medium priority low complexity frontend pending frontend specialist Tier 4

Acceptance Criteria

Each integration card displays a '⋮' overflow menu containing a 'Delete Integration' action
Tapping 'Delete Integration' opens a modal confirmation dialog before any API call is made
The confirmation dialog clearly states what data will be affected (e.g., sync history, field mappings) in plain language
The dialog has two actions: 'Cancel' (dismisses, no change) and 'Delete' (destructive, highlighted in red or error color)
On confirming delete, DELETE /organizations/{orgId}/integrations/{integrationId} is called
While delete API call is in flight, the confirm button shows a loading spinner and cannot be tapped again
On success, the card is removed from the dashboard list with a FadeTransition animation (duration ~300ms)
A success toast appears after the card is removed confirming the integration name was deleted
On delete API error, the dialog remains open and shows an inline error message — the card is not removed
The overflow menu action is not available to roles without delete permission (coordinator read-only must not see it)
The delete action and dialog meet WCAG 2.2 AA — dialog announces itself to screen readers and focus is trapped while open

Technical Requirements

frameworks
Flutter
BLoC
apis
Integration Config Service REST API — DELETE /organizations/{orgId}/integrations/{integrationId}
performance requirements
Fade-out animation completes within 400ms for perceived snappiness
Delete API call must not block UI thread — dispatched asynchronously
security requirements
Delete action visible only to users with admin or integration-manager role — enforced via role check in widget and RLS on the backend
Organization ID scoped from JWT — client cannot delete integrations belonging to another org
Soft-delete preferred over hard-delete if audit trail of past sync configurations is required
ui components
PopupMenuButton with 'Delete Integration' item on each card
DeleteConfirmationDialog widget (reusable, accepts integration name and impact description)
AnimatedSwitcher or FadeTransition for card removal animation
SnackBar for post-deletion success toast

Execution Context

Execution Tier
Tier 4

Tier 4 - 323 tasks

Can start after Tier 3 completes

Integration Task

Handles integration between different epics or system components. Requires coordination across multiple development streams.

Implementation Notes

Implement DeleteConfirmationDialog as a standalone reusable widget that accepts integrationId, integrationName, and an onConfirm callback — keep it decoupled from the BLoC to allow reuse. The DashboardCubit should expose a deleteIntegration(id) method that: sets per-card loading state, calls the API, on success removes the entry from the list. Use AnimatedList or an AnimatedSwitcher wrapping the card list to animate removal cleanly — avoid rebuilding the entire list on delete. The data impact description in the confirmation dialog should be dynamic based on integration type (Xledger vs Dynamics vs Bufdir) so coordinators understand what is lost.

Role gating: check user role from Riverpod auth state provider before rendering the overflow menu item.

Testing Requirements

Write widget tests for the integration card verifying: overflow menu shows delete option for admin role, does not show for read-only role. Write widget tests for DeleteConfirmationDialog verifying: cancel dismisses without API call, confirm triggers API call with correct integration ID, error state shows inline message. Write unit tests for DashboardCubit covering: delete success → integration removed from list state, delete error → list unchanged. Verify fade animation completes without exceptions using pumpAndSettle in widget tests.

Epic Risks (4)
medium impact high prob technical

The multi-step Integration Setup Wizard must render different credential fields, field mapping targets, and validation rules depending on the selected integration type. If the type-specific branching logic is implemented as conditional widget trees rather than driven by the Integration Type Registry, the wizard becomes unmaintainable and adding new integration types requires UI code changes.

Mitigation & Contingency

Mitigation: Design the wizard to be metadata-driven from the Integration Type Registry from day one. Credential form fields, required field validation, and mapping target lists are all fetched from the registry, not hardcoded in widgets. Implement one integration type end-to-end first (Xledger) to validate the pattern before building the others.

Contingency: If the metadata-driven approach proves too complex for the initial delivery, implement Xledger and Dynamics as hardcoded wizard variants and create a registry-driven refactor as a follow-up technical debt ticket with a fixed deadline.

medium impact medium prob dependency

The Excluded Features Configuration Panel must wire directly into the feature flag system to suppress HLF app features. If the feature flag system does not yet expose a writable admin interface, this panel cannot save its configuration, blocking the HLF-specific acceptance criteria.

Mitigation & Contingency

Mitigation: Verify that the Organization-scoped Feature Flags feature (a declared dependency) exposes a Dart API for programmatic flag writes before starting this panel. Coordinate with the feature flags team to ensure the write API is available. If needed, schedule this panel as the last item in the epic.

Contingency: If the feature flag write API is unavailable at implementation time, store excluded features in the integration's JSONB settings column and wire them into a local feature flag provider that merges database state with the standard flag system at app startup.

high impact medium prob scope

The Field Mapping Editor's usability for non-technical org admins is high-risk. If the visual mapping interface is confusing, admins will configure incorrect mappings that cause silent data corruption in accounting exports — a serious financial risk discovered only at month-end reconciliation.

Mitigation & Contingency

Mitigation: Conduct usability testing with at least one admin user from Blindeforbundet on the field mapping editor prototype before full implementation. Provide descriptive labels and sample data values for all fields. Add a 'test mapping' preview that shows a transformed sample record before saving.

Contingency: If usability testing reveals the visual editor is too complex, implement a simplified list-based mapping editor (select app field → select external field, one row at a time) as a fallback, deferring the drag-and-drop visual editor to a future iteration.

medium impact medium prob technical

The Credential Management Form's masked fields and connection-test flow may conflict with screen reader requirements — VoiceOver and JAWS must be able to navigate the form, understand which fields are already configured, and receive feedback on connection test results without exposing credential values in accessible text.

Mitigation & Contingency

Mitigation: Design accessible semantics labels for masked fields (e.g., 'API key: configured, last 4 characters: abcd') from the start. Use Flutter's Semantics widget to provide screen-reader-specific text that differs from visual display. Test with VoiceOver on iOS and TalkBack on Android during development, not only at QA.

Contingency: If accessibility conflicts with security requirements for the credential form, implement a separate 'accessibility mode' flow where credential configuration is done through a separate confirmation step that provides more explicit semantic feedback without risk of value exposure.