Skip to content

Commit 58bf800

Browse files
authored
Merge pull request #83 from INU-Software-Design/feature/student-parent-page
Feature/student parent page
2 parents 605cef3 + 9e595c5 commit 58bf800

8 files changed

Lines changed: 65 additions & 75 deletions

File tree

src/components/student-record/CounselList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export default function CounselList() {
6060
teacher={card.teacher}
6161
content={card.content}
6262
nextPlan={card.nextPlan}
63-
isPublic={card.isPublic}
63+
isPublic={true}
6464
/>
6565
))}
6666
</div>

src/components/student-record/category/Attendance.test.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,15 @@ describe("Attendance Component", () => {
138138
fireEvent.click(saveButton);
139139

140140
await waitFor(() => {
141-
expect(axios.post).toHaveBeenCalled();
142-
expect(screen.getByText("피드백이 저장되었습니다.")).toBeInTheDocument();
141+
expect(axios.post).toHaveBeenCalledWith(
142+
`${process.env.NEXT_PUBLIC_BACKEND_DOMAIN}/attendances/feedback?year=2024&grade=1&classNum=2&number=3`,
143+
{ feedback: "새로운 피드백입니다." },
144+
{
145+
headers: { Authorization: `Bearer mocked-token` },
146+
}
147+
);
143148
});
149+
// Removed the expectation for setSaveMessage, as it's no longer present in the component.
144150
});
145151

146152
it("피드백이 있을 때 기존 피드백을 수정한다 (PUT)", async () => {
@@ -186,8 +192,14 @@ describe("Attendance Component", () => {
186192
fireEvent.click(saveButton);
187193

188194
await waitFor(() => {
189-
expect(axios.put).toHaveBeenCalled();
190-
expect(screen.getByText("피드백이 수정되었습니다.")).toBeInTheDocument();
195+
expect(axios.put).toHaveBeenCalledWith(
196+
`${process.env.NEXT_PUBLIC_BACKEND_DOMAIN}/attendances/feedback?year=2024&grade=1&classNum=2&number=3`,
197+
{ feedback: "수정된 피드백" },
198+
{
199+
headers: { Authorization: `Bearer mocked-token` },
200+
}
201+
);
191202
});
203+
// Removed the expectation for setSaveMessage, as it's no longer present in the component.
192204
});
193205
});

src/components/student-record/category/Attendance.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,7 @@ export default function Attendance() {
8383
);
8484
const data = res.data.response;
8585
setFeedbackId(data.feedbackId);
86-
setSaveMessage("피드백이 저장되었습니다.");
87-
} catch (err) {
88-
console.error("출결 피드백 등록 에러:", err);
89-
setSaveMessage("피드백 저장 중 오류가 발생했습니다.");
90-
}
86+
} catch {}
9187
};
9288

9389
// PUT: 피드백 수정
@@ -101,11 +97,7 @@ export default function Attendance() {
10197
}
10298
);
10399
console.log(res);
104-
setSaveMessage("피드백이 수정되었습니다.");
105-
} catch (err) {
106-
console.error("출결 피드백 수정 에러:", err);
107-
setSaveMessage("피드백 수정 중 오류가 발생했습니다.");
108-
}
100+
} catch {}
109101
};
110102

111103
const handleEditClick = () => {

src/components/student-record/category/Behavior.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export default function Behavior() {
2424
setGeneralComment(data.generalComment);
2525
} catch (err) {
2626
console.error("행동 정보 가져오기 오류:", err);
27+
alert("담임선생님만 조회할 수 있습니다");
2728
}
2829
};
2930

src/pages/counsel/index.tsx

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,42 @@ import { Header } from "@/components/shared/Header";
33
import StudentFilter from "@/components/shared/StudentFilter";
44
import dynamic from "next/dynamic";
55
const StudentList = dynamic(() => import("@/components/shared/StudentList"), { ssr: false });
6-
import React, { ReactNode, useEffect, useState } from "react";
6+
import React, { ReactNode, useEffect, useState } from "react";
77

