medium complexity extracted User Management Confidence: 100%
7
Components
2
Shared
0
User Stories
Yes
Analyzed

Description

Provides full create, read, update, and delete operations for user accounts within the Admin Web Portal. Organization administrators can invite new users via email, edit existing user profiles, deactivate accounts, and reactivate them as needed. The interface includes a searchable, filterable user list with key attributes visible at a glance, plus detailed edit pages for individual user records. Coordinators and Peer Mentors are managed as data records here - they never log in to the admin portal themselves, so this CRUD surface is the only way to provision and maintain their accounts. Org Admins and Global Admins do log in directly and are also managed through the same interface with tenant-scoped isolation.

Sources & reasoning

Source explicitly lists User CRUD as a feature of admin-user-management and as MVP scope for the Admin Web Portal. Coordinators/peer mentors are provisioned exclusively here, making CRUD the operational entry point for every other admin workflow.

  • docs/source/likeperson.md · line 244-247
    Admin Web Portal (MVP scope): - Brukeradministrasjon (invitere, deaktivere, rolletildeling)
  • admin-user-management | User Management | User CRUD, Role Assignment, Bulk Actions
  • Coordinators and Peer Mentors are **managed** inside the admin portal (invitations, role assignment, deactivation) but never log in to it

Analysis

Business Value

User CRUD is the operational foundation of the Admin Web Portal - without it, organizations cannot onboard peer mentors or coordinators, and the mobile app has no users to authenticate. Every other administrative workflow (role assignment, activity oversight, expense approval) presupposes that user records exist and are maintained. From a business standpoint, this feature enables organizations to self-serve their member lifecycle without Norse support intervention, which is essential for the multi-tenant scaling model. It also enforces tenant isolation: each Org Admin sees only their organization's users, protecting privacy across the four pilot organizations and any future tenants.

Implementation Notes

Implemented as Next.js SSR pages under `/admin/users` with server actions calling the shared REST API. The user list page supports pagination, search, and filtering; the edit page validates input server-side and persists to the `users` table with audit log entries on every mutation. Invitation flow generates a one-time token, persists it, and triggers a transactional email (Mailgun planned). Deactivation is a soft delete via a status flag so historical activity records retain referential integrity. Tenant scoping is enforced at the API layer - every query filters by the caller's organization_id, and Global Admins require an explicit time-bounded support-access flag to view another org's users.

Quality Assurance

Organization Administrator (primary) · Global Administrator (time-bounded support access)
1
Scenarios
7
UAT Steps
19
A11y Annotations
4
Role Boundaries
Organization Administrator

Organization Administrator

Quick UAT

  1. Logg inn i Admin-portalen som Organisasjonsadministrator. Åpne Brukeradministrasjon → Brukere.
  2. SÞk etter en e-postadresse i sÞkefeltet og filtrer pÄ rolle 'Likeperson' og status 'Aktiv'.
  3. Trykk 'Inviter ny bruker'. Fyll inn navn, e-post og velg rolle 'Likeperson'. Send invitasjon.
  4. Bekreft at den nye brukeren vises i listen med status 'Invitert' og at invitasjons-e-post er sendt.
  5. Åpne en eksisterende bruker fra listen. Rediger navn og bytt rolle til 'Koordinator'. Lagre.
  6. Trykk 'Deaktiver' pÄ samme bruker og bekreft i dialogen.
  7. Filtrer listen pĂ„ status 'Deaktivert'. Åpne brukeren og trykk 'Reaktiver'. Bekreft at status gĂ„r tilbake til 'Aktiv' og at historiske aktiviteter fortsatt vises.

