Institution Roster
| Student ID | First Name | Last Name | Faculty | Major | Actions |
|---|---|---|---|---|---|
| ST-2024-0801 | Khampheng | Sonethip | Technology & Engineering | Electrical Technology | |
| ST-2024-0802 | Thiphavanh | Keovongsa | Technology & Engineering | Civil Construction | Matched |
| ST-2024-0804 | Manisone | Phommavong | Business & Management | Accounting | |
| … 40 more entries | |||||
Screen Flow (from flow.puml):
📝 Spec notes — UC-IDP.24 / SCR-IDP.55 (fields, actions, requirements)
- Screen: SCR-IDP.55 — Institution Roster
- Use case: UC-IDP.24 — Manage Institution Roster
Page listing students in the institution's Roster — used for matching against TVET student data registered in the system. Each row displays: student ID, first name, last name, faculty, major, and action buttons. Admin can search and filter by student ID, email, mobile, and major. Both PA and SA access via the Working Institute context (SS-IDP.31) — the Roster is pre-filtered to the current Working Institute; no institution dropdown is shown on this page. To manage a different institution's Roster, Admin switches the Working Institute. Unmatched entries can be edited (SCR-IDP.52) or deleted (SCR-IDP.53) per row. Adding new entries is exclusively through "Import Roster" (UC-IDP.06).
- Search & Filter:
student_id_filter"Student ID" · text · no data_ref,email_filter"Email" · text · no data_ref,mobile_filter"Mobile" · text · no data_ref,major_filter"Major" · enum · options from Major master filtered to Working Institute - Roster List (display columns, all read-only):
student_id(InstitutionRoster.student_id),firstname(InstitutionRoster.firstname),lastname(InstitutionRoster.lastname),faculty(Faculty.name — resolved via InstitutionRoster.major_id → Major.faculty_id → Faculty.name),major(Major.name — resolved via InstitutionRoster.major_id)
import_roster"Import Roster" — always enabled · cross-UC to UC-IDP.06 (Bulk Import Learners)search"Search" — always enabled · triggers UC-IDP.24-M-2clear_filter"Clear Filter" — always enabled · resets all filter fields and re-renders listedit_entry"Edit" — per row · unmatched entries only · opens SCR-IDP.52 dialog · triggers UC-IDP.24-M-4delete_entry"Delete" — per row · unmatched entries only · opens SCR-IDP.53 dialog · triggers UC-IDP.24-A-4A-1
- Role-based scoping via Working Institute context (SS-IDP.31) — both PA and SA access the Roster pre-filtered to their current Working Institute; no institution dropdown on this page; requests for data outside the allowed scope are rejected at the backend.
- Per-row Edit and Delete buttons shown only for unmatched entries (InstitutionRoster.match_status). Entries linked to a registered learner display no action buttons.
- Display empty state with "Import Roster" button when no entries in scope (AF 1A).
↳ Embedded dialog: SCR-IDP.52 — Edit Roster Entry
Type: dialog · Opened by: Edit button on SCR-IDP.55 · Returns to: SCR-IDP.55 on Save (success) or Cancel · Scenario AF-5A: auto-opens dialog with institution changed, Student ID cleared, Faculty & Major unchanged · Scenario AF-6A: auto-opens dialog with inline conflict error on Student ID
Dialog for Admin to edit one student entry in the Roster. Opens as overlay on SCR-IDP.55; current data pre-filled in all fields. Institution: SA gets editable dropdown of all active institutions; PA sees read-only text locked to Working Institute. AF-5A (SA changes institution): Student ID is cleared (institution-specific identifier must be re-entered); Faculty and Major are NOT reset — they are global vocabularies independent of institution. Faculty cascade: changing Faculty resets the Major dropdown to Active Majors of the new faculty (SS-IDP.33); Save is disabled until a Major is reselected.
institute_id"Institution" — enum · Institution.id · required · read-only when actor_role == program_administrator; SA gets editable dropdown of all active institutions; cascade on change (SA only): clears student_id; Faculty and Major unchangedstudent_id"Student ID" — text · required · validation: not_blank, unique_per_institution · InstitutionRoster.student_id · cleared when institution changes (SA only — AF 5A)faculty_id"Faculty" — enum · InstitutionRoster.faculty_id · required · global vocabulary (all faculties, sorted alphabetically) · cascade: when faculty changes, Major dropdown resets to Active Majors of the new faculty (AR.3)major_id"Major" — enum · InstitutionRoster.major_id · required · Active Majors under selected faculty (SS-IDP.33) · resets when faculty changesfirstname"First Name" — text · required · max 100 chars · InstitutionRoster.firstnamelastname"Last Name" — text · required · max 100 chars · InstitutionRoster.lastnameemail"Email" — text · required when mobile empty · email format · max 255 chars · unique_platform_wide [SS-IDP.03]country_code"Country Code" — text · read-only · default literal "+856"mobile"Mobile" — phone · required when email empty · unique_platform_wide [SS-IDP.03]
save"Save" — enabled when required_fields_valid; disabled while duplicate detected (AF 6A) or after institution change until Student ID re-entered (AF 5A) · triggers UC-IDP.24-M-6cancel"Cancel" — always enabled · dismisses dialog, no data change · no UC step
- Inline error below the field that fails uniqueness (student_id within institution / email or mobile platform-wide); Save disabled until corrected (AF 6A). [SS-IDP.03]
- Admin must provide at least one of email or mobile; when both empty, error shown below mobile: "Please provide at least one of email or mobile".
- When Faculty changes, Major dropdown resets (clears + re-populates with Active Majors of new faculty per SS-IDP.33); Save disabled until Major reselected. When SA changes Institution, Student ID is cleared; Faculty and Major are NOT reset (AF 5A). [SS-IDP.33]
↳ Embedded dialog: SCR-IDP.53 — Delete Roster Entry Confirmation
Type: dialog (data-bs-backdrop="static" data-bs-keyboard="false") · Opened by: Delete button on SCR-IDP.55 (unmatched entries only) · Returns to: SCR-IDP.55 on Confirm Delete or Cancel · Scenario AF-4A: auto-opens this dialog on page load
Deletion confirmation dialog — all fields read-only. Opens only for unmatched entries. Entries already matched (linked to a learner) have no action buttons on the row (SCR-IDP.55 AR.2 — blocked before dialog opens).
student_id"Student ID" — InstitutionRoster.student_idfullname"Full Name" — computed: InstitutionRoster.firstname + " " + InstitutionRoster.lastname (not persisted separately)institute_name"Institution" — lookup: Institute.name via InstitutionRoster.institute_id → Institute.id
confirm_delete"Confirm Delete" — always enabled · danger styling (red) · triggers UC-IDP.24-A-4A-3 · navigates back to SCR-IDP.55cancel"Cancel" — always enabled · dismisses dialog, no data change · no UC step
- "Confirm Delete" must use danger styling (red) to communicate the destructive action risk.
- Keyboard focus defaults to "Cancel" button when dialog opens — prevents accidental deletion via Enter/Space. [NFR-09]