User Management › Invite Staff
🎬 Simulate:

Invite Staff

Search and Filter
Clear Filters
Invitation List 7 invitations
Email Role Institution Status Invited At Action
khamla.v@skillslao.la Central Review β€” Pending 25/06/2026 09:15
navaphone.k@skillslao.la Super Administrator β€” Pending 25/06/2026 10:00
bounmy.s@ptc.edu.la Program Administrator Pakse Technical College Pending 24/06/2026 14:30
somsak.i@skillslao.la Central Review β€” Activated 10/06/2026 11:00 β€”
bounpheng.l@skillslao.la Tag Administrator β€” Activated 15/06/2026 14:20 β€”
phongsan.k@ptc.edu.la Program Administrator Pakse Technical College Expired 25/05/2026 08:45 β€”
sengphet.v@skillslao.la Sale Administrator β€” Expired 20/05/2026 09:30 β€”

Screen Flow (from flow.puml):

πŸ“ Spec notes β€” UC-IDP.04 / SCR-IDP.54 (fields, actions, requirements)
Identity
  • Screen: SCR-IDP.54 β€” Provision Staff (entry page)
  • Use case: UC-IDP.04 β€” Provision Staff Account
  • Zone rendering: Global Zone (Super Administrator) — all institutions; Program Administrator / Super Administrator / Central Review / Tag Administrator / Sale Administrator (no Instructor) β€” toggle via ?zone=pa|sa
  • Embedded dialogs: SCR-IDP.17 β€” Invite Staff Form Β· SCR-IDP.18 β€” Invitation Results
Brief description

Main page for managing staff invitations β€” Admin views all invitations (Pending / Activated / Expired). Program Administrator (My Institute zone) sees only invitations for their own institution; Super Administrator (Global zone) sees all institutions. Page title and invite button label adapt to the navigation zone (AR-5). Rows with status Pending show a "Copy Link" button so the Admin can obtain the activation link via another channel. The invite button opens the multi-recipient form (SCR-IDP.17).

Regions
  • Page actions β€” page title (adapts per zone) + primary invite button
  • Search and filter β€” keyword (email) + status filter + institution filter (SA Global zone only)
  • Invitation list β€” table; Institution column shown in SA view only; Copy Link per-row for Pending rows
  • Empty state β€” visible when list_count == 0; two variants: (a) no invitations in scope, (b) search / filter returns no results
Fields
  • keyword "Search Email" β€” text Β· always
  • filter_status "Status" β€” enum [all, pending, activated, expired] Β· UserInvitation.status Β· default: all Β· always
  • filter_institution "Institution" β€” enum Β· Institute.name Β· visible only when zone == global (SA); hidden entirely for PA β€” institution context is active Working Institute, applied server-side [refs: SS-IDP.31]
  • col_email "Email" β€” UserInvitation.email Β· read-only Β· always
  • col_role "Role" β€” Role.name via UserInvitationRole Β· read-only
  • col_institution "Institution" β€” Institute.name via UserInvitation.institution_id Β· read-only Β· column visible in SA view; hidden in PA view (institution implicit from scope)
  • col_status "Status" β€” enum [pending, activated, expired] Β· UserInvitation.status Β· read-only
  • col_invited_at "Invited At" β€” datetime Β· UserInvitation.invited_at Β· read-only
  • empty_message β€” text Β· visible when list_count == 0
Actions
  • invite_staff "Invite Staff" β€” enabled always Β· triggers UC-IDP.04-M-2 Β· opens SCR-IDP.17 dialog
  • search "Search" β€” enabled always
  • clear_filters "Clear Filters" β€” enabled when any_filter_active
  • copy_link "Copy Link" β€” per-row Β· enabled when row.status == pending Β· clipboard action Β· no navigation
Additional requirements
  1. Program Administrator: invitations scoped to active Working Institute (server-side); filter_institution hidden entirely in My Institute zone. Super Administrator: all institutions; filter_institution visible and selectable. [refs: SS-IDP.31]
  2. "Copy Link" shown and enabled only for rows where col_status == pending; Activated / Expired rows show no action in the Action column.
  3. Empty state variants: (a) no invitations in scope β†’ "No staff invitations in this scope" + invite CTA; (b) search / filter no results β†’ "No invitations match the search criteria" + Clear Filters button.
  4. List auto-refreshes when Admin returns from invitation creation (UC-IDP.04-M-6).
  5. Page title and button label adapt to zone β€” My Institute (PA): "Invite Instructors"; Global Zone (SA): "Invite Staff". [refs: SS-IDP.31]
