Resolve course id when filters imply a single course so Add next CEFR level works without forcing Course selection; show incremental CEFR sections; tighten remove actions; use optional chaining on module lists.
Made-with: Cursor
Avoid nested button markup so remove-level controls render reliably, keep level rows visible for all CEFR levels, and add clearer guidance/labeling for incremental level creation starting from A1.
Made-with: Cursor
Add AUDIO question support to the shared practice creation page and preserve human-language navigation context so back/cancel returns to the Human Language page.
Made-with: Cursor
Adopt a structured empty-state layout similar to sub-category management screens, auto-create the Human Language category when missing, hide level listing until a path exists, and surface first-path creation clearly.
Made-with: Cursor
Allow creating the initial subcategory/course path directly from the Human Language page empty state so module and sub-module creation can start immediately.
Made-with: Cursor
Keep course rows visible even when module count is zero so Add Module is accessible immediately, and show a clear empty-state hint before first module creation.
Made-with: Cursor
Provide incremental Module-N and Module-N.M creation buttons, plus direct sub-module actions to manage lesson media and practice/audio question creation.
Made-with: Cursor
Integrate the admin Human Language page with the new hierarchy API and present subcategory/course/level/module/sub-module tree including videos and practices.
Made-with: Cursor
Hide Speaking from content tabs and update Human Language filters to subcategory and course-focused selection for the single descriptive language category flow.
Made-with: Cursor
Drop the practice-level edit action and modal from the Speaking page while preserving collapsible groups, searchable practice filtering, and question bulk actions.
Made-with: Cursor
Improve Speaking tab UX with collapsible practice sections, searchable practice filter picker, whole-practice selection controls, and a practice metadata editor wired to the backend practice update API.
Made-with: Cursor
Group audio questions under practices on the Speaking tab, add client-side search and image previews, and support multi-select bulk deletion of audio questions.
Made-with: Cursor
Filter speaking practice options using returned AUDIO question rows instead of total_count so unrelated practices are excluded reliably.
Made-with: Cursor
Limit the Speaking page practice filter options to sets that contain AUDIO questions and clear stale selected filter values when unavailable.
Made-with: Cursor
Show a live intro video preview from the entered URL, using Vimeo embed playback when applicable and HTML5 video fallback for direct links.
Made-with: Cursor
Ensure the speaking question set is created when moving from setup to questions, rename Set status to Status, and default new set status to PUBLISHED.
Made-with: Cursor
Re-fetch practice options after creating a speaking practice and auto-select the new set so freshly created practices appear immediately in the filter and question list.
Made-with: Cursor
- Flows: Parent category sequence (reorder all parents), sub category sequence per parent, sub category structure (courses/questions/feedback)
- Fix Flow page white screen (useEffect deps: selectedSubCategoryId/selectedParentCategoryId)
- Loading state: visible refresh icon (white card, brand-600) on AllCourses, Courses, CourseFlowBuilder, SubCourses
- Add team member page, team API and types, route /team/add
Made-with: Cursor