source: frontend/web3-eDnevnik_Frontend/src/pages/DirektorAdmin_Pages/CreateUcenik/CreateUcenik.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: 7.4 KB
Line 
1import React, { useState, useEffect } from "react";
2import axios from "axios";
3import { useNavigate } from "react-router-dom";
4import styles from "./CreateUcenik.module.css";
5import Navbar from "../../../components/nav/Navbar.jsx";
6
7const CreateUcenik = () => {
8 const navigate = useNavigate();
9
10 const [roditeli, setRoditeli] = useState([]);
11
12 const [adminId, setAdminId] = useState("");
13
14 const [error, setError] = useState("");
15 const [loading, setLoading] = useState(true);
16
17 const [formData, setFormData] = useState({
18 e_posta: "",
19 lozinka: "",
20 ime: "",
21 prezime: "",
22 pol: "Masko",
23 adresa: "",
24 mestoNaRagjanje: "",
25 mobilenTelefon: "",
26 datumNaRagjanje: "",
27 staratelId: "",
28 });
29
30 useEffect(() => {
31 const fetchInitialData = async () => {
32 try {
33 setLoading(true);
34
35 const [resRoditeli, resMe] = await Promise.all([
36 axios.get("http://localhost:8080/api/users/roditeli", {
37 withCredentials: true,
38 }),
39
40 axios.get("http://localhost:8080/api/auth/me", {
41 withCredentials: true,
42 }),
43 ]);
44
45 setRoditeli(resRoditeli.data);
46
47 setAdminId(resMe.data.id || resMe.data.userId);
48 } catch (err) {
49 console.error("Грешка при вчитување податоци:", err);
50 setError("Неуспешно вчитување на податоци");
51 } finally {
52 setLoading(false);
53 }
54 };
55 fetchInitialData();
56 }, []);
57
58 const handleChange = (e) => {
59 const { name, value } = e.target;
60 setFormData((prev) => ({
61 ...prev,
62 [name]: value,
63 }));
64 };
65
66 const handleSubmit = async (e) => {
67 e.preventDefault();
68 setError("");
69
70 const ucenikRequestDTO = {
71 e_posta: formData.e_posta,
72 lozinka: formData.lozinka,
73 ime: formData.ime,
74 prezime: formData.prezime,
75 pol: formData.pol,
76 adresa: formData.adresa,
77
78 mestoNaRagjanje: formData.mestoNaRagjanje,
79 mobilenTelefon: formData.mobilenTelefon,
80 datumNaRagjanje: formData.datumNaRagjanje,
81
82 staratelId: formData.staratelId,
83
84 kreiranOdId: adminId,
85 };
86
87 try {
88 const response = await axios.post(
89 "http://localhost:8080/api/users/ucenici",
90 ucenikRequestDTO,
91 {
92 withCredentials: true,
93 headers: { "Content-Type": "application/json" },
94 }
95 );
96
97 if (response.status === 200 || response.status === 201) {
98 alert("Ученикот е успешно креиран!");
99 navigate("/adminDashboard/users");
100 }
101 } catch (err) {
102 console.error("Грешка при POST:", err.response?.data);
103 const serverMsg =
104 err.response?.data?.message ||
105 "Грешка при валидација. Проверете ги сите полиња.";
106 setError(serverMsg);
107 }
108 };
109
110 if (loading)
111 return (
112 <div style={{ padding: "50px", textAlign: "center" }}>
113 <Navbar />
114 <h2>Вчитување на формата...</h2>
115 </div>
116 );
117
118 return (
119 <div style={{ backgroundColor: "#fdf8e1", minHeight: "100vh" }}>
120 <Navbar />
121 <div className={styles.container}>
122 <h2 className={styles.title}>Додади нов ученик</h2>
123
124 {error && <div className={styles.errorBanner}>{error}</div>}
125
126 <form onSubmit={handleSubmit} className={styles.formGrid}>
127 <div className={styles.inputGroup}>
128 <label>Име *</label>
129 <input
130 type="text"
131 name="ime"
132 value={formData.ime}
133 required
134 onChange={handleChange}
135 className={styles.inputField}
136 />
137 </div>
138
139 <div className={styles.inputGroup}>
140 <label>Презиме *</label>
141 <input
142 type="text"
143 name="prezime"
144 value={formData.prezime}
145 required
146 onChange={handleChange}
147 className={styles.inputField}
148 />
149 </div>
150
151 <div className={styles.inputGroup}>
152 <label>Е-пошта *</label>
153 <input
154 type="email"
155 name="e_posta"
156 value={formData.e_posta}
157 required
158 onChange={handleChange}
159 className={styles.inputField}
160 />
161 </div>
162
163 <div className={styles.inputGroup}>
164 <label>Лозинка * (мин. 6 карактери)</label>
165 <input
166 type="password"
167 name="lozinka"
168 value={formData.lozinka}
169 required
170 onChange={handleChange}
171 className={styles.inputField}
172 />
173 </div>
174
175 <div className={styles.inputGroup}>
176 <label>Пол *</label>
177 <select
178 name="pol"
179 value={formData.pol}
180 onChange={handleChange}
181 className={styles.inputField}
182 >
183 <option value="Masko">Машко</option>
184 <option value="Zensko">Женско</option>
185 </select>
186 </div>
187
188 <div className={styles.inputGroup}>
189 <label>Датум на раѓање *</label>
190 <input
191 type="date"
192 name="datumNaRagjanje"
193 value={formData.datumNaRagjanje}
194 required
195 onChange={handleChange}
196 className={styles.inputField}
197 />
198 </div>
199
200 <div className={styles.inputGroup}>
201 <label>Место на раѓање *</label>
202 <input
203 type="text"
204 name="mestoNaRagjanje"
205 value={formData.mestoNaRagjanje}
206 required
207 onChange={handleChange}
208 className={styles.inputField}
209 />
210 </div>
211
212 <div className={styles.inputGroup}>
213 <label>Мобилен телефон *</label>
214 <input
215 type="text"
216 name="mobilenTelefon"
217 value={formData.mobilenTelefon}
218 required
219 onChange={handleChange}
220 className={styles.inputField}
221 />
222 </div>
223
224 <div className={styles.inputGroup + " " + styles.fullWidth}>
225 <label>Адреса</label>
226 <input
227 type="text"
228 name="adresa"
229 value={formData.adresa}
230 onChange={handleChange}
231 className={styles.inputField}
232 />
233 </div>
234
235 <div className={styles.inputGroup}>
236 <label>Избери Родител *</label>
237 <select
238 name="staratelId"
239 value={formData.staratelId}
240 required
241 onChange={handleChange}
242 className={styles.inputField}
243 >
244 <option value="">-- Избери родител --</option>
245 {roditeli.map((r) => (
246 <option key={r.id} value={r.id}>
247 {r.ime} {r.prezime} ({r.e_posta})
248 </option>
249 ))}
250 </select>
251 </div>
252
253 <div className={styles.fullWidth}>
254 <button type="submit" className={styles.submitBtn}>
255 Креирај Ученик
256 </button>
257 </div>
258 </form>
259 </div>
260 </div>
261 );
262};
263
264export default CreateUcenik;
Note: See TracBrowser for help on using the repository browser.