People › Approve Learner
🎬 Simulate:

Approve Learner

Pending Requests 2
Learner Name Email Mobile Student ID Major Submission Date
Somphone Chanthavisouk somphone.c@example.la +856 20 5551 0011 2021-CS-0042 Computer Science 10 Jun 2026
Bouakham Xaiyavong bouakham.x@example.la +856 20 5551 0023 2022-IT-0089 Information Technology 14 Jun 2026

Screen Flow (from uc-idp-25-approve-reject-learner-institution-registration.flow.puml):

← approve → dialog closes, list refreshes ← cancel → dialog closes, status unchanged ← click Reject → Reject Reason Dialog (SCR-IDP.59 nested dialog) ← confirm rejection → dialogs close, list refreshes ← no pending requests → empty state
📝 Spec notes — UC-IDP.25 / SCR-IDP.56 + SCR-IDP.57 (dialog) + SCR-IDP.59 (dialog)
Identity
  • Screen (entry): SCR-IDP.56 — Approve Learner
  • Use case: UC-IDP.25 — Approve / Reject Learner Institution Registration
  • Embedded dialogs: SCR-IDP.57 — Review Registration Request · SCR-IDP.59 — Reject Reason Dialog
Brief description (SCR-IDP.56)

Back-office page for reviewing pending institution registration requests submitted by learners whose student ID or contact information did not match the Institution Roster during registration (SS-IDP.04). This screen operates exclusively in the institution-scoped navigation context (SS-IDP.31) — the Institution filter and Institution column do not appear. Each row displays the learner's name, contact, claimed student ID, claimed major, and submission date. Clicking any row opens SCR-IDP.57 to approve or reject the request. When there are no pending requests within scope, the screen displays an empty-state message (AF 1A). The Enrolled Learners list has been moved to its own separate menu item (SCR-IDP.70) and is no longer part of this screen.

Fields (SCR-IDP.56)
  • learner_name_filter "Learner Name" — text · Search & Filter · max 255 chars · not required · always
  • student_id_filter "Student ID" — text · Search & Filter · max 100 chars · not required · always
  • learner_name "Learner Name" — computed: User.firstname + " " + User.lastname · Request List · read-only · always
  • email "Email" — InstitutionRegistrationRequest.email (new entity — run /analyze-entities IDP) · Request List · read-only · always
  • mobile "Mobile" — InstitutionRegistrationRequest.mobile · Request List · read-only · always
  • claimed_student_id "Student ID" — InstitutionRegistrationRequest.student_id · Request List · read-only · always
  • claimed_major "Major" — resolved from InstitutionRegistrationRequest.major_id → Major.name · Request List · read-only · always
  • institution_name "Institution" — absent from Request List per AR no. 1 (institution is implicit from navigation context)
  • submission_date "Submission Date" — InstitutionRegistrationRequest.submitted_at · Request List · read-only · always
Actions (SCR-IDP.56)
  • search "Search" — enabled always · triggers UC-IDP.25-M-1 (applies filters, reloads request list)
  • clear_filter "Clear Filter" — enabled always · triggers UC-IDP.25-M-1 (resets all filters, reloads list)
  • select_request (row click) — enabled always · triggers UC-IDP.25-M-2 (opens SCR-IDP.57)
Additional requirements (SCR-IDP.56)
  1. This screen operates exclusively in the institution-scoped navigation context (My Institute — Program Administrator, or multi-institution PA with an active institution selected via SS-IDP.31 switcher). The Institution filter and Institution column are absent — the active institution is always determined by the navigation context. The backend must reject any request for out-of-scope institution data. [refs: SS-IDP.31]
  2. This screen displays only requests with claim_status = pending. Approved and rejected requests are excluded.
  3. When no pending requests exist within scope, the screen displays "No pending requests" in place of the table (AF 1A of UC-IDP.25).
  4. Each row in the Request List is fully clickable and opens SCR-IDP.57 (Review Registration Request dialog) loaded with the selected request's details.
