Commit Graph

51 Commits

Author SHA1 Message Date
Tyler 77f61b675d feat(sp7): ServiceLinesTable — Paid + Adjustments columns 2026-06-20 19:45:35 -06:00
Tyler 3157c86340 feat(sp6): bulk action bar wired into lanes 2026-06-20 18:43:51 -06:00
Tyler 610e580844 feat(sp6): InboxHeader + CandidateBreakdown 2026-06-20 18:41:07 -06:00
Tyler 5f3339ac1f feat(sp6): Lane component with multi-select 2026-06-20 18:40:34 -06:00
Tyler 713f0932b2 feat(sp6): InboxRow with Ticker Tape accents 2026-06-20 18:38:52 -06:00
Tyler ab841653d4 feat(sp6): /inbox route + sidebar nav link 2026-06-20 18:37:24 -06:00
Tyler 6ee87174d3 fix(activity): tolerate unknown activity kinds in ActivityFeed
The live-tail stream (now reachable through the new Vite /api proxy)
started delivering activity rows with kind="manual_match", a kind the
ActivityFeed kindConfig map didn't know about. The map lookup returned
undefined, and reading .icon on it threw — taking the whole Activity
Log page down.

Two fixes:

1. Add "manual_match" to the ActivityKind union in src/types/index.ts
   and to the kindConfig map in src/components/ActivityFeed.tsx (with
   a Wrench icon + neutral tone), so the kind is properly typed and
   rendered.

2. Add a FALLBACK_KIND guard so any future backend-emitted kind that
   arrives before the frontend is updated no longer crashes the page.
   kindConfig stays exhaustive for known kinds, so TypeScript still
   catches missing entries at compile time.

Also adds src/components/ActivityFeed.test.tsx with three regression
tests (empty state, multi-item render, unknown-kind safety).
2026-06-20 17:46:00 -06:00
Tyler f4a7cd99b3 merge: ui/batch-diff 2026-06-20 17:30:30 -06:00
Tyler 5baa0290f0 merge: ui/remit-drawer 2026-06-20 17:30:09 -06:00
Tyler 19fb675007 merge: ui/global-search 2026-06-20 17:29:45 -06:00
Tyler c94a1f8201 merge: ui/a11y-followup 2026-06-20 17:29:22 -06:00
Tyler 7c4da65625 merge: ui/csv-export 2026-06-20 17:29:00 -06:00
Tyler 1359b0753a merge: SP5 live-tail — pub/sub + 3 stream endpoints + frontend tail integration
Brings the SP5 live-tail implementation into main:

Backend
  * EventBus (cyclone.pubsub): per-kind fan-out with drop-oldest overflow
  * FastAPI lifespan initializes the bus + db once per process
  * store.add() publishes claim_written / remittance_written /
    activity_recorded events on every batch write
  * GET /api/{claims,remittances,activity}/stream: NDJSON snapshot +
    live subscription + 15s idle heartbeat
  * EventBus.unsubscribe() lets the tail loop release its queue on
    client disconnect (no queue leak per open stream)

Frontend
  * src/lib/tail-stream.ts: streamTail() async-generator over fetch
  * src/store/tail-store.ts: zustand with FIFO cap 10k per slice
  * src/hooks/useTailStream.ts: connecting/live/reconnecting/stalled/error/closed
    state machine with 1→2→4→8→16→30s backoff
  * src/hooks/useMergedTail.ts: base + tail merge with filter
  * src/components/TailStatusPill.tsx: badge + Reconnect button
  * Claims, Remittances, ActivityLog pages wired to the tail

Tests
  * 437 backend tests pass (was 418 before SP5)
  * 154 frontend tests pass (was 124)
  * npm run typecheck clean
  * end-to-end smoke: open /api/claims/stream, POST 837, see new claims
    arrive in real time without refresh

# Conflicts:
#	src/pages/ActivityLog.tsx
#	src/pages/Remittances.test.tsx
#	src/pages/Remittances.tsx
2026-06-20 17:28:58 -06:00
Tyler a79668192d feat(frontend): global Cmd-K search across claims/remits/activity 2026-06-20 17:25:40 -06:00
Tyler c8d84c08c4 a11y(frontend): select outline, CardTitle polymorphic as prop, cheatsheet labels 2026-06-20 17:22:43 -06:00
Tyler 7b394fff1a feat(batch-diff): side-by-side claim diff between two batches 2026-06-20 17:17:09 -06:00
Tyler 25d47a5621 feat(frontend): RemitDrawer component with CAS adjustments + parties + claim payments 2026-06-20 17:16:23 -06:00
Tyler 162127b494 feat(frontend): CSV export utility + ExportCsvButton component 2026-06-20 17:12:44 -06:00
Tyler f1407dbb1d feat(frontend): TailStatusPill with reconnect button 2026-06-20 17:07:01 -06:00
Tyler 4cd52c3084 merge: ui/activity-filter — kind + since filters on ActivityLog 2026-06-20 17:00:07 -06:00
Tyler d376647f5f merge: ui/batches-browser — list + detail drawer for /api/batches 2026-06-20 16:59:44 -06:00
Tyler ff4906d0c1 feat(frontend): kind + since filters on ActivityLog page 2026-06-20 16:53:19 -06:00
Tyler 354268330c feat(frontend): Batches browser page with list + detail drawer 2026-06-20 16:52:20 -06:00
Tyler b37fb5a26c a11y(frontend): focus rings, ARIA labels, skip-link across ui components 2026-06-20 16:51:36 -06:00
Tyler d44aa1de3f feat(frontend): KeyboardCheatsheet overlay 2026-06-20 12:18:08 -06:00
Tyler 436cbead11 feat(frontend): ClaimDrawer root orchestrator with skeleton/error/data states 2026-06-20 12:00:27 -06:00
Tyler 7117f75764 feat(frontend): ClaimDrawer barrel export 2026-06-20 11:50:44 -06:00
Tyler 3fec07ca4d style(frontend): tidy drawer review nits
- RawSegmentsPanel: summary now reads 'Show N raw segments' for
  non-empty (with singular pluralization). The previous identical
  ternary branches read as a bug.
