high priority low complexity frontend pending frontend specialist Tier 3

Acceptance Criteria

Step 1 renders exactly 5 selectable integration type cards: Xledger, Microsoft Dynamics, Cornerstone, Consio, Bufdir
Each card displays integration name, a recognisable icon, and a one-sentence description of the integration purpose
Selecting a card updates wizard state with the chosen integration type and visually marks the card as selected (border, checkmark, or highlight using design tokens)
Only one card can be selected at a time; selecting a new card deselects the previous
Forward navigation button in wizard shell becomes enabled only after a card is selected
Selecting an integration type pre-populates the credential field schema for step 2 (Credential Management Form) based on the chosen type
Each integration type maps to a distinct credential schema: Xledger (API key + org code), Dynamics (Azure AD client ID/secret + tenant ID), Cornerstone (base URL + API key), Consio (username + password + endpoint), Bufdir (organisation number + report period config)
Cards are keyboard and screen-reader accessible: each card is a semantically labelled selectable widget with selected state announced
Step renders within 100ms with no async dependency — all integration type metadata is static/local

Technical Requirements

frameworks
Flutter
Riverpod
performance requirements
All integration type metadata loaded statically — zero network calls on this step
Card selection state update must reflect in UI within one frame (16ms)
security requirements
No credential data collected on this step — purely type selection
Integration type constants must not expose internal API endpoint URLs in client code
ui components
IntegrationTypeCard widget (icon, title, description, selected state)
IntegrationTypeSelectionGrid (wraps cards in a responsive grid)
Integration type icon assets for Xledger, Dynamics, Cornerstone, Consio, Bufdir

Execution Context

Execution Tier
Tier 3

Tier 3 - 413 tasks

Can start after Tier 2 completes

Integration Task

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

Implementation Notes

Define an IntegrationType enum (xledger, dynamics, cornerstone, consio, bufdir) with a companion extension providing displayName, description, iconAsset, and credentialSchema. Keep all metadata in a const map — no API call needed. credentialSchema per type should be a List {fieldKey, label, inputType (text/password/url), isRequired}. Expose selected type via Riverpod provider consumed by both this step and the Credential Management Form step.

Use design token border/accent colors for selected state — avoid hardcoded values. Cards should use the existing card component pattern from the design system; do not create a one-off styled container.

Testing Requirements

Widget tests: render all 5 cards, tap one and assert selected state, tap a second and assert first deselected, assert forward button enabled after selection. Unit tests: credential schema pre-population — verify each integration type maps to the correct credential field list. Accessibility: verify each card has semanticsLabel and selected semantics property toggling correctly. Coverage target: 90% on selection logic and schema mapping.

Component
Integration Setup Wizard
ui high
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.