Add unmapped activity warnings to summary widget
epic-bufdir-data-aggregation-ui-task-006 — Extend AggregationSummaryWidget with a warning section that lists activity types that could not be mapped to a Bufdir category, showing the activity name and count of unmapped occurrences. Display an explanatory message that these activities will not appear in the Bufdir report. Use an amber/warning colour token and a warning icon with proper ARIA role annotations.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 3 - 413 tasks
Can start after Tier 2 completes
Implementation Notes
Add an `unmappedActivities` field to AggregationSummaryData as a List
The warning icon should be visually consistent with the rest of the app's icon set.
Testing Requirements
Widget tests using flutter_test: (1) empty unmappedActivities — assert warning section finder returns zero widgets; (2) one unmapped activity — assert section appears, activity name and count are present via find.text; (3) five unmapped activities — assert all five rows rendered; (4) Semantics test — use flutter_test SemanticsHandle to assert alert role is present on warning container; (5) golden test for both states (with/without warnings). All tests should reuse the existing AggregationSummaryWidget test harness from task-008.
For NHF with 1,400 local chapters, rendering a geographic breakdown as a flat list in the AggregationSummaryWidget would produce an unscrollable wall of data that is unusable on a mobile screen. Coordinators need to verify geographic completeness before export, but the raw chapter list is too long to review.
Mitigation & Contingency
Mitigation: Design the geographic distribution section as a collapsible two-level hierarchy: regions are shown expanded by default with their aggregate count, individual chapters are collapsed under each region and expandable on tap. Show only non-zero regions by default with a 'show empty regions' toggle.
Contingency: If the hierarchical display is too complex to implement before the submission deadline, fall back to a region-only summary view with a total count of active chapters per region and a note that chapter-level detail is available in the full export file.
The aggregation BLoC must handle a multi-stage async pipeline with partial success states, warning accumulation across stages, and retry logic for individual failed stages. If the state model is too simplistic (e.g., loading/success/error), warning states and partial results will be lost on retry, confusing coordinators who see warnings disappear and reappear.
Mitigation & Contingency
Mitigation: Model the BLoC state as a rich sealed class hierarchy: AggregationIdle, AggregationRunning(stage, completedStages, accumulatedWarnings), AggregationComplete(result, warnings), AggregationFailed(failedStage, accumulatedWarnings, error). Accumulated warnings persist across retry attempts so coordinators see the full warning history.
Contingency: If state management complexity causes repeated bugs near the deadline, simplify to a single AggregationResult value object that captures success, warnings, and error as nullable fields, and drive both UI components from that single object rather than a live BLoC stream.