Commit Graph
732 Commits
Author SHA1 Message Date
jernejp21 7e98987b87 Translated using Weblate (Slovenian)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: jernejp21 <jernejp21@tuta.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/sl/
Translation: Spoolman/Web Client LEGACY
2026-09-26 13:51:35 +00:00
Donkie bed3f14ee7 Bump version to 0.27.0 2026-09-25 13:35:18 +00:00
klim d848ddef97 Translated using Weblate (French)
Currently translated at 99.3% (291 of 293 strings)

Co-authored-by: klim <klim@free.fr>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/fr/
Translation: Spoolman/Web Client LEGACY
2026-09-21 17:51:33 +00:00
Steam Flow 3ecdf5dfc6 Translated using Weblate (Czech)
Currently translated at 99.6% (292 of 293 strings)

Co-authored-by: Steam Flow <black23@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/cs/
Translation: Spoolman/Web Client LEGACY
2026-09-20 15:51:31 +02:00
Dr_Perry_Coke ae2319a215 Translated using Weblate (Russian)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: Dr_Perry_Coke <dr.perrycoke@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ru/
Translation: Spoolman/Web Client LEGACY
2026-09-19 08:34:23 +02:00
dimquea 9f90c2238d Translated using Weblate (Russian)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: dimquea <dimquea@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ru/
Translation: Spoolman/Web Client LEGACY
2026-09-19 08:34:23 +02:00
dependabot[bot] 1db2ed3851 build(deps): bump react-router from 7.18.1 to 7.18.3 in /client
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.18.1 to 7.18.3.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/react-router@7.18.3/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.18.3/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.18.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-13 10:59:46 +00:00
dependabot[bot] 83b0238bb4 build(deps-dev): bump js-yaml from 3.15.1 to 3.15.2 in /client
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.15.1 to 3.15.2.
- [Changelog](https://github.com/nodeca/js-yaml/blob/3.15.2/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.15.1...3.15.2)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 3.15.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-13 05:13:28 +00:00
Donkie 8f9c214dac Merge pull request #1135 from Donkie/dependabot/npm_and_yarn/client/fast-uri-3.1.7
build(deps): bump fast-uri from 3.1.5 to 3.1.7 in /client
2026-09-02 18:58:43 +02:00
Donkie 1305857efb Merge pull request #1134 from Donkie/dependabot/npm_and_yarn/client/sanitize-html-2.17.7
build(deps-dev): bump sanitize-html from 2.17.5 to 2.17.7 in /client
2026-09-02 18:27:23 +02:00
dependabot[bot] 1eeb2948b2 build(deps): bump fast-uri from 3.1.5 to 3.1.7 in /client
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.5 to 3.1.7.
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.5...v3.1.7)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-02 16:00:29 +00:00
dependabot[bot] a63af285f5 build(deps-dev): bump sanitize-html from 2.17.5 to 2.17.7 in /client
Bumps [sanitize-html](https://github.com/apostrophecms/apostrophe/tree/HEAD/packages/sanitize-html) from 2.17.5 to 2.17.7.
- [Changelog](https://github.com/apostrophecms/apostrophe/blob/main/packages/sanitize-html/CHANGELOG.md)
- [Commits](https://github.com/apostrophecms/apostrophe/commits/HEAD/packages/sanitize-html)

---
updated-dependencies:
- dependency-name: sanitize-html
  dependency-version: 2.17.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-02 03:33:01 +00:00
dependabot[bot] 09fea9f668 build(deps): bump browserslist from 4.28.4 to 4.28.8 in /client
Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.28.4 to 4.28.8.
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.28.4...4.28.8)

---
updated-dependencies:
- dependency-name: browserslist
  dependency-version: 4.28.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-01 19:23:02 +00:00
Samuel Wang 92be2975b8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: Samuel Wang <imhsaw@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/zh_Hans/
Translation: Spoolman/Web Client LEGACY
2026-08-27 07:46:37 +02:00
darkk-k1 a62e4ce6c1 Translated using Weblate (Polish)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: darkk-k1 <softdev@darkabo.eu>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/pl/
Translation: Spoolman/Web Client LEGACY
2026-08-27 07:46:37 +02:00
Julia 0a3404cefe Translated using Weblate (Polish)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: Julia <juliazero2@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/pl/
Translation: Spoolman/Web Client LEGACY
2026-08-27 07:46:37 +02:00
Micha f83b9d9ea4 Translated using Weblate (German)
Currently translated at 97.9% (287 of 293 strings)

Co-authored-by: Micha <hoagman@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/de/
Translation: Spoolman/Web Client LEGACY
2026-08-25 23:00:17 +02:00
Donkie a039095360 Replace Ko-fi buttons with GitHub Sponsors
Both frontends and the README now point at github.com/sponsors/Donkie.

The GitHub-suggested iframe embed is not usable here: Spoolman is often
run on a LAN with no internet access, so it would render as an empty box,
and it cannot be translated or themed. The existing buttons keep their
shell and get an inlined Octicon heart plus a translated label instead.

Only the en locale source is touched; the new "sponsor" key goes out to
the other locales via Weblate.
2026-08-23 17:38:31 +02:00
dependabot[bot] f458995104 build(deps): bump brace-expansion in /client
Bumps  and [brace-expansion](https://github.com/juliangruber/brace-expansion). These dependencies needed to be updated together.

Updates `brace-expansion` from 2.1.1 to 2.1.4
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.1.1...v2.1.4)

Updates `brace-expansion` from 1.1.15 to 1.1.18
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.1.1...v2.1.4)

Updates `brace-expansion` from 5.0.7 to 5.0.9
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.1.1...v2.1.4)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 2.1.4
  dependency-type: indirect