- PartiesGrid: replace the verbose intersection cast on AddressBlock
  with a direct ClaimDetailAddress cast (the union's other arm is
  Record<string, never>, ruled out by isEmptyAddress above).
2026-06-20 11:49:18 -06:00
Tyler dc89244100 feat(frontend): StateHistoryTimeline with kind-colored dots 2026-06-20 11:43:49 -06:00
Tyler 1671e96a10 feat(frontend): MatchedRemitCard with view-remittance link 2026-06-20 11:41:30 -06:00
Tyler 7c7e724464 feat(frontend): RawSegmentsPanel collapsible debug aid 2026-06-20 11:39:59 -06:00
Tyler 94a39e9dd6 feat(frontend): PartiesGrid with billing provider/subscriber/payer cards 2026-06-20 11:38:51 -06:00
Tyler 042597217f feat(frontend): DiagnosesList with qualifier + code formatting 2026-06-20 11:34:00 -06:00
Tyler 7f389fe04b feat(frontend): ServiceLinesTable with procedure + charge columns 2026-06-20 11:29:10 -06:00
Tyler 19b2eb7eaa fix(frontend): announce blocking validation errors via role=alert
ClaimDrawerError.tsx already wraps its error surface with role=alert
(line 36). Apply the same pattern to the ValidationPanel errors
sub-section so assistive tech announces blocking validation failures
when the drawer opens, matching the established sibling pattern.

Warnings stay decorative (no role change) — they're advisories, not
blocks.
2026-06-20 11:25:28 -06:00
Tyler 88da603c9b feat(frontend): ValidationPanel with rule-grouped errors + warnings 2026-06-20 11:21:54 -06:00
Tyler 702104c26d test(frontend): cover all 6 states in ClaimDrawerHeader badge variant matrix
The parametrized variant test only exercised 4 of the 6 mapped states
(submitted/denied/paid/pending). Add accepted (-> default) and matched
(-> success) so the entire STATE_VARIANT map is verified, not just the
branches whose tokens happened to be easy to reach.
2026-06-20 11:18:50 -06:00
Tyler 8933596c77 feat(frontend): ClaimDrawerHeader with state badge + close button 2026-06-20 11:15:49 -06:00
Tyler 67653f0da8 feat(frontend): ClaimDrawer skeleton + error states 2026-06-20 11:09:41 -06:00
Tyler fb2a98fc7a feat(parsers+api+ui+db): 999 ACK transaction set end-to-end (SP3 P3) 2026-06-20 08:03:37 -06:00
Tyler 8412bdc090 feat(frontend): sidebar Reconciliation nav entry with badge count 2026-06-20 00:04:30 -06:00
Tyler 35ffe31447 refactor(frontend): StatusBadge delegates to ClaimStateBadge; Claims uses API state 2026-06-20 00:03:23 -06:00
Tyler 5ddbbcfc2a feat(frontend): ClaimStateBadge primitive (7 states, same palette) 2026-06-20 00:02:36 -06:00
Tyler 3ddf962da2 feat(frontend): add 6 GET methods (batches, batch, claims, remits, providers, activity) + tests 2026-06-19 19:41:07 -06:00
Tyler 585548e046 feat(frontend): add 1px refetch indicator to Layout 2026-06-19 19:39:33 -06:00
Tyler 6af787614e feat(frontend): add Pagination primitive 2026-06-19 19:37:01 -06:00
Tyler daccb2d223 feat(frontend): add FilterChips primitive 2026-06-19 19:36:41 -06:00
Tyler 511230ec04 feat(frontend): add ErrorState primitive 2026-06-19 19:36:22 -06:00
Tyler fb6730813f feat(frontend): add EmptyState primitive 2026-06-19 19:35:59 -06:00
Tyler f094b250b5 feat(frontend): add Skeleton primitive with scanline-shimmer 2026-06-19 19:35:43 -06:00