↳ Embedded dialog: SCR-IDP.17 β€” Invite Staff Form (type: dialog)
Brief: Dialog to invite multiple back-office staff at once. Shared Settings (Role + Institution) apply to every email in the batch. PA zone: Role pre-selected as Instructor (read-only); Institution pre-filled as own institution (read-only). SA zone: Role = chip-multiselect across all 5 roles; Institution conditional β€” visible + required for institute-scoped roles (Instructor, Program Administrator); hidden for system-wide roles (Super Administrator, Tag Administrator, Sale Administrator). Inline per-row warning only for a pending invitation on the same email (AF-5B) β€” an email already belonging to an existing account is invited silently (no warning), handled by UC-IDP.03.
Regions: Shared settings Β· Email list Β· Form actions
Fields:
  • roles "Role(s)" β€” enum multi-select chip Β· required Β· PA: Instructor pre-selected, read-only; SA: Program Administrator, Super Administrator, Central Review, Tag Administrator, Sale Administrator (Instructor excluded β€” PA-only) Β· UserInvitationRole.role_id
  • institution "Institution(s)" β€” enum Β· PA: own institution pre-filled, read-only; SA: conditional chip-multiselect β€” visible + required for institute-scoped roles; hidden for system-wide roles Β· UserInvitation.institution_id
  • email "Email" β€” text per row Β· required Β· format: email Β· max 255 Β· UserInvitation.email
Actions:
  • add_email "Add Email" β€” always
  • remove_email "Remove" β€” enabled when email_count > 1; disabled at 1 row (minimum)
  • send_invitation "Send Invitation" β€” enabled when required_fields_valid Β· triggers UC-IDP.04-M-4
  • cancel "Cancel" β€” always Β· closes dialog
  • revoke_and_resend "Revoke Previous Invitation and Resend" β€” visible on AF-5B flagged rows
  • skip_recipient "Skip This Recipient" β€” visible on AF-5B flagged rows
Additional requirements:
  1. Role options filtered by actor authority: PA β†’ Instructor only (read-only); SA β†’ Program Administrator, Super Administrator, Central Review, Tag Administrator, Sale Administrator (Instructor is PA-only β€” not shown in Global Zone).
  2. Institution: PA β†’ own institution pre-filled, read-only, single value; SA β†’ conditional multi-select per selected role type.
  3. An email that already belongs to an existing account is invited without any warning here β€” the outcome (already has this role vs. role added to existing account) is handled downstream by UC-IDP.03 AF 1B / AF 1C. A pending (not yet activated) invitation for the same email still triggers a separate warning (next item).
  4. Inline warning "A pending invitation already exists for this email" + choice buttons (AF-5B).
  5. Minimum 1 email row; Remove disabled when email_count == 1. Max rows: TBD.
  6. Keyboard focus order: Role(s) β†’ Institution(s) β†’ email rows β†’ Add Email β†’ Send Invitation β†’ Cancel. [refs: NFR-09]
↳ Embedded dialog: SCR-IDP.18 β€” Invitation Results (type: dialog)
Brief: Read-only results dialog "Invitation Results" shown after submitting SCR-IDP.17. Summary header shows batch context (role, institution when institute-scoped, count "X of Y invitations created successfully" in warning style when X < Y). Per-row: Email, Status (sent / email_delivery_failed / error), Activation Link with Copy button (for sent + failed rows) or Reason text (for error rows). Expiry notice when any row is sent or email_delivery_failed. Close returns to SCR-IDP.54 with refreshed list.
Fields:
  • summary_count β€” "X of Y invitations created successfully"; warning style when X < Y
  • batch_role "Role" β€” Role.name via UserInvitationRole Β· always
  • batch_institution "Institution" β€” visible when batch role is institute-scoped (Instructor, Program Administrator) Β· Institution.name
  • batch_expiry_notice β€” "All activation links expire at [datetime] (48 hours)" Β· visible when any row ∈ [sent, email_delivery_failed] Β· AuthToken.expires_at Β· default TTL 48 hours [SS-IDP.34]
  • result_recipient_email, result_email_status, result_activation_link, result_error_reason β€” per-row columns
Actions + additional requirements:
  • copy_link "Copy" β€” per-row Β· enabled when status ∈ [sent, email_delivery_failed] Β· aria-label="Copy activation link for [email]" Β· toast "Link copied" (aria-live="polite") [refs: NFR-09]
  • close "Close" β€” triggers UC-IDP.04-M-6; list refreshes
  • email_delivery_failed rows must show note "Email delivery failed" alongside the link. [refs: none]
  • Back-office web portal only β€” mobile not applicable. [refs: NFR-12]
Link copied