source: frontend/web3-eDnevnik_Frontend/src/pages/RoditelPages/Roditel_NedelenPlan/Roditel_NedelenPlan.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.1 KB
Line 
1import React, { useState, useEffect } from "react";
2import axios from "axios";
3import { useParams, useNavigate, Link } from "react-router-dom";
4import styles from "./Roditel_NedelenPlanStyles.module.css";
5import NavbarRoditelAndBlagajnik from "../../../components/NavbarRoditel/NavbarRoditel";
6
7const Roditel_NedelenPlan = () => {
8 const { classId } = useParams();
9 const navigate = useNavigate();
10 const [plan, setPlan] = useState(null);
11 const [classDetails, setClassDetails] = useState(null);
12 const [loading, setLoading] = useState(true);
13
14 const daysMapping = [
15 { label: "Понеделник", key: "Ponedelnik" },
16 { label: "Вторник", key: "Vtornik" },
17 { label: "Среда", key: "Sreda" },
18 { label: "Четврток", key: "Cetvrtok" },
19 { label: "Петок", key: "Petok" },
20 { label: "Сабота", key: "Sabota" },
21 ];
22
23 const nastavniCasovi = [1, 2, 3, 4, 5, 6, 7, 8];
24
25 const fetchAllData = async () => {
26 try {
27 setLoading(true);
28 const [resPlan, resClass] = await Promise.all([
29 axios.get(`http://localhost:8080/api/klas/${classId}/nedelenPlan`, {
30 withCredentials: true,
31 }),
32 axios.get(`http://localhost:8080/api/klas/${classId}`, {
33 withCredentials: true,
34 }),
35 ]);
36 setPlan(resPlan.data);
37 setClassDetails(resClass.data);
38 } catch (err) {
39 console.error("Грешка при вчитување:", err);
40 } finally {
41 setLoading(false);
42 }
43 };
44
45 useEffect(() => {
46 if (classId) fetchAllData();
47 }, [classId]);
48
49 if (loading)
50 return (
51 <div className={styles.wrapper}>
52 <NavbarRoditelAndBlagajnik />
53 <div className={styles.loaderContainer}>
54 <h2>Вчитување на неделниот план...</h2>
55 </div>
56 </div>
57 );
58
59 return (
60 <div className={styles.wrapper}>
61 <NavbarRoditelAndBlagajnik />
62
63 <div className={styles.contentContainer}>
64 <div className={styles.headerRow}>
65 <h1 className={styles.title}>
66 Клас {classDetails?.oddelenie}-{classDetails?.paralelka} — Неделни
67 активности
68 </h1>
69 </div>
70
71 <div className={styles.infoBar}>
72 <span className={styles.dateRange}>
73 Период: <strong>{plan?.datumOd}</strong> до{" "}
74 <strong>{plan?.datumDo}</strong>
75 </span>
76 </div>
77
78 <div className={styles.tableWrapper}>
79 <table className={styles.weeklyTable}>
80 <thead>
81 <tr>
82 <th className={styles.hourCol}>Час</th>
83 {daysMapping.map((day) => (
84 <th key={day.key} className={styles.dayHeader}>
85 {day.label}
86 </th>
87 ))}
88 </tr>
89 </thead>
90 <tbody>
91 {nastavniCasovi.map((casBroj, index) => (
92 <tr key={casBroj}>
93 <td className={styles.hourCell}>{casBroj}</td>
94 {daysMapping.map((day) => {
95 const активностиЗаДенот = plan?.timetable?.[day.key] || [];
96 const активност = активностиЗаДенот[index];
97
98 return (
99 <td key={day.key} className={styles.tableCell}>
100 {активност ? (
101 <div className={styles.activityCard}>
102 <div className={styles.subjectName}>
103 {активност.naslov}
104 </div>
105 <div className={styles.subjectOpis}>
106 {активност.opis}
107 </div>
108 </div>
109 ) : (
110 <div className={styles.emptyCell}>—</div>
111 )}
112 </td>
113 );
114 })}
115 </tr>
116 ))}
117 </tbody>
118 </table>
119 </div>
120 </div>
121 </div>
122 );
123};
124
125export default Roditel_NedelenPlan;
Note: See TracBrowser for help on using the repository browser.