source: frontend/web3-eDnevnik_Frontend/src/pages/dashboards/BlagajnikDashboard/BlagajnikDashboard.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: 8.5 KB
Line 
1import React, { useState, useEffect } from "react";
2import axios from "axios";
3import { Link, useNavigate } from "react-router-dom";
4import NavbarBlagajnik from "../../../components/NavbarBlagajnik/NavbarBlagajnik.jsx"
5import dayjs from "dayjs";
6
7const BlagajnikDashboard = ({ blagajnikId }) => {
8 const navigate = useNavigate();
9 const [
10 showCreateSoopstenieZaPlakjanjeModal,
11 setShowCreateSoopstenieZaPlakjanjeModal,
12 ] = useState(false);
13 const [error, setError] = useState("");
14 const [loading, setLoading] = useState(true);
15 const [soopstenijaZaPlakjanje, setSoopstenijaZaPlakjanje] = useState([]);
16
17 const [formData, setFormData] = useState({
18 naslov: "",
19 sodrzina: "",
20 iznos: "",
21 valuta: "",
22 rokZaPlakjanje: "",
23 });
24 const handleChange = (e) => {
25 const { name, value } = e.target;
26 setFormData((prev) => ({
27 ...prev,
28 [name]: value,
29 }));
30 };
31 const handleSubmitSoopstenie = async (e) => {
32 e.preventDefault();
33 setError("");
34 const SoopstenieZaPlakjanjeRequestDTO = {
35 naslov: formData.naslov,
36 sodrzina: formData.sodrzina,
37 iznos: parseFloat(formData.iznos),
38 valuta: formData.valuta,
39 rokZaPlakjanje: formData.rokZaPlakjanje,
40 sozdadenoOdBlagajnikId: blagajnikId,
41 };
42
43 try {
44 const response = await axios.post(
45 "http://localhost:8080/api/paymentsSoopstenija",
46 SoopstenieZaPlakjanjeRequestDTO,
47 {
48 withCredentials: true,
49 headers: { "Content-Type": "application/json" },
50 }
51 );
52
53 if (response.status === 200 || response.status === 201) {
54 alert("Соопштението за плаќање е успешно креирано!");
55 navigate("/dashboard");
56 }
57 } catch (err) {
58 console.error("Грешка при POST:", err.response?.data);
59 const serverMsg =
60 err.response?.data?.message ||
61 "Грешка при валидација. Проверете ги сите полиња.";
62 setError(serverMsg);
63 }
64 };
65 useEffect(() => {
66 const initializeDashboard = async () => {
67 if (!blagajnikId) return;
68 try {
69 setLoading(true);
70 const [resSoopstenija] = await Promise.all([
71 axios.get(`http://localhost:8080/api/paymentsSoopstenija/blagajnik`, {
72 withCredentials: true,
73 }),
74 ]);
75 setSoopstenijaZaPlakjanje(resSoopstenija.data);
76 } catch (err) {
77 setError(err);
78 console.log(err);
79 } finally {
80 setLoading(false);
81 }
82 };
83 initializeDashboard();
84 }, [blagajnikId]);
85
86 const handleShowCreateSoopstenieModal = () => {
87 setShowCreateSoopstenieZaPlakjanjeModal(true);
88 };
89 return (
90 <>
91 <div>
92 {error && <div className="alert alert-danger">{error}</div>}
93 <NavbarBlagajnik />
94 <div className="container mt-5 mh-100">
95 <div className="row">
96 <div className="col-12">
97 <nav
98 className="container text-white h-5 d-flex text-start p-3"
99 style={{ backgroundColor: "#147176" }}
100 >
101 <Link to={`/dashboard`} className="btn btn-secondary">
102 Соопштенија за плаќање
103 </Link>
104 </nav>
105 <div className="container">
106 <button
107 className="btn btn-primary float-end"
108 data-bs-toggle="modal"
109 data-bs-target="#createSoopstenieZaPlakjanje"
110 >
111 Креирај соопштение за плаќање
112 </button>
113 <div className="row">
114 {soopstenijaZaPlakjanje.length > 0 ? (
115 soopstenijaZaPlakjanje.map((pA) => (
116 <div key={pA.id} className="col-4">
117 <div className="card">
118 <div className="card-body">
119 <h5 className="card-title">{pA.naslov}</h5>
120 <p className="card-text">STATUS: {pA.status}</p>
121 <p>Рок за плаќање: {pA.rokZaPlakjanje}</p>
122 <p className="card-text">{pA.sodrzina}</p>
123 <p className="card-text">
124 {pA.valuta} {Number(pA.iznos).toFixed(18)}
125 </p>
126 <p>
127 Креирано на{" "}
128 {dayjs(pA.createdAt).format("HH:mm DD.MM.YYYY")}
129 </p>
130 <Link to={`/blagajnikDashboard//${pA.id}/payments`}>
131 Види плаќања
132 </Link>
133 </div>
134 </div>
135 </div>
136 ))
137 ) : (
138 <div>Нема соопштенија</div>
139 )}
140 </div>
141 </div>
142 </div>
143 </div>
144 </div>
145 </div>
146
147 <div
148 className="modal fade"
149 tabIndex="-1"
150 role="dialog"
151 id="createSoopstenieZaPlakjanje"
152 >
153 <div className="modal-dialog modal-dialog-centered" role="document">
154 <div className="modal-content">
155 <div className="modal-header">
156 <h5 className="modal-title" id="exampleModalLongTitle">
157 Креирај соопштение за плаќање
158 </h5>
159 </div>
160 <div className="modal-body">
161 <form onSubmit={handleSubmitSoopstenie}>
162 <div className="form-group">
163 <label htmlFor="naslov">Наслов</label>
164 <input
165 type="text"
166 name="naslov"
167 id="naslov"
168 placeholder="Наслов на соопштението"
169 className="form-control"
170 value={formData.naslov}
171 onChange={handleChange}
172 required
173 />
174 </div>
175 <div className="form-group">
176 <label htmlFor="sodrzina">Содржина</label>
177 <textarea
178 id="sodrzina"
179 name="sodrzina"
180 rows="4"
181 cols="50"
182 value={formData.sodrzina}
183 className="form-control"
184 onChange={handleChange}
185 required
186 placeholder="Содржина на соопштението"
187 />
188 </div>
189 <div className="form-group">
190 <label htmlFor="iznos">Износ</label>
191 <input
192 className="form-control"
193 type="number"
194 name="iznos"
195 id="iznos"
196 step="any"
197 value={formData.iznos}
198 min={0}
199 required
200 onChange={handleChange}
201 placeholder="0.00"
202 />
203 </div>
204 <div className="form-group">
205 <label htmlFor="valuta">Валута</label>
206 <input
207 type="text"
208 required
209 name="valuta"
210 className="form-control"
211 onChange={handleChange}
212 value={formData.valuta}
213 placeholder="ETH, LTC, XRP"
214 />
215 </div>
216 <div className="form-group">
217 <label htmlFor="rokZaPlakjanje">Рок за плаќање</label>
218 <input
219 type="date"
220 name="rokZaPlakjanje"
221 className="form-control"
222 value={formData.rokZaPlakjanje}
223 required
224 onChange={handleChange}
225 />
226 </div>
227 <div className="modal-footer ">
228 <button type="submit" className="btn btn-primary">
229 Креирај соопштение
230 </button>
231 <button type="button" data-bs-dismiss="modal" className="btn">
232 Затвори
233 </button>
234 </div>
235 </form>
236 </div>
237 </div>
238 </div>
239 </div>
240 </>
241 );
242};
243export default BlagajnikDashboard;
Note: See TracBrowser for help on using the repository browser.