From e4109a26a911a4948001861124b1014e07410265 Mon Sep 17 00:00:00 2001 From: Yared Yemane Date: Tue, 7 Apr 2026 07:41:37 -0700 Subject: [PATCH] UI adjustment --- .../content-management/HumanLanguagePage.tsx | 71 +++++++++++++++---- 1 file changed, 58 insertions(+), 13 deletions(-) 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")} > - {CEFR_LEVELS.map((level) => ( + {visibleCefrLevels.map((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() {
{!collapsedLevels.includes(level) ? ( @@ -481,9 +524,10 @@ export function HumanLanguagePage() { Add Sub-module @@ -511,9 +555,10 @@ export function HumanLanguagePage() { ) : null}