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