diff --git a/apps/backend/src/event/entity/event.entity.ts b/apps/backend/src/event/entity/event.entity.ts index b35a5ea..eb413f3 100644 --- a/apps/backend/src/event/entity/event.entity.ts +++ b/apps/backend/src/event/entity/event.entity.ts @@ -1,5 +1,5 @@ import { Color, Priority, Status } from '@prisma/client'; -import { IsDate, IsEnum, IsNotEmpty, IsString, IsUUID } from 'class-validator'; +import { IsDate, IsDateString, IsEnum, IsNotEmpty, IsString, IsUUID } from 'class-validator'; export class Event { @IsString() @@ -14,7 +14,7 @@ export class Event { @IsString() description: string; - @IsDate() + @IsDateString() date: Date; @IsString() diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 4984bd2..7be2dcd 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -12,11 +12,18 @@ "lint": "next lint" }, "dependencies": { + "@chakra-ui/next-js": "^2.2.0", + "@chakra-ui/react": "^2.8.2", + "@chakra-ui/system": "^2.6.2", + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", "@tanstack/react-query": "^5.51.15", "@tanstack/react-query-devtools": "^5.51.23", "axios": "^1.7.2", + "chakra-ui": "^0.3.9", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", + "framer-motion": "^11.3.30", "lucide-react": "^0.372.0", "next": "14.2.2", "react": "^18.2.0", @@ -24,6 +31,8 @@ "react-hook-form": "^7.52.2", "react-icons": "^5.2.1", "react-router-dom": "^6.25.1", + "react-tag-input": "^6.10.3", + "react-tag-input-component": "^2.0.2", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7" }, diff --git a/apps/frontend/src/api/hooks/eventMutationHooks.ts b/apps/frontend/src/api/hooks/eventMutationHooks.ts index ddc62a9..75b2d61 100644 --- a/apps/frontend/src/api/hooks/eventMutationHooks.ts +++ b/apps/frontend/src/api/hooks/eventMutationHooks.ts @@ -10,3 +10,17 @@ export const useCreateEventMutation = () => { mutationFn: async (event: CreateEvent) => (await axios.post(`${API_HOST}/events`, event)).data, }); }; + +export const useUpdateEventMutation = (eventId: string) => { + return useMutation({ + mutationFn: async (event: CreateEvent) => (await axios.patch(`${API_HOST}/events/${eventId}`, event)).data, + }); +}; + +export const useDeleteEventMutation = (onSuccess: () => void, onError: (e: Error) => void) => { + return useMutation({ + mutationFn: async (eventId: string) => (await axios.delete(`${API_HOST}/events/${eventId}`)).data, + onSuccess, + onError, + }); +}; diff --git a/apps/frontend/src/api/hooks/eventQueryHooks.ts b/apps/frontend/src/api/hooks/eventQueryHooks.ts index d134e45..f7a0178 100644 --- a/apps/frontend/src/api/hooks/eventQueryHooks.ts +++ b/apps/frontend/src/api/hooks/eventQueryHooks.ts @@ -4,6 +4,7 @@ import axios from 'axios'; import { EventDetails } from '@/app/events/types/eventDetails'; import { API_HOST } from '@/util/environment'; +import { EventModel } from '@/api/model/event.model'; export const useFetchEventDetailsQuery = (eventId: string) => { return useQuery({ @@ -11,3 +12,10 @@ export const useFetchEventDetailsQuery = (eventId: string) => { queryFn: async () => (await axios.get(`${API_HOST}/events/${eventId}`)).data, }); }; + +export const useFetchEventListQuery = () => { + return useQuery({ + queryKey: ['fetchEventList'], + queryFn: async () => (await axios.get(`${API_HOST}/events`)).data, + }); +}; diff --git a/apps/frontend/src/api/model/event.model.ts b/apps/frontend/src/api/model/event.model.ts index 9f15af7..a936b73 100644 --- a/apps/frontend/src/api/model/event.model.ts +++ b/apps/frontend/src/api/model/event.model.ts @@ -8,9 +8,9 @@ export enum Priority { } export enum Status { - CREATED, - SUBMITTED, - APPROVED, + CREATED = 'CREATTED', + SUBMITTED = 'SUBMITTED', + APPROVED = 'APPROVED', } export enum Color { diff --git a/apps/frontend/src/app/events/new/page.tsx b/apps/frontend/src/app/events/new/page.tsx index fafa7d5..f8cae29 100644 --- a/apps/frontend/src/app/events/new/page.tsx +++ b/apps/frontend/src/app/events/new/page.tsx @@ -1,19 +1,40 @@ +'use client'; +import { + Button, + Checkbox, + Flex, + FormControl, + FormErrorMessage, + FormLabel, + Input, + Select, + Stack, + Text, + Textarea, + useToast, + VStack, +} from '@chakra-ui/react'; import { redirect } from 'next/navigation'; +import { useState } from 'react'; import { useForm } from 'react-hook-form'; +import ReactTags from 'react-tag-input/types/components/ReactTags'; +import { TagsInput } from 'react-tag-input-component'; import { useCreateEventMutation } from '@/api/hooks/eventMutationHooks'; import { Color, EventModel, Status } from '@/api/model/event.model'; import { CreateEvent, CreateEventForm } from '@/app/events/types/createEvent'; -import Button from '@/components/button'; -import Input from '@/components/input'; import { styles } from '@/components/newEventStyles'; +import { FRONTEND_HOST } from '@/util/environment'; export default function newEvent() { - /*const { mutate: createEvent } = useCreateEventMutation(); + const { mutate: createEvent } = useCreateEventMutation(); const publishEvent = (formData: CreateEvent) => { createEvent(formData, { onSuccess: (event: EventModel) => { - redirect(`http://localhost:3000/events/${event.id}`); + redirect(`${FRONTEND_HOST}/events/${event.id}`); + }, + onError: (e: Error) => { + throw e; }, }); }; @@ -21,8 +42,10 @@ export default function newEvent() { const form = useForm({ defaultValues: { tags: [], + organizerIds: [], date: new Date(), color: Color.RED, + link: '', }, mode: 'all', }); @@ -36,20 +59,41 @@ export default function newEvent() { formState: { errors, isValid, isSubmitted }, } = form; - const onSubmit = handleSubmit((data: CreateEventForm) => { + const onPublish = handleSubmit((data: CreateEventForm) => { const formData: CreateEvent = { name: data.name, description: data.description, - date: data.date, + date: new Date(data.date).toISOString(), location: data.location, - tags: data.tags, + tags: tags, color: data.color, link: data.link, ownerId: 'bearni03', + organizerIds: data.organizerIds, status: Status.SUBMITTED, }; + console.log(formData); publishEvent(formData); - });*/ + }); + + const onSaveDraft = handleSubmit((data: CreateEventForm) => { + const formData: CreateEvent = { + name: data.name, + description: data.description, + date: new Date(data.date).toISOString(), + location: data.location, + tags: tags, + color: data.color, + link: data.link, + ownerId: 'bearni03', + organizerIds: organizerIds, + status: Status.CREATED, + }; + publishEvent(formData); + }); + + const [tags, setTags] = useState([]); + const [organizerIds, setOrganizerIds] = useState([]); return (
@@ -60,41 +104,99 @@ export default function newEvent() {
Név: - + + + {errors.name && {errors.name.message}} +
+
Szín: + + + {errors.color && {errors.color.message}} +
Helyszín: - + + + {errors.location && {errors.location.message}} +
Tagek: - +
Időpont: - + + + {errors.date && {errors.date.message}} +
Szervezők: - +
Leírás:
- + + +
- +
diff --git a/apps/frontend/src/app/events/types/createEvent.ts b/apps/frontend/src/app/events/types/createEvent.ts index 42b4cf7..b023f46 100644 --- a/apps/frontend/src/app/events/types/createEvent.ts +++ b/apps/frontend/src/app/events/types/createEvent.ts @@ -1,13 +1,12 @@ import { Color, Status } from '@/api/model/event.model'; -import { PublicUser } from '@/app/users/types/PublicUser'; export interface CreateEvent { name: string; description: string; - date: Date; + date: string; location: string; tags: string[]; - //organizerIds: string[]; + organizerIds: string[]; color: Color; status: Status; ownerId: string; @@ -20,7 +19,7 @@ export type CreateEventForm = { date: Date; location: string; tags: string[]; - //organizers: PublicUser[]; + organizerIds: string[]; color: Color; //status: Status; link?: string;