fix(transactions): fetch all pending rows so the inbox is never capped at 200 (#1493)

* fix(transactions): fetch all pending rows so the inbox is never capped at 200

The transactions page fetched only the newest 200 rows and derived the
inbox from that window, with no load-more in inbox mode. Users with more
than 200 transactions since their oldest unhandled row had older pending
transactions silently hidden, and the footer counter understated the
real backlog (confirmed live: 188 shown vs 286 actual).

The inbox now merges a fetchAllRows query for every pending row
(is_business null, not ignored) into the transactions state, so all
existing row-mutation paths keep working unchanged. The history view
keeps its contiguous newest-first paging via a tracked window boundary
(pagedCountRef / pagedThroughDate) and hides the sparse older pending
rows that would otherwise read as missing bookkeeping.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(transactions): address review findings on the pending-backlog fetch

Stable (date, id) ordering on both history page queries so offset paging
cannot skip or repeat same-date rows; surface a pending-backlog fetch
failure through the existing load-failed toast instead of silently
rendering a complete-looking inbox; chunk fetchPotentialMatches .in()
lists at 150 ids so a large pending backlog cannot exceed PostgREST URL
limits and silently drop match hints.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Mattsson
2026-08-10 11:45:21 +02:00
committed by GitHub
co-authored by Claude Fable 5
parent d4b0bd3df1
commit 6aab1fbe23
2 changed files with 115 additions and 30 deletions
+1
View File
@@ -847,5 +847,6 @@ One line per decision: `[YYYY-MM-DD] <decision>: <why>`. Appended by agents and
[2026-08-08] extensions.schema.json enum also gained "stripe" while adding "shopify": the enum had drifted (stripe was enabled in extensions.config.json but missing from the schema, failing editor validation); fixed in the same touch since the file had to change anyway.
[2026-08-08] Login panel is method-stated (BankID hero default, remembered via accounted-login-method cookie) instead of a stacked method list: matches the Swedish bank/Fortnox convention, gives exactly one primary action per view; errors moved from boxed banner to a field-adjacent single line (NN/g 3/4/10), reset link surfaces from the second failed attempt.
[2026-08-09] Upsell FAB dismissal is session-scoped (sessionStorage), not persisted: closing the paywalled sheet or the pill's X hides all floating assistant UI for non-payers until the next browser session; a permanent dismissal would let one click silence the conversion surface forever, and payer/collapsed FAB behavior stays untouched.
[2026-08-10] Transactions inbox fetches ALL pending rows merged into the single transactions state array (tracked window boundary via pagedCountRef/pagedThroughDate) instead of a parallel pendingTransactions state: ~20 setTransactions mutation call sites (book/ignore/edit/delete) would each need dual updates and would drift; the merged array keeps mutations one code path, at the cost of a date-boundary filter for the history view.
[2026-08-09] /migrate streaming is opt-in via Accept: application/x-ndjson instead of replacing the JSON contract: the wizard is the only caller today but a hard cutover would break open pre-deploy tabs and the route's locked error-status tests; mid-stream failures re-send the structured envelope as a terminal error event because the 200 is already committed once the stream opens.
[2026-08-09] Regeluppdat + docs-freshness scans (#1417) built as local loop skills with due-date self-gating, not cloud crons: cloud routines were retired 2026-07-20, and session crons die at 7 days, so weekly/monthly cadence is achieved by loop-ignite running each loop when its run marker says it is due. loop-regeluppdat files tickets only (no auto-fix PRs): regulatory changes touch money math and compliance logic, which .claude/loops.md forbids loops from changing. Docs check diffs the live .md mirror routes against repo-built markdown (exact, canonicalised both sides) instead of diffing the gnubok-website checkout, so it also catches deployed-but-stale and route-404 states.