From 8032f415dc7dd4acac137836f24790825d41f97a Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 3 Mar 2025 20:15:12 +0300 Subject: [PATCH] still rainbow vommit --- backend/src/controllers.ts | 4 +- .../src/components/CardGroup/CardGroup.tsx | 22 ++-- .../src/components/MainBoard/MainBoard.tsx | 30 ++--- .../AddUserToProjectDialog.tsx | 92 +++++++++++++++ .../CreateProjectDialog.tsx | 59 ++++++++++ .../CreateTaskDialog/CreateTaskDialog.tsx | 0 .../DeleteProjectDialog/CreateTaskDialog.tsx | 0 .../pages/auth/RegisterPage/RegisterPage.tsx | 61 +++++++++- cool_todo_manager/src/services/mainApi.ts | 110 ++++++++++++++---- 9 files changed, 324 insertions(+), 54 deletions(-) create mode 100644 cool_todo_manager/src/components/dialogs/AddUserToProjectDialog/AddUserToProjectDialog.tsx create mode 100644 cool_todo_manager/src/components/dialogs/CreateProjectDialog/CreateProjectDialog.tsx rename cool_todo_manager/src/components/{CardGroup => dialogs}/CreateTaskDialog/CreateTaskDialog.tsx (100%) rename cool_todo_manager/src/components/{CardGroup => dialogs}/DeleteProjectDialog/CreateTaskDialog.tsx (100%) diff --git a/backend/src/controllers.ts b/backend/src/controllers.ts index 427905f..416f6f0 100644 --- a/backend/src/controllers.ts +++ b/backend/src/controllers.ts @@ -1,9 +1,9 @@ import { Request, Response } from 'express'; +import jwt from 'jsonwebtoken'; import { getRepository } from 'typeorm'; import { Project } from './entities/Project'; -import { ProjectMember } from './entities/ProjectMember' +import { ProjectMember } from './entities/ProjectMember'; import { Task } from './entities/Task'; -import jwt from 'jsonwebtoken'; import { User } from './entities/User'; const SECRET_KEY = process.env.JWT_SECRET || 'your_secret_key'; diff --git a/cool_todo_manager/src/components/CardGroup/CardGroup.tsx b/cool_todo_manager/src/components/CardGroup/CardGroup.tsx index fa0ed1d..7185d91 100644 --- a/cool_todo_manager/src/components/CardGroup/CardGroup.tsx +++ b/cool_todo_manager/src/components/CardGroup/CardGroup.tsx @@ -6,12 +6,15 @@ import { useGetTasksForGroupQuery, } from '../../services/mainApi'; import TaskCard from '../TaskCard/TaskCard'; -import CreateTaskDialog from './CreateTaskDialog/CreateTaskDialog'; -import DeleteProjectDialog from './DeleteProjectDialog/CreateTaskDialog'; +import AddUserToProjectDialog from '../dialogs/AddUserToProjectDialog/AddUserToProjectDialog'; +import CreateTaskDialog from '../dialogs/CreateTaskDialog/CreateTaskDialog'; +import DeleteProjectDialog from '../dialogs/DeleteProjectDialog/CreateTaskDialog'; + +import { PlusIcon } from '@radix-ui/react-icons'; type TCardGroup = { id: string; - title: string; + title: string; }; export default function CardGroup(props: TCardGroup) { @@ -56,14 +59,19 @@ export default function CardGroup(props: TCardGroup) { - + - + + + + + )} diff --git a/cool_todo_manager/src/components/MainBoard/MainBoard.tsx b/cool_todo_manager/src/components/MainBoard/MainBoard.tsx index 94c6331..41854df 100644 --- a/cool_todo_manager/src/components/MainBoard/MainBoard.tsx +++ b/cool_todo_manager/src/components/MainBoard/MainBoard.tsx @@ -2,41 +2,24 @@ import { DragDropContext } from '@hello-pangea/dnd'; import { Button, Flex, ScrollArea } from '@radix-ui/themes'; import { useCreateProjectMutation, - useCreateTaskMutation, - useGetProjectsQuery, + useGetProjectsQuery } from '../../services/mainApi'; import CardGroup from '../CardGroup/CardGroup'; +import CreateProjectDialog from '../dialogs/CreateProjectDialog/CreateProjectDialog'; export default function MainBoard() { const dragEndHandle = (result: TDragResult) => { result; }; - const [create] = useCreateTaskMutation(); const [createProject] = useCreateProjectMutation(); const { data: cringe, isLoading } = useGetProjectsQuery({}); - const onClick = () => { - create({ - title: 'My Task 123', - projectId: 4, - assignedUserId: 1, - deadline: '2025-03-01T12:00:00Z', - }); - }; - - const onClick1 = () => { - createProject({ - title: 'My project test 12', - description: 'Test desc 123 123 123', - }); - }; - return ( <> - - + + {!isLoading && (cringe as any[]).map((item: any) => ( @@ -44,7 +27,10 @@ export default function MainBoard() { - + + + + ); } diff --git a/cool_todo_manager/src/components/dialogs/AddUserToProjectDialog/AddUserToProjectDialog.tsx b/cool_todo_manager/src/components/dialogs/AddUserToProjectDialog/AddUserToProjectDialog.tsx new file mode 100644 index 0000000..65727f8 --- /dev/null +++ b/cool_todo_manager/src/components/dialogs/AddUserToProjectDialog/AddUserToProjectDialog.tsx @@ -0,0 +1,92 @@ +import { Button, Dialog, Flex, Select } from '@radix-ui/themes'; +import { PropsWithChildren, useState } from 'react'; +import { + useAddProjectMemberMutation, + useGetAllUsersQuery, +} from '../../../services/mainApi'; + +type TAddUserToProjectDialog = { + projectId: number; +} & PropsWithChildren; + +export default function AddUserToProjectDialog(props: TAddUserToProjectDialog) { + const { projectId, children } = props; + const { data: users, isLoading, error, refetch } = useGetAllUsersQuery({}); + const [addProjectMember, { isLoading: isAdding }] = + useAddProjectMemberMutation(); + const [selectedUserId, setSelectedUserId] = useState(null); + + const handleAddUser = async () => { + if (selectedUserId) { + try { + await addProjectMember({ + projectId, + memberId: selectedUserId, + }).unwrap(); + setSelectedUserId(null); + } catch (err) { + console.error('Failed to add user:', err); + } + } + }; + + + return ( + refetch()}> + {children} + + + Add User to Project + + + {isLoading ? ( + Loading users... + ) : error ? ( + Error loading users. + ) : ( + + setSelectedUserId(Number(value)) + } + required + > + + {selectedUserId + ? users?.find( + (user: any) => + user.id === selectedUserId, + )?.username + : 'Select a user'} + + + {users?.map((user: any) => ( + + {user.username} + + ))} + + + )} + + + + + + + + + + + + + ); +} diff --git a/cool_todo_manager/src/components/dialogs/CreateProjectDialog/CreateProjectDialog.tsx b/cool_todo_manager/src/components/dialogs/CreateProjectDialog/CreateProjectDialog.tsx new file mode 100644 index 0000000..8d74bf8 --- /dev/null +++ b/cool_todo_manager/src/components/dialogs/CreateProjectDialog/CreateProjectDialog.tsx @@ -0,0 +1,59 @@ +import { Button, Dialog, Flex, TextArea, TextField } from '@radix-ui/themes'; +import { PropsWithChildren, useState } from 'react'; + +type TCreateProjectDialog = { + onCreate: (f: any) => void; +} & PropsWithChildren; + +export default function CreateProjectDialog(props: TCreateProjectDialog) { + const [title, setTitle] = useState(''); + const [description, setDescription] = useState(''); + + const handleCreate = () => { + props.onCreate({title, description}); + setTitle(''); + setDescription(''); + }; + + return ( + + + {props.children} + + + + Create a New Project + + + setTitle(e.target.value)} + required + > +