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
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