Quick UAT — Accessibility

  1. Logg inn i Admin-portalen som Organisasjonsadministrator. Åpne Brukeradministrasjon → Brukere.
    • Screen reader Sidetittel 'Brukere' annonseres; tab-rekkefĂžlge: hovedmeny → sidetittel → sĂžk → filter → tabell.
    • Keyboard / focus Alle navigasjonselementer nĂ„bare med Tab; ingen tastaturfeller.
    • Focus visibility Synlig fokusring pĂ„ sidemenylenker og 'Inviter ny bruker'-knapp.
  2. SÞk etter en e-postadresse i sÞkefeltet og filtrer pÄ rolle 'Likeperson' og status 'Aktiv'.
    • Screen reader SĂžkefelt annonseres med label 'SĂžk brukere'; filter-comboboxer annonserer valgt verdi.
    • Keyboard / focus Filter-comboboxer Ă„pnes med Enter/Space, navigeres med piltaster, lukkes med Esc.
    • Live region 'Viser X brukere' annonseres hĂžflig nĂ„r resultatlisten oppdateres.
  3. Trykk 'Inviter ny bruker'. Fyll inn navn, e-post og velg rolle 'Likeperson'. Send invitasjon.
    • Screen reader Obligatoriske felt annonseres som 'pĂ„krevd'; valideringsfeil leses opp ved aria-describedby.
    • Keyboard / focus Tab-fellesyklus inne i modal; Esc lukker uten Ă„ sende.
    • Focus visibility Modal-fokus settes pĂ„ fĂžrste felt; fokus returnerer til 'Inviter'-knapp ved lukking.
  4. Bekreft at den nye brukeren vises i listen med status 'Invitert' og at invitasjons-e-post er sendt.
    • Live region 'Invitasjon sendt til e-postadresse. Brukeren er lagt til i listen.'
    • Contrast Statusbadge 'Invitert' har 4.5:1 kontrast og bruker bĂ„de farge og tekstetikett.
  5. Åpne en eksisterende bruker fra listen. Rediger navn og bytt rolle til 'Koordinator'. Lagre.
    • Keyboard / focus Rad Ă„pnes med Enter; rediger-skjema er en sammenhengende tab-sekvens.
    • Focus visibility Synlig fokus pĂ„ alle inputfelt og 'Lagre'-knapp; label er programmatisk koblet til felt.
    • Zoom Skjemaet er brukbart ved 200% zoom uten horisontal scroll.
  6. Trykk 'Deaktiver' pÄ samme bruker og bekreft i dialogen.
    • Screen reader Bekreftelsesdialog annonseres som 'dialog' med tittel og beskrivelse.
    • Focus visibility Initialfokus pĂ„ 'Avbryt' (sikker default); Esc avbryter.
    • Touch target Knapper i dialog er minst 24×24 CSS-piksler.
  7. Filtrer listen pĂ„ status 'Deaktivert'. Åpne brukeren og trykk 'Reaktiver'. Bekreft at status gĂ„r tilbake til 'Aktiv' og at historiske aktiviteter fortsatt vises.
    • Live region 'Bruker reaktivert. Status er nĂ„ Aktiv.'
    • Contrast Status-overgang 'Deaktivert' → 'Aktiv' kommuniseres med bĂ„de tekst og farge, ikke farge alene.

Role Boundaries

4 role(s) must NOT access this feature
  • Peer Mentor (Likeperson)

    Har ingen pÄlogging til Admin-portalen. Deep-link til /admin/users returnerer 403; bruker omdirigeres til mobilappens pÄloggingsskjerm.

  • Coordinator (Koordinator)

    Har ingen pÄlogging til Admin-portalen. Brukeradministrasjon er ikke synlig i noen navigasjon for denne rollen; deep-link returnerer 403.

  • Global Administrator

    Ser ikke organisasjonens brukerliste som standard. Tilgang krever tidsbegrenset support-grant fra Org Admin; uten aktiv grant returnerer /admin/users 403 og forsĂžket logges i organisasjonens audit-trail.

  • Prospective Buyer

    Har ingen konto i plattformen. Admin-portalen er ikke lenket fra Sales Website; direkte URL returnerer pÄloggingsskjerm uten registreringsmulighet.

Expected End State

Brukerlisten reflekterer alle endringer: nye inviterte brukere vises med status 'Invitert' og e-post er sendt, redigerte profiler er lagret med ny rolle, deaktiverte brukere er markert 'Deaktivert' uten Ă„ miste historiske aktivitetsdata, og reaktiverte brukere returnerer til status 'Aktiv'. Alle endringer er logget i organisasjonens audit-trail.

User Stories

No user stories have been generated for this feature yet.