Feature Toggles
Feature Detail
Description
This feature provides the per-organization module enable/disable surface that drives the platform's multi-tenant module-toggle architecture. Org Admins toggle areas (e.g. expense-reimbursement, encrypted-assignments, certification-training) on or off for their organization. Toggle state is persisted as tenant configuration, surfaced to clients via the bootstrap response, and enforced server-side on every endpoint belonging to a module. Dependencies between modules are declared in the registry and visualized to avoid silent runtime failures.
Sources & reasoning
§170-186 describes module toggles as the platform's core multi-tenancy mechanism; §180 explicitly names admin-organization as the host for the Feature Toggles UI. Must be MVP because the always-on admin areas need this surface from day one to differentiate tenants.
-
docs/source/likeperson.md · line 174-177Module = Area. The canonical areas defined in the area taxonomy (section 8) are the unit of toggling. Each area ID (e.g. `expense-reimbursement`, `encrypted-assignments`, `certification-training`) is a module
-
docs/source/likeperson.md · line 180Admin Web Portal: `admin-dashboard`, `admin-user-management`, `admin-organization`, `admin-security`. `admin-organization` is always-on because it hosts the Feature Toggles UI itself
Analysis
Feature Toggles is the architectural keystone that lets a single codebase serve five materially different organizations without per-tenant code branches. Without it, Blindeforbundet's encrypted assignments would force NHF into a workflow they don't need, and HLF's course administration would clutter Barnekreftforeningen's app. By making each area a toggleable module, the platform onboards new tenants by picking modules rather than shipping code, dramatically reducing per-tenant engineering cost. It also future-proofs growth: a sixth or seventh organization can be added without touching the codebase, which is essential for the Bufdir-funded scale ambition.
Backed by the organization_modules table (one_to_many with organizations) recording the enabled module set keyed by area ID. The admin portal exposes a toggle UI grouped by always-on vs toggleable modules; always-on modules (authentication-access-control, home-navigation, accessibility, help-support, profile-management on mobile; admin-dashboard, admin-user-management, admin-organization, admin-security on admin) are non-toggleable. Enabling a module with dependencies implicitly enables required modules with a visible explanation. The API exposes the enabled set in the session/bootstrap response; every module-scoped endpoint checks membership server-side. Clients render nav and entry points dynamically from the set.
Quality Assurance
Organization Administrator (primary) · Global Administrator (same flow, when time-bounded support access is granted)Organization Administrator
Quick UAT
- Logg inn i Admin-portalen som Organisasjonsadministrator og Ă„pne Organisasjon â Funksjonsbrytere.
- Bekreft at listen viser alle togglable moduler med av/pÄ-bryter, og at alltid-pÄ-moduler (admin-organization, admin-dashboard, admin-user-management, admin-security) vises som lÄste.
- SlÄ pÄ modulen 'Utgifter og refusjon' (expense-reimbursement) og bekreft at lagre-knappen blir aktiv.
- Trykk Lagre og bekreft at statusmeldingen 'Endringer lagret' vises og at bryteren forblir i pÄ-stilling etter siden lastes pÄ nytt.
- ForsÞk Ä slÄ av 'Organisasjonsadministrasjon' (admin-organization) og bekreft at bryteren er deaktivert med forklaring om sirkulÊr avhengighet.
- SlÄ av en modul som har avhengige moduler aktivert (f.eks. forsÞk Ä slÄ av en modul som encrypted-assignments avhenger av) og bekreft at en bekreftelsesdialog forklarer kaskade-effekten fÞr endringen kan lagres.
- à pne mobilappen som testbruker i samme organisasjon, logg inn pÄ nytt og bekreft at navigasjonen nÄ inkluderer 'Utleggsregistrering' i samsvar med den nye toggle-tilstanden.
Quick UAT â Accessibility
-
Logg inn i Admin-portalen som Organisasjonsadministrator og Ă„pne Organisasjon â Funksjonsbrytere.
- Screen reader Sideoverskrift 'Funksjonsbrytere' annonseres ved sideÄpning; landmark 'main' annonseres.
- Keyboard / focus Hovedmeny nÄs med Tab; undermeny 'Organisasjon' Äpnes med Enter eller Mellomrom.
- Focus visibility Synlig fokusring pÄ menyelementer; aktivt menyvalg har aria-current=page.
-
Bekreft at listen viser alle togglable moduler med av/pÄ-bryter, og at alltid-pÄ-moduler (admin-organization, admin-dashboard, admin-user-management, admin-security) vises som lÄste.
- Screen reader Hver bryter annonseres som 'Modul <navn>, bryter, av/pÄ'; lÄste moduler annonseres som 'utilgjengelig, alltid aktivert'.
- Keyboard / focus Tab beveger seg gjennom bryterne i listerekkefÞlge; lÄste brytere hoppes ikke over men kan ikke aktiveres.
- Contrast Status (pĂ„/av/lĂ„st) formidles med bĂ„de ikon, tekstetikett og farge â ikke kun farge. 4.5:1 kontrast pĂ„ tekst.
-
SlÄ pÄ modulen 'Utgifter og refusjon' (expense-reimbursement) og bekreft at lagre-knappen blir aktiv.
- Screen reader Bryter annonseres som 'Utgifter og refusjon, pÄ'; lagre-knappen annonseres som 'tilgjengelig' nÄr den blir aktiv.
- Keyboard / focus Bryter aktiveres med Mellomrom; lagre-knapp nÄs med Tab.
- Touch target Bryter og lagre-knapp er minst 24Ă24 CSS-piksler.
-
Trykk Lagre og bekreft at statusmeldingen 'Endringer lagret' vises og at bryteren forblir i pÄ-stilling etter siden lastes pÄ nytt.
- Focus visibility Fokus forblir pÄ lagre-knappen etter lagring; ingen fokus-tap.
- Live region 'Endringer lagret' annonseres via aria-live=polite region uten Ă„ flytte fokus.
-
ForsÞk Ä slÄ av 'Organisasjonsadministrasjon' (admin-organization) og bekreft at bryteren er deaktivert med forklaring om sirkulÊr avhengighet.
- Screen reader Bryter annonseres som 'utilgjengelig'; tilhĂžrende forklaringstekst er knyttet via aria-describedby og leses opp.
- Contrast Deaktivert tilstand formidles med ikon + tekst, ikke kun nedtonet farge.
-
SlÄ av en modul som har avhengige moduler aktivert (f.eks. forsÞk Ä slÄ av en modul som encrypted-assignments avhenger av) og bekreft at en bekreftelsesdialog forklarer kaskade-effekten fÞr endringen kan lagres.
- Screen reader Dialogen annonseres som 'dialog, Bekreft kaskade-deaktivering'; liste over pÄvirkede moduler leses opp.
- Keyboard / focus Fokus flyttes til dialogens fĂžrste interaktive element; Esc lukker dialogen; Tab-fellen holder fokus inne i dialogen.
- Focus visibility Synlig fokusring pÄ Bekreft/Avbryt-knapper; fokus returnerer til utlÞsende bryter ved lukking.
-
à pne mobilappen som testbruker i samme organisasjon, logg inn pÄ nytt og bekreft at navigasjonen nÄ inkluderer 'Utleggsregistrering' i samsvar med den nye toggle-tilstanden.
- Screen reader Ny nav-fane 'Utleggsregistrering' annonseres som del av bunnav-listen.
- Zoom Funksjonsbryter-listen og dialogene er brukbare ved 200% zoom; ingen horisontal scrolling kreves pÄ desktop.
Role Boundaries
4 role(s) must NOT access this feature-
Peer Mentor (Likeperson)
Funksjonsbrytere finnes ikke i mobilappens navigasjon; admin-portalen er ikke tilgjengelig for denne rollen. Direkte API-kall til toggle-endepunkter returnerer 403.
-
Coordinator (Koordinator)
Funksjonsbrytere finnes ikke i mobilappens navigasjon; admin-portalen er ikke tilgjengelig for denne rollen. Direkte API-kall til toggle-endepunkter returnerer 403.
-
Global Administrator
Kan kun se og endre en organisasjons funksjonsbrytere nÄr organisasjonen har gitt tidsbegrenset stÞtte-tilgang; uten aktiv grant returnerer siden 403 og handlingen logges ikke i organisasjonens revisjonsspor.
-
Prospective Buyer
Har ingen pÄlogging til admin-portalen; toggle-siden er ikke nÄbar via salgsnettstedet og direkte URL returnerer 403/redirect til offentlig landingsside.
Expected End State
Den valgte modulen er aktivert i organisasjonens enabled-module-sett, lagret transaksjonelt i module-toggle-store, og synlig som ny navigasjon/funksjonalitet i mobilappen ved neste innlogging. Eventuelle avhengige moduler er kaskade-aktivert. Endringen er logget i organisasjonens audit-log med administratorens identitet og tidsstempel.
Components (8)
Shared Components
These components are reused across multiple features
User Stories
No user stories have been generated for this feature yet.