From afc4ba91ca7c22ab1798115730ba512dad0c7e93 Mon Sep 17 00:00:00 2001 From: Suhjung Park <145967352+Imggaggu@users.noreply.github.com> Date: Sun, 25 May 2025 04:06:53 +0900 Subject: [PATCH 01/24] Update AdminStudentAssignment.jsx --- frontend/src/pages/admin/AdminStudentAssignment.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/admin/AdminStudentAssignment.jsx b/frontend/src/pages/admin/AdminStudentAssignment.jsx index 345778f..b5ddb99 100644 --- a/frontend/src/pages/admin/AdminStudentAssignment.jsx +++ b/frontend/src/pages/admin/AdminStudentAssignment.jsx @@ -27,7 +27,7 @@ const AdminStudentAssignment = () => { } fetchStudentInfo(id).then((res) => { - setStudentInfo(res.data.data); + setStudentInfo(res.data); }); From 5c4447cc6a7f59fe80b66641305dc88424d92d13 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 04:39:03 +0900 Subject: [PATCH 02/24] [Fix] attendanceRes --- frontend/src/pages/admin/AdminStudentAssignment.jsx | 2 +- frontend/src/pages/admin/AdminStudentAttendance.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/admin/AdminStudentAssignment.jsx b/frontend/src/pages/admin/AdminStudentAssignment.jsx index b5ddb99..e4b6351 100644 --- a/frontend/src/pages/admin/AdminStudentAssignment.jsx +++ b/frontend/src/pages/admin/AdminStudentAssignment.jsx @@ -27,7 +27,7 @@ const AdminStudentAssignment = () => { } fetchStudentInfo(id).then((res) => { - setStudentInfo(res.data); + setStudentInfo(res); }); diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index b7039ae..22b75f2 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -27,7 +27,7 @@ const AdminStudentAttendance = () => { setStudentInfo(studentRes); const attendanceRes = await getStudentAttendance(studentId); - const processed = processWeeklyAttendance(attendanceRes); + const processed = processWeeklyAttendance(attendanceRes.data); setAttendanceData(processed); } catch (err) { console.error("데이터 불러오기 실패:", err); From e5310200d1da5fc4e0104ee4d55ee75268948603 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 04:55:31 +0900 Subject: [PATCH 03/24] =?UTF-8?q?[Fix]=20api=20=EC=97=B0=EA=B2=B0-=20?= =?UTF-8?q?=ED=95=99=EC=83=9D=EB=B3=84=20=EC=B6=9C=EC=84=9D=20=ED=98=84?= =?UTF-8?q?=ED=99=A9=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/AdminStudentAttendance.jsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 22b75f2..0030e5f 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -27,7 +27,15 @@ const AdminStudentAttendance = () => { setStudentInfo(studentRes); const attendanceRes = await getStudentAttendance(studentId); - const processed = processWeeklyAttendance(attendanceRes.data); + /* + "attendanceId": 1, + "userId": 1, + "username": "홍길동", + "date": "2023-10-20", + "order": 1, + "status": true + */ + const processed = processWeeklyAttendance(attendanceRes); setAttendanceData(processed); } catch (err) { console.error("데이터 불러오기 실패:", err); @@ -67,11 +75,9 @@ const AdminStudentAttendance = () => { const weekSlotMap = new Map(); const dateMap = new Map(); // 추가: 날짜 저장 - rawData.forEach(({ date, slots }) => { + rawData.forEach(({ date, order,status }) => { const week = getWeekFromDate(date); - const statuses = slots.map((s) => - s.status ? "SUCCESS" : "FAILURE" - ); + const statuses = status.map((s) => (s ? "SUCCESS" : "FAILURE")); const existing = weekSlotMap.get(week) || []; const existingDates = dateMap.get(week) || []; From 6744b7fc957ae3226a80967dc32b2a1295d21890 Mon Sep 17 00:00:00 2001 From: Suhjung Park <145967352+Imggaggu@users.noreply.github.com> Date: Sun, 25 May 2025 05:00:05 +0900 Subject: [PATCH 04/24] Update AdminStudentAttendance.jsx --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 0030e5f..d61e52a 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -77,7 +77,7 @@ const AdminStudentAttendance = () => { rawData.forEach(({ date, order,status }) => { const week = getWeekFromDate(date); - const statuses = status.map((s) => (s ? "SUCCESS" : "FAILURE")); + const statuses = [status ? "SUCCESS" : "FAILURE"]; const existing = weekSlotMap.get(week) || []; const existingDates = dateMap.get(week) || []; From 2ffc2f2daac13d7aa71663da64546692175f1c81 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 05:20:26 +0900 Subject: [PATCH 05/24] =?UTF-8?q?[Fix]=20Attendance=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/AdminDailyAttendanceCard.jsx | 28 ++++++++++++++++--- .../pages/admin/AdminStudentAttendance.jsx | 6 ++-- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/AdminDailyAttendanceCard.jsx b/frontend/src/components/AdminDailyAttendanceCard.jsx index 73b0b07..a50b646 100644 --- a/frontend/src/components/AdminDailyAttendanceCard.jsx +++ b/frontend/src/components/AdminDailyAttendanceCard.jsx @@ -24,8 +24,24 @@ const AdminDailyAttendanceCard = ({ date, studentId, onClose }) => { */ try { const rawData = await getStudentAttendance(studentId); - const dayData = rawData.data.find((d) => d.date === date); - const rawSlots = dayData?.slots || []; + /* + "attendanceId": 1, + "userId": 1, + "username": "홍길동", + "date": "2023-10-20", + "order": 1, + "status": true + */ + const dayData = rawData.find((d) => d.date === date); + const rawSlots = dayData + ? [ + { + id: dayData.attendanceId, // API 요청용 ID + order: dayData.order, // 회차 표시용 + status: dayData.status ? "SUCCESS" : "FAILURE", + }, + ] + : []; setSlots(rawSlots); setModified(Array(rawSlots.length).fill(false)); @@ -49,8 +65,12 @@ const AdminDailyAttendanceCard = ({ date, studentId, onClose }) => { const handleSave = async (idx) => { try { - const slot = slots[idx]; - await updateAttendanceStatus(studentId, slot.id, slot.status); + + const slot = slots[idx]; + const attendanceId = slot.id; + const status = slot.status === "SUCCESS"; + + await updateAttendanceStatus(studentId, attendanceId, status); const newModified = [...modified]; newModified[idx] = false; diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 0030e5f..daffa99 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; import AdminStudentHeader from "../../components/AdminStudentHeader"; -import DailyAttendanceCard from "../../components/AdminDailyAttendanceCard"; +import AdminDailyAttendanceCard from "../../components/AdminDailyAttendanceCard"; import api from "../../api/api"; import styles from "./AdminStudentAttendance.module.css"; import AdminWeeklyAttendanceList from "../../components/AdminWeeklyAttendanceList"; @@ -75,7 +75,7 @@ const AdminStudentAttendance = () => { const weekSlotMap = new Map(); const dateMap = new Map(); // 추가: 날짜 저장 - rawData.forEach(({ date, order,status }) => { + rawData.forEach(({ date, order, status }) => { const week = getWeekFromDate(date); const statuses = status.map((s) => (s ? "SUCCESS" : "FAILURE")); const existing = weekSlotMap.get(week) || []; @@ -137,7 +137,7 @@ const AdminStudentAttendance = () => { {/* 선택된 날짜의 상세 수정 카드 */} {selectedDate && ( - setSelectedDate(null)} From 7d0cf0df01b383b54ff51f52790f6eedca9efdeb Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 05:49:56 +0900 Subject: [PATCH 06/24] =?UTF-8?q?[Fix]=20date=20=EB=B0=9B=EC=95=84?= =?UTF-8?q?=EC=98=A4=EA=B8=B0=20admin=20attendance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 35d156a..7a18db3 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -88,8 +88,8 @@ const AdminStudentAttendance = () => { return Array.from({ length: 5 }, (_, i) => { const week = i + 1; const all = weekSlotMap.get(week) || []; - const dates = dateMap.get(week) || []; - + //const dates = dateMap.get(week) || []; + const dates = sortedByOrder.map((r) => r.date); const classes = [0, 1, 2].map((classIdx) => { const slice = all.slice(classIdx * 3, classIdx * 3 + 3); const trueCount = slice.filter((s) => s === "SUCCESS").length; @@ -116,7 +116,10 @@ const AdminStudentAttendance = () => { }); - return { week, classes }; + return { + week, + classes + }; }); }; From 376987b6adab804e7bbd35df0867ad3cfc4599c7 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 06:07:50 +0900 Subject: [PATCH 07/24] =?UTF-8?q?[Fix]=20date=20=EB=B0=9B=EC=95=84?= =?UTF-8?q?=EC=98=A4=EA=B8=B0=20admin=20attendance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/AdminDailyAttendanceCard.jsx | 20 +++++++++---------- .../pages/admin/AdminStudentAttendance.jsx | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/AdminDailyAttendanceCard.jsx b/frontend/src/components/AdminDailyAttendanceCard.jsx index a50b646..9d982fd 100644 --- a/frontend/src/components/AdminDailyAttendanceCard.jsx +++ b/frontend/src/components/AdminDailyAttendanceCard.jsx @@ -32,19 +32,19 @@ const AdminDailyAttendanceCard = ({ date, studentId, onClose }) => { "order": 1, "status": true */ - const dayData = rawData.find((d) => d.date === date); - const rawSlots = dayData - ? [ - { - id: dayData.attendanceId, // API 요청용 ID - order: dayData.order, // 회차 표시용 - status: dayData.status ? "SUCCESS" : "FAILURE", - }, - ] - : []; + const rawSlots = rawData + .filter((d) => d.date === date) // 해당 날짜의 출석만 필터 + .sort((a, b) => a.order - b.order) // order 순으로 정렬 + .map((d) => ({ + date: d.date, + id: d.attendanceId, // 출석 ID + order: d.order, // 회차 표시용 + status: d.status ? "SUCCESS" : "FAILURE", // 드롭다운에 맞게 변환 + })); setSlots(rawSlots); setModified(Array(rawSlots.length).fill(false)); + } catch (err) { console.error("슬롯 정보 불러오기 실패:", err); } diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 7a18db3..f71a380 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -83,13 +83,13 @@ const AdminStudentAttendance = () => { weekSlotMap.set(week, [...existing, ...statuses]); dateMap.set(week, [...existingDates, date]); + console.log("✅ week", week, "=>", newDates); }); return Array.from({ length: 5 }, (_, i) => { const week = i + 1; const all = weekSlotMap.get(week) || []; - //const dates = dateMap.get(week) || []; - const dates = sortedByOrder.map((r) => r.date); + const dates = dateMap.get(week) || []; const classes = [0, 1, 2].map((classIdx) => { const slice = all.slice(classIdx * 3, classIdx * 3 + 3); const trueCount = slice.filter((s) => s === "SUCCESS").length; From 5a2251e2a22b414e29bb2aae0148edc422827de2 Mon Sep 17 00:00:00 2001 From: Suhjung Park <145967352+Imggaggu@users.noreply.github.com> Date: Sun, 25 May 2025 06:11:13 +0900 Subject: [PATCH 08/24] Update AdminStudentAttendance.jsx --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index f71a380..b84baa2 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -83,7 +83,7 @@ const AdminStudentAttendance = () => { weekSlotMap.set(week, [...existing, ...statuses]); dateMap.set(week, [...existingDates, date]); - console.log("✅ week", week, "=>", newDates); + }); return Array.from({ length: 5 }, (_, i) => { From d6a3fc71078771e7b73d862541bcfc11526a076f Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 06:20:52 +0900 Subject: [PATCH 09/24] =?UTF-8?q?=EB=94=94=EB=B2=84=EA=B9=85=EC=9A=A9=20?= =?UTF-8?q?=EC=BD=98=EC=86=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/AdminWeeklyAttendanceList.jsx | 5 ++++- frontend/src/pages/admin/AdminStudentAttendance.jsx | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/AdminWeeklyAttendanceList.jsx b/frontend/src/components/AdminWeeklyAttendanceList.jsx index 6072f3c..07f3783 100644 --- a/frontend/src/components/AdminWeeklyAttendanceList.jsx +++ b/frontend/src/components/AdminWeeklyAttendanceList.jsx @@ -19,7 +19,10 @@ const AdminWeeklyAttendanceList = ({ attendanceData, onSelectDate }) => { cls.date && onSelectDate(cls.date)} + onClick={() => { + console.log("🧪 클릭됨!", cls.date); + cls.date && onSelectDate(cls.date); + }} /> ))} diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index f71a380..3d0b1de 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -83,7 +83,7 @@ const AdminStudentAttendance = () => { weekSlotMap.set(week, [...existing, ...statuses]); dateMap.set(week, [...existingDates, date]); - console.log("✅ week", week, "=>", newDates); + }); return Array.from({ length: 5 }, (_, i) => { From 4e1605207eb56342868ec3009b5c38814d4870aa Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 06:38:29 +0900 Subject: [PATCH 10/24] =?UTF-8?q?[Fix]=20processWeeklyAttendance=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/admin/AdminStudentAttendance.jsx | 100 ++++++++---------- 1 file changed, 47 insertions(+), 53 deletions(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 3d0b1de..f21971d 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -64,64 +64,58 @@ const AdminStudentAttendance = () => { }, []); */ // 날짜 기반 주차-회차 구조로 변환 - const processWeeklyAttendance = (rawData) => { - const startDate = new Date("2025-06-24"); - const getWeekFromDate = (dateStr) => { - const d = new Date(dateStr); - const diffDays = Math.floor((d - startDate) / (1000 * 60 * 60 * 24)); - return Math.floor(diffDays / 7) + 1; - }; - - const weekSlotMap = new Map(); - const dateMap = new Map(); // 추가: 날짜 저장 - - rawData.forEach(({ date, order, status }) => { - const week = getWeekFromDate(date); - const statuses = [status ? "SUCCESS" : "FAILURE"]; - const existing = weekSlotMap.get(week) || []; - const existingDates = dateMap.get(week) || []; - - weekSlotMap.set(week, [...existing, ...statuses]); - dateMap.set(week, [...existingDates, date]); - - }); +const processWeeklyAttendance = (rawData) => { + const startDate = new Date("2025-06-24"); - return Array.from({ length: 5 }, (_, i) => { - const week = i + 1; - const all = weekSlotMap.get(week) || []; - const dates = dateMap.get(week) || []; - const classes = [0, 1, 2].map((classIdx) => { - const slice = all.slice(classIdx * 3, classIdx * 3 + 3); - const trueCount = slice.filter((s) => s === "SUCCESS").length; - - let status; - switch (trueCount) { - case 3: - status = "SUCCESS"; - break; - case 2: - status = "INSUFFICIENT"; - break; - case 1: - status = "FAILURE"; - break; - default: - status = "EMPTY"; - } - - return { - status, - date: dates[classIdx] || null, - }; - }); + const getWeekFromDate = (dateStr) => { + const d = new Date(dateStr); + const diffDays = Math.floor((d - startDate) / (1000 * 60 * 60 * 24)); + return Math.floor(diffDays / 7) + 1; + }; + // 주차별 출석 정보 묶기 + const weekMap = new Map(); + + rawData.forEach(({ date, order, status }) => { + const week = getWeekFromDate(date); + const entry = { date, order, status: status ? "SUCCESS" : "FAILURE" }; + + if (!weekMap.has(week)) weekMap.set(week, []); + weekMap.get(week).push(entry); + }); + + return Array.from({ length: 5 }, (_, i) => { + const week = i + 1; + const entries = (weekMap.get(week) || []).sort((a, b) => a.order - b.order); + + const classes = [0, 1, 2].map((classIdx) => { + const slice = entries.slice(classIdx * 3, classIdx * 3 + 3); + const trueCount = slice.filter((e) => e.status === "SUCCESS").length; + + let status; + switch (trueCount) { + case 3: + status = "SUCCESS"; + break; + case 2: + status = "INSUFFICIENT"; + break; + case 1: + status = "FAILURE"; + break; + default: + status = "EMPTY"; + } return { - week, - classes - }; + status, + date: entries[classIdx]?.date || null, + }; }); - }; + + return { week, classes }; + }); +}; return (
From cdb7708128737e5b36f10dea317646ff709cf32b Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 07:00:11 +0900 Subject: [PATCH 11/24] =?UTF-8?q?[Fix]=20empty=20=EA=B3=A0=EB=A0=A4=20proc?= =?UTF-8?q?essWeeklyAttendance=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/AdminStudentAttendance.jsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index f21971d..74a7500 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -66,12 +66,19 @@ const AdminStudentAttendance = () => { // 날짜 기반 주차-회차 구조로 변환 const processWeeklyAttendance = (rawData) => { const startDate = new Date("2025-06-24"); + const offsetDays = [0, 2, 4]; + const getWeekFromDate = (dateStr) => { const d = new Date(dateStr); const diffDays = Math.floor((d - startDate) / (1000 * 60 * 60 * 24)); return Math.floor(diffDays / 7) + 1; }; + const getDateForClass = (week, classIdx) => { + const base = new Date(startDate); + base.setDate(base.getDate() + (week - 1) * 7 + offsetDays[classIdx]); + return base.toISOString().split("T")[0]; // 'YYYY-MM-DD' 형식 + }; // 주차별 출석 정보 묶기 const weekMap = new Map(); @@ -87,9 +94,11 @@ const processWeeklyAttendance = (rawData) => { return Array.from({ length: 5 }, (_, i) => { const week = i + 1; const entries = (weekMap.get(week) || []).sort((a, b) => a.order - b.order); - + const classes = [0, 1, 2].map((classIdx) => { const slice = entries.slice(classIdx * 3, classIdx * 3 + 3); + const fallbackDate = getDateForClass(week, classIdx); + const trueCount = slice.filter((e) => e.status === "SUCCESS").length; let status; @@ -108,8 +117,9 @@ const processWeeklyAttendance = (rawData) => { } return { - status, - date: entries[classIdx]?.date || null, + order, + status: entry?.status ?? "EMPTY", + date: entry?.date ?? fallbackDate, }; }); From 7ae6767ac04592a7425ce27bbbb392fa4a507e1d Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 07:01:48 +0900 Subject: [PATCH 12/24] =?UTF-8?q?[Fix]=20empty=20=EA=B3=A0=EB=A0=A4=20proc?= =?UTF-8?q?essWeeklyAttendance=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 74a7500..06d72df 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -142,13 +142,21 @@ const processWeeklyAttendance = (rawData) => { onSelectDate={(date) => setSelectedDate(date)} /> - {/* 선택된 날짜의 상세 수정 카드 */} + {/* 선택된 날짜의 상세 수정 카드 {selectedDate && ( setSelectedDate(null)} /> + )}*/} + {selectedDate && ( + setSelectedDate(null)} + /> )}
); From 0f9ee2d7c999991873388ef9fb196d8808723a5a Mon Sep 17 00:00:00 2001 From: Suhjung Park <145967352+Imggaggu@users.noreply.github.com> Date: Sun, 25 May 2025 22:00:35 +0900 Subject: [PATCH 13/24] Update AdminStudentAttendance.jsx --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 06d72df..6065770 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -153,8 +153,8 @@ const processWeeklyAttendance = (rawData) => { {selectedDate && ( setSelectedDate(null)} /> )} From a644f497011fb8f7cc91889fd2b9ba31be01f047 Mon Sep 17 00:00:00 2001 From: Suhjung Park <145967352+Imggaggu@users.noreply.github.com> Date: Sun, 25 May 2025 22:35:07 +0900 Subject: [PATCH 14/24] Update AdminStudentAttendance.jsx --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 6065770..63dc7ed 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -96,6 +96,7 @@ const processWeeklyAttendance = (rawData) => { const entries = (weekMap.get(week) || []).sort((a, b) => a.order - b.order); const classes = [0, 1, 2].map((classIdx) => { + const order = classIdx + 1; const slice = entries.slice(classIdx * 3, classIdx * 3 + 3); const fallbackDate = getDateForClass(week, classIdx); From f8beb87ba83612f606cd7a4f7d4567bf838aa30a Mon Sep 17 00:00:00 2001 From: Suhjung Park <145967352+Imggaggu@users.noreply.github.com> Date: Sun, 25 May 2025 22:38:51 +0900 Subject: [PATCH 15/24] Update AdminStudentAttendance.jsx --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 63dc7ed..85834d8 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -97,7 +97,7 @@ const processWeeklyAttendance = (rawData) => { const classes = [0, 1, 2].map((classIdx) => { const order = classIdx + 1; - const slice = entries.slice(classIdx * 3, classIdx * 3 + 3); + const entry = entries.find((e) => e.order === order); const fallbackDate = getDateForClass(week, classIdx); const trueCount = slice.filter((e) => e.status === "SUCCESS").length; From 29cb6600c4157ab722aa9605d17f3da7f4088ca0 Mon Sep 17 00:00:00 2001 From: Suhjung Park <145967352+Imggaggu@users.noreply.github.com> Date: Sun, 25 May 2025 22:40:06 +0900 Subject: [PATCH 16/24] Update AdminStudentAttendance.jsx --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 85834d8..e56c33d 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -97,8 +97,10 @@ const processWeeklyAttendance = (rawData) => { const classes = [0, 1, 2].map((classIdx) => { const order = classIdx + 1; + const slice = entries.slice(classIdx * 3, classIdx * 3 + 3); const entry = entries.find((e) => e.order === order); const fallbackDate = getDateForClass(week, classIdx); + const trueCount = slice.filter((e) => e.status === "SUCCESS").length; From 570466656b53b414fb28ca94b2bc03faa5c3bd20 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 22:41:43 +0900 Subject: [PATCH 17/24] before merge --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 06d72df..3738b79 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -96,6 +96,7 @@ const processWeeklyAttendance = (rawData) => { const entries = (weekMap.get(week) || []).sort((a, b) => a.order - b.order); const classes = [0, 1, 2].map((classIdx) => { + const order = classIdx + 1; const slice = entries.slice(classIdx * 3, classIdx * 3 + 3); const fallbackDate = getDateForClass(week, classIdx); From e29696555f6e0f129f8c22ca952abfa50ff45c4f Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 22:52:09 +0900 Subject: [PATCH 18/24] =?UTF-8?q?[Fix]=20upadate=20card=20order=20param=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/AdminDailyAttendanceCard.jsx | 19 ++++++++++++++++--- .../components/AdminWeeklyAttendanceList.jsx | 12 +++++++++--- .../pages/admin/AdminStudentAttendance.jsx | 2 +- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/AdminDailyAttendanceCard.jsx b/frontend/src/components/AdminDailyAttendanceCard.jsx index 9d982fd..8338dc2 100644 --- a/frontend/src/components/AdminDailyAttendanceCard.jsx +++ b/frontend/src/components/AdminDailyAttendanceCard.jsx @@ -3,7 +3,7 @@ import "./componentsCss/AdminDailyAttendanceCard.css"; import api from "../api/api"; import { getStudentAttendance,updateAttendanceStatus } from "../api/adminattendance"; -const AdminDailyAttendanceCard = ({ date, studentId, onClose }) => { +const AdminDailyAttendanceCard = ({ date, order,studentId, onClose }) => { const [slots, setSlots] = useState([]); const [modified, setModified] = useState([]); @@ -42,8 +42,21 @@ const AdminDailyAttendanceCard = ({ date, studentId, onClose }) => { status: d.status ? "SUCCESS" : "FAILURE", // 드롭다운에 맞게 변환 })); - setSlots(rawSlots); - setModified(Array(rawSlots.length).fill(false)); + const filledSlots = + rawSlots.length > 0 + ? rawSlots + : [1, 2, 3].map((order) => ({ + date, + id: null, // 새 출석이므로 아직 id 없음 + order, + status: "EMPTY",//기본값 + })); + + setSlots(filledSlots); + setModified(Array(filledSlots.length).fill(false)); + + //setSlots(rawSlots); + //setModified(Array(rawSlots.length).fill(false)); } catch (err) { console.error("슬롯 정보 불러오기 실패:", err); diff --git a/frontend/src/components/AdminWeeklyAttendanceList.jsx b/frontend/src/components/AdminWeeklyAttendanceList.jsx index 07f3783..c8edeae 100644 --- a/frontend/src/components/AdminWeeklyAttendanceList.jsx +++ b/frontend/src/components/AdminWeeklyAttendanceList.jsx @@ -19,10 +19,16 @@ const AdminWeeklyAttendanceList = ({ attendanceData, onSelectDate }) => { { - console.log("🧪 클릭됨!", cls.date); - cls.date && onSelectDate(cls.date); - }} + console.log("🧪 클릭됨!", cls.date); + cls.date && onSelectDate(cls.date); + }} + */ + onClick={() => { + console.log("🧪 클릭됨!", cls.date, cls.order); + if (cls.date) onSelectDate({ date: cls.date, order: cls.order }); + }} /> ))} diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index e56c33d..5064d5f 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -157,7 +157,7 @@ const processWeeklyAttendance = (rawData) => { setSelectedDate(null)} /> )} From bd3bb6ded71111821aaf779f0250bf9f756921ff Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 22:58:03 +0900 Subject: [PATCH 19/24] =?UTF-8?q?[Fix]=EC=B6=9C=EC=84=9D=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=ED=9A=8C=EC=B0=A8?= =?UTF-8?q?(order)=20=EC=A0=95=EB=B3=B4=20=EB=88=84=EB=9D=BD=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/admin/AdminStudentAttendance.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/admin/AdminStudentAttendance.jsx b/frontend/src/pages/admin/AdminStudentAttendance.jsx index 5064d5f..145f94d 100644 --- a/frontend/src/pages/admin/AdminStudentAttendance.jsx +++ b/frontend/src/pages/admin/AdminStudentAttendance.jsx @@ -142,7 +142,8 @@ const processWeeklyAttendance = (rawData) => { {/* 주차별 출석 */} setSelectedDate(date)} + onSelectDate={(selected) => setSelectedDate(selected)} + //onSelectDate={(date) => setSelectedDate(date)} /> {/* 선택된 날짜의 상세 수정 카드 @@ -156,7 +157,7 @@ const processWeeklyAttendance = (rawData) => { {selectedDate && ( setSelectedDate(null)} /> From b4ca691a39a529e8e7f2471523e6adcc6d689d95 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 23:26:15 +0900 Subject: [PATCH 20/24] =?UTF-8?q?[Fix]=20=EC=B6=9C=EC=84=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=B9=B4=EB=93=9C=20=EB=93=9C=EB=A1=AD=EB=8B=A4?= =?UTF-8?q?=EC=9A=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/AdminDailyAttendanceCard.jsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/AdminDailyAttendanceCard.jsx b/frontend/src/components/AdminDailyAttendanceCard.jsx index 8338dc2..76ec286 100644 --- a/frontend/src/components/AdminDailyAttendanceCard.jsx +++ b/frontend/src/components/AdminDailyAttendanceCard.jsx @@ -68,7 +68,7 @@ const AdminDailyAttendanceCard = ({ date, order,studentId, onClose }) => { const handleChange = (idx, newValue) => { const newSlots = [...slots]; - newSlots[idx].status = newValue === "SUCCESS"; + newSlots[idx].status = newValue; setSlots(newSlots); const newModified = [...modified]; @@ -88,9 +88,18 @@ const AdminDailyAttendanceCard = ({ date, order,studentId, onClose }) => { const newModified = [...modified]; newModified[idx] = false; setModified(newModified); + + console.log("📝 저장 요청", { + id: slot.id, + order: slot.order, + date: slot.date, + status: slot.status, + }); + } catch (err) { console.error("슬롯 저장 실패:", err); alert("저장 실패"); + } }; From 4648a4e0678052f5bea728c887937a30e6111c25 Mon Sep 17 00:00:00 2001 From: Imggaggu Date: Sun, 25 May 2025 23:37:02 +0900 Subject: [PATCH 21/24] =?UTF-8?q?[Feat]=20=EC=88=98=EC=A0=95=20=ED=9B=84?= =?UTF-8?q?=20=EC=9D=B4=EB=AA=A8=EC=A7=80=20=EC=83=88=EB=A1=9C=EA=B3=A0?= =?UTF-8?q?=EC=B9=A8,=20fix=20slot=20key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/AdminDailyAttendanceCard.jsx | 8 +++++--- frontend/src/pages/admin/AdminStudentAttendance.jsx | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/AdminDailyAttendanceCard.jsx b/frontend/src/components/AdminDailyAttendanceCard.jsx index 76ec286..f4f0f25 100644 --- a/frontend/src/components/AdminDailyAttendanceCard.jsx +++ b/frontend/src/components/AdminDailyAttendanceCard.jsx @@ -3,7 +3,7 @@ import "./componentsCss/AdminDailyAttendanceCard.css"; import api from "../api/api"; import { getStudentAttendance,updateAttendanceStatus } from "../api/adminattendance"; -const AdminDailyAttendanceCard = ({ date, order,studentId, onClose }) => { +const AdminDailyAttendanceCard = ({ date, order,studentId, onClose, onRefresh }) => { const [slots, setSlots] = useState([]); const [modified, setModified] = useState([]); @@ -88,7 +88,7 @@ const AdminDailyAttendanceCard = ({ date, order,studentId, onClose }) => { const newModified = [...modified]; newModified[idx] = false; setModified(newModified); - + console.log("📝 저장 요청", { id: slot.id, order: slot.order, @@ -111,6 +111,8 @@ const AdminDailyAttendanceCard = ({ date, order,studentId, onClose }) => { } } alert("전체 저장 완료"); + if (onRefresh) onRefresh(); // submit 이후 새로고침 + onClose(); } catch (err) { console.error("전체 저장 실패:", err); } @@ -124,7 +126,7 @@ const AdminDailyAttendanceCard = ({ date, order,studentId, onClose }) => {
{slots.map((slot, idx) => ( -
+
{idx + 1}차 출석