BillTracker/client/pages
null 4638d24a1d fix(payoff): correctness, data-integrity & clarity of the payoff simulator
Data integrity (A):
- "Apply … to my budget" overwrote the bill's expected_amount (its real
  recurring amount, used in budgets + payment recording) with the simulated
  payoff payment. Replace with "Save APR to this bill" — persists interest_rate,
  leaves expected_amount untouched. Fixes the corruption AND the interest-free
  root cause (future runs use the saved APR). BillModal debt section also opens
  when a bill has an interest_rate.

Error handling (B):
- Undo now has try/catch + error toast (was an unhandled rejection that left the
  wrong value applied); Apply uses errMessage.
- loadData no longer snaps the selection back to the first bill after a
  save/undo (was a stale-closure over selectedId); background refreshes are
  "silent" so a transient failure no longer replaces the whole page.

Makes-sense (C):
- Distinguish "no APR" from a real 0% and show a notice (was silently interest-
  free with no indication).
- Without a real minimum, show absolute Time-to-Payoff + Total Interest instead
  of a broken "$0 savings" / "~580 mo sooner".
- Remove the arbitrary, mislabeled "Snowball plan" line (was extra applied only
  to the alphabetically-first bill) from the page + chart.
- Detect the 600-month cap (incl. 0% tiny payment) as "won't pay off".
- Correct the "set a minimum on the Snowball page" guidance (no such editor).

Clarity (D):
- Plain-language toasts on every write; targeted HelpCircle tooltips (Interest/
  Time Savings, Total Interest, Required Minimum, APR, Save-APR); a clearer page
  description; states that explain why + what to do.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:09:12 -05:00
..
AboutPage.tsx refactor(brand): adopt new primitives in pages 2026-07-05 17:18:56 -05:00
AdminPage.tsx refactor(ts): move User to @/types + type auth endpoints; add code to 500 (Track C/D) 2026-07-05 12:26:11 -05:00
AnalyticsPage.tsx refactor(brand): adopt new primitives in pages 2026-07-05 17:18:56 -05:00
BankTransactionsPage.tsx refactor(ts): type the bank-ledger API responses (Track C) 2026-07-05 12:02:28 -05:00
BillsPage.tsx perf(ui): useDeferredValue on the Bills + Subscriptions search filters (Phase 2 stack leverage) 2026-07-05 13:16:21 -05:00
CalendarPage.tsx feat(settings): first day of week (plan Tier 3) 2026-07-05 15:57:35 -05:00
CategoriesPage.tsx refactor(ts): CategoriesPage → TypeScript (category list + drag-reorder + expand) 2026-07-04 22:44:39 -05:00
DataPage.tsx refactor(ts): DataPage → TypeScript (section routing + data-section orchestration) 2026-07-04 22:21:48 -05:00
HealthPage.tsx refactor(ts): HealthPage → TypeScript + export makeBillDraft's SourceBill return 2026-07-04 22:19:39 -05:00
LoginPage.tsx refactor(brand): adopt new primitives in pages 2026-07-05 17:18:56 -05:00
NotFoundPage.tsx refactor(ts): convert content pages to TSX (B13) 2026-07-04 20:32:06 -05:00
PayoffPage.tsx fix(payoff): correctness, data-integrity & clarity of the payoff simulator 2026-07-05 18:09:12 -05:00
PrivacyPage.tsx refactor(ts): convert content pages to TSX (B13) 2026-07-04 20:32:06 -05:00
ProfilePage.tsx feat(settings): sign out of other devices (plan Tier 7) 2026-07-05 16:05:59 -05:00
ReleaseNotesPage.tsx refactor(ts): convert content pages to TSX (B13) 2026-07-04 20:32:06 -05:00
RoadmapPage.tsx refactor(brand): adopt new primitives in pages 2026-07-05 17:18:56 -05:00
SettingsPage.tsx feat(settings): default landing page (plan Tier 6) 2026-07-05 16:03:01 -05:00
SnowballPage.tsx refactor(ts): type snowball projection + settings responses (Track C) 2026-07-05 12:16:03 -05:00
SpendingPage.tsx refactor(client): de-duplicate parseUtc + settingEnabled to lib/utils (plan A2/A3) 2026-07-05 14:38:12 -05:00
StatusPage.tsx refactor(ts): StatusPage → TypeScript (server-health dashboard, loose response shape) 2026-07-04 22:33:15 -05:00
SubscriptionCatalogPage.tsx refactor(ts): convert AdminPage + SubscriptionCatalogPage to TSX (B12) 2026-07-04 20:14:30 -05:00
SubscriptionsPage.tsx perf(ui): useDeferredValue on the Bills + Subscriptions search filters (Phase 2 stack leverage) 2026-07-05 13:16:21 -05:00
SummaryPage.tsx refactor(brand): adopt new primitives in pages 2026-07-05 17:18:56 -05:00
TrackerPage.tsx refactor(brand): adopt new primitives in pages 2026-07-05 17:18:56 -05:00