diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index bc66519..632f2bd 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -28,7 +28,7 @@ Full details: [`milestones/v1.0-ROADMAP.md`](milestones/v1.0-ROADMAP.md) - [x] **Phase 9: UX Tech Debt Closure** — Fix the three carried-over UX gaps so the deployed build is the polished one technicians actually use (completed 2026-04-13) - [x] **Phase 10: Real-World Runtime Validation** — Validate generated artifacts end-to-end against a live Intune tenant and a real managed endpoint (completed 2026-04-13) -- [ ] **Phase 11: UI Enhancements** — Add printer edit, separate form from list, clickable client names, dark/light mode toggle, and French/English language switch +- [x] **Phase 11: UI Enhancements** — Add printer edit, separate form from list, clickable client names, dark/light mode toggle, and French/English language switch (completed 2026-04-15) ## Phase Details @@ -108,4 +108,4 @@ Full details: [`milestones/v1.0-ROADMAP.md`](milestones/v1.0-ROADMAP.md) | 8. Nyquist Validation Track | v1.1 | 8/8 | Complete | 2026-04-13 | | 9. UX Tech Debt Closure | 3/3 | Complete | 2026-04-13 | 2026-04-13 | | 10. Real-World Runtime Validation | v1.1 | 3/3 | Complete | 2026-04-13 | -| 11. UI Enhancements | 1/4 | In Progress| | | +| 11. UI Enhancements | 4/4 | Complete | 2026-04-15 | | diff --git a/.planning/STATE.md b/.planning/STATE.md index d15e89b..31702cc 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,7 +3,23 @@ gsd_state_version: 1.0 milestone: v1.1 milestone_name: Hardening & Validation current_plan: 3 -status: completed +status: verifying +stopped_at: Completed 11-ui-enhancements/11-04-PLAN.md +last_updated: "2026-04-15T12:54:00.372Z" +last_activity: 2026-04-15 +progress: + total_phases: 4 + completed_phases: 4 + total_plans: 18 + completed_plans: 18 +--- + +--- +gsd_state_version: 1.0 +milestone: v1.1 +milestone_name: Hardening & Validation +current_plan: 3 +status: Phase complete — ready for verification stopped_at: Completed 11-ui-enhancements/11-01-PLAN.md last_updated: "2026-04-15T09:04:38.757Z" last_activity: 2026-04-15 @@ -89,6 +105,8 @@ Full decision log in PROJECT.md Key Decisions table. Milestone v1.0 decisions ar - [Phase 09-ux-tech-debt-closure]: 09-02: conftest.py adapted — imptune.config uses string paths, init_db() takes no args - [Phase 11-ui-enhancements]: 11-01: Plain HTML form in printers_new.html (Option A) — no hx-post, uses action=/printers method=post so browser follows 303 redirect naturally - [Phase 11-ui-enhancements]: 11-01: driver_data context kept in GET /printers handler for future Plan 02 edit modal +- [Phase 11-ui-enhancements]: 11-04: client_id extracted from printers[0].client_id in Jinja2 — no grouped structure change needed +- [Phase 11-ui-enhancements]: 11-04: Unassigned group header plain text — group_client_id is None when client_id absent; no dead anchor ### Active Blockers @@ -102,6 +120,6 @@ None. BLOCKER-01 resolved 2026-04-13 via commits 74535ea (HMAC over IV+ciphertex ## Session Continuity -Last session: 2026-04-15T09:04:38.754Z -Stopped at: Completed 11-ui-enhancements/11-01-PLAN.md +Last session: 2026-04-15T12:54:00.369Z +Stopped at: Completed 11-ui-enhancements/11-04-PLAN.md Resume file: None diff --git a/.planning/phases/11-ui-enhancements/11-04-SUMMARY.md b/.planning/phases/11-ui-enhancements/11-04-SUMMARY.md new file mode 100644 index 0000000..ef85e5e --- /dev/null +++ b/.planning/phases/11-ui-enhancements/11-04-SUMMARY.md @@ -0,0 +1,81 @@ +--- +phase: 11-ui-enhancements +plan: "04" +subsystem: navigation/client-detail +tags: [client-nav, routing, templates, tdd] +dependency_graph: + requires: [11-02, 11-03] + provides: [GET /clients/{id}, client_detail.html, client-name-links] + affects: [imptune/api/pages.py, printer_list.html, client_list.html] +tech_stack: + added: [] + patterns: [grouped-dict-reuse, client_id-from-FK-field] +key_files: + created: + - imptune/templates/client_detail.html + modified: + - imptune/api/pages.py + - imptune/templates/partials/printer_list.html + - imptune/templates/partials/client_list.html +decisions: + - "client_id extracted from printers[0].client_id in Jinja2 template (no grouped structure change)" + - "Unassigned group renders plain text — condition is False when client_id is None" + - "client_detail route placed after /clients to avoid FastAPI path conflict ordering" +metrics: + duration_minutes: 4 + completed_date: "2026-04-15" + tasks_completed: 2 + files_changed: 4 +--- + +# Phase 11 Plan 04: Client Name Navigation Summary + +One-liner: Per-client filtered printer page at GET /clients/{id} with clickable client names in printer group headers and client table, using grouped-dict reuse pattern from existing printer_list partial. + +## What Was Built + +- **GET /clients/{client_id} route** in `imptune/api/pages.py`: queries client by id (404 if not found), builds `grouped = {client.name: [printers]}` dict, passes full context (clients, driver_data) so printer_list partial with Edit/Delete modals works identically to /printers. +- **client_detail.html template**: extends base.html, renders client name as `