88
export default function CounselPage() {
9-
const [windowWidth, setWindowWidth] = useState(typeof window !== "undefined" ? window.innerWidth : 0);
9+
const [windowWidth, setWindowWidth] = useState(typeof window !== "undefined" ? window.innerWidth : 0);
1010

11-
useEffect(() => {
12-
// 윈도우 너비 변경을 감지하는 함수
13-
const handleResize = () => {
14-
setWindowWidth(window.innerWidth);
15-
};
16-
17-
// 컴포넌트 마운트 시 윈도우 너비 초기화
18-
if (typeof window !== "undefined") {
19-
setWindowWidth(window.innerWidth);
20-
window.addEventListener("resize", handleResize);
21-
}
22-
23-
// 컴포넌트 언마운트 시 이벤트 리스너 제거
24-
return () => {
25-
if (typeof window !== "undefined") {
26-
window.removeEventListener("resize", handleResize);
27-
}
28-
};
29-
}, []);
30-
31-
// 화면 너비가 600px 이상일 때만 StudentList 표시
32-
const showStudentList = windowWidth > 600;
11+
useEffect(() => {
12+
// 윈도우 너비 변경을 감지하는 함수
13+
const handleResize = () => {
14+
setWindowWidth(window.innerWidth);
15+
};
3316

17+
// 컴포넌트 마운트 시 윈도우 너비 초기화
18+
if (typeof window !== "undefined") {
19+
setWindowWidth(window.innerWidth);
20+
window.addEventListener("resize", handleResize);
21+
}
3422

23+
// 컴포넌트 언마운트 시 이벤트 리스너 제거
24+
return () => {
25+
if (typeof window !== "undefined") {
26+
window.removeEventListener("resize", handleResize);
27+
}
28+
};
29+
}, []);
30+
31+
// 화면 너비가 600px 이상일 때만 StudentList 표시
32+
const showStudentList = windowWidth > 600;
3533

3634
return (
37-
<div className="mx-0 sm:mx-8 mt-4 mb-8 h-[calc(100vh-120px)] flex flex-col">
35+
<div className="m-4 sm:mx-8 h-[calc(100vh-120px)] flex flex-col">
3836
<div className="flex flex-col sm:flex-row sm:items-center w-full gap-2 h-auto sm:h-8">
3937
<StudentFilter />
4038
</div>
4139
<div className="flex flex-row gap-8 mt-4 flex-1">
42-
{showStudentList && <StudentList />}
43-
<CounselContent/>
40+
{showStudentList && <StudentList />}
41+
<CounselContent />
4442
</div>
4543
</div>
4644
);

src/pages/grade/index.tsx

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { mapApiResponseToStudents, convertToApiFormat, Evaluation } from "@/util
1313
import useStudentFilterStore from "@/store/student-filter-store";
1414
import useGradeFilterStore from "@/store/grade-filter-store";
1515
import useTeacher from "@/store/teacher-store";
16+
1617
export default function GradesPage() {
1718
const { grade, classNumber, studentNumber } = useStudentFilterStore();
1819
const { year, semester, subject } = useGradeFilterStore();
@@ -87,13 +88,7 @@ export default function GradesPage() {
8788

8889
const handleInputBlur = () => {
8990
if (!editing) return;
90-
setStudents(prev =>
91-
prev.map(stu =>
92-
stu.number === editing.row
93-
? { ...stu, [editing.key]: inputValue === "" ? undefined : Number(inputValue) }
94-
: stu
95-
)
96-
);
91+
setStudents((prev) => prev.map((stu) => (stu.number === editing.row ? { ...stu, [editing.key]: inputValue === "" ? undefined : Number(inputValue) } : stu)));
9792
setEditing(null);
9893
};
9994

@@ -103,16 +98,17 @@ export default function GradesPage() {
10398

10499
const handleSave = async (e: React.MouseEvent<HTMLButtonElement>) => {
105100
e.preventDefault();
106-
if(subject != mysubject ){
107-
alert(`본인의 과목인 ${mysubject}만 수정가능합니다.`)
108-
}else{
109-
const payload = convertToApiFormat(students, evaluations, Number(classNumber));
110-
try {
111-
await PostScore(payload);
112-
window.location.reload();
113-
} catch {
114-
alert("저장에 실패했습니다. 다시 시도해주세요.");
115-
}}
101+
if (subject != mysubject) {
102+
alert(`본인의 과목인 ${mysubject}만 수정가능합니다.`);
103+
} else {
104+
const payload = convertToApiFormat(students, evaluations, Number(classNumber));
105+
try {
106+
await PostScore(payload);
107+
window.location.reload();
108+
} catch {
109+
alert("저장에 실패했습니다. 다시 시도해주세요.");
110+
}
111+
}
116112
};
117113

118114
const handleAddEval = async () => {
@@ -121,25 +117,16 @@ export default function GradesPage() {
121117
return;
122118
}
123119
try {
124-
await PostEval(
125-
subject,
126-
Number(year),
127-
Number(semester),
128-
Number(grade),
129-
evalInput.examType,
130-
evalInput.title,
131-
Number(evalInput.weight),
132-
Number(evalInput.fullScore)
133-
);
134-
setEvaluations(prev => [
120+
await PostEval(subject, Number(year), Number(semester), Number(grade), evalInput.examType, evalInput.title, Number(evalInput.weight), Number(evalInput.fullScore));
121+
setEvaluations((prev) => [
135122
...prev,
136123
{
137124
evaluationId: Date.now(),
138125
title: evalInput.title,
139126
examType: evalInput.examType,
140127
weight: evalInput.weight,
141128
fullScore: evalInput.fullScore,
142-
}
129+
},
143130
]);
144131
setShowEvalInput(false);
145132
setEvalInput({ title: "", examType: "WRITTEN", weight: 20, fullScore: 100 });
@@ -149,13 +136,13 @@ export default function GradesPage() {
149136
};
150137

151138
return (
152-
<div className="mx-0 sm:mx-8 mt-4 mb-8 h-[calc(100vh-120px)] flex flex-col">
139+
<div className="mx-4 sm:mx-8 mt-4 mb-8 h-[calc(100vh-120px)] flex flex-col">
153140
<GradeHeaderSection />
154141
<GradeActionBar onAddEval={() => setShowEvalInput(true)} onSave={handleSave} />
155142
<EvalAddModal
156143
open={showEvalInput}
157144
value={evalInput}
158-
onChange={v => setEvalInput(prev => ({ ...prev, ...v }))}
145+
onChange={(v) => setEvalInput((prev) => ({ ...prev, ...v }))}
159146
onAdd={handleAddEval}
160147
onCancel={() => setShowEvalInput(false)}
161148
/>

src/pages/student/attendance.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ const Attendance = () => {
109109
<div className="my-4">
110110
<DateFilter />
111111
</div>
112-
<div className=" flex flex-col justify-between">
112+
<div className="flex flex-col justify-between">
113113
<div>
114114
{/* 출결 통계 요약 */}
115115
<div className="flex flex-wrap ">

src/pages/student/counsel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ const CounselPage = () => {
6161
teacher={card.teacher}
6262
content={card.content}
6363
nextPlan={card.nextPlan}
64-
isPublic={card.isPublic}
64+
isPublic={true}
6565
/>
6666
))}
6767
</div>

0 commit comments

Comments
 (0)