source: frontend/web3-eDnevnik_Frontend/src/pages/PredmetenNastavnikPages/PredmetenNastavnik_CreateKrajnaOcenka/PredmetenNastavnik_CreateKrajnaOcenka.jsx

Last change on this file was 81cdf2d, checked in by Nikola Janev <nikolajanev57@…>, 10 days ago

initial commit

  • Property mode set to 100644
File size: 9.0 KB
Line 
1import { useState, useEffect } from "react";
2import { useParams, Link, useNavigate } from "react-router-dom";
3import NavbarKlasen from "../../../components/navbarKlasen/NavbarKlasen";
4
5import axios from "axios";
6
7const PredmetenNastavnik_CreateKrajnaOcenka = () => {
8 const navigate = useNavigate();
9 const { studentId } = useParams();
10 const [error, setError] = useState("");
11 const [loading, setLoading] = useState(true);
12 const [teacherId, setTeacherId] = useState("");
13 const { classId } = useParams();
14 const [studentInfo, setStudentInfo] = useState("");
15 const [predmeti, setPredmeti] = useState([]);
16
17 const [formData, setFormData] = useState({
18 ocenka: "",
19 datum: "",
20 zabeleska: "",
21 vnesena_Od: teacherId,
22 dobienaZaUcenikot_Id: studentId,
23 eZaPredmetot_Id: predmeti.id,
24
25 tip: "",
26 });
27
28 useEffect(() => {
29 const fetchInitialData = async () => {
30 try {
31 setLoading(true);
32
33 const [resMe, resStudent] = await Promise.all([
34 axios.get("http://localhost:8080/api/auth/me", {
35 withCredentials: true,
36 }),
37 axios.get(`http://localhost:8080/api/users/ucenici/${studentId}`, {
38 withCredentials: true,
39 }),
40 ]);
41
42 const tId = resMe.data.id;
43
44 setTeacherId(tId);
45 setStudentInfo(resStudent.data);
46 setFormData((prev) => ({
47 ...prev,
48 vnesena_Od: tId,
49 }));
50
51 const resPredmeti = await axios.get(
52 `http://localhost:8080/api/klas/${classId}/predmeti`,
53 { withCredentials: true }
54 );
55
56 setPredmeti(resPredmeti.data);
57 } catch (err) {
58 console.error("Грешка при вчитување на податоците:", err);
59 setError(
60 "Неуспешно вчитување на податоците за наставникот кој е логиран."
61 );
62 } finally {
63 setLoading(false);
64 }
65 };
66 fetchInitialData();
67 }, []);
68
69 const handleSubmit = async (e) => {
70 e.preventDefault();
71 setError("");
72
73 try {
74 const response = await axios.post(
75 `http://localhost:8080/api/users/ucenici/${studentId}/enterKrajnaOcenka`,
76 formData,
77 {
78 withCredentials: true,
79 headers: { "Content-Type": "application/json" },
80 }
81 );
82
83 if (response.status === 200 || response.status === 201) {
84 alert("Успешно е креирана крајна оценка за ученикот ");
85 navigate(
86 `/predmetenNastavnikDashboard/klas/${classId}/student/${studentId}/grades`
87 );
88 }
89 } catch (err) {
90 console.error("Грешка при POST:", err.response?.data);
91 const serverMsg = err.response?.data?.message || "Полињата се грешка";
92 setError(serverMsg);
93 }
94 };
95
96 if (loading)
97 return (
98 <div style={{ padding: "50px", textAlign: "center" }}>
99 <NavbarKlasen />
100 <h2>Вчитување на податоците...</h2>
101 </div>
102 );
103 const handleChange = (e) => {
104 const { name, value } = e.target;
105
106 if (name === "predmetId") {
107 setFormData((prev) => ({
108 ...prev,
109 eZaPredmetot_Id: value,
110 }));
111 return;
112 }
113
114 setFormData((prev) => ({
115 ...prev,
116 [name]: value,
117 }));
118 };
119 const vidoviIsprasuvanje = [
120 "USNA_OCENKA",
121 "PISMENA_OCENKA",
122 "POLUGODISNA_OCENKA",
123 "GODISNA_OCENKA",
124 ];
125
126 return (
127 <>
128 <NavbarKlasen />
129 <div className="container-fluid">
130 <nav className="navbar navbar-expand-lg bg-dark align-items-center">
131 <div className="container-fluid ">
132 <div className="navbar-nav mx-auto ">
133 <Link
134 className="nav-link text-white"
135 to="/predmetenNastavnikDashboard"
136 >
137 Соопштенија
138 </Link>
139
140 <Link
141 className="nav-link text-white"
142 to={`/predmetenNastavnikDashboard/${classId}/weeklyPlan`}
143 >
144 Види неделни активности
145 </Link>
146
147 <Link
148 className="nav-link text-white"
149 to={`/predmetenNastavnikDashboard/${classId}/raspored`}
150 >
151 Види распоред
152 </Link>
153
154 <Link
155 className="nav-link text-white"
156 to={`/predmetenNastavnikDashboard/${classId}/students`}
157 >
158 Студенти
159 </Link>
160 </div>
161 </div>
162 </nav>
163
164 <div className="w-75 m-3 bg-secondary mx-auto rounded">
165 <h1 className="text-center text-white">
166 Внеси крајна оценка за {studentInfo.ime} {studentInfo.prezime}
167 </h1>
168
169 <form onSubmit={handleSubmit}>
170 <div className="row m-3 align-items-center">
171 <label
172 htmlFor="ocenka"
173 className="col-form-label col-3 m-3 text-center text-white"
174 >
175 Внеси оценка од 1 до 5
176 </label>
177 <div className="col-8">
178 <input
179 name="ocenka"
180 type="number"
181 required
182 className="form-control w-75 m-3 mx-auto"
183 placeholder="Оценката мора да биде од 1 до 5"
184 min="1"
185 max="5"
186 value={formData.ocenka}
187 onChange={handleChange}
188 />
189 </div>
190 </div>
191 <div className="row mb-3 align-items-center">
192 <label
193 htmlFor="datum"
194 className="col-form-label col-3 m-3 text-center text-white"
195 >
196 Внеси датум на внесување на оценката
197 </label>
198 <div className="col-8">
199 <input
200 name="datum"
201 type="date"
202 className="form-control w-75 m-3 mx-auto"
203 required
204 value={formData.datum}
205 onChange={handleChange}
206 />
207 </div>
208 </div>
209 <div className="row mb-3 align-items-center">
210 <label
211 htmlFor="zabeleska"
212 className="col-3 col-form-label m-3 text-white"
213 >
214 забелешка
215 </label>
216 <textarea
217 name="zabeleska"
218 value={formData.zabeleska}
219 required
220 placeholder="Внесете забелешка за оценката доколку ја имате"
221 onChange={handleChange}
222 className="form-control w-75 mx-auto"
223 style={{ minHeight: "200px", resize: "horizontal" }}
224 />
225 </div>
226 <div className="row mb-3 align-items-center">
227 <label className="form-label m-3 col-3 text-center text-white">
228 Избери Предмет
229 </label>
230 <div className="col-8">
231 <select
232 name="predmetId"
233 value={formData.eZaPredmetot_Id}
234 required
235 onChange={handleChange}
236 className="form-control w-75 mx-auto"
237 >
238 <option value="">-- Избери предмет --</option>
239 {predmeti.map((n) => (
240 <option key={n.id} value={n.id}>
241 {n.ime} {n.fond_casovi}
242 </option>
243 ))}
244 </select>
245 </div>
246 </div>
247
248 <div className="row mb-3 align-items-center">
249 <label
250 htmlFor="tip"
251 className="form-label col-3 p-3 text-center text-white"
252 >
253 Избери вид на крајна оценка
254 </label>
255 <div className="col-9">
256 <select
257 name="tip"
258 value={formData.tip}
259 required
260 onChange={handleChange}
261 className="form-control m-3 w-75 mx-auto"
262 >
263 <option value="">-- Избери вид на крајна оценка --</option>
264 {vidoviIsprasuvanje.map((n) => (
265 <option key={n} value={n}>
266 {n}
267 </option>
268 ))}
269 </select>
270 </div>
271 </div>
272 <div className="text-center">
273 <button className="btn btn-primary m-3 " type="submit">
274 Внеси крајна оценка
275 </button>
276 <a className="btn btn-danger m-3">Откажи</a>
277 </div>
278 </form>
279 </div>
280 </div>
281 </>
282 );
283};
284
285export default PredmetenNastavnik_CreateKrajnaOcenka;
Note: See TracBrowser for help on using the repository browser.