From 11051d9fc729fa185fb34c2beab6ac7eb1b30a3e Mon Sep 17 00:00:00 2001 From: andrei Date: Tue, 21 Jan 2025 21:11:58 +0500 Subject: [PATCH] ._. --- API/main.py | 2 +- WEB/app/public/image.png | Bin 0 -> 876 bytes WEB/app/src/app/app.css | 17 +++++- WEB/app/src/app/components/event-card.js | 60 +++++++++++++++++++ WEB/app/src/app/components/header.js | 6 +- WEB/app/src/app/page.js | 71 ++++++++++++++++++++--- 6 files changed, 140 insertions(+), 16 deletions(-) create mode 100644 WEB/app/public/image.png create mode 100644 WEB/app/src/app/components/event-card.js diff --git a/API/main.py b/API/main.py index 9af6bd4..f380a13 100644 --- a/API/main.py +++ b/API/main.py @@ -324,7 +324,7 @@ def get_events(): resp.append({ 'title': event.title, 'date': str(event.datetime_event.date()), - 'author': f'{user.last_name} {user.first_name}', + 'author': f'{user.last_name} {user.first_name[0]}. {user.patronymic[0]}.', 'description': event.title, }) diff --git a/WEB/app/public/image.png b/WEB/app/public/image.png new file mode 100644 index 0000000000000000000000000000000000000000..fe885cd4e5f511777e2344745bebf3950d51585d GIT binary patch literal 876 zcmV-y1C#uTP)30)L>5xSsT#7y~v*O7$9vjQZv@!Zi| zVfpCl+OVr$;xxSK4L|kMpxz*L%6fyn`U$^OEJC-?1Nu^;Uq2Y~!H_c=`Dj?b?&2}c z2Wiee^?l4EVfRG0ZgAn4q#{WL>r|0s{UqzVLs@j{Wm8-F!S%X+>3jfl%-eMWxq zvRzEk-R$nO8*FN1lqJqXszp1C^1tL;37r^#h@~&+&6GhMXIGZo) z=5aR91uW}kSvM1zrMN61x#EsLcl??baaAFa~aXO0Amay8e@b2Ut3)_%Ha@E zDJ=x}DMbrQ@1i|@thCSWPkI?$mZDWm&qRTUp57@@0+-~}v;pV$*;}sPz|v{Of&Ms~ z8+UODFRPU?=4G`KvNUFE%yu@L-`#)p{_g&(kfl;nL=>`=MHR#{QFJo8X2(h|>&92i zB^a}Hy>EpqN$(ctdY=Y*;93I}i_pBKceDR8X1iMbdNVtv7kj$vluP$VkoKz>E6pY3 zMHwWZ5^y*&rFgHjJxT!;6|>N;JUuicpbE{%q6*DK8$@(~5y0p;eWItw>Cn=fhGs0F z(rtFn-P3akk?f1oTIp$BH+9_zC};C|-88fL_X4WAY3ioYdU})&P!WxokPrzGpBD?a zfhOZr>vLKxejp-2S5Q{R>Au{57!UOF1YH&osetmR4y;Zgmg{A+N31Ztj2Jd((YBeu zq9)>=%ovEl5cHlNvFP+1w+jkwP-C-G9QEhWa447JBF`u;_?Y{Sm=PDss;owq9 { + + return ( + <> +
+ {event.event.title} +

{event.event.description}

+ +
+
+ + {event.event.date} +
+ + {event.event.author} +
+ +
+ + ) +} + +const downloadICS = (event) => { + const { title, description, date, author } = event.event; + + const startDate = new Date(date).toISOString().replace(/[-:]/g, "").split(".")[0] + "Z"; + const uid = crypto.randomUUID(); + const dtStamp = new Date().toISOString().replace(/[-:]/g, "").split(".")[0] + "Z"; + + const icsContent = `BEGIN:VCALENDAR +VERSION:2.0 +BEGIN:VEVENT +SUMMARY:${title} +DTSTART:${startDate} +DTEND:${startDate} +DTSTAMP:${dtStamp} +UID:${uid} +DESCRIPTION:${description} +LOCATION:Не указано +ORGANIZER:${author} +STATUS:CONFIRMED +PRIORITY:0 +END:VEVENT +END:VCALENDAR`; + + const blob = new Blob([icsContent], { type: "text/calendar" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `${title}.ics`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); +}; + + +export default EventCard; \ No newline at end of file diff --git a/WEB/app/src/app/components/header.js b/WEB/app/src/app/components/header.js index 5f82de2..e0f5ab5 100644 --- a/WEB/app/src/app/components/header.js +++ b/WEB/app/src/app/components/header.js @@ -1,11 +1,8 @@ 'use client'; import Image from "next/image"; -import { useState } from "react"; - -const Header = () => { - const [searchString, setSearchString] = useState(''); +const Header = ({ setSearchString }) => { const onSearchStringChange = (e) => { setSearchString(e.target.value); @@ -16,7 +13,6 @@ const Header = () => { { fetchEmployees(); fetchRSS(); + fetchEvents(); const interval = setInterval( () => { fetchEmployees(); fetchRSS(); + fetchEvents(); }, 5000 ) @@ -27,6 +31,10 @@ export default function Home() { } }, []); + useEffect(() => { + filterData(); + }, [searchString]) + const fetchEmployees = async () => { try { const data = await fetch('http://localhost:5000/employees'); @@ -41,6 +49,20 @@ export default function Home() { } } + const fetchEvents = async () => { + try { + const data = await fetch('http://localhost:5000/events'); + + if (data.ok) { + const json_data = await data.json(); + setEvents(json_data) + } + + } catch { + + } + } + const fetchRSS = async () => { try { const response = await fetch("http://127.0.0.1:5000/rss"); @@ -55,9 +77,27 @@ export default function Home() { } }; + const filterData = (data, fields) => { + if (data === undefined) { + return data; + } + + if (!searchString.trim()) return data; + + return data.filter(item => + fields.some(field => + String(item[field] || "").toLowerCase().includes(searchString.toLowerCase()) + ) + ); + }; + + const filteredEmployees = filterData(employees, ["last_name", "first_name", "patronymic", "post", "email", "phone", "birthday"]); + const filteredEvents = filterData(events, ["title", "description", "author"]); + const filteredNews = filterData(news, ["title", "description"]); + return ( <> -
+
@@ -67,10 +107,14 @@ export default function Home() {
- {employees.map( - (employee) => ( - + {filteredEmployees.length > 0 ? ( + filteredEmployees.map( + (employee) => ( + + ) ) + ) : ( +

Сотрудники не найдены

)}
@@ -91,6 +135,15 @@ export default function Home() {

События

+ + {filteredEvents.length > 0 ? (filteredEvents.map( + (event, index) => ( + + ) + )) : ( +

События не найдены

+ )} +
@@ -101,9 +154,11 @@ export default function Home() {
- {news.map((article, index) => ( - - )) + {filteredNews.length > 0? (filteredNews.map((article, index) => ( + + ))) : ( +

Новости не найдены

+ ) }