You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(kanban): surface off-column records in an Uncategorized lane (#2792) (#2804)
Records whose groupBy value matched no declared column were bucketed into
`groups` and then dropped — `groups[col.id]` never reads a key that isn't a
column id — so the board rendered empty while the list footer still counted
the rows, reading as data loss. Triggered by a status the board doesn't
render, an edited/removed picklist option, imported legacy data, or an
empty value.
- Extract the flat-data→columns bucketing into a pure, exported
`bucketCardsIntoColumns` (the single choke point, now unit-testable).
- Append a trailing 'Uncategorized' lane (sentinel id KANBAN_UNCOLUMNED_ID)
holding every record whose key matched no column, so nothing is invisible
and the visible card total reconciles with the record count.
- Guard the drag-persist handler: dragging a card OUT of the lane into a
real column repairs its status; dropping one IN is refused (the sentinel
is not a real option).
- Add kanban.uncategorized to the en/zh bundles.
Tests (both red-verified against the pre-fix code): index.bucket.test.ts
covers the pure bucketing (off-column, empty/null, static cards, cover
mapping, no-groupBy); KanbanRenderer.uncolumned.test.tsx renders the real
board through Suspense and asserts the lane + orphan card appear in the
DOM. type-check caught (and this fixes) the hook-destructure at the call
site — the pure test alone would have shipped it.
Closes#2792
Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
fix(kanban): surface off-column records in an "Uncategorized" lane instead of dropping them (#2792)
7
+
8
+
Records whose `groupBy` value matched no declared column were bucketed and then silently discarded — the board rendered empty while the list footer still counted the rows, so it read as data loss (a status the board doesn't render, an edited/removed picklist option, imported legacy data, or an empty value all triggered it). They now land in a trailing "Uncategorized" lane so no record is invisible and the visible card total reconciles with the record count. Dragging a card out of that lane into a real column repairs its status; the drag handler refuses to persist a move *into* the lane (its sentinel id is not a real option). Adds `kanban.uncategorized` to the en/zh bundles.
0 commit comments