Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
afc4ba9
Update AdminStudentAssignment.jsx
Imggaggu May 24, 2025
1c1c869
Merge pull request #198 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
5c4447c
[Fix] attendanceRes
Imggaggu May 24, 2025
b8c296a
Merge pull request #199 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
e531020
[Fix] api 연결- 학생별 출석 현황 조회
Imggaggu May 24, 2025
fb7cc9c
Merge pull request #200 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
6744b7f
Update AdminStudentAttendance.jsx
Imggaggu May 24, 2025
2ffc2f2
[Fix] Attendance 수정 로직 수정
Imggaggu May 24, 2025
8c18d2b
Merge pull request #201 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
7d0cf0d
[Fix] date 받아오기 admin attendance
Imggaggu May 24, 2025
07ea04d
Merge pull request #202 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
376987b
[Fix] date 받아오기 admin attendance
Imggaggu May 24, 2025
3c3d30a
Merge pull request #203 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
5a2251e
Update AdminStudentAttendance.jsx
Imggaggu May 24, 2025
d6a3fc7
디버깅용 콘솔
Imggaggu May 24, 2025
8c8b4a1
Merge branch 'deploy' into frontend_admin_sj
Imggaggu May 24, 2025
2c3e370
Merge pull request #204 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
4e16052
[Fix] processWeeklyAttendance 리팩토링..
Imggaggu May 24, 2025
5f3f18c
Merge branch 'frontend_admin_sj' of https://github.com/pirogramming/P…
Imggaggu May 24, 2025
f4504cc
Merge pull request #205 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
cdb7708
[Fix] empty 고려 processWeeklyAttendance 변경
Imggaggu May 24, 2025
7ae6767
[Fix] empty 고려 processWeeklyAttendance 변경
Imggaggu May 24, 2025
9812eb9
Merge pull request #206 from pirogramming/frontend_admin_sj
Imggaggu May 24, 2025
0f9ee2d
Update AdminStudentAttendance.jsx
Imggaggu May 25, 2025
a644f49
Update AdminStudentAttendance.jsx
Imggaggu May 25, 2025
f8beb87
Update AdminStudentAttendance.jsx
Imggaggu May 25, 2025
29cb660
Update AdminStudentAttendance.jsx
Imggaggu May 25, 2025
5704666
before merge
Imggaggu May 25, 2025
d31f71b
[HOTFIX] 출석 수정 카드 등장
Imggaggu May 25, 2025
e296965
[Fix] upadate card order param 추가
Imggaggu May 25, 2025
e071557
Merge pull request #207 from pirogramming/frontend_admin_sj
Imggaggu May 25, 2025
bd3bb6d
[Fix]출석 카드 클릭 시 회차(order) 정보 누락 문제 수정
Imggaggu May 25, 2025
015bc2e
Merge pull request #208 from pirogramming/frontend_admin_sj
Imggaggu May 25, 2025
b4ca691
[Fix] 출석 수정 카드 드롭다운 수정
Imggaggu May 25, 2025
1204f2f
Merge pull request #209 from pirogramming/frontend_admin_sj
Imggaggu May 25, 2025
4648a4e
[Feat] 수정 후 이모지 새로고침, fix slot key
Imggaggu May 25, 2025
cc721d0
Merge pull request #210 from pirogramming/frontend_admin_sj
Imggaggu May 25, 2025
902b995
[Fix] fetchData 밖으로 빼기
Imggaggu May 25, 2025
3139b3c
Merge pull request #211 from pirogramming/frontend_admin_sj
Imggaggu May 25, 2025
608865a
[Fix] attendance 수강생 페이지 일별 제목
Imggaggu May 25, 2025
1c89020
[Fix] 과제 관리 페이지 시작
Imggaggu May 25, 2025
1bdf6ed
Merge pull request #212 from pirogramming/frontend_admin_sj
Imggaggu May 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 53 additions & 9 deletions frontend/src/components/AdminDailyAttendanceCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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, onRefresh }) => {
const [slots, setSlots] = useState([]);
const [modified, setModified] = useState([]);

Expand All @@ -24,11 +24,40 @@ 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 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", // 드롭다운에 맞게 변환
}));

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));

