- Add LessonPracticesPage with GET /lessons/:id/practices and polished UI
- Route and module lesson navigation; view practices icon on VideoCard hover
- Question type definitions API, DynamicSchemaSlotField, definition helpers
- AddPracticeFlow and practice steps; AddQuestionPage and PracticeQuestionEditorFields
Co-authored-by: Cursor <cursoragent@cursor.com>
- VideoCard: optional onAddPractice for lesson-scoped CTA
- ModuleDetailPage: navigate to add-practice with lessonId and lessonTitle
- AddPracticeFlow: show context banner when opened from a lesson
Co-authored-by: Cursor <cursoragent@cursor.com>
- Add practiceDynamicQuestionPayload helper to build stimulus/response slots
- Extend PracticeQuestionEditorFields with DYNAMIC type, definition picker, and per-slot values (JSON-capable)
- Wire AddNewPracticePage and AddNewLessonPage createQuestion to send question_type_definition_id and dynamic_payload
- Use lesson/practice save status (DRAFT/PUBLISHED) for created questions instead of always PUBLISHED
Co-authored-by: Cursor <cursoragent@cursor.com>
Handle environments where sub-module lesson detail is missing by falling back to question-set detail, and keep lesson form/status typing safe.
Made-with: Cursor
For lessons, fetch related questions by lesson question_set_id and render a styled question bank panel (same UX as practice), including add/edit/delete with proper refresh.
Made-with: Cursor
Fetch selected lesson details from the sub-module lesson endpoint so the inline detail panel shows the latest question count and lesson metadata.
Made-with: Cursor
Load human language lesson edit data from the dedicated sub-module lesson detail API so lesson metadata stays aligned with the backend response shape.
Made-with: Cursor
Retry scroll restoration until the page is tall enough so refreshes restore to the saved position smoothly, while keeping reduced-motion fallback.
Made-with: Cursor
Replace ad-hoc Loader2 loading indicators with SpinnerIcon so loading states across content and notifications pages use the same Circular-indeterminate progress indicator.
Made-with: Cursor
Route published lesson success back to the Human Language page so prior scroll position is restored, and explicitly guard practice question rendering by fetch status.
Made-with: Cursor
Filter course options by exact selected category_id in flows to prevent first-load course mismatch that changed module counts after refresh.
Made-with: Cursor
Keep retrying hierarchy fetch for a short period when the tab is active and still empty, so data appears automatically without manual refresh.
Made-with: Cursor
Trigger hierarchy fetch whenever the Human Language route is selected so data appears immediately when switching tabs from Content Management.
Made-with: Cursor