From 0fb7097407c05001ae8f1367b5bb1b907f6c5098 Mon Sep 17 00:00:00 2001 From: sifes Date: Fri, 19 Jan 2024 17:49:16 +0200 Subject: [PATCH] feature #25 added admin user flow - added admin user search page - added admin user edit page - added admin user create page - added missing endpoints to UserAPI closes #25 --- .../src/app/admin/users/create/page.tsx | 3 +- .../app/admin/users/edit/[userId]/page.tsx | 21 ++- fictadvisor-web/src/app/admin/users/page.tsx | 3 +- .../admin-user/constants/UserStateOptions.ts | 8 + .../create-user-page/CreateUserPage.styles.ts | 45 +++++ .../create-user-page/CreateUserPage.tsx | 107 ++++++++++++ .../admin-user/create-user-page/index.ts | 1 + .../edit-user-page/EditUserPage.styles.ts | 43 +++++ .../edit-user-page/EditUserPage.tsx | 137 +++++++++++++++ .../admin/admin-user/edit-user-page/index.ts | 1 + .../search-user-page/SearchUserPage.styles.ts | 12 ++ .../search-user-page/SearchUserPage.tsx | 53 ++++++ .../HeaderUserSearch.styles.ts | 38 +++++ .../header-user-search/HeaderUserSearch.tsx | 115 +++++++++++++ .../components/header-user-search/index.ts | 1 + .../components/users-list/UsersList.styles.ts | 54 ++++++ .../components/users-list/UsersList.tsx | 157 ++++++++++++++++++ .../components/users-list/index.ts | 1 + .../search-user-page/constants/Options.ts | 13 ++ .../constants/UserInitialValues.ts | 8 + .../constants/UserSearchConstants.ts | 12 ++ .../admin-user/search-user-page/index.ts | 1 + .../types/HeaderUserSearch.ts | 12 ++ fictadvisor-web/src/lib/api/user/UserAPI.ts | 52 +++++- .../src/lib/api/user/types/ChangeUserBody.ts | 7 + .../src/lib/api/user/types/CreateUserBody.ts | 7 + .../src/lib/api/user/types/GetAllResponse.ts | 7 + fictadvisor-web/src/types/user.ts | 4 + 28 files changed, 914 insertions(+), 9 deletions(-) create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/constants/UserStateOptions.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/CreateUserPage.styles.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/CreateUserPage.tsx create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/index.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/edit-user-page/EditUserPage.styles.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/edit-user-page/EditUserPage.tsx create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/edit-user-page/index.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/SearchUserPage.styles.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/SearchUserPage.tsx create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/components/header-user-search/HeaderUserSearch.styles.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/components/header-user-search/HeaderUserSearch.tsx create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/components/header-user-search/index.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/components/users-list/UsersList.styles.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/components/users-list/UsersList.tsx create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/components/users-list/index.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/constants/Options.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/constants/UserInitialValues.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/constants/UserSearchConstants.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/index.ts create mode 100644 fictadvisor-web/src/components/pages/admin/admin-user/search-user-page/types/HeaderUserSearch.ts create mode 100644 fictadvisor-web/src/lib/api/user/types/ChangeUserBody.ts create mode 100644 fictadvisor-web/src/lib/api/user/types/CreateUserBody.ts create mode 100644 fictadvisor-web/src/lib/api/user/types/GetAllResponse.ts diff --git a/fictadvisor-web/src/app/admin/users/create/page.tsx b/fictadvisor-web/src/app/admin/users/create/page.tsx index a30f8a061..f1dbb8806 100644 --- a/fictadvisor-web/src/app/admin/users/create/page.tsx +++ b/fictadvisor-web/src/app/admin/users/create/page.tsx @@ -1,11 +1,12 @@ import React from 'react'; import AdminPanelLayout from '@/components/common/layout/admin-panel-layout/AdminPanelLayout'; +import CreateUserPage from '@/components/pages/admin/admin-user/create-user-page'; const Create = () => { return ( -
+
); }; diff --git a/fictadvisor-web/src/app/admin/users/edit/[userId]/page.tsx b/fictadvisor-web/src/app/admin/users/edit/[userId]/page.tsx index 0ff2bf676..55ab90155 100644 --- a/fictadvisor-web/src/app/admin/users/edit/[userId]/page.tsx +++ b/fictadvisor-web/src/app/admin/users/edit/[userId]/page.tsx @@ -1,13 +1,26 @@ -import React from 'react'; +'use client'; +import React, { FC } from 'react'; +import { useQuery } from 'react-query'; import AdminPanelLayout from '@/components/common/layout/admin-panel-layout/AdminPanelLayout'; +import EditUserPage from '@/components/pages/admin/admin-user/edit-user-page'; +import UserAPI from '@/lib/api/user/UserAPI'; -const UserId = () => { +interface AdminUserEditProps { + params: { + userId: string; + }; +} + +const AdminUserEdit: FC = ({ params }) => { + const { data: user, isSuccess } = useQuery('getUser', () => + UserAPI.getUser(params.userId), + ); return ( -
+ {isSuccess && }
); }; -export default UserId; +export default AdminUserEdit; diff --git a/fictadvisor-web/src/app/admin/users/page.tsx b/fictadvisor-web/src/app/admin/users/page.tsx index 1dd30cea3..1b48c7d2e 100644 --- a/fictadvisor-web/src/app/admin/users/page.tsx +++ b/fictadvisor-web/src/app/admin/users/page.tsx @@ -1,11 +1,12 @@ import React from 'react'; import AdminPanelLayout from '@/components/common/layout/admin-panel-layout/AdminPanelLayout'; +import SearchUserPage from '@/components/pages/admin/admin-user/search-user-page'; const Page = () => { return ( -
+
); }; diff --git a/fictadvisor-web/src/components/pages/admin/admin-user/constants/UserStateOptions.ts b/fictadvisor-web/src/components/pages/admin/admin-user/constants/UserStateOptions.ts new file mode 100644 index 000000000..33d15f09b --- /dev/null +++ b/fictadvisor-web/src/components/pages/admin/admin-user/constants/UserStateOptions.ts @@ -0,0 +1,8 @@ +import { DropDownOption } from '@/components/common/ui/form/dropdown/types'; +import { UserGroupState } from '@/types/user'; + +export const UserStateOptions: DropDownOption[] = [ + { id: UserGroupState.APPROVED, label: 'Верифікований' }, + { id: UserGroupState.DECLINED, label: 'Не верифікований' }, + { id: UserGroupState.PENDING, label: 'В очікуванні' }, +]; diff --git a/fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/CreateUserPage.styles.ts b/fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/CreateUserPage.styles.ts new file mode 100644 index 000000000..24e04f81b --- /dev/null +++ b/fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/CreateUserPage.styles.ts @@ -0,0 +1,45 @@ +import { SxProps, Theme } from '@mui/material/styles'; + +export const header: SxProps = { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + padding: '16px', +}; + +export const button: SxProps = { + borderRadius: '8px', +}; + +export const title: SxProps = { + borderBottom: '1px solid', + borderColor: 'backgroundDark.400', + padding: '16px', + width: '50%', +}; + +export const input: SxProps = { + width: '40%', + borderRadius: '8px', + padding: '0px 16px', +}; + +export const body: SxProps = { + display: 'flex', + gap: '36px', + padding: '24px 16px', +}; + +export const inputsWrapper: SxProps = { + width: '100%', + maxWidth: '308px', + display: 'flex', + flexDirection: 'column', + gap: '18px', +}; + +export const avatar: SxProps = { + width: '160px', + height: '160px', + borderRadius: '100%', +}; diff --git a/fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/CreateUserPage.tsx b/fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/CreateUserPage.tsx new file mode 100644 index 000000000..8d4eb58a9 --- /dev/null +++ b/fictadvisor-web/src/components/pages/admin/admin-user/create-user-page/CreateUserPage.tsx @@ -0,0 +1,107 @@ +'use client'; +import React, { FC, useState } from 'react'; +import { Avatar, Box, CardHeader, Stack } from '@mui/material'; +import { isAxiosError } from 'axios'; +import { useRouter } from 'next/navigation'; + +import Button from '@/components/common/ui/button-mui'; +import { + ButtonColor, + ButtonSize, +} from '@/components/common/ui/button-mui/types'; +import { Dropdown, InputSize, InputType } from '@/components/common/ui/form'; +import { FieldSize } from '@/components/common/ui/form/common/types'; +import Input from '@/components/common/ui/form/input-mui'; +import useToast from '@/hooks/use-toast'; +import { useToastError } from '@/hooks/use-toast-error/useToastError'; +import UserAPI from '@/lib/api/user/UserAPI'; +import { UserGroupState } from '@/types/user'; + +import { UserStateOptions } from '../constants/UserStateOptions'; + +import * as styles from './CreateUserPage.styles'; + +const CreateUserPage: FC = () => { + const [username, setUsername] = useState(''); + const [email, setEmail] = useState(''); + const [userState, setUserState] = useState( + '' as UserGroupState, + ); + const toast = useToast(); + const toastError = useToastError(); + const router = useRouter(); + + const handleUserCreation = async () => { + try { + await UserAPI.create({ username, email, state: userState }); + toast.success('Користувач успішно створений!', '', 4000); + router.replace('/admin/users'); + } catch (e) { + if (isAxiosError(e)) { + toastError.displayError(e.response?.data.message); + } + } + }; + + return ( + <> + + + +