From 4ad843e465a14ca5bfb591eeaac0aa5400d21c8a Mon Sep 17 00:00:00 2001 From: fakz9 Date: Mon, 5 Aug 2024 01:47:11 +0300 Subject: [PATCH] feat: create user --- src/client/index.ts | 3 ++ src/client/models/CreateUserRequest.ts | 9 ++++++ src/client/models/CreateUserResponse.ts | 9 ++++++ src/client/models/UserCreate.ts | 19 ++++++++++++ src/client/models/UserSchema.ts | 2 +- src/client/models/UserUpdate.ts | 2 +- src/client/services/UserService.ts | 22 ++++++++++++++ .../components/UsersTable/UsersTable.tsx | 30 +++++++++++++++---- .../modals/UserFormModal/UserFormModal.tsx | 23 +++++++++----- src/pages/AdminPage/tabs/Users/UsersTab.tsx | 15 ++++++++++ 10 files changed, 119 insertions(+), 15 deletions(-) create mode 100644 src/client/models/CreateUserRequest.ts create mode 100644 src/client/models/CreateUserResponse.ts create mode 100644 src/client/models/UserCreate.ts diff --git a/src/client/index.ts b/src/client/index.ts index 0f0e4fc..7a82aec 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -43,6 +43,8 @@ export type { CreatePayRateRequest } from './models/CreatePayRateRequest'; export type { CreatePayRateResponse } from './models/CreatePayRateResponse'; export type { CreatePositionRequest } from './models/CreatePositionRequest'; export type { CreatePositionResponse } from './models/CreatePositionResponse'; +export type { CreateUserRequest } from './models/CreateUserRequest'; +export type { CreateUserResponse } from './models/CreateUserResponse'; export type { DealAddProductRequest } from './models/DealAddProductRequest'; export type { DealAddProductResponse } from './models/DealAddProductResponse'; export type { DealAddServiceRequest } from './models/DealAddServiceRequest'; @@ -156,6 +158,7 @@ export type { UpdateTimeTrackingRecordRequest } from './models/UpdateTimeTrackin export type { UpdateTimeTrackingRecordResponse } from './models/UpdateTimeTrackingRecordResponse'; export type { UpdateUserRequest } from './models/UpdateUserRequest'; export type { UpdateUserResponse } from './models/UpdateUserResponse'; +export type { UserCreate } from './models/UserCreate'; export type { UserSchema } from './models/UserSchema'; export type { UserUpdate } from './models/UserUpdate'; export type { ValidationError } from './models/ValidationError'; diff --git a/src/client/models/CreateUserRequest.ts b/src/client/models/CreateUserRequest.ts new file mode 100644 index 0000000..8ca1493 --- /dev/null +++ b/src/client/models/CreateUserRequest.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { UserCreate } from './UserCreate'; +export type CreateUserRequest = { + data: UserCreate; +}; + diff --git a/src/client/models/CreateUserResponse.ts b/src/client/models/CreateUserResponse.ts new file mode 100644 index 0000000..e95c871 --- /dev/null +++ b/src/client/models/CreateUserResponse.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type CreateUserResponse = { + ok: boolean; + message: string; +}; + diff --git a/src/client/models/UserCreate.ts b/src/client/models/UserCreate.ts new file mode 100644 index 0000000..9d833a3 --- /dev/null +++ b/src/client/models/UserCreate.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { PayRateSchema } from './PayRateSchema'; +export type UserCreate = { + telegramId: number; + phoneNumber?: (string | null); + firstName: string; + secondName: string; + comment: string; + isAdmin: boolean; + isBlocked: boolean; + isDeleted: boolean; + roleKey: string; + payRate?: (PayRateSchema | null); + positionKey?: (string | null); +}; + diff --git a/src/client/models/UserSchema.ts b/src/client/models/UserSchema.ts index 2a3195c..7a5c1cc 100644 --- a/src/client/models/UserSchema.ts +++ b/src/client/models/UserSchema.ts @@ -6,7 +6,6 @@ import type { PayRateSchema } from './PayRateSchema'; import type { PositionSchema } from './PositionSchema'; import type { RoleSchema } from './RoleSchema'; export type UserSchema = { - id: number; telegramId: number; phoneNumber?: (string | null); firstName: string; @@ -17,6 +16,7 @@ export type UserSchema = { isDeleted: boolean; roleKey: string; payRate?: (PayRateSchema | null); + id: number; role: RoleSchema; position?: (PositionSchema | null); }; diff --git a/src/client/models/UserUpdate.ts b/src/client/models/UserUpdate.ts index 350f6bd..9008db0 100644 --- a/src/client/models/UserUpdate.ts +++ b/src/client/models/UserUpdate.ts @@ -4,7 +4,6 @@ /* eslint-disable */ import type { PayRateSchema } from './PayRateSchema'; export type UserUpdate = { - id: number; telegramId: number; phoneNumber?: (string | null); firstName: string; @@ -15,6 +14,7 @@ export type UserUpdate = { isDeleted: boolean; roleKey: string; payRate?: (PayRateSchema | null); + id: number; positionKey?: (string | null); }; diff --git a/src/client/services/UserService.ts b/src/client/services/UserService.ts index 2fa055f..b1037fa 100644 --- a/src/client/services/UserService.ts +++ b/src/client/services/UserService.ts @@ -2,6 +2,8 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { CreateUserRequest } from '../models/CreateUserRequest'; +import type { CreateUserResponse } from '../models/CreateUserResponse'; import type { GetAllUsersResponse } from '../models/GetAllUsersResponse'; import type { UpdateUserRequest } from '../models/UpdateUserRequest'; import type { UpdateUserResponse } from '../models/UpdateUserResponse'; @@ -40,4 +42,24 @@ export class UserService { }, }); } + /** + * Create + * @returns CreateUserResponse Successful Response + * @throws ApiError + */ + public static createUser({ + requestBody, + }: { + requestBody: CreateUserRequest, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/user/create', + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } } diff --git a/src/pages/AdminPage/components/UsersTable/UsersTable.tsx b/src/pages/AdminPage/components/UsersTable/UsersTable.tsx index 0aa0faf..4e01257 100644 --- a/src/pages/AdminPage/components/UsersTable/UsersTable.tsx +++ b/src/pages/AdminPage/components/UsersTable/UsersTable.tsx @@ -2,7 +2,7 @@ import {CRUDTableProps} from "../../../../types/CRUDTable.tsx"; import {UserSchema} from "../../../../client"; import {BaseTable} from "../../../../components/BaseTable/BaseTable.tsx"; import {FC} from "react"; -import {ActionIcon, Flex, Text, Tooltip} from "@mantine/core"; +import {ActionIcon, Button, Flex, rem, Text, Tooltip} from "@mantine/core"; import {useUsersTableColumns} from "./columns.tsx"; import {IconEdit, IconTrash} from "@tabler/icons-react"; import {modals} from "@mantine/modals"; @@ -10,7 +10,7 @@ import {MRT_TableOptions} from "mantine-react-table"; type Props = CRUDTableProps; -const UsersTable: FC = ({items, onChange, onDelete}) => { +const UsersTable: FC = ({items, onChange, onDelete, onCreate}) => { const columns = useUsersTableColumns(); const onEditClick = (user: UserSchema) => { if (!onChange) return; @@ -40,19 +40,39 @@ const UsersTable: FC = ({items, onChange, onDelete}) => { onConfirm: () => onDelete(user) }); } - + const onCreateClick = () => { + if (!onCreate) return; + modals.openContextModal({ + modal: "userFormModal", + title: 'Редактирование пользователя', + withCloseButton: false, + innerProps: { + onCreate: onCreate + }, + size: "md" + }) + } return ( + + + ), enableRowActions: true, renderRowActions: ({row}) => ( - { onEditClick(row.original) diff --git a/src/pages/AdminPage/modals/UserFormModal/UserFormModal.tsx b/src/pages/AdminPage/modals/UserFormModal/UserFormModal.tsx index 72444d6..8a76176 100644 --- a/src/pages/AdminPage/modals/UserFormModal/UserFormModal.tsx +++ b/src/pages/AdminPage/modals/UserFormModal/UserFormModal.tsx @@ -1,5 +1,5 @@ import {ContextModalProps} from "@mantine/modals"; -import BaseFormModal, {EditProps} from "../../../ClientsPage/modals/BaseFormModal/BaseFormModal.tsx"; +import BaseFormModal, {CreateEditFormProps} from "../../../ClientsPage/modals/BaseFormModal/BaseFormModal.tsx"; import {UserSchema} from "../../../../client"; import {useForm} from "@mantine/form"; import {Checkbox, Fieldset, Input, Stack, Textarea, TextInput} from "@mantine/core"; @@ -11,16 +11,23 @@ import {IMaskInput} from "react-imask"; import phone from "phone"; import PayRateSelect from "../../../../components/Selects/PayRateSelect/PayRateSelect.tsx"; -type Props = EditProps; +type Props = CreateEditFormProps; const UserFormModal = ({context, id, innerProps}: ContextModalProps) => { - const initialValues = innerProps.element; + const isEditing = 'element' in innerProps; + const initialValues = isEditing ? innerProps.element : { + isAdmin: false, + isBlocked: false, + isDeleted: false, + comment: "", + roleKey: UserRoleEnum.USER + }; - const form = useForm({ + const form = useForm>({ initialValues: initialValues, validate: { - firstName: value => !value.trim() && "Укажите имя пользователя", - secondName: value => !value.trim() && "Укажите фамилию", - position: (value, values) => ((values.role.key === UserRoleEnum.EMPLOYEE) && (!value)) && 'Необходимо указать должность сотрудника', + firstName: value => !value?.trim() && "Укажите имя пользователя", + secondName: value => !value?.trim() && "Укажите фамилию", + position: (value, values) => ((values.role?.key === UserRoleEnum.EMPLOYEE) && (!value)) && 'Необходимо указать должность сотрудника', phoneNumber: value => !phone(value || '', { country: "", strictDetection: false, @@ -71,7 +78,7 @@ const UserFormModal = ({context, id, innerProps}: ContextModalProps) => { placeholder={"Выберите роль пользователя"} {...form.getInputProps('role')} /> - {form.values.role.key === UserRoleEnum.EMPLOYEE && + {form.values.role?.key === UserRoleEnum.EMPLOYEE && <> { const onDelete = async (user: UserSchema) => { onChange({...user, isDeleted: true}); } + const onCreate = (user: UserSchema) => { + UserService.createUser({ + requestBody: { + data: { + ...user, + telegramId: -1 + } + } + }).then(async ({ok, message}) => { + notifications.guess(ok, {message}); + if (!ok) return; + await refetch(); + }) + } return ( ) }