diff --git a/src/pages/content-management/HumanLanguagePage.tsx b/src/pages/content-management/HumanLanguagePage.tsx index 3fcad64..6bcb976 100644 --- a/src/pages/content-management/HumanLanguagePage.tsx +++ b/src/pages/content-management/HumanLanguagePage.tsx @@ -18,7 +18,7 @@ export function HumanLanguagePage() { const [selectedSubCategoryId, setSelectedSubCategoryId] = useState("ALL") const [selectedCourseId, setSelectedCourseId] = useState("ALL") const [selectedLevel, setSelectedLevel] = useState("ALL") - const [collapsedLevels, setCollapsedLevels] = useState([]) + const [collapsedLevels, setCollapsedLevels] = useState([]) const [creatingKey, setCreatingKey] = useState(null) const [quickSubCategoryName, setQuickSubCategoryName] = useState("") const [quickCourseName, setQuickCourseName] = useState("") @@ -111,8 +111,8 @@ export function HumanLanguagePage() { } }, [selectedLevel, visibleCefrLevels]) - const toggleLevel = (level: CefrLevel) => { - setCollapsedLevels((prev) => (prev.includes(level) ? prev.filter((l) => l !== level) : [...prev, level])) + const toggleLevel = (levelKey: string) => { + setCollapsedLevels((prev) => (prev.includes(levelKey) ? prev.filter((l) => l !== levelKey) : [...prev, levelKey])) } const parseModuleNumber = (title: string): number | null => { @@ -429,184 +429,173 @@ export function HumanLanguagePage() { ) : null} {availableCourses.length > 0 - ? 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 { - course, - modules: levelNode?.modules ?? [], - } - }) - const levelRemoveIds = - resolvedCourseId == null - ? [] - : (() => { - const courseEntry = modulesByCourse.find((entry) => entry.course.course_id === resolvedCourseId) - return (courseEntry?.modules ?? []).flatMap((m) => m.sub_modules.map((s) => s.id)) - })() - const canRemoveLevel = resolvedCourseId != null && levelRemoveIds.length > 0 + ? selectedCourses.map((course: HumanLanguageCourseTree) => { + const courseLevels = CEFR_LEVELS.filter((level) => { + if (level === "A1") return true + const node = course.levels.find((item) => item.level.toUpperCase() === level) + return (node?.modules?.length ?? 0) > 0 + }).filter((level) => selectedLevel === "ALL" || selectedLevel === level) + return ( - -
- - + +
+

{course.course_name}

- {!collapsedLevels.includes(level) ? ( - - {modulesByCourse.length === 0 ? ( -

No lessons found for this level.

- ) : ( - modulesByCourse.map((entry) => ( -
-
-

{entry.course.course_name}

+ + {courseLevels.length === 0 ? ( +

No levels match the current level filter.

+ ) : ( + courseLevels.map((level) => { + const levelNode = course.levels.find((item) => item.level.toUpperCase() === level) + const modules = levelNode?.modules ?? [] + const levelKey = `${course.course_id}-${level}` + const levelRemoveIds = modules.flatMap((m) => m.sub_modules.map((s) => s.id)) + const canRemoveLevel = levelRemoveIds.length > 0 + return ( +
+
+
-
- {entry.modules.length === 0 ? ( -

No modules yet. Use “Add Module” to start.

- ) : ( - entry.modules.map((module) => ( -
-
-

Module: {module.title}

-
- - + {!collapsedLevels.includes(levelKey) ? ( +
+
+ +
+ {modules.length === 0 ? ( +

No modules yet. Use “Add Module” to start.

+ ) : ( + modules.map((module) => ( +
+
+

Module: {module.title}

+
+ + +
+ {module.sub_modules.map((subModule) => ( +
+
+

Sub-module: {subModule.title}

+ {categoryId ? ( +
+ + + + + + + +
+ ) : null} +
+
+ {subModule.videos.map((video) => ( +
+ + {video.title} +
+ ))} + {subModule.practices.map((practice) => ( +
+ Practice: {practice.title} ({practice.question_count} audio question(s)) +
+ ))} +
+
+ ))}
- {module.sub_modules.map((subModule) => ( -
-
-

Sub-module: {subModule.title}

- {categoryId ? ( -
- - - - - - - -
- ) : null} -
-
- {subModule.videos.map((video) => ( -
- - {video.title} -
- ))} - {subModule.practices.map((practice) => ( -
- Practice: {practice.title} ({practice.question_count} audio question(s)) -
- ))} -
-
- ))} -
- )) - )} -
+ )) + )} +
+ ) : null}
- )) - )} - - ) : null} + ) + }) + )} + ) })