From 0fcf0868618987b27e565afd6573dd6a9b56b27a Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Sun, 5 Oct 2025 12:05:23 +0400 Subject: [PATCH] feat: client tab in deal editor --- package.json | 1 + src/app/clients/hooks/useClientsCrud.tsx | 6 +- src/app/clients/hooks/useClientsList.tsx | 12 +- .../components/CreateCardForm.tsx | 31 ++++- .../components/shared/DealCard/DealCard.tsx | 6 +- src/app/deals/contexts/ProjectsContext.tsx | 16 ++- .../tabs/GeneralTab/GeneralTab.tsx | 17 +-- src/components/ui/FormFlexRow/FormFlexRow.tsx | 13 ++ src/hooks/cruds/useDealsCrud.tsx | 3 +- src/lib/client/sdk.gen.ts | 3 +- src/lib/client/types.gen.ts | 26 +++- src/lib/client/zod.gen.ts | 10 +- .../Clients/shared/ClientsTab.tsx | 29 +++++ .../shared/components/ClientDataForm.tsx | 119 ++++++++++++++++++ .../shared/components/ClientSelect.tsx | 68 ++++++++++ .../shared/components/ClientSelectForm.tsx | 44 +++++++ .../shared/contexts/ClientTabContext.tsx | 92 ++++++++++++++ src/modules/dealModularEditorTabs/index.ts | 1 + src/modules/modules.tsx | 36 ++++-- src/theme.ts | 5 + yarn.lock | 8 ++ 21 files changed, 511 insertions(+), 35 deletions(-) create mode 100644 src/components/ui/FormFlexRow/FormFlexRow.tsx create mode 100644 src/modules/dealModularEditorTabs/Clients/shared/ClientsTab.tsx create mode 100644 src/modules/dealModularEditorTabs/Clients/shared/components/ClientDataForm.tsx create mode 100644 src/modules/dealModularEditorTabs/Clients/shared/components/ClientSelect.tsx create mode 100644 src/modules/dealModularEditorTabs/Clients/shared/components/ClientSelectForm.tsx create mode 100644 src/modules/dealModularEditorTabs/Clients/shared/contexts/ClientTabContext.tsx diff --git a/package.json b/package.json index 1be0c1e..0ccee7e 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "libphonenumber-js": "^1.12.10", "mantine-datatable": "^8.2.0", "next": "15.4.7", + "phone": "^3.1.67", "react": "19.1.0", "react-dom": "19.1.0", "react-imask": "^7.6.1", diff --git a/src/app/clients/hooks/useClientsCrud.tsx b/src/app/clients/hooks/useClientsCrud.tsx index ca13248..4467e24 100644 --- a/src/app/clients/hooks/useClientsCrud.tsx +++ b/src/app/clients/hooks/useClientsCrud.tsx @@ -16,7 +16,11 @@ type UseClientsProps = { export type ClientsCrud = { onCreate: (client: CreateClientSchema) => void; - onUpdate: (clientId: number, client: UpdateClientSchema) => void; + onUpdate: ( + clientId: number, + client: UpdateClientSchema, + onSuccess?: () => void + ) => void; onDelete: (client: ClientSchema) => void; }; diff --git a/src/app/clients/hooks/useClientsList.tsx b/src/app/clients/hooks/useClientsList.tsx index 5305ddf..99f0633 100644 --- a/src/app/clients/hooks/useClientsList.tsx +++ b/src/app/clients/hooks/useClientsList.tsx @@ -5,8 +5,16 @@ import { getClientsQueryKey, } from "@/lib/client/@tanstack/react-query.gen"; -const useClientsList = () => { - const { data, refetch } = useQuery(getClientsOptions()); +type Props = { + includeDeleted?: boolean; +}; + +const useClientsList = ( + { includeDeleted = false }: Props = { includeDeleted: false } +) => { + const { data, refetch } = useQuery( + getClientsOptions({ query: { includeDeleted } }) + ); const clients = useMemo(() => data?.items ?? [], [data]); const queryKey = getClientsQueryKey(); diff --git a/src/app/deals/components/shared/CreateDealButton/components/CreateCardForm.tsx b/src/app/deals/components/shared/CreateDealButton/components/CreateCardForm.tsx index 89b75c7..2f22a06 100644 --- a/src/app/deals/components/shared/CreateDealButton/components/CreateCardForm.tsx +++ b/src/app/deals/components/shared/CreateDealButton/components/CreateCardForm.tsx @@ -2,9 +2,15 @@ import { FC } from "react"; import { IconCheck, IconX } from "@tabler/icons-react"; import { Button, Group, Stack, TextInput } from "@mantine/core"; import { useForm } from "@mantine/form"; +import { useProjectsContext } from "@/app/deals/contexts/ProjectsContext"; +import { ClientSchema } from "@/lib/client"; +import ClientSelect from "@/modules/dealModularEditorTabs/Clients/shared/components/ClientSelect"; +import { ModuleNames } from "@/modules/modules"; export type CreateDealForm = { name: string; + client?: ClientSchema; + clientId?: number; }; type Props = { @@ -13,25 +19,42 @@ type Props = { }; const CreateCardForm: FC = ({ onSubmit, onCancel }) => { + const { modulesSet } = useProjectsContext(); + const form = useForm({ initialValues: { name: "", }, validate: { name: value => !value && "Введите название", + client: client => + modulesSet.has(ModuleNames.CLIENTS) && + !client && + "Выберите клиента", }, }); return ( -
{ - onSubmit(values); - form.reset(); - })}> + { + onSubmit(values); + form.reset(); + })}> + {modulesSet.has(ModuleNames.CLIENTS) && ( + { + form.setFieldValue("client", client); + form.setFieldValue("clientId", client?.id); + }} + /> + )}