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 0000000..fe885cd Binary files /dev/null and b/WEB/app/public/image.png differ diff --git a/WEB/app/src/app/app.css b/WEB/app/src/app/app.css index 1c63fdd..e7324e7 100644 --- a/WEB/app/src/app/app.css +++ b/WEB/app/src/app/app.css @@ -116,5 +116,18 @@ .events { margin: 2vw; - border: 1px solid black; -} \ No newline at end of file +} + +.event-card-body { + background-color: #2f9836; + height: 100px; + margin: 5px; + color: white; + padding: 1vw; +} + +.last-row { + display: flex; + flex-direction: row; + justify-content: space-between; +} diff --git a/WEB/app/src/app/components/event-card.js b/WEB/app/src/app/components/event-card.js new file mode 100644 index 0000000..c98fbfd --- /dev/null +++ b/WEB/app/src/app/components/event-card.js @@ -0,0 +1,60 @@ +const EventCard = (event) => { + + 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) => ( + + ))) : ( +

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

+ ) }