docs: update progress.txt with iteration 40 (Task 10.8 complete — TC 6-chart dashboard)

This commit is contained in:
Andrew Charlwood
2026-02-06 22:24:47 +00:00
parent ea6b9065bf
commit 9c783a7e4e
+62
View File
@@ -2306,3 +2306,65 @@ Console error: `WARN: Multiple implied roots, cannot build icicle hierarchy of t
- The query wrappers are ready: `get_trust_market_share`, `get_trust_cost_waterfall`, `get_trust_dosing`, `get_trust_heatmap`, `get_trust_durations`, and existing `get_pathway_costs`
### Blocked items:
- None
## Iteration 40 — 2026-02-06
### Task: 10.8 — Trust Comparison 6-chart dashboard
### Why this task:
- Task 10.7 (TC landing page + directorate selector) was completed in iteration 39
- Progress.txt from iteration 39 explicitly recommended Task 10.8 as next
- This is the core data visualization task for Trust Comparison — replacing 6 placeholder charts with real implementations
### Status: COMPLETE
### What was done:
- **Added 3 new visualization functions** to `src/visualization/plotly_generator.py`:
1. `create_trust_market_share_figure(data, title)` — horizontal stacked bars grouped by trust (drugs as segments), short trust names for readability
2. `create_trust_heatmap_figure(data, title, metric)` — trust × drug matrix with NHS blue colorscale, shortened trust names on y-axis
3. `create_trust_duration_figure(data, title)` — grouped horizontal bars with one trace per trust, drugs on y-axis
- **Replaced 6 placeholder callbacks** in `dash_app/callbacks/trust_comparison.py`:
1. **Market Share**: `get_trust_market_share` → `create_trust_market_share_figure` (new function)
2. **Cost Waterfall**: `get_trust_cost_waterfall` → mapped `trust_name→directory` key → reused `create_cost_waterfall_figure`
3. **Dosing**: `get_trust_dosing` + directory field injection → reused `create_dosing_figure(group_by="trust")`
4. **Heatmap**: `get_trust_heatmap` → `create_trust_heatmap_figure` (new function)
5. **Duration**: `get_trust_durations` → `create_trust_duration_figure` (new function)
6. **Cost Effectiveness**: existing `get_pathway_costs(directory=selected)` + `calculate_retention_rate` → reused `create_cost_effectiveness_figure`
- Added helper functions: `_tc_empty()` for empty state messages, `_tc_title()` for chart title generation
- All 6 callbacks respond to `selected_comparison_directorate`, `date_filter_id`, and `chart_type` from app-state
- All use `prevent_initial_call=True` to avoid rendering when no directorate selected
### Validation results:
- Tier 1 (Code): `from dash_app.app import app` — OK, 20 callbacks registered
- Tier 1 (App starts): `python run_dash.py` → "Dash is running on http://127.0.0.1:8050/" — no errors
- Tier 3 (Functional — directory mode, RHEUMATOLOGY):
- Market Share: 42 rows, 17 traces (drug traces across 6 trusts)
- Cost Waterfall: 6 trusts, 1 trace (bars)
- Dosing: 40 entries, 1 trace (grouped by trust)
- Heatmap: 6 trusts × 17 drugs
- Duration: 40 entries, 6 traces (one per trust)
- Cost Effectiveness: 38 pathways, 39 traces (sticks + dots)
- Tier 3 (Functional — indication mode, asthma):
- Market Share: 3 rows, 2 traces
- Cost Waterfall: 2 trusts
- Dosing: 3 entries
- Heatmap: 2 trusts × 2 drugs
- Duration: 3 entries, 2 traces
- Cost Effectiveness: 0 pathways (expected — no multi-drug pathways for asthma)
### Files changed:
- `src/visualization/plotly_generator.py` — Added 3 trust-comparison figure functions (~306 new lines)
- `dash_app/callbacks/trust_comparison.py` — Replaced 6 placeholders with real chart callbacks
- `IMPLEMENTATION_PLAN.md` — Task 10.8 marked [x]
### Committed: ea6b906 "feat: Trust Comparison 6-chart dashboard with real data (Task 10.8)"
### Patterns discovered:
- Reusing existing visualization functions by mapping data keys (e.g., `trust_name` → `directory`) is cleaner than creating entirely new functions for identical chart types. Cost Waterfall and Dosing both reused existing functions.
- The `_dosing_by_trust` helper in `create_dosing_figure` expects a `directory` key even when data is already scoped to one directory. Adding the field in the callback is the simplest fix.
- Trust names are long ("CAMBRIDGE UNIVERSITY HOSPITALS NHS FOUNDATION TRUST") — `short_trust()` helper strips common suffixes for chart readability.
- Cost Effectiveness for indication mode with narrow indications (like "asthma") may return 0 pathways at level 4+ since patients are on single drugs. The empty state handler covers this gracefully.
### Next iteration should:
- Start Task 10.9 — Patient Pathways filter relocation
- Key sub-steps:
1. Drug/trust/directorate filter buttons (with count badges) should only be visible on Patient Pathways view
2. They should be hidden when on Trust Comparison view
3. The filter bar currently lives inside `dash_app/components/filter_bar.py` and is placed inside the patient-pathways-view container in `app.py` — check if it's already correctly scoped
4. If filter_bar is already ONLY in patient-pathways-view, this may be largely done. Verify the filter modals still work and "Clear All Filters" still works
5. Read `dash_app/app.py` to see current layout structure — is filter_bar inside patient-pathways-view or outside?
6. Read `docs/PHASE10_DESIGN.md` Section 5 for the design spec on pathway filter placement
- If filter_bar is already in the right place, this task may just need verification and minor CSS adjustments per the design spec
### Blocked items:
- None