diff --git a/.gitignore b/.gitignore index 3772982..8174972 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ # production /build +yarn.lock # misc .DS_Store diff --git a/app/page.tsx b/app/page.tsx index 517d847..e019ac0 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -53,6 +53,7 @@ const Home: FC = () => { const [isEditDialogOpen, setIsEditDialogOpen] = useState(false); const [isImportDialogOpen, setIsImportDialogOpen] = useState(false); + const [showButtons, setShowButtons] = useState(true); const [currentEditingData, setCurrentEditingData] = useState< EditingData | undefined >(undefined); @@ -67,9 +68,11 @@ const Home: FC = () => { const [attendance, setAttendance] = useState({ present: 36, total: 36, + seatCount:36, }); const [showSchedule, setShowSchedule] = useState(true); const [showCredits, setShowCredits] = useState(false); + const [seatCount, setSeatCount] = useState(0); const formatEditingData = (): EditingData => { return { @@ -82,11 +85,20 @@ const Home: FC = () => { absentSeatNumbers: attendance.absentSeatNumbers || "", }, showSchedule: showSchedule, + seatCount: seatCount, }; }; function getSchedule() { - return examSchedule.map((exam) => ( + const sortedExams = [...examSchedule].sort((a, b) => { + const timeToMinutes = (time: string) => { + const [hours, minutes] = time.split(':').map(num => parseInt(num, 10)); + return hours * 60 + minutes; + }; + return timeToMinutes(a.startTime) - timeToMinutes(b.startTime); + }); + + return sortedExams.map((exam) => (
  • { }); setShowSchedule(data.showSchedule); + setSeatCount(data.seatCount); setIsEditDialogOpen(false); }; @@ -262,13 +275,20 @@ const Home: FC = () => { href="https://github.com/kevin0216" className="text-blue-400 hover:text-blue-500" > -  @kevin0216 +  @kevin0216  + + &{" "} + +  @hanshans135 {screenfull.isFullscreen ? (

    - 目前正在全螢幕模式下,按 F11, Esc 或右方按鈕來離開 + 按 F11, Esc 或右方按鈕來離開全螢幕

    ) : ( @@ -404,26 +424,43 @@ const Home: FC = () => {
    - - + + + /> +

    編輯考程與人數

    + + + +
    diff --git a/components/editDialog.tsx b/components/editDialog.tsx index e05532d..aada1f8 100644 --- a/components/editDialog.tsx +++ b/components/editDialog.tsx @@ -43,6 +43,7 @@ const EditDialog: FC = ({ absentSeatNumbers: "", }, showSchedule: true, + seatCount: 0, }, ); @@ -58,6 +59,7 @@ const EditDialog: FC = ({ absentSeatNumbers: "", }, showSchedule: true, + seatCount: 0, }, ); }, [initialData]); @@ -92,6 +94,12 @@ const EditDialog: FC = ({ setData(newData); }; + const handleSeatCountChange = (value: number) => { + const newData = { ...data }; + newData.seatCount = value; + setData(newData); + }; + const handleAbsentSeatNumbersChange = (number: number, isAbsent: number) => { const newData = { ...data }; var absentSeatNumbers = newData.attendanceData.absentSeatNumbers.split(","); @@ -170,11 +178,11 @@ const EditDialog: FC = ({ return false; } - function getNumberButton(expectedAttendance: number) { + function getNumberButton(seatCount: number) { let numberGrid = []; var i: number; - for (i = 0; i < expectedAttendance; i++) { + for (i = 0; i < seatCount; i++) { numberGrid.push(i + 1); } @@ -288,7 +296,7 @@ const EditDialog: FC = ({ placeholder="請輸入科目..." /> ) => { handleStartTimeChange(index, e.target.value); @@ -301,7 +309,7 @@ const EditDialog: FC = ({ placeholder="請輸入開始時間... (24小時制)" /> ) => { handleEndTimeChange(index, e.target.value); @@ -362,10 +370,16 @@ const EditDialog: FC = ({ ) => { - handleExpectedAttendanceChange( - parseInt(e.target.value, 10), - ); + const newValue = parseInt(e.target.value, 10); + handleExpectedAttendanceChange(newValue); + const absentCount = data.attendanceData.absentSeatNumbers ? + data.attendanceData.absentSeatNumbers.split(',').filter(x => x).length : 0; + const newData = { ...data }; + newData.attendanceData.expectedAttendance = newValue; + newData.attendanceData.actualAttendance = newValue - absentCount; + setData(newData); }} className="block w-32 mt-1 px-3 py-2 rounded-md bg-gray-100 border border-gray-300 dark:border-slate-600 dark:bg-slate-600 dark:placeholder-white text-gray-900 dark:text-white placeholder-gray-500 focus:dark:border-white focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" placeholder="應到人數" @@ -391,6 +405,23 @@ const EditDialog: FC = ({ placeholder="實到人數" /> +
    +

    + 座號數量 +

    + ) => { + handleSeatCountChange( + parseInt(e.target.value, 10), + ); + }} + className="block w-32 mt-1 px-3 py-2 rounded-md bg-gray-100 border border-gray-300 dark:border-slate-600 dark:bg-slate-600 dark:placeholder-white text-gray-900 dark:text-white placeholder-gray-500 focus:dark:border-white focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" + placeholder="座號數量" + /> +

    @@ -400,9 +431,7 @@ const EditDialog: FC = ({ 請點選未到學生座號來標記缺考

    - {getNumberButton( - data.attendanceData.expectedAttendance, - )} + {getNumberButton(data.seatCount)}
    diff --git a/lib/interfaces.tsx b/lib/interfaces.tsx index 58e9227..8c846e9 100644 --- a/lib/interfaces.tsx +++ b/lib/interfaces.tsx @@ -9,6 +9,7 @@ export interface Attendance { present: number; total: number; absentSeatNumbers?: string; + seatCount: number; } export interface EditingData { @@ -21,6 +22,7 @@ export interface EditingData { absentSeatNumbers: string; }; showSchedule: boolean; + seatCount: number; } export interface ImportExamData { @@ -29,3 +31,5 @@ export interface ImportExamData { startTime: string; endTime: string; } + +