Skip to content

Sync upstream Donkie/Spoolman (client_v2 filter menu + translations) - #10

Merged
jpapiez merged 10 commits into
masterfrom
sync-upstream-2026-08-18
Aug 18, 2026
Merged

Sync upstream Donkie/Spoolman (client_v2 filter menu + translations)#10
jpapiez merged 10 commits into
masterfrom
sync-upstream-2026-08-18

Conversation

@jpapiez

@jpapiez jpapiez commented Aug 18, 2026

Copy link
Copy Markdown

Warning

Merge with "Create a merge commit" — do NOT squash. Squashing a sync PR discards the upstream ancestry and forces the next sync to re-resolve everything. That has already happened twice on this repo (#5, #9) and is what commit 356ebfb had to repair.

Routine sync with upstream Donkie/Spoolman: 9 commits, 0 conflicts.

This is the payoff from repairing the ancestry in 356ebfb — the previous sync needed 15 conflict resolutions, and a trial merge before the repair produced 27. With history recorded correctly, git merged this cleanly on its own.

What's coming in

client_v2 filament filter menu (4 commits)

  • show colors and material in the filament filter
  • pick several filter values without reopening the menu
  • keep the frontend suite in step with the filter menu

Translations (5 commits) — German, Lithuanian, Thai, via Weblate.

Files touched: client_v2/src/lib/api/spoolSource.ts, components/library/ListToolbar.svelte, utils/library.ts, tests_frontend_v2/tests/helpers.ts, and three locale files.

Verification

Check Result
Merge conflicts 0
Alembic heads 1 (9c1d5f2a7b31) — no split history
ruff check spoolman clean
Backend unit tests 228 passed (8 pre-existing Windows file-lock failures in test_backup_rotation.py, unrelated)
client_v2 unit tests 253 passed (20 files)
svelte-check 0 errors, 0 warnings
Fork customizations intact — OlyForge3D SpoolmanDB URL, /spool/materials/available, extra CORS knobs, fork preset settings, olyforge3d/spoolman:test image tags
Version stays 0.26.3 (ours)

Backend is untouched by this sync — the changes are entirely client_v2 and locales.

Note

The upstream-sync label is applied so guard-translations skips: this PR carries upstream's own Weblate commits, which that guard cannot distinguish from hand edits.

Donkie and others added 10 commits August 17, 2026 20:59
The filament filter listed nothing but a label, which is the manufacturer
and the name. That is not enough to pick from: the colour is the thing
you actually recognise a filament by, and two filaments may legitimately
carry the same name in different materials, leaving the menu offering two
entries that read identically.

Each option now carries whatever it has beyond its label, so the menu
draws a swatch and the material where they exist and stays a plain list
of names where they don't (locations, lot numbers). The material sits
with the label rather than off at the row's right edge, since it is there
to qualify the name it follows. None of it costs a request: the option
list is built from whole filaments already fetched.

The search box narrows on the material too. It is on screen, so a query
that visibly matches a row has to keep it — and since terms match in any
order, "prusament petg" now finds one filament out of two same-named
ones.

Closes Donkie#1087
Closes Donkie#1088
Narrowing a library to three filaments meant opening the filter menu,
stepping into Filament, picking one, and doing all of it again twice
more. The menu closed on every pick, and nothing in it said which values
were already on — the chips that say so sit in the toolbar, behind the
menu that covers them.

A value row now carries a checkbox and its state, the same way the "Show
archived" row already does, and picking one leaves the menu open. The two
go together: once the values are marked, the list reads as a multi-select,
and closing after a single pick is the surprising half. Escape and a click
outside still close it, and picking a filter property or a date range still
does too, since neither is a set.

Nothing has to be preserved by hand for this to work. Each toggle is a
query-only navigation that keeps the component mounted, and it already
asked to keep focus and not to scroll, so the search box stays focused and
the list stays where it was.

The Ctrl-modifier the issue suggested is deliberately not implemented: a
checkbox list that stays open needs no hint text to explain itself.

Closes Donkie#1090
Closes Donkie#1089
Turning filter values into checkboxes that leave the menu open broke the
`addFilter` helper in two ways, and with it the grouping test that uses it
to pin the list down to its own spools.

An explicit `role="menuitemcheckbox"` replaces a button's implicit role, so
the helper's `getByRole("button")` no longer matched a value row at all;
and having picked one, the helper handed back a toolbar with the menu still
covering it, which the next call could not open through. It now asks for
the role the row actually has, and closes the menu itself, restoring the
postcondition every caller was already relying on.

The row's accessible name needed a real space rather than the margin that
had been standing in for one: without it a filament read as one
run-together word, "Galaxy BlackPLA".
client_v2: filter menu colours, materials, checkmarks and multi-select
Currently translated at 51.0% (276 of 541 strings)

Translation: Spoolman/Spoolman Web UI v2
Translate-URL: https://hosted.weblate.org/projects/spoolman/spoolman-web-ui-v2/de/
Currently translated at 51.0% (276 of 541 strings)

Translation: Spoolman/Spoolman Web UI v2
Translate-URL: https://hosted.weblate.org/projects/spoolman/spoolman-web-ui-v2/de/
Currently translated at 34.7% (188 of 541 strings)

Translation: Spoolman/Spoolman Web UI v2
Translate-URL: https://hosted.weblate.org/projects/spoolman/spoolman-web-ui-v2/lt/
Currently translated at 100.0% (541 of 541 strings)

Translation: Spoolman/Spoolman Web UI v2
Translate-URL: https://hosted.weblate.org/projects/spoolman/spoolman-web-ui-v2/th/
Translations update from Hosted Weblate
Copilot AI lite review requested due to automatic review settings August 18, 2026 18:57
@jpapiez jpapiez added the upstream-sync PR that merges upstream Donkie/Spoolman; exempt from the translation guard label Aug 18, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Syncs upstream Donkie/Spoolman changes into the fork, focused on client_v2’s library filter UX (richer filament filter options + multi-select without closing) and updated Weblate translations.

Changes:

  • Extend filter option metadata (material + colors + multi-color direction) and render it in the filter menu with searchable secondary text.
  • Update frontend v2 tests to select filter values via checkbox-like menu items and explicitly close the filter menu afterward.
  • Import upstream translation updates for German, Lithuanian, and Thai.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests_frontend_v2/tests/helpers.ts Adjusts Playwright helper to click checkbox-style filter entries and then close the filter menu.
client_v2/src/lib/utils/library.ts Introduces shared FilterOption type with optional metadata for richer filter menu rendering.
client_v2/src/lib/components/library/ListToolbar.svelte Updates filter menu UX to support multi-select, show swatches + meta text, and search across label+meta.
client_v2/src/lib/api/spoolSource.ts Enhances filament filter options to include material and color metadata.
client_v2/locales/th/common.json Upstream Thai translations update.
client_v2/locales/lt/common.json Upstream Lithuanian translations update.
client_v2/locales/de/common.json Upstream German translations update.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +509 to +511
<!-- A value row is a checkbox, not a command: it reads as on or off, and
picking one leaves the menu open so the next one is a click away
(#1090, #1089). Escape and a click outside still close it. -->
Comment on lines 514 to +518
<button
class="menu-item"
onclick={() => {
params.toggleFilter(filterProp!, opt.value);
close();
}}
role="menuitemcheckbox"
aria-checked={checked}
onclick={() => params.toggleFilter(filterProp!, opt.value)}
@jpapiez
jpapiez merged commit 570b000 into master Aug 18, 2026
14 of 15 checks passed
@jpapiez
jpapiez deleted the sync-upstream-2026-08-18 branch August 18, 2026 19:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

upstream-sync PR that merges upstream Donkie/Spoolman; exempt from the translation guard

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants