diff --git a/docs/TODO.md b/docs/TODO.md index edb4ba2..651162e 100755 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -148,7 +148,59 @@ slots stay put whether they were ever settled or not. The two anchorings differ here on purpose (AGENTS.md §1's schedule invariant), and unifying them would reintroduce the bug the anchored model exists to fix. -## 4. Visual redesign, sub-project 3 — Year, Summary, Post detail +## 4. Anchored-model follow-ups left after the merge with main + +The anchored model was merged on 2026-09-30, after main had gained budget +folders, placement and nested bills. Everything below is known and unfinished. + +### "+ New recurring cost…" is offered for a purchase with no post + +`newCostOptionIsSelectable` in `src/ui/recurringForm.ts` checks only the date. +A bill needs at least one destination post (`requireRecurringSplitDestinations` +in `src/store/actions.ts`), so a purchase left unassigned (no splits) can pick +the option, and Save is then refused with "A bill needs a destination post". +The error surfaces and the dialog stays open, so nothing is lost — but it is a +doomed save the dialog could have prevented. Disable the option, with the +reason, while the draft has no splits, the same way a month-only date disables +the day-granular units. + +### A bill created from the purchase dialog has no folder choice + +Settings' new-bill form picks a folder; the dialog's "+ New recurring cost…" +does not. The new bill nests under its post when it has exactly one split +(the same default Settings applies), otherwise it lands in Unfiled and has to +be moved from Budget folders. Decide whether the dialog needs the picker or +whether moving it afterwards is fine for an occasional action. + +### "Unlink from bill" was replaced by the Recurring cost select + +Main had an "Unlink from bill" checkbox on an edited purchase; the merge +dropped it because choosing "None" in the anchored model's "Recurring cost" +select does the same thing (and `updatePurchase` now honours an explicit +`source: undefined`). Its copy said "the occurrence will show as expected +again", which is true for a `calendar` bill and meaningless for a +`lastCharge` one, whose next due date simply re-derives from the remaining +charges. Confirm the owner does not miss the checkbox; nothing tests its +absence. + +### Not yet driven in a browser + +The merge was checked by the full suite, `tsc`, a build, and screenshots of +the month page and Settings with demo data (both render, no console errors, +Car insurance shows "Next 2026-10-19" after charges on 3 and 19 September). +Not yet clicked through by anyone: + +- tagging a new purchase to an existing anchored bill and seeing its next due + date move in the Budget tree and in Expected; +- "+ New recurring cost…" end to end, including where the new bill appears in + Budget folders; +- untagging an edited purchase via "None"; +- the Settings anchoring control switching a never-charged monthly bill to + "the last charge" (its month-only start should expand to the 1st and the + Month/Date precision control should disappear), and being locked once the + bill has a charge. + +## 5. Visual redesign, sub-project 3 — Year, Summary, Post detail The owner's brief for the whole redesign: *"right now it looks a bit boring, simple and ugly. We want sleek, modern, and nice to use."* On scoping: both @@ -188,7 +240,7 @@ than re-decide** (spec: `2026-09-02-month-view-design.md`): phone. `formatMoney` is still right wherever an amount can be in some other currency — every purchase row, for one. -## 5. Visual redesign, sub-project 4 — dialogs and fast entry +## 6. Visual redesign, sub-project 4 — dialogs and fast entry Untouched. Native `