- dependency-name: brace-expansion
  dependency-version: 1.1.18
  dependency-type: indirect
- dependency-name: brace-expansion
  dependency-version: 5.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-23 10:17:19 +00:00
rupefelo 35d10f899d Translated using Weblate (Portuguese)
Currently translated at 99.6% (292 of 293 strings)

Co-authored-by: rupefelo <rupefelo@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/pt/
Translation: Spoolman/Web Client LEGACY
2026-08-21 19:56:01 +00:00
Jeff PapiezandCopilot App 97758f2c4c Let prettier respect the working tree's line endings
The root .gitattributes sets `* text=auto`, so a Windows checkout gets CRLF in
the working tree. Prettier defaults to `endOfLine: "lf"` and therefore reports
every text file as mis-formatted -- 163 files in client_v2 alone -- which makes
`npm run lint` and `lefthook run ci` unusable locally. The pre-commit hook is
worse: it runs `prettier --write .` with stage_fixed, so any commit made from
Windows rewrites and stages the whole client tree.

Set `endOfLine: "auto"` in both client configs. Git still normalizes to LF in
the index and in the repo thanks to `text=auto`, and CI runs on ubuntu-latest,
so LF in version control is unaffected; prettier just stops fighting the
checkout. This is Prettier's documented fix for this scenario.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-08-19 21:50:44 -07:00
Julia afb3094c1b Translated using Weblate (Polish)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: Julia <juliazero2@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/pl/
Translation: Spoolman/Web Client LEGACY
2026-08-19 11:35:03 +02:00
Icezaza Ch 48221c270a Translated using Weblate (Thai)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: Icezaza Ch <icezaza.jar@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/th/
Translation: Spoolman/Web Client LEGACY
2026-08-18 19:51:27 +00:00
Icezaza Ch 2edd96dbb0 Translated using Weblate (Thai)
Currently translated at 96.5% (283 of 293 strings)

Co-authored-by: Icezaza Ch <icezaza.jar@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/th/
Translation: Spoolman/Web Client LEGACY
2026-08-17 21:40:22 +02:00
Liudas Ališauskas 61e1b62a38 Translated using Weblate (Lithuanian)
Currently translated at 99.3% (291 of 293 strings)

Co-authored-by: Liudas Ališauskas <liu2kas3@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/lt/
Translation: Spoolman/Web Client LEGACY
2026-08-17 21:40:22 +02:00
Dr_Perry_Coke 678213f67e Translated using Weblate (Russian)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: Dr_Perry_Coke <dr.perrycoke@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ru/
Translation: Spoolman/Web Client LEGACY
2026-08-16 18:48:06 +02:00
Alessandro “Alessandrol” L 422657d18f Translated using Weblate (French)
Currently translated at 99.3% (291 of 293 strings)

Co-authored-by: Alessandro “Alessandrol” L <alessandrolond@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/fr/
Translation: Spoolman/Web Client LEGACY
2026-08-13 18:51:25 +02:00
KnightArch a17e351e25 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.6% (292 of 293 strings)

