docs(inline-filters): append Shipped 2026-04-23 block to design doc
Captures the 6 deviations from the original design (each with driving feedback + commit SHA), the 5 non-design polish commits, and the test delta (42 → 47 passing). Keeps the design doc as the first-read for understanding the feature while preserving decision history from the Checkpoint-1 iteration. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
c26d2e07d0
commit
54080a3e0a
@ -235,3 +235,43 @@ Feature is template-only (no backend behaviour change beyond one new serialised
|
||||
## Next step
|
||||
|
||||
Hand off to `superpowers:writing-plans` after Feature 2 (Payroll Adjustments Browser) has been brainstormed and its design doc committed. Both features can then become either one combined plan or two separate plans — user's choice.
|
||||
|
||||
---
|
||||
|
||||
## 10. Shipped — 2026-04-23
|
||||
|
||||
Implementation and Checkpoint-1 UX approval complete. Everything on this branch before the final push. Sections below list what deviated from the design above, with the driving feedback + commit SHAs.
|
||||
|
||||
### Deviations from the original design
|
||||
|
||||
| # | Original | Shipped | Why |
|
||||
|---|----------|---------|-----|
|
||||
| 1 | Popover **OK** sets pending state; global **Apply** button commits when any pill is dirty (§2, §2.3) | No global Apply. Each popover's **OK** rebuilds the URL and navigates immediately. | Konrad on CP-1: Apply button was far-right + easy to miss, and the dirty-diff on multi-selects was unreliable. `ffb3ef6` |
|
||||
| 2 | Date pill uses **From / To** pickers, both required (§2.1) | **Until** is the always-filled anchor. **From (optional)** blank = single-month (JS submits `from_month = to_month`). Visual order: `From (optional)` left, `Until` right, English reading order. | Konrad on CP-1: "Until must be auto-filled, From optional." `71f8558`, `3fa3cdc` |
|
||||
| 3 | Cross-filter scope = **entire history** (§2.5 Semantics) | Cross-filter + picker lists scoped to the **currently-selected date range**. URL-selected IDs always unioned in so they never vanish. | Konrad on CP-1: "Filter out teams and projects that has no log for any of the dates chosen." `71f8558` |
|
||||
| 4 | Cross-filter **auto-removes** invalid selections and shows a toast (§2.5) | Read-time only: disable invalid options on popover open. No runtime removal, no toast (the next OK submits, so the server handles validation). | Side-effect of (1) — with auto-submit-on-OK there's no pending state to patch. `ffb3ef6` |
|
||||
| 5 | Dashboard "Generate Report" → `?from_month=current&to_month=current` (§2.4) | Same, implemented as `{% now 'Y-m' %}` template tag. | No deviation, just recording. `1d00a3a` |
|
||||
| 6 | Not in scope | **"Last Activity" column** added to All Time Projects table. | Konrad on CP-1 surprise ask. Extends `_build_report_context` with `Max(WorkLog.date)`; mirrored in PDF. `f6975bf` |
|
||||
|
||||
### Polish not in the original design
|
||||
|
||||
| Commit | What |
|
||||
|--------|------|
|
||||
| `5c4162d` | Fixed double-encoded `project_team_pairs_json` — the view was calling `json.dumps(pairs)` AND the template's `\|json_script` filter was re-serialising. Now passes raw list. Regression test added. |
|
||||
| `c1937cd` | Tooltip on **Until** "(ⓘ Single month select)" + shrink `(optional)` helper to 0.6rem |
|
||||
| `0bbf2ca` | Popover border → 2px accent-orange + three-layer shadow so it visually detaches from the report body. Separate light-theme shadow palette. |
|
||||
| `dcc0eeb` | Choices.js dropdown → `position: static` scoped to `.filter-popover` so it flows inline (dropdown was being clipped by `overflow: hidden` and not contributing to the body's scrollHeight). Specificity trick: mirrored Choices.js's own `[aria-expanded]` selector to win the source-order tiebreaker. |
|
||||
| `c26d2e0` | Auto-open Choices dropdown on pill click via `showDropdown(true)` (dropdown was opening hidden until user clicked the input). Helper text colour swapped from `opacity: 0.75` over Bootstrap's `.form-text` default to `var(--text-tertiary)` — was unreadable on the dark card. |
|
||||
|
||||
### Tests
|
||||
|
||||
- 42 → 47 passing, +5 locked-in behaviours:
|
||||
- `InlineFiltersPairsContextTests.test_pairs_context_key_populated`
|
||||
- `test_pairs_excludes_null_project_or_team`
|
||||
- `test_pairs_renders_as_valid_json_in_template` — end-to-end HTML check for the double-encoding bug
|
||||
- `test_pickers_and_pairs_are_date_scoped` — out-of-range entries absent from picker and pair map
|
||||
- `test_url_selected_projects_survive_even_out_of_range` — URL selection unioned into picker list
|
||||
|
||||
### Total churn
|
||||
|
||||
17 commits on `ai-dev` (prior to push). Across the feature: template -375 net, CSS -65 net (rewritten smaller), view +65 net, tests +130 net. Modal partial deleted (-160). JS module -200 after collapsing the pending/dirty/Apply model.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user