setSlots(rawSlots);
setModified(Array(rawSlots.length).fill(false));
} catch (err) {
console.error("슬롯 정보 불러오기 실패:", err);
}
Expand All @@ -39,7 +68,7 @@ const AdminDailyAttendanceCard = ({ date, studentId, onClose }) => {

const handleChange = (idx, newValue) => {
const newSlots = [...slots];
newSlots[idx].status = newValue === "SUCCESS";
newSlots[idx].status = newValue;
setSlots(newSlots);

const newModified = [...modified];
Expand All @@ -49,15 +78,28 @@ 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;
setModified(newModified);

console.log("📝 저장 요청", {
id: slot.id,
order: slot.order,
date: slot.date,
status: slot.status,
});

} catch (err) {
console.error("슬롯 저장 실패:", err);
alert("저장 실패");

}
};

Expand All @@ -69,6 +111,8 @@ const AdminDailyAttendanceCard = ({ date, studentId, onClose }) => {
}
}
alert("전체 저장 완료");
if (onRefresh) onRefresh(); // submit 이후 새로고침
onClose();
} catch (err) {
console.error("전체 저장 실패:", err);
}
Expand All @@ -82,7 +126,7 @@ const AdminDailyAttendanceCard = ({ date, studentId, onClose }) => {
</div>
<div className="card-body">
{slots.map((slot, idx) => (
<div key={slot.id} className="slot-row">
<div key={`${slot.date}-${slot.order}`} className="slot-row">
<span>{idx + 1}차 출석</span>
<select value={slot.status} onChange={(e) => handleChange(idx, e.target.value)}>
<option value="SUCCESS">성공</option>
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/AdminStudentHeader.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const AdminStudentHeader = ({ studentName = "default", subtitle = "default", onB

<button
className="icon-button"
onClick={() => navigate(`/admin/managestudent`)}
onClick={() => navigate(`/managestudent`)}
>
👥
</button>
Expand Down
11 changes: 10 additions & 1 deletion frontend/src/components/AdminWeeklyAttendanceList.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,16 @@ const AdminWeeklyAttendanceList = ({ attendanceData, onSelectDate }) => {
<img key={idx}
src={statusImageMap[cls.status]}
style={{ cursor: "pointer" }}
onClick={() => cls.date && onSelectDate(cls.date)}
/*
onClick={() => {
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 });
}}
/>
))}
</div>
Expand Down
14 changes: 8 additions & 6 deletions frontend/src/pages/admin/AdminStudentAssignment.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const AdminStudentAssignment = () => {
}

fetchStudentInfo(id).then((res) => {
setStudentInfo(res.data);
setStudentInfo(res);
});


Expand All @@ -38,28 +38,28 @@ const AdminStudentAssignment = () => {
label: `${weekItem.week}주차 ${weekItem.subject}`,
days: weekItem.days.map((dayItem) => ({
day: dayItem.day,
subject: weekItem.subject,
tasks: dayItem.details.map((task) => ({
id: task.id,
label: task.assignmentName,
status: task.status,
modified: false,
//modified: false,
})),
})),
}));

setWeeks(formatted);

const matched = formatted.find((w) => String(w.week) === String(week));
const matched = formatted.find((w) => Number(w.week) === Number(week));
if (matched) {
setSelectedWeekLabel(matched.label);
/*
if (matched.days.length > 0) {
setHighlightCard({
weekLabel: matched.label,
day: matched.days[0].day,
tasks: matched.days[0].tasks,
});
}
}*/
}
});
}, [studentId, week]);
Expand All @@ -79,9 +79,11 @@ const AdminStudentAssignment = () => {
});
};
*/


const handleSave = async (taskId, status) => {
const userId = parseInt(studentId); // 문자열일 수 있으니 숫자로 변환

try {
// PUT 요청 시도 (기존 과제 수정)
await updateAssignmentStatus(userId, taskId, status);
Expand Down
Loading