Co-authored-by: KnightArch <knightarch@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/pt_BR/
Translation: Spoolman/Web Client LEGACY
2026-08-10 05:51:26 +00:00
dimquea 9bcaece766 Translated using Weblate (Russian)
Currently translated at 99.3% (291 of 293 strings)

Co-authored-by: dimquea <dimquea@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ru/
Translation: Spoolman/Web Client LEGACY
2026-08-10 05:51:24 +00:00
dependabot[bot] 352d36cb86 Bump js-yaml from 3.15.0 to 3.15.1 in /client
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.15.0 to 3.15.1.
- [Changelog](https://github.com/nodeca/js-yaml/blob/3.15.1/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.15.0...3.15.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 3.15.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-08 20:50:40 +00:00
Donkie 56c181f634 Merge pull request #1048 from Donkie/deps/batch-1018-1022-1030
build(deps): bump cryptography, fast-uri and postcss
2026-08-08 22:33:18 +02:00
변성운 2225db0b5f Translated using Weblate (Korean)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: 변성운 <kamyu1537@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ko/
Translation: Spoolman/Web Client LEGACY
2026-08-08 20:51:26 +02:00
Miloslav Kos 30fa35d38b Translated using Weblate (Czech)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: Miloslav Kos <kos.m@post.cz>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/cs/
Translation: Spoolman/Web Client LEGACY
2026-08-08 20:51:24 +02:00
Donkie 8680805416 build(deps): bump fast-uri to 3.1.5 and postcss to 8.5.26 in /client 2026-08-08 20:23:51 +02:00
변성운 590b510f20 Translated using Weblate (Korean)
Currently translated at 100.0% (293 of 293 strings)

Co-authored-by: 변성운 <kamyu1537@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ko/
Translation: Spoolman/Web Client LEGACY
2026-08-07 09:58:03 +02:00
Donkie f38720314b Bump version to 0.26.1 2026-08-06 18:44:00 +00:00
Miloslav Kos 2d6945f5f6 Translated using Weblate (Czech)
Currently translated at 99.3% (291 of 293 strings)

Co-authored-by: Miloslav Kos <kos.m@post.cz>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/cs/
Translation: Spoolman/Web Client LEGACY
2026-08-06 06:25:40 +00:00
Anonymous e50c2ec72f Translated using Weblate (Latvian)
Currently translated at 4.5% (13 of 288 strings)

Translated using Weblate (Slovak)

Currently translated at 10.4% (30 of 288 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/lv/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/sk/
Translation: Spoolman/Web Client LEGACY
2026-08-05 18:41:21 +02:00
Donkie 18f114419f Let extra field choices be reordered by dragging
Choice values could only be appended, so the only way to get a value into
the right place was to remove everything after it and type it all back in.
Both clients now render each choice with a grip: drag it, or focus it and
press the left/right arrow keys, to move it. The backend already accepts a
reordered list — it only refuses removals.

Fixes #994
2026-08-02 08:35:18 +02:00
tomaioo 95230eaa73 fix(security): unsafe json parsing of application settings
The `useCurrency` and `useCurrencyFormatter` functions parse currency settings using `JSON.parse` directly on values fetched from the backend. If the backend returns malformed JSON or unexpected data types, this will throw an unhandled exception and crash the UI component relying on these hooks.

Signed-off-by: tomaioo <203048277+tomaioo@users.noreply.github.com>
2026-08-01 23:12:38 -07:00
Donkie f369253c67 Bump version to 0.26.0 2026-07-31 08:19:20 +00:00
Donkie ff7170f0f7 Build on Node 24, which is not end-of-life
Every workflow pinned node-version '20'. Node 20 reached end-of-life on
2026-04-30, so for three months CI has been building the artifacts that
go into released images on a runtime that no longer gets security fixes.
Vite 8 also floors at ^20.19, which setup-node's '20' happens to satisfy
today only because it resolves to the latest 20.x -- a floor we were
clearing by accident is not one worth keeping.

24 rather than 22: it is Active LTS until 2026-10-20 and supported
through 2028-04-30, so this pin outlives the 22 line by a year. Node 26
does not ship until October.

The legacy client declared engines "20.x", which would have made every
npm ci in that package print EBADENGINE against the new runner. It is
widened to the floor of the Vite 7 it already runs on, so it now
describes what the package actually supports instead of naming a single
line.

Verified locally on Node 24.13.0: lefthook ci green, both clients
install clean and build, client_v2's unit tests and the
tests_frontend_v2 Playwright suite pass. tests_frontend needs the built
image so it is left to CI; its only dependency declares node >=18.

The setup-node pin itself is untouched and still on v4.0.3, whose action
runtime is the other deprecated Node 20 in the logs -- GitHub already
force-runs it on 24. That is an action upgrade, and a separate change.
2026-07-31 09:00:16 +02:00
Donkie 59672ecb30 Merge master into feature/v2-client
Brings the branch up to 0.25.0 and picks up cosign image signing, the
armv7/arm64 smoke tests, the armv7 greenlet/libstdc++ fix, the
PUID/PGID and Kubernetes SPOOLMAN_PORT entrypoint guards, and the
externaldb unwritable-path fix.

The only conflict was publish-images' needs list, where both sides had
added a job: test-frontend-v2 here, test-multiarch-smoke on master.
Resolved as the union, so nothing publishes until every test job has
passed. The rest of the graph is unchanged, and the new smoke tests
inherit client_v2 coverage for free -- build-arm64 and build-armv7
already download the client_v2 artifact, so booting those images to
/health now also proves the default client is present in them.

Claude-Session: https://claude.ai/code/session_01UB5KocsTBm9GL5x3Uuup5F
2026-07-30 21:02:14 +02:00
Donkie ae3208a9c3 Let an extra field's value be cleared again
Picking the empty option of a single-choice extra field did nothing --
in either client, on spools, filaments and vendors alike. Emptying an
integer, range, datetime or multi-choice field was just as stuck. There
was no way to get a value back to unset once it had one.

Nothing in the API could express it. A key left out of the map means
"leave it alone", and every value that could stand in for empty is
rejected by the field's type check: "" is not one of a choice field's
choices. So `extra` values now accept null, meaning the entity has no
value for that field -- no row is stored, which clears whatever was
there. Null was a 422 before it reached any logic, so nothing that used
to work behaves differently.

A filament's and a vendor's extra were also REPLACED wholesale by a
patch rather than merged per key, unlike a spool's since 28f6f8e
(v0.22.0). Anyone patching one field of a filament -- as client_v2 did
-- silently destroyed the rest of its custom fields; anyone relying on
the replacement to delete a key can now say so with null. All three
entities merge per key now, and the field descriptions say so instead
of saying nothing.

client_v2's saver was where the frontend half died: an emptied input
produced no patch at all. It sends the cleared key as null now, and
keeps sending only the keys that changed, which is what stops two people
editing different fields of one entity from overwriting each other. It
also captures the entity id when the edit is made -- the inspectors are
reused across selections rather than remounted, so a debounced patch
could otherwise land on whatever you clicked next.

The legacy client cleared a filament's or vendor's field by omitting it,
which the merge would now ignore, so its form sends null for a field
left empty. That also buys it clearing on spools, which merged (and so
ignored the omission) all along.

Claude-Session: https://claude.ai/code/session_01UB5KocsTBm9GL5x3Uuup5F
2026-07-30 18:11:02 +02:00
+2 4219230aa1 Translations update (#977)
* Translated using Weblate (Estonian)

Currently translated at 17.3% (50 of 288 strings)

Translated using Weblate (Persian)

Currently translated at 96.5% (278 of 288 strings)

Translated using Weblate (French)

Currently translated at 98.9% (285 of 288 strings)

Translated using Weblate (Greek)

Currently translated at 72.9% (210 of 288 strings)

Translated using Weblate (Dutch)

Currently translated at 99.3% (286 of 288 strings)

Translated using Weblate (Hungarian)

Currently translated at 72.2% (208 of 288 strings)

Translated using Weblate (Danish)

Currently translated at 85.4% (246 of 288 strings)

Translated using Weblate (Thai)

Currently translated at 98.6% (284 of 288 strings)

Translated using Weblate (Japanese)

Currently translated at 99.3% (286 of 288 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/da/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/el/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/et/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/fa/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/fr/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/hu/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ja/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/nl/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/th/
Translation: Spoolman/Web Client

* Translated using Weblate (Ukrainian)

Currently translated at 93.0% (268 of 288 strings)

Translated using Weblate (Greek)

Currently translated at 72.9% (210 of 288 strings)

Translated using Weblate (Hungarian)

Currently translated at 72.2% (208 of 288 strings)

Co-authored-by: Daniel Hultgren <daniel.cf.hultgren@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/el/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/hu/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/uk/
Translation: Spoolman/Web Client

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 98.6% (284 of 288 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.3% (286 of 288 strings)

Translated using Weblate (Hindi (Latin script))

Currently translated at 3.8% (11 of 288 strings)

Translated using Weblate (Swedish)

Currently translated at 94.7% (273 of 288 strings)

Translated using Weblate (Ukrainian)

Currently translated at 93.0% (268 of 288 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/hi_Latn/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/sv/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/uk/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/zh_Hant/
Translation: Spoolman/Web Client

* Translated using Weblate (Danish)

Currently translated at 87.1% (251 of 288 strings)

Co-authored-by: srbjessen <srbjessen@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/da/
Translation: Spoolman/Web Client

* Translated using Weblate (Czech)

Currently translated at 100.0% (288 of 288 strings)

Co-authored-by: Miloslav Kos <kos.m@post.cz>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/cs/
Translation: Spoolman/Web Client

* Translated using Weblate (Korean)

Currently translated at 100.0% (288 of 288 strings)

Translated using Weblate (Korean)

Currently translated at 78.1% (225 of 288 strings)

Added translation using Weblate (Korean)

Co-authored-by: 김태남 <imedia0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ko/
Translation: Spoolman/Web Client

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (288 of 288 strings)

Co-authored-by: Kayz C <kayzed.x@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/zh_Hant/
Translation: Spoolman/Web Client

* Translated using Weblate (Slovenian)

Currently translated at 100.0% (288 of 288 strings)

Translated using Weblate (Slovenian)

Currently translated at 38.1% (110 of 288 strings)

Translated using Weblate (Slovenian)

Currently translated at 14.9% (43 of 288 strings)

Added translation using Weblate (Slovenian)

Co-authored-by: Jernej Pangerc <jernejp21@tuta.com>
Co-authored-by: jernejp21 <jernejp21@tuta.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/sl/
Translation: Spoolman/Web Client

* Translated using Weblate (Slovak)

Currently translated at 10.4% (30 of 288 strings)

Translated using Weblate (Slovak)

Currently translated at 9.7% (28 of 288 strings)

Added translation using Weblate (Slovak)

Co-authored-by: Pavol Vrba <pvrba2000@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/sk/
Translation: Spoolman/Web Client

* Translated using Weblate (Hungarian)

Currently translated at 94.0% (271 of 288 strings)

Co-authored-by: Tamas Veres <tamas.veres@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/hu/
Translation: Spoolman/Web Client

* Translated using Weblate (Danish)

Currently translated at 100.0% (288 of 288 strings)

Translated using Weblate (Danish)

Currently translated at 92.0% (265 of 288 strings)

Co-authored-by: JonasBentin <jonasbentin19+github@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/da/
Translation: Spoolman/Web Client

* Translated using Weblate (Latvian)

Currently translated at 4.5% (13 of 288 strings)

Added translation using Weblate (Latvian)

Co-authored-by: Jurijs Kiricenko <jurijskiricenko@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/lv/
Translation: Spoolman/Web Client

* Translated using Weblate (Russian)

Currently translated at 100.0% (288 of 288 strings)

Translation: Spoolman/Web Client
Translate-URL: https://hosted.weblate.org/projects/spoolman/web-client/ru/

---------

Co-authored-by: Daniel Hultgren <daniel.cf.hultgren@gmail.com>
Co-authored-by: srbjessen <srbjessen@gmail.com>
Co-authored-by: Miloslav Kos <kos.m@post.cz>
Co-authored-by: 김태남 <imedia0@gmail.com>
Co-authored-by: Kayz C <kayzed.x@gmail.com>
Co-authored-by: jernejp21 <jernejp21@tuta.com>
Co-authored-by: Pavol Vrba <pvrba2000@gmail.com>
Co-authored-by: Tamas Veres <tamas.veres@gmail.com>
Co-authored-by: JonasBentin <jonasbentin19+github@gmail.com>
Co-authored-by: Jurijs Kiricenko <jurijskiricenko@gmail.com>
Co-authored-by: Dr_Perry_Coke <dr.perrycoke@gmail.com>
2026-07-29 18:06:17 +00:00
Donkie 6e1065009c Bump version to 0.25.0 2026-07-22 14:10:59 +00:00
dependabot[bot] 0076058280 Bump fast-uri from 3.1.3 to 3.1.4 in /client (#972)
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.3 to 3.1.4.
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.3...v3.1.4)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 16:08:58 +02:00
470d8f3bcc Add filtering and sorting for custom fields (#773)
* Add filtering and sorting for custom fields

* Fix tests and make code postgres compatible

* Fix bugs and expand test coverage for custom field filter/sort

* trigger CI

* fix: address extra field filter review feedback

* fix: clean up custom field table state handling

* docs: update extra field table view description

* fix: narrow boolean custom field filter syntax

* Expand test coverage for all custom field types/entities and fix range filter/sort

- Add comprehensive tests covering all 9 field types (text, integer, float,
  boolean, single-choice, multi-choice, datetime, integer_range, float_range)
  for filter and sort on spool, filament, and vendor entities
- Add invalid-filter 400 tests for float, integer_range, and float_range
- Fix integer_range/float_range filter to use LIKE pattern matching against
  Python's deterministic json.dumps output instead of fragile .contains()
- Add integer_range/float_range sort support via a @compiles helper
  (_JsonArrayFirstElement) that emits CAST(col AS JSON)->>0 on PostgreSQL
  and JSON_EXTRACT(col, '$[0]') on SQLite/MariaDB
- Add logger and __all__ to extra_fields.py (aligns with PR #893)
- All tests verified passing on postgres, sqlite, and mariadb

* Add filter UI for all custom field types and fix range filters

- Add text input filter dropdown for text fields (substring search)
- Add range input filter dropdowns (min/max) for integer, float, integer_range, and float_range fields
- Add datetime picker filter dropdown for datetime fields
- Fix boolean "No" filter to use empty value so it correctly matches unset/false fields
- Fix integer_range/float_range filter to use numeric comparisons instead of LIKE-based exact matching (stored_min >= filter_min, stored_max <= filter_max)
- Add range filter support for integer/float fields (min:max format)
- Add _JsonArraySecondElement cross-database helper for extracting second JSON array element

* Range filter for integer/float fields and fix range_field filter semantics

Backend:
- Add _JsonArraySecondElement cross-database helper (mirrors _JsonArrayFirstElement)
- integer_range/float_range filter now uses numeric comparisons:
  stored_min >= filter_min and stored_max <= filter_max (was LIKE exact match)
- integer/float filter now supports min:max range format in addition to exact match:
  stored_value >= min and/or stored_value <= max

Frontend:
- integer and float fields now use a range filter dropdown (min/max inputs)
  instead of a single exact-value input

Tests:
- Fix integer_range/float_range spool and vendor tests broken by new >= semantics
  (filter values updated to discriminate between test entries)
- Add range filter tests (min only, max only, both) for integer and float fields

* Replace 12 copy-pasted numeric field tests with 4 parametrized tests

Introduce a _create_entity helper and @pytest.mark.parametrize("entity_type",
["spool", "filament", "vendor"]) to run each numeric field type test against
all three entity types from a single test function.

- Removes 12 individual tests (integer/float/integer_range/float_range × 3 entities)
- Adds 4 parametrized tests covering the same ground plus the previously missing
  min-only / max-only range filter cases for filament and vendor
- Uses try/finally for cleanup so entities are always deleted even on assertion failure

* Add datetime range filter and restore integer/float range filter support

- Backend: add datetime range filter using '|' separator (ISO dates contain ':')
- Backend: restore integer/float range filter support (lost during attribution rewrite)
- Frontend: replace single DateTimePicker with From/To range pickers for datetime fields

* Use local timezone in filter picker; add range filter tests

The DateTimeRangeFilterDropdown was initializing pickers with dayjs.utc(),
causing them to display and accept UTC times directly. The entry form shows
local time and converts to UTC, so the filter was inconsistent: entering
the same displayed time would produce a filter value 2h offset from what
was stored (in UTC+2), making exact boundaries fail unexpectedly.

Fix: initialize picker values with dayjs() (local mode) so the filter picker
behaves the same as the entry form — shows local times and converts to UTC.

Tests: replace 3 separate entity-specific datetime tests with one parametrized
test covering spool/filament/vendor, and add range filter cases (start|, |end,
start|end).

* Replace all entity-specific tests with parametrized tests

Replace 16 separate spool/filament/vendor tests for text, boolean,
single-choice, multi-choice, and empty-filter with 5 parametrized tests
that run against all three entity types. Each test is now defined once
and executed 3 times, eliminating copy-paste and ensuring consistent
coverage across all entity types.

Parametrize invalid-filter-value 400 tests across all entity types

The non-numeric-value error uses "Invalid integer/float range filter value"
while the missing-colon error uses "Invalid range filter value". Both contain
"range filter value", so use that as the assertion substring.

* Align custom filter dropdowns with Ant Design choice filter style

All three custom filter dropdowns (text, number range, datetime range) now
match the built-in choice filter footer: a border-top separator, Reset as a
link button on the left (disabled when no filter is active), and OK as a
primary button on the right.

* fix(fields): correct custom-field filter edge cases across databases

- Float exact-match filters now compare numerically (cast to Float) instead of
  by JSON string, so float fields stored as integer JSON (e.g. "2") or
  non-canonical decimals (e.g. "2.50") match an equivalent filter.
- integer_range/float_range filter and sort no longer return HTTP 500 on
  CockroachDB: the PostgreSQL '->>' JSON extraction is now also registered for
  the cockroachdb dialect, which previously fell back to the unsupported
  JSON_EXTRACT function.
- Text exact-match and single-choice equality use ensure_ascii=False so
  non-ASCII values match how the frontend's JSON.stringify stores them.

Co-authored-by: Dieter Blomme <dieterblomme@gmail.com>

* test(fields): expand custom-field filter/sort coverage

Add tests covering filter composition (multiple extra fields, extra + built-in,
filter one field / sort another), pagination total-count, unknown-field
handling, text case-insensitivity/substring/non-ASCII, numeric multi-value OR,
boolean empty semantics and token rejection, multi-choice substring collisions,
empty filters on numeric fields, null-bounded ranges, and additional
invalid-value 400 paths.

Verified against sqlite, postgres, mariadb and cockroachdb.

Co-authored-by: Dieter Blomme <dieterblomme@gmail.com>

* style(client): format column.tsx with prettier

The custom-field filter dropdowns' Reset buttons were written as one-line
onClick handlers that prettier wraps across multiple lines. Apply prettier
so the CI style check passes.

Co-authored-by: Dieter Blomme <dieterblomme@gmail.com>

* fix(fields): decode JSON scalars in-DB for text/choice/datetime custom-field filters

Match text, single-choice and datetime custom-field filters against the
database-decoded JSON scalar (new _JsonScalarText cross-dialect helper:
#>> '{}' on postgres/cockroachdb, JSON_UNQUOTE(JSON_EXTRACT) on mysql,
json_extract on sqlite) instead of reconstructing the exact JSON
serialization the client wrote. This decouples matching from
json.dumps/JSON.stringify encoding quirks (non-ASCII escaping, surrounding
quotes). Also escape LIKE wildcards so '%' and '_' in text and multi-choice
queries match literally rather than acting as wildcards.

Verified against sqlite, postgres, mariadb and cockroachdb.

Co-authored-by: Dieter Blomme <dieterblomme@gmail.com>

* test(fields): cover LIKE-wildcard escaping in custom-field filters

Add parametrized tests (spool/filament/vendor) asserting that '%' and '_'
are matched literally in text and multi-choice filters, that a literal '/'
(the internal LIKE escape char) matches literally, and that single-choice
equality handles a '%' value exactly.

Co-authored-by: Dieter Blomme <dieterblomme@gmail.com>

---------

Co-authored-by: Donkie <daniel.cf.hultgren@gmail.com>
Co-authored-by: akira69 <akira69@gmail.com>
2026-07-08 10:14:27 +02:00
Donkie 103e029434 Bump version to 0.24.0 2026-07-07 09:48:12 +00:00
Donkie 92da7fd110 feat(i18n): add Lithuanian and Turkish locales
Rework check-i18n to measure real translation coverage against en
(non-empty and differing from the reference) instead of file size,
gating inclusion at 50%. Add lt and tr, both ~96% translated.

Claude-Session: https://claude.ai/code/session_01BQjJiwEbu6bHbeDjPPDm3V
2026-07-07 11:40:48 +02:00