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