π¬ Simulate:
Invite Instructors
Search and Filter
Invitation List
3 invitations
| Role | Status | Invited At | Action | |
|---|---|---|---|---|
| khamla.v@lptvet.edu.la | Instructor | Pending | 25/06/2026 09:15 | |
| somsak.i@lptvet.edu.la | Instructor | Activated | 10/06/2026 11:00 | β |
| phongsan.k@lptvet.edu.la | Instructor | Expired | 25/05/2026 08:45 | β |
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: My Institute zone (Program Administrator) — own institution; Instructor only β 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 Β· alwaysfilter_status"Status" β enum [all, pending, activated, expired] Β·UserInvitation.statusΒ· default: all Β· alwaysfilter_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 Β· alwayscol_role"Role" βRole.nameviaUserInvitationRoleΒ· read-onlycol_institution"Institution" βInstitute.nameviaUserInvitation.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-onlycol_invited_at"Invited At" β datetime Β·UserInvitation.invited_atΒ· read-onlyempty_messageβ text Β· visible when list_count == 0
Actions
invite_staff"Invite Instructors" β enabled always Β· triggers UC-IDP.04-M-2 Β· opens SCR-IDP.17 dialogsearch"Search" β enabled alwaysclear_filters"Clear Filters" β enabled when any_filter_activecopy_link"Copy Link" β per-row Β· enabled when row.status == pending Β· clipboard action Β· no navigation
Additional requirements
- Program Administrator: invitations scoped to active Working Institute (server-side);
filter_institutionhidden entirely in My Institute zone. Super Administrator: all institutions;filter_institutionvisible and selectable. [refs: SS-IDP.31] - "Copy Link" shown and enabled only for rows where col_status == pending; Activated / Expired rows show no action in the Action column.
- 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.
- List auto-refreshes when Admin returns from invitation creation (UC-IDP.04-M-6).
- 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_idinstitution"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_idemail"Email" β text per row Β· required Β· format: email Β· max 255 Β·UserInvitation.email
Actions:
add_email"Add Email" β alwaysremove_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-4cancel"Cancel" β always Β· closes dialogrevoke_and_resend"Revoke Previous Invitation and Resend" β visible on AF-5B flagged rowsskip_recipient"Skip This Recipient" β visible on AF-5B flagged rows
Additional requirements:
- 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).
- Institution: PA β own institution pre-filled, read-only, single value; SA β conditional multi-select per selected role type.
- 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).
- Inline warning "A pending invitation already exists for this email" + choice buttons (AF-5B).
- Minimum 1 email row; Remove disabled when email_count == 1. Max rows: TBD.
- 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 < Ybatch_role"Role" βRole.nameviaUserInvitationRoleΒ· alwaysbatch_institution"Institution" β visible when batch role is institute-scoped (Instructor, Program Administrator) Β·Institution.namebatch_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