source: frontend/web3-eDnevnik_Frontend/src/pages/DirektorAdmin_Pages/addSubjectToClass/AddSubjectToClass.jsx

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

initial commit

  • Property mode set to 100644
File size: 4.8 KB
Line 
1import React, { useState, useEffect } from "react";
2import axios from "axios";
3import { useNavigate, useParams, Link } from "react-router-dom";
4import styles from "./AddSubjectToClassStyles.module.css";
5import Navbar from "../../../components/nav/Navbar.jsx";
6
7const AddSubjectToClass = () => {
8 const navigate = useNavigate();
9 const { classId } = useParams();
10
11 const [predmeti, setPredmeti] = useState([]);
12 const [adminId, setAdminId] = useState("");
13 const [className, setClassName] = useState("");
14
15 const [error, setError] = useState("");
16 const [loading, setLoading] = useState(true);
17
18 const [formData, setFormData] = useState({
19 predmetId: "",
20 });
21
22 useEffect(() => {
23 const fetchInitialData = async () => {
24 try {
25 setLoading(true);
26 const [resPredmeti, resMe, resClass] = await Promise.all([
27 axios.get("http://localhost:8080/api/predmeti", {
28 withCredentials: true,
29 }),
30 axios.get("http://localhost:8080/api/auth/me", {
31 withCredentials: true,
32 }),
33 axios.get(`http://localhost:8080/api/klas/${classId}`, {
34 withCredentials: true,
35 }),
36 ]);
37
38 setPredmeti(resPredmeti.data);
39 setAdminId(resMe.data.id || resMe.data.userId);
40 setClassName(`${resClass.data.oddelenie}-${resClass.data.paralelka}`);
41 } catch (err) {
42 console.error("Грешка при вчитување податоци:", err);
43 setError("Грешка при вчитување на потребните информации.");
44 } finally {
45 setLoading(false);
46 }
47 };
48 if (classId) fetchInitialData();
49 }, [classId]);
50
51 const handleChange = (e) => {
52 const { name, value } = e.target;
53 setFormData((prev) => ({ ...prev, [name]: value }));
54 };
55
56 const handleSubmit = async (e) => {
57 e.preventDefault();
58 setError("");
59
60 const payload = {
61 predmetId: formData.predmetId,
62 };
63
64 try {
65 setLoading(true);
66 const response = await axios.post(
67 `http://localhost:8080/api/klas/${classId}/predmeti`,
68 payload,
69 {
70 withCredentials: true,
71 headers: { "Content-Type": "application/json" },
72 }
73 );
74
75 if (response.status === 200 || response.status === 201) {
76 alert(
77 "Предметот е успешно доделен на класот, притиснете OK за редирекција!"
78 );
79 navigate("/adminDashboard/classes");
80 }
81 } catch (err) {
82 setError(err.response?.data?.message || "Грешка при зачувување.");
83 console.log(err);
84 }
85 };
86
87 if (loading)
88 return <div className={styles.loading}>Вчитување на формата...</div>;
89
90 return (
91 <div className={styles.adminWrapper}>
92 <Navbar />
93 <div
94 className="d-flex flex-row justify-content-center align-items-center p-2"
95 style={{ backgroundColor: "#147176" }}
96 >
97 <Link
98 to="/adminDashboard/users"
99 className="mx-3 text-white text-decoration-none fs-6 opacity-100-hover"
100 >
101 Корисници
102 </Link>
103
104 <Link
105 to="/adminDashboard/classes"
106 className="mx-3 text-white text-decoration-none fs-6"
107 >
108 Класови
109 </Link>
110
111 <Link
112 to="/adminDashboard/subjects"
113 className="mx-3 text-white text-decoration-none fs-6"
114 >
115 Предмети
116 </Link>
117
118 <Link
119 to="/adminDashboard/schedules"
120 className="mx-3 text-white text-decoration-none fs-6"
121 >
122 Распореди
123 </Link>
124
125 <Link
126 to="/adminDashboard/weeklyPlans"
127 className="mx-3 text-white text-decoration-none fs-6"
128 >
129 Неделни планови
130 </Link>
131 </div>
132 <div className="text-center">
133 <h2 className={styles.title}>
134 Додади / Измени предмет што го слуша класот: {className}
135 </h2>
136
137 <form onSubmit={handleSubmit} className="mx-auto">
138 <div className="form-control w-25 mx-auto">
139 <label>Избери Предмет</label>
140 <select
141 name="predmetId"
142 value={formData.predmetId}
143 required
144 onChange={handleChange}
145 className="form-control"
146 >
147 <option value="">-- Избери предмет --</option>
148 {predmeti.map((n) => (
149 <option key={n.id} value={n.id}>
150 {n.ime} {n.fond_casovi}
151 </option>
152 ))}
153 </select>
154 </div>
155
156 <button type="submit" className="btn btn-primary">
157 Зачувај промени
158 </button>
159 </form>
160 </div>
161 </div>
162 );
163};
164
165export default AddSubjectToClass;
Note: See TracBrowser for help on using the repository browser.