diff --git a/src/pages/content-management/HumanLanguagePage.tsx b/src/pages/content-management/HumanLanguagePage.tsx index 5c466c9..5e3b8ef 100644 --- a/src/pages/content-management/HumanLanguagePage.tsx +++ b/src/pages/content-management/HumanLanguagePage.tsx @@ -77,6 +77,31 @@ export function HumanLanguagePage() { return course.levels.filter((l) => l.modules.length > 0).map((l) => l.level.toUpperCase()) }, [selectedCourses, selectedCourseId]) + /** A1 always; A2–C3 only after that level has at least one module (incremental UI). */ + const visibleCefrLevels = useMemo(() => { + if (availableCourses.length === 0) return [] as CefrLevel[] + const out: CefrLevel[] = [] + for (const level of CEFR_LEVELS) { + if (level === "A1") { + out.push(level) + continue + } + const hasContent = selectedCourses.some((c) => { + const node = c.levels.find((item) => item.level.toUpperCase() === level) + return node !== undefined && node.modules.length > 0 + }) + if (hasContent) out.push(level) + } + return out + }, [availableCourses.length, selectedCourses]) + + useEffect(() => { + if (selectedLevel === "ALL") return + if (!visibleCefrLevels.includes(selectedLevel)) { + setSelectedLevel("ALL") + } + }, [selectedLevel, visibleCefrLevels]) + const toggleLevel = (level: CefrLevel) => { setCollapsedLevels((prev) => (prev.includes(level) ? prev.filter((l) => l !== level) : [...prev, level])) } @@ -305,7 +330,7 @@ export function HumanLanguagePage() { onChange={(e) => setSelectedLevel(e.target.value as CefrLevel | "ALL")} > ALL LEVELS - {CEFR_LEVELS.map((level) => ( + {visibleCefrLevels.map((level) => ( {level} @@ -395,7 +420,9 @@ export function HumanLanguagePage() { ) : null} {availableCourses.length > 0 - ? CEFR_LEVELS.filter((l) => selectedLevel === "ALL" || l === selectedLevel).map((level) => { + ? visibleCefrLevels + .filter((l) => selectedLevel === "ALL" || l === selectedLevel) + .map((level) => { const modulesByCourse = selectedCourses.map((course: HumanLanguageCourseTree) => { const levelNode = course.levels.find((item) => item.level.toUpperCase() === level) return { @@ -403,6 +430,14 @@ export function HumanLanguagePage() { modules: levelNode?.modules ?? [], } }) + const levelRemoveIds = + selectedCourseId === "ALL" + ? [] + : (() => { + const courseEntry = modulesByCourse.find((entry) => entry.course.course_id === selectedCourseId) + return (courseEntry?.modules ?? []).flatMap((m) => m.sub_modules.map((s) => s.id)) + })() + const canRemoveLevel = selectedCourseId !== "ALL" && levelRemoveIds.length > 0 return ( @@ -418,19 +453,27 @@ export function HumanLanguagePage() { { - if (selectedCourseId === "ALL") return + if (!canRemoveLevel) return const courseEntry = modulesByCourse.find((entry) => entry.course.course_id === selectedCourseId) const ids = (courseEntry?.modules ?? []).flatMap((m) => m.sub_modules.map((s) => s.id)) handleDeleteSubModules(ids, `level-${selectedCourseId}-${level}`, `Level ${level} removed`) }} > - - Remove level + + Remove {!collapsedLevels.includes(level) ? ( @@ -481,9 +524,10 @@ export function HumanLanguagePage() { Add Sub-module handleDeleteSubModules( @@ -493,8 +537,8 @@ export function HumanLanguagePage() { ) } > - - Remove Module + + Remove @@ -511,9 +555,10 @@ export function HumanLanguagePage() { Add practice/audio questions handleDeleteSubModules( @@ -523,8 +568,8 @@ export function HumanLanguagePage() { ) } > - - Remove Sub-module + + Remove ) : null}