Files
Spoolman/client_v2/src
Donkie e2a08c0cfd client_v2: load the locations page lazily instead of all at once
The page fetched every spool up front (limit 1000, sorted by location) and
re-ran that query on every live spool event. On a 4158-spool collection that
was 14.2 s and 1.82 MB, and it silently truncated: 76% of the spools never
appeared, so the per-card counts were wrong too.

One aggregate query (/spool/group?group_by=location, 10 ms / 2.1 KB) now
supplies every location and its exact count, and each card fetches its own
spools 30 at a time — starting when it scrolls into view, continuing as its
list is scrolled, capped at three requests in flight so a screenful of cards
doesn't queue behind the browser's per-host connection limit. Card bodies get
a max height and scroll internally. Live spool events are applied to the
loaded cards directly, with a single debounced aggregate refresh to
re-authorize the counts, rather than reloading everything.

Because a card now holds a page rather than the whole location, its saved
custom spool order can only speak for what is loaded; ids from the previous
order that aren't loaded are carried over behind the loaded ones instead of
being dropped.

Also fixes shelf reordering, which never worked under Svelte 5. The grid's
drag zone was armed by setting dragDisabled from the grip's own mousedown
handler, but svelte-dnd-action only attaches its mousedown/touchstart
listeners while dragDisabled is already false, and Svelte 5 flushes state
changes asynchronously — so the action updated after the press had passed and
the drag was never seen. Arm it from pointerdown (which precedes both
mousedown and touchstart) via flushSync so the listener is in place in time.

Claude-Session: https://claude.ai/code/session_014Cwk5Yyze9yPvkYkUtMAP4
2026-07-19 14:39:42 +02:00
..
2026-07-19 09:06:04 +02:00