↳ Embedded dialog: SCR-IDP.57 — Review Registration Request
Brief description

Dialog opened on top of SCR-IDP.56 when Program Administrator selects a pending request. Displays all learner-submitted details (full name, contact, claimed student ID, faculty, major, institution, submission date) and current platform status (Unaffiliated — learner can use the platform while the request is pending, per SS-IDP.04). Provides Approve, Reject (→ opens SCR-IDP.59), and Cancel actions.

Fields
  • learner_name "Learner Name" — computed: InstitutionRegistrationRequest.learner_id → User.firstname + " " + User.lastname · Request Info · read-only
  • contact "Contact" — InstitutionRegistrationRequest.contact · Request Info · read-only ⚠ open issue: confirm whether SS-IDP.21 contact masking applies to this admin-facing review dialog (AR no. 1)
  • claimed_student_id "Claimed Student ID" — InstitutionRegistrationRequest.student_id · Request Info · read-only
  • claimed_faculty "Faculty" — computed: InstitutionRegistrationRequest.faculty_id → Faculty.name (new entity field — run /analyze-entities IDP) · Request Info · read-only
  • claimed_major "Major" — computed: InstitutionRegistrationRequest.major_id → Major.name · Request Info · read-only
  • claimed_institution "Institution" — computed: InstitutionRegistrationRequest.institution_id → Institute.name · Request Info · read-only
  • submitted_at "Submission Date" — InstitutionRegistrationRequest.submitted_at (new entity field — confirm via /analyze-entities IDP) · Request Info · read-only
  • platform_status "Platform Status" — computed: LearnerProfile.institute_id == null → "Unaffiliated" · Learner Platform Status · read-only
Actions
  • approve "Approve" — enabled always · triggers UC-IDP.25-M-4 (affiliates learner with institution, grants subscription per SS-IDP.32, sends outcome notification; dialog closes, list refreshes)
  • reject "Reject" — enabled always · triggers UC-IDP.25-A-4A-1 (closes SCR-IDP.57, opens SCR-IDP.59 reject reason dialog)
  • cancel "Cancel" — enabled always · triggers UC-IDP.25-A-4B-1 (closes dialog, request status unchanged)
Additional requirements
  1. Contact field display in back-office admin context — confirm with design team whether SS-IDP.21 (contact masking) applies to this admin-facing review dialog. The Program Administrator needs the contact to identify the learner for the institution claim review; if full contact is shown, add an explicit exception in SS-IDP.21. [refs: SS-IDP.21]
↳ Embedded dialog: SCR-IDP.59 — Reject Reason Dialog
Brief description

Focused dialog that opens on top of SCR-IDP.57 when Program Administrator clicks "Reject". Shows learner name as read-only context. Rejection reason is mandatory — Confirm Rejection stays disabled until at least one non-whitespace character is entered. Clicking Confirm Rejection saves the rejection with reason, sends learner notification with the reason included, and returns to SCR-IDP.57 (AF 4A step 4). Clicking Cancel returns to SCR-IDP.57 without any change (AF 4A.3A).

Fields
  • learner_name "Learner Name" — computed: same derivation as SCR-IDP.57 · Request context · read-only · always
  • rejection_reason "Rejection Reason" — textarea · required · max 1000 chars · InstitutionRegistrationRequest.rejection_reason (new entity — run /analyze-entities IDP)
Actions
  • confirm_reject "Confirm Rejection" — enabled when required_fields_valid (rejection_reason has at least one non-whitespace char; UC-IDP.25 AR no. 2) · triggers UC-IDP.25-A-4A-3
  • cancel "Cancel" — enabled always · triggers UC-IDP.25-A-4A.3A-1 (closes reject reason dialog, reopens SCR-IDP.57)
Additional requirements
  1. On dialog open, keyboard focus moves to the rejection_reason textarea (WCAG 2.1 AA focus management for modal dialogs). [refs: NFR-09]
  2. Confirm Rejection button remains disabled until rejection_reason contains at least one non-whitespace character. [refs: UC-IDP.25 AR no. 2]