Build Hierarchy Node Editor Screen
epic-organizational-hierarchy-management-admin-portal-task-015 — Implement the modal/screen for creating and editing hierarchy nodes. Include fields for node name, type (chapter/region/national/local), and parent unit selector using the tree view. Provide validation feedback from the HierarchyStructureValidator inline. Support both create-new and edit-existing modes. On save, call HierarchyService and propagate cache invalidation.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 5 - 253 tasks
Can start after Tier 4 completes
Implementation Notes
Use a single HierarchyNodeEditorCubit with a NodeEditorState that holds all form field values and validation status. The cubit accepts an optional HierarchyNode? existingNode in its constructor — if non-null, initialize state with existing values (edit mode). Run HierarchyStructureValidator synchronously within the cubit on each field update event; this keeps validation fast and avoids async complexity.
For the parent unit selector, open the HierarchyTreeView as a picker by pushing a route that returns a HierarchyNode? via Navigator.pop(context, selectedNode). Store the returned node in the cubit state. Use a GlobalKey
After a successful save, call a cache invalidation method on HierarchyService (or emit a cache-bust event via a shared repository) before popping the screen.
Testing Requirements
Write widget tests for: (1) create mode renders empty form, (2) edit mode pre-fills all fields, (3) empty name shows validation error on save, (4) invalid type-parent combination shows inline validator error, (5) save button disabled while errors present, (6) successful create calls HierarchyService.createNode and pops screen, (7) successful edit calls HierarchyService.updateNode and pops screen, (8) API error shows error banner without closing screen, (9) loading state shown during save. Unit test HierarchyStructureValidator logic independently with all valid and invalid combinations. Aim for 90%+ coverage on validator and 80%+ widget coverage on the editor screen.
If the AccessScopeService and the Supabase RLS policies use different logic to determine accessible units, a coordinator could see data in the client that RLS blocks server-side, causing confusing empty states, or worse, RLS could block data the scope service declares accessible.
Mitigation & Contingency
Mitigation: Define the canonical scope computation in a single Supabase Postgres function shared by both the RLS policies and the RPC endpoint called by AccessScopeService. The client-side service calls this RPC rather than reimplementing the logic, ensuring a single source of truth.
Contingency: Add integration tests that execute the same access decision through both the RLS policy path and the AccessScopeService path and assert identical results. Use these as regression guards in the CI pipeline.
When a user switches active chapter via the ChapterSwitcher, widgets that are already built may not receive the context-change event if they subscribe incorrectly to the ActiveChapterState BLoC, leading to stale data being displayed under the new chapter context.
Mitigation & Contingency
Mitigation: Use Riverpod's ref.watch on the active chapter provider at the root of each scoped data subtree rather than at individual leaf widgets. Trigger a global data refresh by invalidating all scoped providers when the chapter changes.
Contingency: Add an app-level chapter-change listener that forces a full navigation stack reset to the home screen on chapter switch, guaranteeing all widgets rebuild from scratch with the new context. Accept the UX cost of navigation reset for correctness.
Non-technical organization administrators may find the hierarchy management interface too complex for the structural changes they need to make frequently (e.g., chapter renaming, coordinator reassignment), leading to low adoption and continued reliance on manual processes.
Mitigation & Contingency
Mitigation: Conduct usability testing with at least one NHF administrator before finalizing the admin portal screen layout. Prioritize the most common operations (rename, reparent, add child) as primary actions in the UI. Include inline help text and confirmation dialogs with plain-language descriptions of consequences.
Contingency: Provide a simplified 'quick edit' mode that exposes only the three most common operations (rename, deactivate, add child) and hides advanced structural operations behind an 'Advanced' toggle.