From ea73c15738a220952c0e2d5dc1b84d30ebb303d3 Mon Sep 17 00:00:00 2001 From: PhuocNTB Date: Fri, 3 Jul 2026 18:28:54 +0700 Subject: [PATCH] fix ui --- management/src/components/AttendancePanel.tsx | 140 ++++++++++-------- 1 file changed, 81 insertions(+), 59 deletions(-) diff --git a/management/src/components/AttendancePanel.tsx b/management/src/components/AttendancePanel.tsx index 67ee162..8880b15 100644 --- a/management/src/components/AttendancePanel.tsx +++ b/management/src/components/AttendancePanel.tsx @@ -36,6 +36,16 @@ export const AttendancePanel: React.FC = ({ classId }) => const [pushing, setPushing] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [selectedStudentRkIds, setSelectedStudentRkIds] = useState([]); + const [isCollapsed, setIsCollapsed] = useState(false); + + const handleScroll = useCallback((e: React.UIEvent) => { + const scrollTop = e.currentTarget.scrollTop; + if (scrollTop > 20) { + setIsCollapsed(true); + } else if (scrollTop <= 5) { + setIsCollapsed(false); + } + }, []); const loadShifts = useCallback(async () => { try { @@ -210,6 +220,14 @@ export const AttendancePanel: React.FC = ({ classId }) => onChange={e => setSearchQuery(e.target.value)} /> + @@ -218,67 +236,71 @@ export const AttendancePanel: React.FC = ({ classId }) => -
- {qldtSynced ? ( - qldtDirty ? ( - <> - Đã lưu QLĐT — có thay đổi mới - - Lần đẩy: {formatQldtTime(shiftInfo?.pushedToQldtAt)} · Cần đẩy lại sau khi chỉnh sửa - - - ) : ( - <> - Đã lưu QLĐT - Lần đẩy gần nhất: {formatQldtTime(shiftInfo?.pushedToQldtAt)} - - ) - ) : ( - <> - Chưa đẩy lên QLĐT - Ca {period} ngày {date} — bấm "Đẩy QLĐT" sau khi kiểm tra trạng thái - - )} -
- - {currentShift && ( -
- {currentShift.startTime}–{currentShift.endTime} - {currentShift.courseName || 'Chưa chọn môn'} - {!currentShift.isActive && Ca tắt} -
- )} - -
- {ATTENDANCE_STATUS_OPTIONS.map(opt => ( - - ))} - - {filteredRows.length}/{rows.length} SV - {searchQuery.trim() ? ' (đã lọc)' : ''} - -
+ {qldtSynced ? ( + qldtDirty ? ( + <> + Đã lưu QLĐT — có thay đổi mới + + Lần đẩy: {formatQldtTime(shiftInfo?.pushedToQldtAt)} · Cần đẩy lại sau khi chỉnh sửa + + + ) : ( + <> + Đã lưu QLĐT + Lần đẩy gần nhất: {formatQldtTime(shiftInfo?.pushedToQldtAt)} + + ) + ) : ( + <> + Chưa đẩy lên QLĐT + Ca {period} ngày {date} — bấm "Đẩy QLĐT" sau khi kiểm tra trạng thái + + )} + -

- Sửa trạng thái thủ công sẽ được khóa — hệ thống tự tính sẽ không ghi đè. -

+ {currentShift && ( +
+ {currentShift.startTime}–{currentShift.endTime} + {currentShift.courseName || 'Chưa chọn môn'} + {!currentShift.isActive && Ca tắt} +
+ )} -
- 💡 Lưu ý: Hệ thống hiện tại chỉ ghi nhận điểm danh học tập nội bộ và KHÔNG tự động lưu lên QLĐT. Thầy cô vui lòng kiểm tra kỹ trạng thái của sinh viên, sau đó bấm nút Đẩy QLĐT ở góc phải bên trên để đồng bộ điểm danh chính thức. -
+
+ {ATTENDANCE_STATUS_OPTIONS.map(opt => ( + + ))} + + {filteredRows.length}/{rows.length} SV + {searchQuery.trim() ? ' (đã lọc)' : ''} + +
+ +

+ Sửa trạng thái thủ công sẽ được khóa — hệ thống tự tính sẽ không ghi đè. +

+ +
+ 💡 Lưu ý: Hệ thống hiện tại chỉ ghi nhận điểm danh học tập nội bộ và KHÔNG tự động lưu lên QLĐT. Thầy cô vui lòng kiểm tra kỹ trạng thái của sinh viên, sau đó bấm nút Đẩy QLĐT ở góc phải bên trên để đồng bộ điểm danh chính thức. +
+ + )} {selectedStudentRkIds.length > 0 && (
@@ -309,7 +331,7 @@ export const AttendancePanel: React.FC = ({ classId }) =>
)} -
+
{loading ? (
) : (