From 2052737561dc0c6b5022a04c67cb8e451747c765 Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Sat, 11 Oct 2025 16:21:31 +0400 Subject: [PATCH] feat: total price and products count display for deals --- .../components/shared/DealCard/DealCard.tsx | 14 +++++++++---- .../shared/DealsTable/DealsTable.tsx | 16 ++++++++++---- .../DealsTable/useDealsTableColumns.tsx | 21 +++++++++++++++---- src/app/deals/contexts/ProjectsContext.tsx | 8 +++++-- src/lib/client/types.gen.ts | 8 +++++++ src/lib/client/zod.gen.ts | 2 ++ 6 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/app/deals/components/shared/DealCard/DealCard.tsx b/src/app/deals/components/shared/DealCard/DealCard.tsx index 6566df5..c840a5c 100644 --- a/src/app/deals/components/shared/DealCard/DealCard.tsx +++ b/src/app/deals/components/shared/DealCard/DealCard.tsx @@ -12,7 +12,7 @@ type Props = { const DealCard = ({ deal }: Props) => { const { selectedProject, modulesSet } = useProjectsContext(); - const { dealsCrud } = useDealsContext(); + const { dealsCrud, refetchDeals } = useDealsContext(); const { openDrawer } = useDrawersContext(); const onClick = () => { @@ -24,6 +24,7 @@ const DealCard = ({ deal }: Props) => { onDelete: dealsCrud.onDelete, project: selectedProject, }, + onClose: refetchDeals, }); }; @@ -51,9 +52,14 @@ const DealCard = ({ deal }: Props) => { {modulesSet.has(ModuleNames.CLIENTS) && ( {deal.client?.name} )} - Wb электросталь - 19 000 руб. - 130 тов. + {modulesSet.has(ModuleNames.FULFILLMENT_BASE) && ( + <> + {deal.totalPrice} руб. + + {deal.productsQuantity} тов. + + + )} Срочно diff --git a/src/app/deals/components/shared/DealsTable/DealsTable.tsx b/src/app/deals/components/shared/DealsTable/DealsTable.tsx index 70720e0..4e0fd5c 100644 --- a/src/app/deals/components/shared/DealsTable/DealsTable.tsx +++ b/src/app/deals/components/shared/DealsTable/DealsTable.tsx @@ -11,9 +11,16 @@ import { DealSchema } from "@/lib/client"; const DealsTable: FC = () => { const isMobile = useIsMobile(); - const { selectedProject } = useProjectsContext(); - const { deals, paginationInfo, page, setPage, sortingForm, dealsCrud } = - useDealsContext(); + const { selectedProject, modulesSet } = useProjectsContext(); + const { + deals, + paginationInfo, + page, + setPage, + sortingForm, + dealsCrud, + refetchDeals, + } = useDealsContext(); const { openDrawer } = useDrawersContext(); const onEditClick = useCallback( @@ -26,12 +33,13 @@ const DealsTable: FC = () => { onDelete: dealsCrud.onDelete, project: selectedProject, }, + onClose: refetchDeals, }); }, [openDrawer, dealsCrud] ); - const columns = useDealsTableColumns({ onEditClick }); + const columns = useDealsTableColumns({ onEditClick, modulesSet }); return ( void; + modulesSet: Set; }; -const useDealsTableColumns = ({ onEditClick }: Props) => { +const useDealsTableColumns = ({ onEditClick, modulesSet }: Props) => { const isMobile = useIsMobile(); return useMemo( @@ -35,19 +37,30 @@ const useDealsTableColumns = ({ onEditClick }: Props) => { accessor: "id", title: isMobile ? "№" : "Номер", sortable: true, - width: "20%", }, { accessor: "name", title: "Название", - width: "45%", }, { title: "Дата создания", accessor: "createdAt", render: deal => utcDateTimeToLocalString(deal.createdAt), sortable: true, - width: "35%", + }, + { + title: "Клиент", + accessor: "client.name", + hidden: !modulesSet.has(ModuleNames.CLIENTS), + }, + { + title: "Общая стоимость", + accessor: "totalPrice", + render: deal => + deal.totalPrice + ? `${deal.totalPrice.toLocaleString("ru")}₽` + : "0₽", + hidden: !modulesSet.has(ModuleNames.FULFILLMENT_BASE), }, ] as DataTableColumn[], [onEditClick] diff --git a/src/app/deals/contexts/ProjectsContext.tsx b/src/app/deals/contexts/ProjectsContext.tsx index c3ad53a..c314d12 100644 --- a/src/app/deals/contexts/ProjectsContext.tsx +++ b/src/app/deals/contexts/ProjectsContext.tsx @@ -7,6 +7,7 @@ import useProjectsList from "@/hooks/lists/useProjectsList"; import useIsMobile from "@/hooks/utils/useIsMobile"; import { ProjectSchema } from "@/lib/client"; import makeContext from "@/lib/contextFactory/contextFactory"; +import { ModuleNames } from "@/modules/modules"; type ProjectsContextState = { selectedProject: ProjectSchema | null; @@ -14,7 +15,7 @@ type ProjectsContextState = { refetchProjects: () => void; projects: ProjectSchema[]; projectsCrud: ProjectsCrud; - modulesSet: Set; + modulesSet: Set; }; const useProjectsContextState = (): ProjectsContextState => { @@ -33,7 +34,10 @@ const useProjectsContextState = (): ProjectsContextState => { ); const modulesSet = useMemo( - () => new Set(selectedProject?.builtInModules.map(m => m.key)), + () => + new Set( + selectedProject?.builtInModules.map(m => m.key as ModuleNames) + ), [selectedProject] ); diff --git a/src/lib/client/types.gen.ts b/src/lib/client/types.gen.ts index af06593..27bcd3a 100644 --- a/src/lib/client/types.gen.ts +++ b/src/lib/client/types.gen.ts @@ -855,6 +855,14 @@ export type DealSchema = { * Createdat */ createdAt: string; + /** + * Productsquantity + */ + productsQuantity?: number; + /** + * Totalprice + */ + totalPrice?: number; client?: ClientSchema | null; }; diff --git a/src/lib/client/zod.gen.ts b/src/lib/client/zod.gen.ts index d54ba11..ae32d91 100644 --- a/src/lib/client/zod.gen.ts +++ b/src/lib/client/zod.gen.ts @@ -327,6 +327,8 @@ export const zDealSchema = z.object({ createdAt: z.iso.datetime({ offset: true, }), + productsQuantity: z.optional(z.int()).default(0), + totalPrice: z.optional(z.number()).default(0), client: z.optional(z.union([zClientSchema, z.null()])), });