Approve Learner
| Learner Name | 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):
📝 Spec notes — UC-IDP.25 / SCR-IDP.56 + SCR-IDP.57 (dialog) + SCR-IDP.59 (dialog)
- 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
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.
learner_name_filter"Learner Name" — text · Search & Filter · max 255 chars · not required · alwaysstudent_id_filter"Student ID" — text · Search & Filter · max 100 chars · not required · alwayslearner_name"Learner Name" — computed: User.firstname + " " + User.lastname · Request List · read-only · alwaysemail"Email" —InstitutionRegistrationRequest.email(new entity — run /analyze-entities IDP) · Request List · read-only · alwaysmobile"Mobile" —InstitutionRegistrationRequest.mobile· Request List · read-only · alwaysclaimed_student_id"Student ID" —InstitutionRegistrationRequest.student_id· Request List · read-only · alwaysclaimed_major"Major" — resolved fromInstitutionRegistrationRequest.major_id → Major.name· Request List · read-only · alwaysinstitution_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
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)
- 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]
- This screen displays only requests with claim_status = pending. Approved and rejected requests are excluded.
- When no pending requests exist within scope, the screen displays "No pending requests" in place of the table (AF 1A of UC-IDP.25).
- 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
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.
learner_name"Learner Name" — computed: InstitutionRegistrationRequest.learner_id → User.firstname + " " + User.lastname · Request Info · read-onlycontact"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-onlyclaimed_faculty"Faculty" — computed:InstitutionRegistrationRequest.faculty_id → Faculty.name(new entity field — run /analyze-entities IDP) · Request Info · read-onlyclaimed_major"Major" — computed:InstitutionRegistrationRequest.major_id → Major.name· Request Info · read-onlyclaimed_institution"Institution" — computed: InstitutionRegistrationRequest.institution_id → Institute.name · Request Info · read-onlysubmitted_at"Submission Date" —InstitutionRegistrationRequest.submitted_at(new entity field — confirm via /analyze-entities IDP) · Request Info · read-onlyplatform_status"Platform Status" — computed: LearnerProfile.institute_id == null → "Unaffiliated" · Learner Platform Status · read-only
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)
- 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
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).
learner_name"Learner Name" — computed: same derivation as SCR-IDP.57 · Request context · read-only · alwaysrejection_reason"Rejection Reason" — textarea · required · max 1000 chars ·InstitutionRegistrationRequest.rejection_reason(new entity — run /analyze-entities IDP)
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-3cancel"Cancel" — enabled always · triggers UC-IDP.25-A-4A.3A-1 (closes reject reason dialog, reopens SCR-IDP.57)
- On dialog open, keyboard focus moves to the rejection_reason textarea (WCAG 2.1 AA focus management for modal dialogs). [refs: NFR-09]
- Confirm Rejection button remains disabled until rejection_reason contains at least one non-whitespace character. [refs: UC-IDP.25 AR no. 2]