v2 Admin Spec — Content
Content
Domain 4 of the Enhanced Candidate A navigation structure. Contains: Video Lessons, Resources, Recordings, Tutorials, MCQ Questions, Quizzes. All 6 screens are existing screens relocated from the Program section. No new screens in this domain. Key change: Integration with Semester Hub > Setup Checklist (deep links with semester pre-filtering, "Return to Checklist" affordance)
1. Domain Overview
Content groups all passive learning materials that students consume. These screens were previously under "Program" alongside submissions and live sessions. In Enhanced Candidate A, submissions moved to Student Management (student activity) and live sessions moved to Scheduling (time-based events), leaving Content as a clean domain for curriculum materials.
Sidebar items:
Content
Video Lessons <- from Program
Resources <- from Program
Recordings <- from Program
Tutorials <- from Program
MCQ Questions <- from Program
Quizzes <- from Program
Key enhancement: All 6 content screens now support semester pre-filtering when accessed from the Setup Checklist. When the admin clicks "Configure -->" on a checklist item, the content screen opens pre-filtered to the relevant semester and level, with a "Return to Setup Checklist" banner at the top (see 01-global-patterns.md Section 4.2 for filter bar pattern; 04-semester-management.md Section 3.6 for the full Setup Checklist specification including deep link mechanics and return affordance).
What this spec covers: Because all 6 screens already exist and their core CRUD behavior is unchanged, this spec focuses on what changed -- new location, Setup Checklist integration, v2 field/action refinements, and role visibility adjustments. It does not repeat full field-by-field breakdowns of existing forms and tables except where v2 refinements add new structure.
Data tables referenced: lessonsnew, resources, recordings, tutorials, mcqquestion, quiz
Transition Hint
Per 01-global-patterns.md Section 6.4, all 6 content screens show "Formerly under Program" for the first 30 days after launch.
2. Screen: Video Lessons
2.1 Purpose
Manage video curriculum. Core content type -- the primary learning material students interact with. Relocated from Program > Video Lessons.
2.2 Entry Points
- Sidebar: Content > Video Lessons
- Semester Hub > Setup Checklist: "Configure -->" link (pre-filtered by semester + level)
2.3 Layout
Filter bar + data table + pagination. Uses standard patterns from 01-global-patterns.md Sections 4.1 and 4.2.
2.4 Key Changes from Current
- New location: Content section (was Program)
- Semester + Level filter pre-population: When accessed from Setup Checklist, semester and level dropdowns are pre-set from URL parameters
?semester={id}&level={id}&from=checklist - "Return to Checklist" banner: Shown when navigated from checklist (see Section 8 below and 04-semester-management.md Section 3.6)
- v2: Multi-video input UI inside a lesson (add/reorder/remove individual video entries rather than a single
videoCountinteger) - v2: Description field added to the lesson create/edit form
2.5 Existing Capabilities (preserved)
- Create/edit/delete video lessons
- Attach multiple videos per lesson (now via structured multi-video input — see 2.8)
- Auto-extract video thumbnails
- Assign to semester + level
- Bulk delete
- Clone-from-previous semester — admin can seed a new semester's Video Lessons from the prior semester's set (preserved from v1; confirmed in meeting)
2.6 Actions
All existing CRUD actions preserved. No new actions. Admin only for create/edit/delete.
| Action | Trigger | Permission | Behavior | Confirmation |
|---|---|---|---|---|
| Create Lesson | "Add Video Lesson" button | Admin | Opens create dialog (see 2.8) | Toast on save |
| Edit Lesson | Row action / row click | Admin | Opens edit dialog (same form as create, pre-filled) | Toast on save |
| Delete Lesson | Row action | Admin | Removes lesson + all attached videos | Confirm modal |
| Bulk Delete | Selection + toolbar action | Admin | Removes selected lessons | Confirm modal with count |
| Clone from Previous | Header button (per semester) | Admin | Copies all lessons from prior semester (same level set) into current semester | Confirm modal listing count |
2.7 Role Visibility
- Admin: Full CRUD
- View-Only: View only (action buttons hidden per 01-global-patterns.md Section 3.4)
- TA: Hidden (sidebar item not visible; TAs access Recordings only)
2.8 Create / Edit Lesson Dialog (v2)
Form fields (in order):
| Field | Type | Required | Notes |
|---|---|---|---|
| Title | Text | Yes | Lesson title (e.g., "Week 3 — Nouns and Pronouns") |
| Week Number | Number | Yes | Integer, used for ordering |
| Semester | Select | Yes | Single-select; pre-filled when from Setup Checklist |
| Level | Select | Yes | Single-select; pre-filled when from Setup Checklist |
| Description | Textarea | No | Free-form description of the lesson content |
| Videos | Multi-video input (see below) | Yes (>=1) | Repeater for individual video entries |
Multi-video input UI (new in v2):
- A repeater list of video rows. Each row contains:
- Video Title (text, required)
- Video URL (text, required — Vimeo or equivalent)
- Reorder handle (drag or up/down controls for playback order)
- Remove (icon button; disabled when only one row remains)
- "Add Video" button at the bottom adds an empty row.
- Thumbnails are still auto-extracted per video URL on save.
- Duration displayed on the row is auto-computed from the video source (not free text).
3. Screen: Resources
3.1 Purpose
Manage downloadable materials (PDFs, documents), external links, and video URLs per level. Relocated from Program > Resources.
3.2 Entry Points
- Sidebar: Content > Resources
- Semester Hub > Setup Checklist: "Configure -->" link (pre-filtered by semester + level)
3.3 Layout
Filter bar + data table + pagination. Standard patterns.
3.4 Key Changes from Current
- New location: Content section (was Program)
- Semester + Level filter pre-population from checklist
- "Return to Checklist" banner when navigated from checklist
- v2: Multi-level tagging — data model changes from
level(single) tolevels(array). One resource can be assigned to multiple levels within a semester; it appears for every student whose level is in the array. - v2: Resource type field added — supports
File(PDF/doc upload),Link(external URL), andVideo URL(embed). The create/edit dialog adapts input fields based on selected type.
3.5 Existing Capabilities (preserved)
- Create/edit/delete downloadable resources
- Upload file attachments (PDFs, docs)
- Assign to specific level(s) within a semester (now via multi-select per 3.4)
3.6 Actions
All existing CRUD actions preserved. Admin only for create/edit/delete.
| Action | Trigger | Permission | Behavior | Confirmation |
|---|---|---|---|---|
| Create Resource | "Add Resource" button | Admin | Opens create dialog (see 3.8) | Toast on save |
| Edit Resource | Row action / row click | Admin | Opens edit dialog (pre-filled) | Toast on save |
| Delete Resource | Row action | Admin | Removes resource (and file if File type) | Confirm modal |
| Bulk Delete | Selection + toolbar action | Admin | Removes selected resources | Confirm modal with count |
3.7 Role Visibility
- Admin: Full CRUD
- View-Only: View only
- TA: Hidden
3.8 Create / Edit Resource Dialog (v2)
Form fields (in order):
| Field | Type | Required | Notes |
|---|---|---|---|
| Title | Text | Yes | Display name for the resource |
| Semester | Select | Yes | Single-select; pre-filled when from Setup Checklist |
| Levels | Multi-select | Yes (>=1) | Multiple levels may be selected; resource appears for all selected levels |
| Resource Type | Select | Yes | One of: File, Link, Video URL |
| File | File upload | Conditional | Required when Resource Type = File |
| URL | Text (URL) | Conditional | Required when Resource Type = Link or Video URL |
| Description | Textarea | No | Optional context shown to students |
Data table columns reflect the new fields:
| Column | Source | Sortable | Notes |
|---|---|---|---|
| Title | resources.title |
Yes | |
| Type | resources.resource_type |
Yes | Badge: File / Link / Video URL |
| File Type / URL | Derived | No | File extension (PDF/DOC) for File; domain for Link/Video URL |
| Levels | resources.levels[] |
No | Comma-separated list of level tags |
| Size | resources.size |
Yes | Shown only for File type; blank otherwise |
| Created | resources.created_at |
Yes |
4. Screen: Recordings
4.1 Purpose
Store recorded live session replays for students who missed sessions. Relocated from Program > Recordings.
4.2 Entry Points
- Sidebar: Content > Recordings
- TA sidebar: Recordings (direct access -- see 01-global-patterns.md Section 3.3)
- Semester Hub > Setup Checklist: "Configure -->" link (pre-filtered by semester; not level-scoped per 04-semester-management.md Section 3.6)
4.3 Layout
Filter bar + data table + pagination. Standard patterns.
Filters (in addition to standard semester/level/search):
- Type —
Lesson Class/QRC/All - Zoom Sync Status —
Synced/Pending Review/Manual/All
4.4 Key Changes from Current
- New location: Content section (was Program)
- TA access path: TAs now access this screen directly from their simplified sidebar ("Recordings" item) rather than navigating through Program
- Semester filter pre-population from checklist (no level filter -- recordings are not level-scoped in the checklist)
- v2: New Type column —
Lesson ClassvsQRC(Quran Recitation Circle). Badge column; also exposed as a filter. - v2: New Time of Day column — time (in EST) the session was held, separate from the session date.
- v2: Zoom auto-upload + auto-tag
[backend]— recordings posted to Zoom are auto-ingested by a backend job and auto-tagged by level and (for gender-specific classes) gender based on Zoom meeting metadata. Admin UI exposes a sync status badge per row and a manual override action.
4.5 Existing Capabilities (preserved)
- Create/edit/delete session recordings (manual entry path preserved alongside Zoom auto-upload)
- Filter by level and type
- Link to video content (Vimeo URLs)
4.6 Data Table Columns (v2)
| Column | Source | Sortable | Notes |
|---|---|---|---|
| Title | recordings.title |
Yes | Class name / session title |
| Type | recordings.type |
Yes | Badge: Lesson Class or QRC |
| Week | recordings.week_number |
Yes | Integer |
| Level | recordings.level_tag_id |
Yes | Level tag name |
| Gender | recordings.gender |
No | Male / Female / Mixed (populated by auto-tag or manual) |
| Session Date | recordings.session_date |
Yes | Date of the live session |
| Time of Day | recordings.session_time |
Yes | Time in EST (e.g., 7:00 PM) |
| Host (TA) | recordings.ta_id → teacher.name |
Yes | |
| Zoom Sync Status | recordings.sync_status |
Yes | Badge: Synced, Pending Review, Manual. See 4.8 |
| Created | recordings.created_at |
Yes |
4.7 Actions
All existing CRUD actions preserved. Admin only for create/edit/delete. Plus new Zoom-related actions.
| Action | Trigger | Permission | Behavior | Confirmation |
|---|---|---|---|---|
| Create Recording | "Add Recording" button | Admin | Opens create dialog (manual entry) | Toast on save |
| Edit Recording | Row action / row click | Admin | Opens edit dialog | Toast on save |
| Delete Recording | Row action | Admin | Removes recording | Confirm modal |
| Approve Auto-Tag | Row action (when status = Pending Review) | Admin | Accepts the auto-tagged level/gender; status moves to Synced |
Toast |
| Override Auto-Tag | Row action (when status = Pending Review or Synced) | Admin | Opens edit dialog to manually correct level/gender; status moves to Manual on save |
Toast |
| Resync from Zoom | Header button | Admin | Triggers on-demand Zoom fetch for the current semester | Confirm modal |
4.8 Zoom Auto-Upload + Auto-Tag Affordance (v2) [backend]
Backend behavior (spec'd here for UI context; implementation lives in the backend):
- A scheduled backend job polls Zoom for newly posted cloud recordings.
- Each recording is matched to a level (and gender for gender-specific classes) using Zoom meeting metadata (meeting topic, host, time-of-day pattern) against the semester's TA schedule.
- High-confidence matches are saved with
sync_status = Synced. - Low-confidence matches are saved with
sync_status = Pending Reviewfor admin approval. - Manually-created recordings carry
sync_status = Manual.
UI affordances:
- Sync status badge on every row (column per 4.6). Status values and colors follow 01-global-patterns.md §4.3:
Synced— successPending Review— warningManual— neutral
- Filter by sync status on the filter bar (4.3).
- Pending Review count shown as a header stat (e.g., "3 recordings pending review") when > 0.
- Row actions for approval/override per 4.7 (Approve Auto-Tag, Override Auto-Tag).
- Manual override via edit dialog preserves admin-set fields; subsequent Zoom re-syncs do not overwrite a
Manualrecord. - Resync from Zoom header button for on-demand refresh (per 4.7).
4.9 Role Visibility
- Admin: Full CRUD; can approve / override auto-tags; can trigger Resync from Zoom
- View-Only: View only
- TA: View only (accessible via "Recordings" in TA sidebar per 01-global-patterns.md Section 3.3)
5. Screen: Tutorials
5.1 Purpose
Manage supplementary PDF-based learning materials. Relocated from Program > Tutorials.
5.2 Entry Points
- Sidebar: Content > Tutorials
- Semester Hub > Setup Checklist: "Configure -->" link (pre-filtered by semester + level)
5.3 Layout
Filter bar + data table + pagination. Standard patterns.
5.4 Key Changes from Current
- New location: Content section (was Program)
- Semester + Level filter pre-population from checklist
- "Return to Checklist" banner when navigated from checklist
5.5 Existing Capabilities (preserved)
- Create/edit/delete tutorials with PDF attachments
- Assign to levels within a semester
5.6 Actions
All existing CRUD actions preserved. Admin only for create/edit/delete.
5.7 Role Visibility
- Admin: Full CRUD
- View-Only: View only
- TA: Hidden
6. Screen: MCQ Questions
6.1 Purpose
Build the question bank for quizzes. Individual multiple-choice questions that are assembled into quizzes (Section 7). Relocated from Program > MCQ Questions.
6.2 Entry Points
- Sidebar: Content > MCQ Questions
- Semester Hub > Setup Checklist: "Configure -->" link (pre-filtered by semester + level)
6.3 Layout
Filter bar + data table + pagination. Standard patterns.
6.4 Key Changes from Current
- New location: Content section (was Program)
- Semester + Level filter pre-population from checklist
- "Return to Checklist" banner when navigated from checklist
6.5 Existing Capabilities (preserved)
- Create/edit/delete multiple choice questions
- Set correct answers and answer options
- Assign to semester + level
6.6 Actions
All existing CRUD actions preserved. Admin only for create/edit/delete.
6.7 Role Visibility
- Admin: Full CRUD
- View-Only: View only
- TA: Hidden
7. Screen: Quizzes
7.1 Purpose
Create assessments from the MCQ question bank (Section 6). Relocated from Program > Quizzes.
7.2 Entry Points
- Sidebar: Content > Quizzes
- Semester Hub > Setup Checklist: "Configure -->" link (pre-filtered by semester + level)
7.3 Layout
Filter bar + data table + pagination. Standard patterns.
7.4 Key Changes from Current
- New location: Content section (was Program)
- Semester + Level filter pre-population from checklist
- "Return to Checklist" banner when navigated from checklist
7.5 Existing Capabilities (preserved)
- Create/edit/delete quizzes
- Link MCQ questions to quizzes
- Transfer quizzes between semesters
7.6 Actions
All existing CRUD actions preserved. Admin only for create/edit/delete.
7.7 Role Visibility
- Admin: Full CRUD
- View-Only: View only
- TA: Hidden
8. Setup Checklist Integration (Cross-Domain Pattern)
All 6 content screens share this integration pattern with the Semester Hub > Setup Checklist (fully specified in 04-semester-management.md Section 3.6). Summarized here for implementer reference.
8.1 Deep Link
Checklist item "Configure -->" navigates to the content screen with URL parameters:
/content/video-lessons?semester={id}&level={id}&from=checklist
8.2 Pre-Filtering
Semester and level dropdown filters auto-populate from URL parameters on page load. The admin can change the filters after landing -- this does not affect the return behavior.
8.3 Return Banner
When from=checklist is present in the URL, a persistent banner appears at the top of the content screen:
<-- Return to Setup Checklist for [Semester Name]
8.4 Return Behavior
Clicking the banner navigates back to Semester Hub > Setup Checklist tab with scroll position preserved (scroll position stored in session state before navigation). If the admin navigates away via sidebar or breadcrumb instead, the banner context is discarded.
8.5 Checklist Status Update
After content is saved on any content screen, the corresponding checklist item status auto-updates on the next visit to the Setup Checklist tab. Status is computed dynamically by querying actual content counts (e.g., count of lessonsnew where semester_id and level_tag_id match), not stored as a separate flag.
8.6 Which Screens Support Level Pre-Filtering
| Screen | Semester Filter | Level Filter | Reason |
|---|---|---|---|
| Video Lessons | Yes | Yes | Content is level-scoped |
| Resources | Yes | Yes (multi) | Content is level-scoped; v2 supports multi-level per resource |
| Recordings | Yes | No | Recordings are not level-scoped in the checklist |
| Tutorials | Yes | Yes | Content is level-scoped |
| MCQ Questions | Yes | Yes | Content is level-scoped |
| Quizzes | Yes | Yes | Content is level-scoped |
9. Cross-Domain References
| From | To | Mechanism |
|---|---|---|
| Semester Hub > Setup Checklist | All 6 Content screens | "Configure -->" deep links with ?semester={id}&level={id}&from=checklist |
| All 6 Content screens | Semester Hub > Setup Checklist | "Return to Setup Checklist" banner (when ?from=checklist present) |
| Dashboard | Content screens (indirect) | Phase prompt --> Semester Hub > Setup Checklist --> Content deep links |
| TA sidebar | Content > Recordings | Direct sidebar link (TA view only) |
| Zoom (external) | Content > Recordings | Backend-only auto-upload + auto-tag pipeline; surfaces in UI via sync status badge and Pending Review queue (see §4.8) [backend] |