diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1c556de..814f903 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,12 +12,14 @@ "@hookform/resolvers": "^3.3.4", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-menubar": "^1.0.4", "@radix-ui/react-navigation-menu": "^1.1.4", + "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", @@ -26,11 +28,13 @@ "autoprefixer": "^10.4.19", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", + "cmdk": "^1.0.0", "cn-decorator": "^2.1.0", "cross": "^1.0.0", "i18next": "^23.10.1", "less": "^4.2.0", "lucide-react": "^0.363.0", + "moment": "^2.30.1", "next-themes": "^0.3.0", "postcss": "^8.4.38", "react": "^18.2.0", @@ -1224,6 +1228,36 @@ } } }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.4.tgz", + "integrity": "sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-use-size": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collapsible": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", @@ -1622,6 +1656,43 @@ } } }, + "node_modules/@radix-ui/react-popover": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", + "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", @@ -3242,6 +3313,19 @@ "node": ">=6" } }, + "node_modules/cmdk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz", + "integrity": "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==", + "dependencies": { + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/cn-decorator": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cn-decorator/-/cn-decorator-2.1.0.tgz", @@ -5838,6 +5922,14 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index f066bb4..353b03a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,25 +12,31 @@ "dependencies": { "@balkangraph/orgchart.js": "^8.14.19", "@hookform/resolvers": "^3.3.4", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-menubar": "^1.0.4", + "@radix-ui/react-navigation-menu": "^1.1.4", + "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-navigation-menu": "^1.1.4", "@vitejs/plugin-react-swc": "^3.5.0", "autoprefixer": "^10.4.19", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", + "cmdk": "^1.0.0", "cn-decorator": "^2.1.0", "cross": "^1.0.0", "i18next": "^23.10.1", "less": "^4.2.0", "lucide-react": "^0.363.0", + "moment": "^2.30.1", "next-themes": "^0.3.0", "postcss": "^8.4.38", "react": "^18.2.0", @@ -46,9 +52,7 @@ "tailwindcss-animate": "^1.0.7", "typescript": "^5.2.2", "vite": "^5.2.0", - "zod": "^3.22.4", - "@radix-ui/react-accordion": "^1.1.2", - "@radix-ui/react-avatar": "^1.0.4" + "zod": "^3.22.4" }, "devDependencies": { "@types/node": "^20.11.30", @@ -56,6 +60,8 @@ "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.0", + "autoprefixer": "^10.4.16", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard-with-typescript": "19.0.1", @@ -63,10 +69,8 @@ "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "prettier": "^3.2.5", - "@vitejs/plugin-react": "^4.2.0", - "autoprefixer": "^10.4.16", "postcss": "^8.4.32", + "prettier": "^3.2.5", "tailwindcss": "^3.3.5", "vite": "^5.0.0" } diff --git a/frontend/public/fonts/Arial_Black.ttf b/frontend/public/fonts/Arial_Black.ttf deleted file mode 100644 index b51c8c2..0000000 Binary files a/frontend/public/fonts/Arial_Black.ttf and /dev/null differ diff --git a/frontend/src/components/app/APIurl.ts b/frontend/src/components/app/APIurl.ts index 0620fe9..953e094 100644 --- a/frontend/src/components/app/APIurl.ts +++ b/frontend/src/components/app/APIurl.ts @@ -4,5 +4,7 @@ export const API_BASE = "http://localhost/api/" //3 сервер export const API_REG = "auth/signup/" export const API_CREATE_TOKEN = "auth/login/" -export const API_CREATE_EVENT = "events/" +export const API_EVENT = "events/" +export const API_USERS = "users/" + diff --git a/frontend/src/components/entities/VacancyCard/VacancyCard.module.less b/frontend/src/components/entities/VacancyCard/VacancyCard.module.less index 7501813..c3fc9c3 100644 --- a/frontend/src/components/entities/VacancyCard/VacancyCard.module.less +++ b/frontend/src/components/entities/VacancyCard/VacancyCard.module.less @@ -2,5 +2,15 @@ max-width: 800px; padding: 20px; margin-bottom: 10px; - height: 200px; + +} +.up{ + display: flex; + flex-direction: column; +} +.header{ + display: flex; + flex-direction: row; + justify-content:space-between; + padding: 0; } \ No newline at end of file diff --git a/frontend/src/components/entities/VacancyCard/VacancyCard.tsx b/frontend/src/components/entities/VacancyCard/VacancyCard.tsx index 11caff0..2cd9485 100644 --- a/frontend/src/components/entities/VacancyCard/VacancyCard.tsx +++ b/frontend/src/components/entities/VacancyCard/VacancyCard.tsx @@ -2,22 +2,37 @@ import { useTranslation } from "react-i18next"; import { Button } from "../../shared/ui/button"; import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "../../shared/ui/card" import less from "./VacancyCard.module.less"; +import { TrashIcon } from "lucide-react"; +import { deleteEvent } from "../../pages/AdminEventPage/AdminEventAPI"; -const VacancyCard = () =>{ +interface VacancyCardProms{ + title: string; + date: string; + desc: string; + cardId: string; + admin: boolean; +} + +const VacancyCard = ({title, date, desc,cardId, admin = false} : VacancyCardProms) =>{ const { t } = useTranslation(); return(
- - Lorem ipsum - Lorem ipsum + +
+ {title} + Дата начала: {date} +
+{admin &&( + + )}
-

Lorem ipsum dolor sit amet consectetur. Lorem justo sit nunc commodo nam fames dui ac ullamcorper. Laoreet faucibus semper adipiscing lobortis.

+

{desc}

- +
diff --git a/frontend/src/components/pages/AdminEventPage/AdminEventAPI.ts b/frontend/src/components/pages/AdminEventPage/AdminEventAPI.ts index 4fe28e0..672b244 100644 --- a/frontend/src/components/pages/AdminEventPage/AdminEventAPI.ts +++ b/frontend/src/components/pages/AdminEventPage/AdminEventAPI.ts @@ -1,5 +1,5 @@ import { FormEvent } from "react"; -import { API_BASE, API_CREATE_EVENT } from "../../app/APIurl"; +import { API_BASE, API_EVENT } from "../../app/APIurl"; export const submitAddEvent = (e: FormEvent) => { e.preventDefault(); @@ -8,7 +8,7 @@ export const submitAddEvent = (e: FormEvent) => { console.log(formProps) - fetch(`${API_BASE}${API_CREATE_EVENT}`, { + fetch(`${API_BASE}${API_EVENT}`, { method: "POST", headers: { "Content-Type": "application/json", @@ -29,37 +29,48 @@ export const submitAddEvent = (e: FormEvent) => { }) .then(data => { console.log('Успешно:', data); + return data }) .catch(error => { console.error('Возникла ошибка с созданием:', error); }); } - export const eventList = () => { + return fetch(`${API_BASE}${API_EVENT}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }) + .then(response => { + if (response.ok) { + return response.json(); + } else { + throw new Error('Код ошибки: ' + response.status); + } + }) + .then(data => { + return data; + }) + .catch(error => { + console.error('Возникла ошибка с получением:', error); + }); +} +export const deleteEvent = (id:string) => { + fetch(`${API_BASE}${API_EVENT}${id}`, { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + }) + .then(response => { + if (response.ok) { - - fetch(`${API_BASE}${API_CREATE_EVENT}`, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }) - .then(response => { - - console.log(response.status); - - if (response.ok) { - console.log('Получен:', response.headers.get('Location')); - return response.json(); - } else { - - throw new Error('Код ошибки: ' + response.status); - } - }) - .then(data => { - console.log('Успешно:', data); - }) - .catch(error => { - console.error('Возникла ошибка с получением:', error); - }); -} \ No newline at end of file + } else { + throw new Error('Код ошибки: ' + response.status); + } + }) + .catch(error => { + console.error('Возникла ошибка с удалением:', error); + }); +} diff --git a/frontend/src/components/pages/AdminEventPage/AdminEventPage.tsx b/frontend/src/components/pages/AdminEventPage/AdminEventPage.tsx index 048b45e..86559a8 100644 --- a/frontend/src/components/pages/AdminEventPage/AdminEventPage.tsx +++ b/frontend/src/components/pages/AdminEventPage/AdminEventPage.tsx @@ -11,63 +11,47 @@ import { useEffect, useState } from "react"; -const AdminEventPage = () =>{ - const { t } = useTranslation(); - let wfew = JSON.stringify(eventList()); - console.log(typeof wfew); - console.log(wfew ); +const AdminEventPage = () => { + const { t } = useTranslation(); - const [events, setEvents] = useState([]); + const [events, setEvents] = useState([]); - useEffect(() => { - fetchData(); - }, []); - - const fetchData = () => { - eventList() // Вызываем функцию eventList из файла api.ts - .then((data: Event[]) => { - setEvents(data); // Устанавливаем полученные данные в состояние - }) - .catch((error: any) => { - console.error('Произошла ошибка:', error); // Обрабатываем ошибку, если она возникла - }); - }; + useEffect(() => { + eventList().then((data) => { + setEvents(data) + }).catch(error => { + console.error('Возникла ошибка с получением:', error) + }) + }, []); - return( -
-
+ + return ( +
+
submitAddEvent(event)}> -

{t("createEvent")}

- - - +

{t("createEvent")}

+ + + -