From 6d6c430e8840945da1245a9dd1d899f46bf6d566 Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Sun, 21 Sep 2025 09:47:55 +0400 Subject: [PATCH] feat: a few tabs for module, deal services tab for mobiles --- .../DealEditorDrawer.module.css | 1 + .../components/DealEditorBody.tsx | 58 ++++++++++++---- .../DealEditorDrawer/components/TabsList.tsx | 30 +++++++++ .../ui/InlineButton/InlineButton.tsx | 24 +++++++ src/lib/client/types.gen.ts | 38 ++++++++--- src/lib/client/zod.gen.ts | 14 +++- src/modals/modals.ts | 14 ++-- src/modules/connectModules.tsx | 13 ---- .../FulfillmentBase.module.css} | 0 .../desktop}/FulfillmentBaseTab.tsx | 4 +- .../components/DealInfoView/DealInfoView.tsx | 8 +-- .../ProductsActions/ProductsActions.tsx | 2 +- .../TotalPriceLabel/TotalPriceLabel.tsx | 4 +- .../DealServicesTable/DealServicesTable.tsx | 16 ++--- .../components/DealServiceRow.tsx | 5 +- .../components/DealServicesTitle.tsx | 0 .../components/ServicesActions.tsx | 4 +- .../FulfillmentBaseTabBody.tsx | 6 +- .../components/LockCheckbox/LockCheckbox.tsx | 0 .../ProductImageDropzone.tsx | 0 .../ProductImageDropzone/useImageDropzone.ts | 0 .../ProductSelect/ProductSelect.tsx | 2 +- .../utils/renderProductOption.tsx | 2 +- .../components/ProductView/ProductView.tsx | 10 +-- .../components/ProductFieldsList.tsx | 0 .../components/ProductServicesTable.tsx | 4 +- .../components/ProductViewActions.tsx | 2 +- .../hooks/useProductServicesTableColumns.tsx | 0 .../ServiceSelect/ServiceSelect.tsx | 4 +- .../mobile/CommonServicesTab.tsx | 18 +++++ .../FulfillmentBase/mobile/ProductsTab.tsx | 17 +++++ .../AddDealServiceButton.tsx | 40 +++++++++++ .../DealServiceTable/DealServicesTable.tsx | 66 +++++++++++++++++++ .../useDealServicesTableColumns.tsx | 57 ++++++++++++++++ .../DealServicesTotalLabel.tsx | 16 +++-- .../contexts/FulfillmentBaseContext.tsx | 27 ++++---- .../hooks/cruds/useDealProductCrud.tsx | 0 .../hooks/cruds/useDealServicesCrud.tsx} | 4 +- .../hooks/cruds/useProductServiceCrud.tsx | 0 .../shared}/hooks/cruds/useProductsCrud.tsx | 0 .../shared}/hooks/cruds/useServicesCrud.tsx | 0 .../hooks/lists/useDealProductsList.ts | 0 .../hooks/lists/useDealServicesList.ts | 0 .../shared}/hooks/lists/useProductsList.ts | 0 .../hooks/lists/useServicesKitsList.ts | 0 .../shared}/hooks/lists/useServicesList.ts | 0 .../utils/useProductAndServiceTabState.tsx | 0 .../DealProductEditorModal.tsx | 3 +- .../DealServiceEditorModal.tsx | 2 +- .../components/ServiceWithPriceInput.tsx | 4 +- .../DuplicateServicesModal.tsx | 0 .../ProductEditorModal/ProductEditorModal.tsx | 2 +- .../ProductServiceEditorModal.tsx | 4 +- .../ServicesKitSelectModal.tsx | 2 +- .../components/ServicesKitSelect.tsx | 2 +- .../FulfillmentBase/shared/modals/index.ts | 6 ++ .../shared}/types/service.ts | 0 src/modules/dealModularEditorTabs/index.ts | 3 + src/modules/modules.tsx | 39 +++++++++-- src/modules/modulesFileGen/modulesFileGen.ts | 22 ++++++- .../templates/modulesFileTemplate.hbs | 32 ++++++--- src/modules/types.tsx | 18 ++++- 62 files changed, 521 insertions(+), 128 deletions(-) create mode 100644 src/app/deals/drawers/DealEditorDrawer/components/TabsList.tsx create mode 100644 src/components/ui/InlineButton/InlineButton.tsx delete mode 100644 src/modules/connectModules.tsx rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab/FulfillmentBaseTab.module.css => FulfillmentBase/FulfillmentBase.module.css} (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/FulfillmentBaseTab.tsx (75%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/DealInfoView/DealInfoView.tsx (68%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/DealInfoView/components/ProductsActions/ProductsActions.tsx (96%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel.tsx (90%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab/components/DealInfoView => FulfillmentBase/desktop}/components/DealServicesTable/DealServicesTable.tsx (69%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab/components/DealInfoView => FulfillmentBase/desktop}/components/DealServicesTable/components/DealServiceRow.tsx (94%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab/components/DealInfoView => FulfillmentBase/desktop}/components/DealServicesTable/components/DealServicesTitle.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab/components/DealInfoView => FulfillmentBase/desktop}/components/DealServicesTable/components/ServicesActions.tsx (95%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody.tsx (78%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/LockCheckbox/LockCheckbox.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductImageDropzone/ProductImageDropzone.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductImageDropzone/useImageDropzone.ts (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductSelect/ProductSelect.tsx (97%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductSelect/utils/renderProductOption.tsx (95%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductView/ProductView.tsx (94%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductView/components/ProductFieldsList.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductView/components/ProductServicesTable.tsx (96%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductView/components/ProductViewActions.tsx (96%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ProductView/hooks/useProductServicesTableColumns.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/desktop}/components/ServiceSelect/ServiceSelect.tsx (94%) create mode 100644 src/modules/dealModularEditorTabs/FulfillmentBase/mobile/CommonServicesTab.tsx create mode 100644 src/modules/dealModularEditorTabs/FulfillmentBase/mobile/ProductsTab.tsx create mode 100644 src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/AddDealServiceButton/AddDealServiceButton.tsx create mode 100644 src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/DealServicesTable.tsx create mode 100644 src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/useDealServicesTableColumns.tsx rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components => FulfillmentBase/shared/components/DealServicesTotalLabel}/DealServicesTotalLabel.tsx (58%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/contexts/FulfillmentBaseContext.tsx (74%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/cruds/useDealProductCrud.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab/hooks/cruds/useDealServiceCrud.tsx => FulfillmentBase/shared/hooks/cruds/useDealServicesCrud.tsx} (97%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/cruds/useProductServiceCrud.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/cruds/useProductsCrud.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/cruds/useServicesCrud.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/lists/useDealProductsList.ts (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/lists/useDealServicesList.ts (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/lists/useProductsList.ts (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/lists/useServicesKitsList.ts (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/lists/useServicesList.ts (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/hooks/utils/useProductAndServiceTabState.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/modals/DealProductEditorModal/DealProductEditorModal.tsx (95%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/modals/DealServiceEditorModal/DealServiceEditorModal.tsx (98%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/modals/DealServiceEditorModal/components/ServiceWithPriceInput.tsx (97%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/modals/DuplicateServicesModal/DuplicateServicesModal.tsx (100%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/modals/ProductEditorModal/ProductEditorModal.tsx (98%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/modals/ProductServiceEditorModal/ProductServiceEditorModal.tsx (96%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/modals/ServicesKitSelectModal/ServicesKitSelectModal.tsx (95%) rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/modals/ServicesKitSelectModal/components/ServicesKitSelect.tsx (92%) create mode 100644 src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/index.ts rename src/modules/dealModularEditorTabs/{FulfillmentBaseTab => FulfillmentBase/shared}/types/service.ts (100%) create mode 100644 src/modules/dealModularEditorTabs/index.ts diff --git a/src/app/deals/drawers/DealEditorDrawer/DealEditorDrawer.module.css b/src/app/deals/drawers/DealEditorDrawer/DealEditorDrawer.module.css index 72169d1..8a696e3 100644 --- a/src/app/deals/drawers/DealEditorDrawer/DealEditorDrawer.module.css +++ b/src/app/deals/drawers/DealEditorDrawer/DealEditorDrawer.module.css @@ -1,6 +1,7 @@ .tab { @media (max-width: 48em) { + width: 100%; border-bottom-width: 3px; } } diff --git a/src/app/deals/drawers/DealEditorDrawer/components/DealEditorBody.tsx b/src/app/deals/drawers/DealEditorDrawer/components/DealEditorBody.tsx index e921e0e..83abc57 100644 --- a/src/app/deals/drawers/DealEditorDrawer/components/DealEditorBody.tsx +++ b/src/app/deals/drawers/DealEditorDrawer/components/DealEditorBody.tsx @@ -2,11 +2,12 @@ import React, { FC, ReactNode } from "react"; import { IconEdit, IconHistory } from "@tabler/icons-react"; import { motion } from "framer-motion"; import { Box, Tabs, Text } from "@mantine/core"; +import TabsList from "@/app/deals/drawers/DealEditorDrawer/components/TabsList"; import DealStatusHistoryTab from "@/app/deals/drawers/DealEditorDrawer/tabs/DealStatusHistoryTab/DealStatusHistoryTab"; import GeneralTab from "@/app/deals/drawers/DealEditorDrawer/tabs/GeneralTab/GeneralTab"; import useIsMobile from "@/hooks/utils/useIsMobile"; import { DealSchema, ProjectSchema } from "@/lib/client"; -import { MODULES } from "@/modules/modules"; +import MODULES from "@/modules/modules"; import styles from "../DealEditorDrawer.module.css"; type Props = { @@ -50,29 +51,58 @@ const DealEditorBody: FC = props => { ); - const getModuleTabs = () => - props.project?.builtInModules.map(module => { - const info = MODULES[module.key].renderInfo; - return getTab(info.key, info.label, info.icon); - }); + const getModuleTabs = (): ReactNode[] => { + if (!props.project) return []; + const tabs: ReactNode[] = []; - const getModuleTabPanels = () => - props.project?.builtInModules.map(module => - getTabPanel(module.key, MODULES[module.key]?.getTab?.(props)) - ); + for (const module of props.project.builtInModules) { + const moduleInfo = MODULES[module.key]; + for (const tab of moduleInfo.tabs) { + if ( + (tab.device === "desktop" && isMobile) || + (tab.device === "mobile" && !isMobile) + ) + continue; + + tabs.push(getTab(tab.key, tab.label, tab.icon)); + } + } + + return tabs; + }; + + const getModuleTabPanels = () => { + if (!props.project) return []; + const tabPanels: ReactNode[] = []; + + for (const module of props.project.builtInModules) { + const moduleInfo = MODULES[module.key]; + for (const tab of moduleInfo.tabs) { + if ( + (tab.device === "desktop" && isMobile) || + (tab.device === "mobile" && !isMobile) + ) + continue; + + tabPanels.push(getTabPanel(tab.key, tab.tab(props))); + } + } + + return tabPanels; + }; return ( - + {getTab("general", "Общая информация", )} {getTab("history", "История", )} {getModuleTabs()} - + {getTabPanel("general", )} {getTabPanel("history", )} diff --git a/src/app/deals/drawers/DealEditorDrawer/components/TabsList.tsx b/src/app/deals/drawers/DealEditorDrawer/components/TabsList.tsx new file mode 100644 index 0000000..80614a7 --- /dev/null +++ b/src/app/deals/drawers/DealEditorDrawer/components/TabsList.tsx @@ -0,0 +1,30 @@ +import { FC, ReactNode } from "react"; +import { ScrollArea, Tabs } from "@mantine/core"; +import useIsMobile from "@/hooks/utils/useIsMobile"; + +type Props = { + children: ReactNode; +}; + +const TabsList: FC = ({ children }) => { + const isMobile = useIsMobile(); + + if (!isMobile) { + return {children}; + } + + return ( + + + {children} + + + ); +}; + +export default TabsList; diff --git a/src/components/ui/InlineButton/InlineButton.tsx b/src/components/ui/InlineButton/InlineButton.tsx new file mode 100644 index 0000000..c6d3932 --- /dev/null +++ b/src/components/ui/InlineButton/InlineButton.tsx @@ -0,0 +1,24 @@ +import { ReactNode } from "react"; +import { Button, ButtonProps, Group } from "@mantine/core"; + +interface Props extends ButtonProps { + children?: ReactNode; + onClick?: () => void; +} + +const InlineButton = ({ children, onClick, ...props }: Props) => { + return ( + + ); +}; + +export default InlineButton; diff --git a/src/lib/client/types.gen.ts b/src/lib/client/types.gen.ts index 267f282..d552490 100644 --- a/src/lib/client/types.gen.ts +++ b/src/lib/client/types.gen.ts @@ -38,10 +38,6 @@ export type BuiltInModuleSchemaInput = { * Label */ label: string; - /** - * Iconname - */ - iconName: string; /** * Description */ @@ -50,6 +46,10 @@ export type BuiltInModuleSchemaInput = { * Dependson */ dependsOn: Array; + /** + * Tabs + */ + tabs: Array; }; /** @@ -68,10 +68,6 @@ export type BuiltInModuleSchemaOutput = { * Label */ label: string; - /** - * Iconname - */ - iconName: string; /** * Description */ @@ -80,6 +76,32 @@ export type BuiltInModuleSchemaOutput = { * Dependson */ dependsOn: Array; + /** + * Tabs + */ + tabs: Array; +}; + +/** + * BuiltInModuleTabSchema + */ +export type BuiltInModuleTabSchema = { + /** + * Id + */ + id: number; + /** + * Label + */ + label: string; + /** + * Iconname + */ + iconName: string; + /** + * Device + */ + device: string; }; /** diff --git a/src/lib/client/zod.gen.ts b/src/lib/client/zod.gen.ts index 9b1c08d..f75c455 100644 --- a/src/lib/client/zod.gen.ts +++ b/src/lib/client/zod.gen.ts @@ -12,6 +12,16 @@ export const zBoardSchema = z.object({ projectId: z.int(), }); +/** + * BuiltInModuleTabSchema + */ +export const zBuiltInModuleTabSchema = z.object({ + id: z.int(), + label: z.string(), + iconName: z.string(), + device: z.string(), +}); + /** * BuiltInModuleSchema */ @@ -19,7 +29,6 @@ export const zBuiltInModuleSchemaInput = z.object({ id: z.int(), key: z.string(), label: z.string(), - iconName: z.string(), description: z.string(), get dependsOn() { return z.array( @@ -28,6 +37,7 @@ export const zBuiltInModuleSchemaInput = z.object({ }) ); }, + tabs: z.array(zBuiltInModuleTabSchema), }); /** @@ -37,7 +47,6 @@ export const zBuiltInModuleSchemaOutput = z.object({ id: z.int(), key: z.string(), label: z.string(), - iconName: z.string(), description: z.string(), get dependsOn() { return z.array( @@ -46,6 +55,7 @@ export const zBuiltInModuleSchemaOutput = z.object({ }) ); }, + tabs: z.array(zBuiltInModuleTabSchema), }); /** diff --git a/src/modals/modals.ts b/src/modals/modals.ts index cb2b591..97ed8f6 100644 --- a/src/modals/modals.ts +++ b/src/modals/modals.ts @@ -2,12 +2,14 @@ import DealsBoardFiltersModal from "@/app/deals/modals/DealsBoardFiltersModal/De import DealsScheduleFiltersModal from "@/app/deals/modals/DealsScheduleFiltersModal/DealsScheduleFiltersModal"; import DealsTableFiltersModal from "@/app/deals/modals/DealsTableFiltersModal/DealsTableFiltersModal"; import EnterNameModal from "@/modals/EnterNameModal/EnterNameModal"; -import DealProductEditorModal from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealProductEditorModal/DealProductEditorModal"; -import DealServiceEditorModal from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealServiceEditorModal/DealServiceEditorModal"; -import DuplicateServicesModal from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DuplicateServicesModal/DuplicateServicesModal"; -import ProductEditorModal from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ProductEditorModal/ProductEditorModal"; -import ProductServiceEditorModal from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ProductServiceEditorModal/ProductServiceEditorModal"; -import ServicesKitSelectModal from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ServicesKitSelectModal/ServicesKitSelectModal"; +import { + DealProductEditorModal, + DealServiceEditorModal, + DuplicateServicesModal, + ProductEditorModal, + ProductServiceEditorModal, + ServicesKitSelectModal, +} from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/modals"; export const modals = { enterNameModal: EnterNameModal, diff --git a/src/modules/connectModules.tsx b/src/modules/connectModules.tsx deleted file mode 100644 index b1376b0..0000000 --- a/src/modules/connectModules.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import FulfillmentBaseTab from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/FulfillmentBaseTab"; -import { ModuleNames } from "./modules"; -import ModulesType from "./types"; - -const connectModules = (modules: ModulesType) => { - modules[ModuleNames.FULFILLMENT_BASE].getTab = props => ( - - ); - - return modules; -}; - -export default connectModules; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/FulfillmentBaseTab.module.css b/src/modules/dealModularEditorTabs/FulfillmentBase/FulfillmentBase.module.css similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/FulfillmentBaseTab.module.css rename to src/modules/dealModularEditorTabs/FulfillmentBase/FulfillmentBase.module.css diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/FulfillmentBaseTab.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/FulfillmentBaseTab.tsx similarity index 75% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/FulfillmentBaseTab.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/FulfillmentBaseTab.tsx index 2a591ec..7f7dc3e 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/FulfillmentBaseTab.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/FulfillmentBaseTab.tsx @@ -1,7 +1,7 @@ import { FC } from "react"; import { DealSchema } from "@/lib/client"; -import FulfillmentBaseTabBody from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody"; -import { FulfillmentBaseContextProvider } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext"; +import { FulfillmentBaseContextProvider } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; +import FulfillmentBaseTabBody from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody"; type Props = { value: DealSchema; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/DealInfoView.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/DealInfoView.tsx similarity index 68% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/DealInfoView.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/DealInfoView.tsx index 6835cfd..dbf859b 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/DealInfoView.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/DealInfoView.tsx @@ -1,8 +1,8 @@ import { Flex, Stack } from "@mantine/core"; -import DealServicesTable from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/DealServicesTable"; -import ProductsActions from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/ProductsActions/ProductsActions"; -import TotalPriceLabel from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel"; -import styles from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/FulfillmentBaseTab.module.css"; +import ProductsActions from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/components/ProductsActions/ProductsActions"; +import TotalPriceLabel from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel"; +import DealServicesTable from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/DealServicesTable"; +import styles from "@/modules/dealModularEditorTabs/FulfillmentBase/FulfillmentBase.module.css"; const DealInfoView = () => ( { const { deal, dealProductsList, productsCrud, dealProductsCrud } = diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel.tsx similarity index 90% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel.tsx index fc9b146..7c50f8e 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/components/TotalPriceLabel/TotalPriceLabel.tsx @@ -1,7 +1,7 @@ import { useMemo } from "react"; import { Flex, Title } from "@mantine/core"; -import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext"; -import styles from "../../../../FulfillmentBaseTab.module.css"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; +import styles from "../../../../../FulfillmentBase.module.css"; const TotalPriceLabel = () => { const { diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/DealServicesTable.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/DealServicesTable.tsx similarity index 69% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/DealServicesTable.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/DealServicesTable.tsx index e9bf8c4..452cb45 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/DealServicesTable.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/DealServicesTable.tsx @@ -1,16 +1,14 @@ import { FC } from "react"; import { Flex, ScrollArea } from "@mantine/core"; -import DealServicesTitle from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServicesTitle"; -import DealServicesTotalLabel from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServicesTotalLabel"; -import ServicesActions from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/ServicesActions"; -import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext"; -import DealServiceRow from "./components/DealServiceRow"; +import DealServiceRow from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/DealServiceRow"; +import DealServicesTitle from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/DealServicesTitle"; +import ServicesActions from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/ServicesActions"; +import DealServicesTotalLabel from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/components/DealServicesTotalLabel/DealServicesTotalLabel"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; const DealServicesTable: FC = () => { const { dealServicesList, dealServicesCrud } = useFulfillmentBaseContext(); - // const isLocked = isDealLocked(deal); // TODO bills - return ( { + offsetScrollbars={"present"}> @@ -34,7 +32,7 @@ const DealServicesTable: FC = () => { ))} - + ); diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServiceRow.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/DealServiceRow.tsx similarity index 94% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServiceRow.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/DealServiceRow.tsx index ed42931..5ae9483 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServiceRow.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/DealServiceRow.tsx @@ -1,11 +1,11 @@ import { FC } from "react"; import { IconTrash } from "@tabler/icons-react"; import { isNumber } from "lodash"; -import { Divider, Group, NumberInput, Stack, Text } from "@mantine/core"; +import { Divider, Group, NumberInput, rem, Stack, Text } from "@mantine/core"; import { useDebouncedCallback } from "@mantine/hooks"; import ActionIconWithTip from "@/components/ui/ActionIconWithTip/ActionIconWithTip"; import { DealServiceSchema } from "@/lib/client"; -import LockCheckbox from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/LockCheckbox/LockCheckbox"; +import LockCheckbox from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/LockCheckbox/LockCheckbox"; type Props = { value: DealServiceSchema; @@ -64,6 +64,7 @@ const DealServiceRow: FC = ({ value, onChange, onDelete }) => { display: "flex", cursor: "pointer", pointerEvents: "auto", + paddingRight: rem(10), }, }} rightSection={ diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServicesTitle.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/DealServicesTitle.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServicesTitle.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/DealServicesTitle.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/ServicesActions.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/ServicesActions.tsx similarity index 95% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/ServicesActions.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/ServicesActions.tsx index 9329ea6..920f756 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/ServicesActions.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealServicesTable/components/ServicesActions.tsx @@ -1,8 +1,8 @@ import { Button, Flex } from "@mantine/core"; import { modals } from "@mantine/modals"; import { addKitToDeal, ServicesKitSchema } from "@/lib/client"; -import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext"; -import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/types/service"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; +import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/types/service"; const ServicesActions = () => { const { dealServicesList, dealServicesCrud, deal } = diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody.tsx similarity index 78% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody.tsx index 9c4c50f..1cb5a20 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/FulfillmentBaseTabBody/FulfillmentBaseTabBody.tsx @@ -1,7 +1,7 @@ import { Flex, ScrollArea, Stack } from "@mantine/core"; -import DealInfoView from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/DealInfoView"; -import ProductView from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/ProductView"; -import { useFulfillmentBaseContext } from "../../contexts/FulfillmentBaseContext"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; +import DealInfoView from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/DealInfoView/DealInfoView"; +import ProductView from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/ProductView"; const FulfillmentBaseTabBody = () => { const { dealProductsList } = useFulfillmentBaseContext(); diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/LockCheckbox/LockCheckbox.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/LockCheckbox/LockCheckbox.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/LockCheckbox/LockCheckbox.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/LockCheckbox/LockCheckbox.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductImageDropzone/ProductImageDropzone.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductImageDropzone/ProductImageDropzone.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductImageDropzone/ProductImageDropzone.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductImageDropzone/ProductImageDropzone.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductImageDropzone/useImageDropzone.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductImageDropzone/useImageDropzone.ts similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductImageDropzone/useImageDropzone.ts rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductImageDropzone/useImageDropzone.ts diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductSelect/ProductSelect.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductSelect/ProductSelect.tsx similarity index 97% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductSelect/ProductSelect.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductSelect/ProductSelect.tsx index 3db82c0..f951d37 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductSelect/ProductSelect.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductSelect/ProductSelect.tsx @@ -6,7 +6,7 @@ import ObjectSelect, { ObjectSelectProps, } from "@/components/selects/ObjectSelect/ObjectSelect"; import { ProductSchema } from "@/lib/client"; -import useProductsList from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useProductsList"; +import useProductsList from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useProductsList"; import renderProductOption from "./utils/renderProductOption"; type RestProps = { diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductSelect/utils/renderProductOption.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductSelect/utils/renderProductOption.tsx similarity index 95% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductSelect/utils/renderProductOption.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductSelect/utils/renderProductOption.tsx index 634dc81..9f51ad5 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductSelect/utils/renderProductOption.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductSelect/utils/renderProductOption.tsx @@ -5,7 +5,7 @@ import { Tooltip, } from "@mantine/core"; import { ProductSchema } from "@/lib/client"; -import ProductFieldsList from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductFieldsList"; +import ProductFieldsList from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductFieldsList"; const renderProductOption = ( products: ProductSchema[] diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/ProductView.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/ProductView.tsx similarity index 94% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/ProductView.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/ProductView.tsx index e463d3c..bd8e746 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/ProductView.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/ProductView.tsx @@ -16,12 +16,12 @@ import { duplicateProductServices, ServicesKitSchema, } from "@/lib/client"; -import ProductFieldsList from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductFieldsList"; -import ProductViewActions from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductViewActions"; -import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext"; -import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/types/service"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; +import ProductFieldsList from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductFieldsList"; +import ProductViewActions from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductViewActions"; +import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/types/service"; import ProductServicesTable from "./components/ProductServicesTable"; -import styles from "../../FulfillmentBaseTab.module.css"; +import styles from "../../../FulfillmentBase.module.css"; type Props = { dealProduct: DealProductSchema; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductFieldsList.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductFieldsList.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductFieldsList.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductFieldsList.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductServicesTable.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductServicesTable.tsx similarity index 96% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductServicesTable.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductServicesTable.tsx index 01531b2..f35a512 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductServicesTable.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductServicesTable.tsx @@ -5,8 +5,8 @@ import { modals } from "@mantine/modals"; import ActionIconWithTip from "@/components/ui/ActionIconWithTip/ActionIconWithTip"; import BaseTable from "@/components/ui/BaseTable/BaseTable"; import { DealProductSchema, ProductServiceSchema } from "@/lib/client"; -import useProductServicesTableColumns from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/hooks/useProductServicesTableColumns"; -import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext"; +import useProductServicesTableColumns from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/hooks/useProductServicesTableColumns"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; type Props = { dealProduct: DealProductSchema; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductViewActions.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductViewActions.tsx similarity index 96% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductViewActions.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductViewActions.tsx index f006a33..a35c97e 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/components/ProductViewActions.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/components/ProductViewActions.tsx @@ -4,7 +4,7 @@ import { Flex } from "@mantine/core"; import { modals } from "@mantine/modals"; import ActionIconWithTip from "@/components/ui/ActionIconWithTip/ActionIconWithTip"; import { DealProductSchema } from "@/lib/client"; -import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; type Props = { dealProduct: DealProductSchema; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/hooks/useProductServicesTableColumns.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/hooks/useProductServicesTableColumns.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductView/hooks/useProductServicesTableColumns.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductView/hooks/useProductServicesTableColumns.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ServiceSelect/ServiceSelect.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ServiceSelect/ServiceSelect.tsx similarity index 94% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ServiceSelect/ServiceSelect.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ServiceSelect/ServiceSelect.tsx index 6acc78e..a50e824 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ServiceSelect/ServiceSelect.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ServiceSelect/ServiceSelect.tsx @@ -9,8 +9,8 @@ import ObjectSelect, { ObjectSelectProps, } from "@/components/selects/ObjectSelect/ObjectSelect"; import { ServiceSchema } from "@/lib/client"; -import useServicesList from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useServicesList"; -import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/types/service"; +import useServicesList from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useServicesList"; +import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/types/service"; type RestProps = { filterType?: ServiceType; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/CommonServicesTab.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/CommonServicesTab.tsx new file mode 100644 index 0000000..3b775e9 --- /dev/null +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/CommonServicesTab.tsx @@ -0,0 +1,18 @@ +import { FC } from "react"; +import { DealSchema } from "@/lib/client"; +import { FulfillmentBaseContextProvider } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; +import DealServicesTable from "@/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/DealServicesTable"; + +type Props = { + value: DealSchema; +}; + +const CommonServicesTab: FC = ({ value }) => { + return ( + + + + ); +}; + +export default CommonServicesTab; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/ProductsTab.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/ProductsTab.tsx new file mode 100644 index 0000000..7098e04 --- /dev/null +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/ProductsTab.tsx @@ -0,0 +1,17 @@ +import { FC } from "react"; +import { DealSchema } from "@/lib/client"; +import { FulfillmentBaseContextProvider } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; + +type Props = { + value: DealSchema; +}; + +const ProductsTab: FC = ({ value }) => { + return ( + + <> + + ); +}; + +export default ProductsTab; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/AddDealServiceButton/AddDealServiceButton.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/AddDealServiceButton/AddDealServiceButton.tsx new file mode 100644 index 0000000..a5e0461 --- /dev/null +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/AddDealServiceButton/AddDealServiceButton.tsx @@ -0,0 +1,40 @@ +import { FC } from "react"; +import { IconPlus } from "@tabler/icons-react"; +import { ButtonProps, Text } from "@mantine/core"; +import { modals } from "@mantine/modals"; +import InlineButton from "@/components/ui/InlineButton/InlineButton"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; + +type Props = ButtonProps; + +const AddDealServiceButton: FC = props => { + const { dealServicesList, dealServicesCrud, deal } = + useFulfillmentBaseContext(); + + const onCreateClick = () => { + const serviceIdsToExclude = dealServicesList.dealServices.map( + service => service.service.id + ); + modals.openContextModal({ + modal: "dealServiceEditorModal", + innerProps: { + onCreate: values => + dealServicesCrud.onCreate({ ...values, dealId: deal.id }), + serviceIdsToExclude, + isEditing: false, + }, + withCloseButton: false, + }); + }; + + return ( + + + Добавить услугу + + ); +}; + +export default AddDealServiceButton; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/DealServicesTable.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/DealServicesTable.tsx new file mode 100644 index 0000000..810ae0f --- /dev/null +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/DealServicesTable.tsx @@ -0,0 +1,66 @@ +import { FC } from "react"; +import { Flex, ScrollArea, Stack } from "@mantine/core"; +import { modals } from "@mantine/modals"; +import BaseTable from "@/components/ui/BaseTable/BaseTable"; +import { DealServiceSchema } from "@/lib/client"; +import AddDealServiceButton from "@/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/AddDealServiceButton/AddDealServiceButton"; +import useDealServicesTableColumns from "@/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/useDealServicesTableColumns"; +import DealServicesTotalLabel from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/components/DealServicesTotalLabel/DealServicesTotalLabel"; +import { useFulfillmentBaseContext } from "../../../shared/contexts/FulfillmentBaseContext"; + +const DealServicesTable: FC = () => { + const { dealServicesList, dealServicesCrud } = useFulfillmentBaseContext(); + + const onChange = (item: DealServiceSchema) => { + const serviceIdsToExclude = dealServicesList.dealServices.map( + dealService => dealService.service.id + ); + + modals.openContextModal({ + modal: "dealServiceEditorModal", + innerProps: { + entity: item, + onChange: values => + dealServicesCrud.onUpdate( + item.dealId, + item.serviceId, + values + ), + serviceIdsToExclude, + isEditing: true, + }, + withCloseButton: false, + }); + }; + + const columns = useDealServicesTableColumns({ + onDelete: dealServicesCrud.onDelete, + onChange, + }); + + return ( + + + + + + + + + + ); +}; +export default DealServicesTable; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/useDealServicesTableColumns.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/useDealServicesTableColumns.tsx new file mode 100644 index 0000000..797885d --- /dev/null +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/mobile/components/DealServiceTable/useDealServicesTableColumns.tsx @@ -0,0 +1,57 @@ +import { useMemo } from "react"; +import { IconEdit, IconTrash } from "@tabler/icons-react"; +import { DataTableColumn } from "mantine-datatable"; +import { ActionIcon, Flex } from "@mantine/core"; +import { DealServiceSchema } from "@/lib/client"; + +type Props = { + onChange: (dealService: DealServiceSchema) => void; + onDelete: (dealService: DealServiceSchema) => void; +}; + +const useDealServicesTableColumns = ({ onChange, onDelete }: Props) => { + return useMemo( + () => + [ + { + accessor: "service.name", + title: "Название", + width: "53%", + }, + { + accessor: "quantity", + title: "Кол-во", + width: "17%", + }, + { + accessor: "price", + title: "Цена", + width: "30%", + }, + { + accessor: "actions", + title: "Действия", + textAlign: "center", + width: "0%", + render: dealService => ( + + onDelete(dealService)}> + + + onChange(dealService)}> + + + + ), + }, + ] as DataTableColumn[], + [onChange, onDelete] + ); +}; + +export default useDealServicesTableColumns; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServicesTotalLabel.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/components/DealServicesTotalLabel/DealServicesTotalLabel.tsx similarity index 58% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServicesTotalLabel.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/components/DealServicesTotalLabel/DealServicesTotalLabel.tsx index cb80b71..23c57ae 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/components/DealInfoView/components/DealServicesTable/components/DealServicesTotalLabel.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/components/DealServicesTotalLabel/DealServicesTotalLabel.tsx @@ -1,8 +1,10 @@ -import { useMemo } from "react"; -import { Title } from "@mantine/core"; -import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext"; +import { FC, useMemo } from "react"; +import { Title, TitleProps } from "@mantine/core"; +import { useFulfillmentBaseContext } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext"; -const DealServicesTotalLabel = () => { +type Props = TitleProps; + +const DealServicesTotalLabel: FC = ({ order = 3, ...props }) => { const { dealServicesList } = useFulfillmentBaseContext(); const total = useMemo( () => @@ -16,9 +18,9 @@ const DealServicesTotalLabel = () => { return ( - Итог: {total.toFixed(2)}₽ + order={order} + {...props}> + Итог: {total.toLocaleString("ru")}₽ ); }; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext.tsx similarity index 74% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext.tsx index 50d1c5a..47cc095 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/contexts/FulfillmentBaseContext.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/contexts/FulfillmentBaseContext.tsx @@ -3,22 +3,25 @@ import { DealSchema } from "@/lib/client"; import { getProductsQueryKey } from "@/lib/client/@tanstack/react-query.gen"; import makeContext from "@/lib/contextFactory/contextFactory"; -import useDealServicesCrud, { - DealServicesCrud, -} from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useDealServiceCrud"; -import useProductServiceCrud, { - DealProductServicesCrud, -} from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useProductServiceCrud"; -import useDealServicesList, { - DealServicesList, -} from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useDealServicesList"; import useDealProductCrud, { DealProductsCrud, -} from "../hooks/cruds/useDealProductCrud"; -import { ProductsCrud, useProductsCrud } from "../hooks/cruds/useProductsCrud"; +} from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useDealProductCrud"; +import useDealServicesCrud, { + DealServicesCrud, +} from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useDealServicesCrud"; +import { + ProductsCrud, + useProductsCrud, +} from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useProductsCrud"; +import useProductServiceCrud, { + DealProductServicesCrud, +} from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useProductServiceCrud"; import useDealProductsList, { DealProductsList, -} from "../hooks/lists/useDealProductsList"; +} from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useDealProductsList"; +import useDealServicesList, { + DealServicesList, +} from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useDealServicesList"; type FulfillmentBaseContextState = { deal: DealSchema; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useDealProductCrud.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useDealProductCrud.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useDealProductCrud.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useDealProductCrud.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useDealServiceCrud.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useDealServicesCrud.tsx similarity index 97% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useDealServiceCrud.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useDealServicesCrud.tsx index a5d198a..67a2ea6 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useDealServiceCrud.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useDealServicesCrud.tsx @@ -29,7 +29,7 @@ export type DealServicesCrud = { onDelete: (data: DealServiceSchema, onSuccess?: () => void) => void; }; -const useDealServiceCrud = ({ dealId }: Props): DealServicesCrud => { +const useDealServicesCrud = ({ dealId }: Props): DealServicesCrud => { const queryKey = getDealServicesQueryKey({ path: { dealId } }); const key = "getDealServices"; const { queryClient, onError, onSettled } = getCommonQueryClient({ @@ -150,4 +150,4 @@ const useDealServiceCrud = ({ dealId }: Props): DealServicesCrud => { }; }; -export default useDealServiceCrud; +export default useDealServicesCrud; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useProductServiceCrud.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useProductServiceCrud.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useProductServiceCrud.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useProductServiceCrud.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useProductsCrud.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useProductsCrud.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useProductsCrud.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useProductsCrud.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useServicesCrud.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useServicesCrud.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/cruds/useServicesCrud.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/cruds/useServicesCrud.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useDealProductsList.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useDealProductsList.ts similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useDealProductsList.ts rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useDealProductsList.ts diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useDealServicesList.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useDealServicesList.ts similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useDealServicesList.ts rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useDealServicesList.ts diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useProductsList.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useProductsList.ts similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useProductsList.ts rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useProductsList.ts diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useServicesKitsList.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useServicesKitsList.ts similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useServicesKitsList.ts rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useServicesKitsList.ts diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useServicesList.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useServicesList.ts similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useServicesList.ts rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useServicesList.ts diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/utils/useProductAndServiceTabState.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/utils/useProductAndServiceTabState.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/utils/useProductAndServiceTabState.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/utils/useProductAndServiceTabState.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealProductEditorModal/DealProductEditorModal.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealProductEditorModal/DealProductEditorModal.tsx similarity index 95% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealProductEditorModal/DealProductEditorModal.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealProductEditorModal/DealProductEditorModal.tsx index 4ea2553..409b0f1 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealProductEditorModal/DealProductEditorModal.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealProductEditorModal/DealProductEditorModal.tsx @@ -11,7 +11,8 @@ import { import BaseFormModal, { CreateEditFormProps, } from "@/modals/base/BaseFormModal/BaseFormModal"; -import ProductSelect from "../../components/ProductSelect/ProductSelect"; +import ProductSelect + from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductSelect/ProductSelect"; type RestProps = { clientId: number; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealServiceEditorModal/DealServiceEditorModal.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealServiceEditorModal/DealServiceEditorModal.tsx similarity index 98% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealServiceEditorModal/DealServiceEditorModal.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealServiceEditorModal/DealServiceEditorModal.tsx index d627f8f..1616d34 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealServiceEditorModal/DealServiceEditorModal.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealServiceEditorModal/DealServiceEditorModal.tsx @@ -11,7 +11,7 @@ import { import BaseFormModal, { CreateEditFormProps, } from "@/modals/base/BaseFormModal/BaseFormModal"; -import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/types/service"; +import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/types/service"; import ServiceWithPriceInput from "./components/ServiceWithPriceInput"; type RestProps = { diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealServiceEditorModal/components/ServiceWithPriceInput.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealServiceEditorModal/components/ServiceWithPriceInput.tsx similarity index 97% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealServiceEditorModal/components/ServiceWithPriceInput.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealServiceEditorModal/components/ServiceWithPriceInput.tsx index 899eaff..070764a 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealServiceEditorModal/components/ServiceWithPriceInput.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealServiceEditorModal/components/ServiceWithPriceInput.tsx @@ -9,8 +9,8 @@ import { } from "@mantine/core"; import { ObjectSelectProps } from "@/components/selects/ObjectSelect/ObjectSelect"; import { ServiceSchema } from "@/lib/client"; -import ServiceSelect from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ServiceSelect/ServiceSelect"; -import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/types/service"; +import ServiceSelect from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ServiceSelect/ServiceSelect"; +import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/types/service"; type ServiceProps = Omit, "data">; type PriceProps = NumberInputProps; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DuplicateServicesModal/DuplicateServicesModal.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DuplicateServicesModal/DuplicateServicesModal.tsx similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DuplicateServicesModal/DuplicateServicesModal.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DuplicateServicesModal/DuplicateServicesModal.tsx diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ProductEditorModal/ProductEditorModal.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ProductEditorModal/ProductEditorModal.tsx similarity index 98% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ProductEditorModal/ProductEditorModal.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ProductEditorModal/ProductEditorModal.tsx index 065ea31..10bf63b 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ProductEditorModal/ProductEditorModal.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ProductEditorModal/ProductEditorModal.tsx @@ -11,7 +11,7 @@ import { import BaseFormModal, { CreateEditFormProps, } from "@/modals/base/BaseFormModal/BaseFormModal"; -import ProductImageDropzone from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/components/ProductImageDropzone/ProductImageDropzone"; +import ProductImageDropzone from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/components/ProductImageDropzone/ProductImageDropzone"; import BaseFormInputProps from "@/utils/baseFormInputProps"; type Props = CreateEditFormProps< diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ProductServiceEditorModal/ProductServiceEditorModal.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ProductServiceEditorModal/ProductServiceEditorModal.tsx similarity index 96% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ProductServiceEditorModal/ProductServiceEditorModal.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ProductServiceEditorModal/ProductServiceEditorModal.tsx index d5e74f0..da23e63 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ProductServiceEditorModal/ProductServiceEditorModal.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ProductServiceEditorModal/ProductServiceEditorModal.tsx @@ -12,8 +12,8 @@ import { import BaseFormModal, { CreateEditFormProps, } from "@/modals/base/BaseFormModal/BaseFormModal"; -import ServiceWithPriceInput from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/DealServiceEditorModal/components/ServiceWithPriceInput"; -import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/types/service"; +import ServiceWithPriceInput from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealServiceEditorModal/components/ServiceWithPriceInput"; +import { ServiceType } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/types/service"; type RestProps = { quantity: number; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ServicesKitSelectModal/ServicesKitSelectModal.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ServicesKitSelectModal/ServicesKitSelectModal.tsx similarity index 95% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ServicesKitSelectModal/ServicesKitSelectModal.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ServicesKitSelectModal/ServicesKitSelectModal.tsx index 2b7eff5..7e404bb 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ServicesKitSelectModal/ServicesKitSelectModal.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ServicesKitSelectModal/ServicesKitSelectModal.tsx @@ -5,7 +5,7 @@ import { useForm } from "@mantine/form"; import { ContextModalProps } from "@mantine/modals"; import { ServicesKitSchema } from "@/lib/client"; import BaseFormModalActions from "@/modals/base/BaseFormModal/BaseFormModalActions"; -import ServicesKitSelect from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ServicesKitSelectModal/components/ServicesKitSelect"; +import ServicesKitSelect from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ServicesKitSelectModal/components/ServicesKitSelect"; type Props = { onSelect: (kit: ServicesKitSchema) => void; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ServicesKitSelectModal/components/ServicesKitSelect.tsx b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ServicesKitSelectModal/components/ServicesKitSelect.tsx similarity index 92% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ServicesKitSelectModal/components/ServicesKitSelect.tsx rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ServicesKitSelectModal/components/ServicesKitSelect.tsx index 48b2cb1..c4a5180 100644 --- a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/modals/ServicesKitSelectModal/components/ServicesKitSelect.tsx +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ServicesKitSelectModal/components/ServicesKitSelect.tsx @@ -3,7 +3,7 @@ import ObjectSelect, { ObjectSelectProps, } from "@/components/selects/ObjectSelect/ObjectSelect"; import { ServicesKitSchema } from "@/lib/client"; -import useServicesKitsList from "@/modules/dealModularEditorTabs/FulfillmentBaseTab/hooks/lists/useServicesKitsList"; +import useServicesKitsList from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/hooks/lists/useServicesKitsList"; type Props = Omit, "data">; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/index.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/index.ts new file mode 100644 index 0000000..623c825 --- /dev/null +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/index.ts @@ -0,0 +1,6 @@ +export { default as ServicesKitSelectModal } from "./ServicesKitSelectModal/ServicesKitSelectModal"; +export { default as ProductEditorModal } from "./ProductEditorModal/ProductEditorModal"; +export { default as DuplicateServicesModal } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DuplicateServicesModal/DuplicateServicesModal"; +export { default as DealServiceEditorModal } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealServiceEditorModal/DealServiceEditorModal"; +export { default as DealProductEditorModal } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/DealProductEditorModal/DealProductEditorModal"; +export { default as ProductServiceEditorModal } from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/modals/ProductServiceEditorModal/ProductServiceEditorModal"; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBaseTab/types/service.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/types/service.ts similarity index 100% rename from src/modules/dealModularEditorTabs/FulfillmentBaseTab/types/service.ts rename to src/modules/dealModularEditorTabs/FulfillmentBase/shared/types/service.ts diff --git a/src/modules/dealModularEditorTabs/index.ts b/src/modules/dealModularEditorTabs/index.ts new file mode 100644 index 0000000..306aec4 --- /dev/null +++ b/src/modules/dealModularEditorTabs/index.ts @@ -0,0 +1,3 @@ +export { default as CommonServicesTab } from "@/modules/dealModularEditorTabs/FulfillmentBase/mobile/CommonServicesTab"; +export { default as FulfillmentBaseTab } from "@/modules/dealModularEditorTabs/FulfillmentBase/desktop/FulfillmentBaseTab"; +export { default as ProductsTab } from "@/modules/dealModularEditorTabs/FulfillmentBase/mobile/ProductsTab"; diff --git a/src/modules/modules.tsx b/src/modules/modules.tsx index b432730..7c31ee4 100644 --- a/src/modules/modules.tsx +++ b/src/modules/modules.tsx @@ -1,21 +1,48 @@ import { + IconColumns, IconBox, } from "@tabler/icons-react"; +import { + CommonServicesTab, + ProductsTab, + FulfillmentBaseTab, +} from "./dealModularEditorTabs"; import ModulesType from "./types"; -import connectModules from "./connectModules"; export enum ModuleNames { FULFILLMENT_BASE = "fulfillment_base", } -const modules: ModulesType = { +const MODULES: ModulesType = { [ModuleNames.FULFILLMENT_BASE]: { - renderInfo: { - label: "Фулфиллмент", + info: { key: "fulfillment_base", - icon: , + label: "Фулфиллмент", }, + tabs: [ + { + label: "Услуги", + key: "common_services", + icon: , + device: "mobile", + tab: (props: any) => , + }, + { + label: "Товары", + key: "products", + icon: , + device: "mobile", + tab: (props: any) => , + }, + { + label: "Фулфиллмент", + key: "fulfillment_base", + icon: , + device: "desktop", + tab: (props: any) => , + }, + ] }, }; -export const MODULES = connectModules(modules); +export default MODULES; diff --git a/src/modules/modulesFileGen/modulesFileGen.ts b/src/modules/modulesFileGen/modulesFileGen.ts index 627df20..ce0e7d8 100644 --- a/src/modules/modulesFileGen/modulesFileGen.ts +++ b/src/modules/modulesFileGen/modulesFileGen.ts @@ -4,12 +4,19 @@ import axios, { AxiosResponse } from "axios"; import * as handlebars from "handlebars"; // region types -type Module = { +type ModuleTab = { id: number; key: string; label: string; iconName: string; + moduleId: number; +}; + +type Module = { + id: number; + label: string; description: string; + tabs: ModuleTab[]; }; type ModulesResponse = { @@ -59,10 +66,23 @@ handlebars.registerHelper("uppercase", text => { return text.replace(/([a-z])([A-Z])/g, "$1_$2").toUpperCase(); }); +function pascalcase(s: string): string { + return s.replace(/(?:^|_+)([a-zA-Z0-9])/g, (_, c) => c.toUpperCase()); +} + +handlebars.registerHelper("pascalcase", pascalcase); + const generateRows = (modules: Module[]) => { try { + const iconsToImport = new Set(); + for (const module of modules) { + for (const tab of module.tabs) { + iconsToImport.add(tab.iconName); + } + } const data = { modules, + iconsToImport: Array.from(iconsToImport), }; const tsxContent = template(data); fs.writeFileSync(OUTPUT_PATH, tsxContent); diff --git a/src/modules/modulesFileGen/templates/modulesFileTemplate.hbs b/src/modules/modulesFileGen/templates/modulesFileTemplate.hbs index 05a61bb..e681249 100644 --- a/src/modules/modulesFileGen/templates/modulesFileTemplate.hbs +++ b/src/modules/modulesFileGen/templates/modulesFileTemplate.hbs @@ -1,10 +1,16 @@ import { -{{#each modules}} - {{#if this.iconName}}{{this.iconName}},{{/if}} +{{#each iconsToImport}} + {{this}}, {{/each}} } from "@tabler/icons-react"; +import { +{{#each modules}} + {{#each this.tabs}} + {{pascalcase this.key}}Tab, + {{/each}} +{{/each}} +} from "./dealModularEditorTabs"; import ModulesType from "./types"; -import connectModules from "./connectModules"; export enum ModuleNames { {{#each modules}} @@ -12,16 +18,26 @@ export enum ModuleNames { {{/each}} } -const modules: ModulesType = { +const MODULES: ModulesType = { {{#each modules}} [ModuleNames.{{uppercase this.key}}]: { - renderInfo: { - label: "{{this.label}}", + info: { key: "{{this.key}}", - icon: {{#if this.iconName}}<{{this.iconName}} />{{else}}None{{/if}}, + label: "{{this.label}}", }, + tabs: [ + {{#each this.tabs}} + { + label: "{{this.label}}", + key: "{{this.key}}", + icon: {{#if this.iconName}}<{{this.iconName}} />{{else}}None{{/if}}, + device: "{{this.device}}", + tab: (props: any) => <{{pascalcase this.key}}Tab {...props} key={"{{this.key}}"} />, + }, + {{/each}} + ] }, {{/each}} }; -export const MODULES = connectModules(modules); +export default MODULES; diff --git a/src/modules/types.tsx b/src/modules/types.tsx index e6f392e..3709c1f 100644 --- a/src/modules/types.tsx +++ b/src/modules/types.tsx @@ -1,12 +1,24 @@ import { ReactNode } from "react"; +type GetTab = (props: any) => ReactNode[] | ReactNode; + +export type ModuleTab = { + label: string; + key: string; + icon: ReactNode; + device: "mobile" | "desktop" | "both"; + tab: (props: any) => ReactNode; +}; + export type Module = { - renderInfo: { + info: { label: string; key: string; - icon: ReactNode; }; - getTab?: (props: any) => ReactNode; + tabs: ModuleTab[]; + getTabs?: GetTab; + getMobileTabs?: GetTab; + getDesktopTabs?: GetTab; }; type ModulesType = {