From e860fc921465f3cecad6b0e74fa00dcfb1c639d9 Mon Sep 17 00:00:00 2001 From: PhuocNTB Date: Fri, 3 Jul 2026 19:05:33 +0700 Subject: [PATCH] fix --- management/src/App.tsx | 49 ++++ management/src/components/ClassWorkspace.tsx | 32 ++- management/src/components/LearningTab.tsx | 285 +++++++++++-------- 3 files changed, 238 insertions(+), 128 deletions(-) diff --git a/management/src/App.tsx b/management/src/App.tsx index 6235cc6..c698328 100644 --- a/management/src/App.tsx +++ b/management/src/App.tsx @@ -101,6 +101,25 @@ function App() { const route = useRoute(); const { staff, logout } = useAuth(); const [sidebarOpen, setSidebarOpen] = useState(false); + const [myClasses, setMyClasses] = useState<{ id: number; name: string; code: string }[]>(() => { + try { + const stored = localStorage.getItem('sc_my_classes_details'); + return stored ? JSON.parse(stored) : []; + } catch { + return []; + } + }); + + useEffect(() => { + const handleUpdate = () => { + try { + const stored = localStorage.getItem('sc_my_classes_details'); + setMyClasses(stored ? JSON.parse(stored) : []); + } catch (e) {} + }; + window.addEventListener('my-classes-updated', handleUpdate); + return () => window.removeEventListener('my-classes-updated', handleUpdate); + }, []); useEffect(() => { const initial = parseRoute(); @@ -219,6 +238,36 @@ function App() { + {myClasses.length > 0 && ( + <> +
Lớp của tôi
+ {myClasses.map((c) => ( +
  • + +
  • + ))} + + )} +
    Công tác sinh viên
  • + - - )} + {!loading && activeClasses.length === 0 && ( +
    + + + + + + +

    Chưa có lớp nào được tạo lịch học.

    + +
    + )} - {!loading && activeClasses.length > 0 && filteredClasses.length === 0 && ( -
    - - - - -

    Không tìm thấy lớp phù hợp với bộ lọc hiện tại.

    - -
    - )} + {!loading && activeClasses.length > 0 && filteredClasses.length === 0 && ( +
    + + + + +

    Không tìm thấy lớp phù hợp với bộ lọc hiện tại.

    + +
    + )} - {!loading && filteredClasses.length > 0 && viewMode === 'timetable' && ( - - )} + {!loading && filteredClasses.length > 0 && viewMode === 'timetable' && ( + + )} - {!loading && filteredClasses.length > 0 && viewMode === 'list' && ( -
    - {filteredClasses.map(cls => { - const byDay = schedulesByDay(cls); - const today = classHasToday(cls); - return ( -
    -
    -
    -
    {cls.classCode}
    -

    {cls.name}

    - {(cls.specializeName || cls.systemName) && ( -

    - {[cls.specializeName, cls.systemName].filter(Boolean).join(' · ')} -

    - )} -
    -
    - {today && Hôm nay} - {cls.studentCount != null && cls.studentCount > 0 && ( - {cls.studentCount} SV - )} -
    -
    - -
    - {byDay.size === 0 ? ( -

    Chưa cấu hình ca học

    - ) : ( - Array.from(byDay.entries()).map(([day, shifts]) => ( -
    - {getDayLabel(day)} -
    - {shifts.map((s, idx) => ( - - Ca{s.period || 1} {s.startTime && s.endTime ? `${s.startTime}–${s.endTime}` : ''} - {s.courseName ? ` · ${s.courseName}` : ''} - - ))} -
    + {!loading && filteredClasses.length > 0 && viewMode === 'list' && ( +
    + {filteredClasses.map(cls => { + const today = classHasToday(cls); + const isMyClass = myClasses.includes(cls.rkId); + return ( +
    +
    +
    + +
    +
    {cls.classCode}
    +

    {cls.name}

    + {(cls.specializeName || cls.systemName) && ( +

    + {[cls.specializeName, cls.systemName].filter(Boolean).join(' · ')} +

    + )}
    - )) - )} -
    +
    +
    + {today && Hôm nay} + {cls.studentCount != null && cls.studentCount > 0 && ( + {cls.studentCount} SV + )} +
    + - {cls.allowedApps && ( -

    - App: {cls.allowedApps} -

    - )} - -
    - - - -
    -
    - ); - })} -
    - )} + + + ); + })} + + )} +