From aa6f0364b54e459a1e4d7ab5382a30959383ea9e Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Fri, 18 Oct 2024 12:28:22 +0400 Subject: [PATCH] fix: scrolls and context for deal prefilling --- .../Dnd/CreateDealButton/CreateDealButton.tsx | 5 +- .../Dnd/CreateDealForm/CreateDealFrom.tsx | 7 +- .../LeadsPage/contexts/DealPageContext.tsx | 38 +--- .../LeadsPage/contexts/PrefillDealContext.tsx | 71 +++++++ .../DealPrefillDrawer/DealPrefillDrawer.tsx | 4 +- .../components/Preview/Preview.module.css | 2 +- .../components/Preview/Preview.tsx | 42 ++-- .../DealServicesTable/DealServicesTable.tsx | 1 - .../tables/DealsTable/DealsTable.tsx | 7 +- .../components/tables/DealsTable/columns.tsx | 4 +- src/pages/LeadsPage/ui/LeadsPage.tsx | 187 +++++++++--------- 11 files changed, 207 insertions(+), 161 deletions(-) create mode 100644 src/pages/LeadsPage/contexts/PrefillDealContext.tsx diff --git a/src/components/Dnd/CreateDealButton/CreateDealButton.tsx b/src/components/Dnd/CreateDealButton/CreateDealButton.tsx index c6ba190..73f2795 100644 --- a/src/components/Dnd/CreateDealButton/CreateDealButton.tsx +++ b/src/components/Dnd/CreateDealButton/CreateDealButton.tsx @@ -6,7 +6,7 @@ import CreateDealFrom from "../CreateDealForm/CreateDealFrom.tsx"; import { DealService } from "../../../client"; import { useQueryClient } from "@tanstack/react-query"; import { dateWithoutTimezone } from "../../../shared/lib/date.ts"; -import { useDealPageContext } from "../../../pages/LeadsPage/contexts/DealPageContext.tsx"; +import { usePrefillDealContext } from "../../../pages/LeadsPage/contexts/PrefillDealContext.tsx"; type Props = { onClick: () => void; @@ -15,7 +15,7 @@ const CreateDealButton: FC = () => { const [isCreating, setIsCreating] = useState(false); const [isTransitionEnded, setIsTransitionEnded] = useState(true); const queryClient = useQueryClient(); - const { prefillDeal, setPrefillDeal } = useDealPageContext(); + const { prefillDeal, setPrefillDeal } = usePrefillDealContext(); return (
= () => { queryKey: ["getDealSummaries"], }); setIsCreating(false); + setPrefillDeal(undefined); }); }} /> diff --git a/src/components/Dnd/CreateDealForm/CreateDealFrom.tsx b/src/components/Dnd/CreateDealForm/CreateDealFrom.tsx index a5f5082..6dad008 100644 --- a/src/components/Dnd/CreateDealForm/CreateDealFrom.tsx +++ b/src/components/Dnd/CreateDealForm/CreateDealFrom.tsx @@ -5,17 +5,18 @@ import { useForm } from "@mantine/form"; import styles from "./CreateDealForm.module.css"; import ClientAutocomplete from "../../Selects/ClientAutocomplete/ClientAutocomplete.tsx"; import { DateTimePicker } from "@mantine/dates"; -import ShippingWarehouseAutocomplete from "../../Selects/ShippingWarehouseAutocomplete/ShippingWarehouseAutocomplete.tsx"; +import ShippingWarehouseAutocomplete + from "../../Selects/ShippingWarehouseAutocomplete/ShippingWarehouseAutocomplete.tsx"; import BaseMarketplaceSelect from "../../Selects/BaseMarketplaceSelect/BaseMarketplaceSelect.tsx"; import ServicePriceCategorySelect from "../../Selects/ServicePriceCategorySelect/ServicePriceCategorySelect.tsx"; -import { useDealPageContext } from "../../../pages/LeadsPage/contexts/DealPageContext.tsx"; +import { usePrefillDealContext } from "../../../pages/LeadsPage/contexts/PrefillDealContext.tsx"; type Props = { onSubmit: (quickDeal: QuickDeal) => void; onCancel: () => void; }; const CreateDealFrom: FC = ({ onSubmit, onCancel }) => { - const { prefillOnOpen, prefillDeal } = useDealPageContext(); + const { prefillOnOpen, prefillDeal } = usePrefillDealContext(); const form = useForm({ initialValues: { name: "", diff --git a/src/pages/LeadsPage/contexts/DealPageContext.tsx b/src/pages/LeadsPage/contexts/DealPageContext.tsx index 0abb2c8..c9789a7 100644 --- a/src/pages/LeadsPage/contexts/DealPageContext.tsx +++ b/src/pages/LeadsPage/contexts/DealPageContext.tsx @@ -1,19 +1,9 @@ -import { createContext, Dispatch, FC, SetStateAction, useContext, useState } from "react"; -import { DealSchema, DealService } from "../../../client"; -import { useDisclosure } from "@mantine/hooks"; +import { createContext, FC, useContext, useState } from "react"; +import { DealSchema } from "../../../client"; type DealPageContextState = { selectedDeal?: DealSchema; setSelectedDeal: (deal: DealSchema | undefined) => void; - - prefillOpened: boolean; - prefillOnClose: () => void; - prefillOnOpen: () => void; - - selectedPrefillDeal?: DealSchema; - selectPrefillDeal: (dealId: number) => void; - prefillDeal?: DealSchema; - setPrefillDeal: Dispatch>; }; const DealPageContext = createContext( @@ -23,34 +13,10 @@ const useDealPageContextState = () => { const [selectedDeal, setSelectedDeal] = useState( undefined ); - const [selectedPrefillDeal, setSelectedPrefillDeal] = useState( - undefined, - ); - const [prefillDeal, setPrefillDeal] = useState( - undefined, - ); - const [prefillOpened, { open, close }] = useDisclosure(false); - const prefillOnClose = close; - const prefillOnOpen = open; - - const selectPrefillDeal = (dealId: number) => { - DealService.getDealById({ dealId }).then(deal => { - setSelectedPrefillDeal(deal); - }); - } return { selectedDeal, setSelectedDeal, - - prefillOpened, - prefillOnClose, - prefillOnOpen, - - selectedPrefillDeal, - selectPrefillDeal, - prefillDeal, - setPrefillDeal, }; }; diff --git a/src/pages/LeadsPage/contexts/PrefillDealContext.tsx b/src/pages/LeadsPage/contexts/PrefillDealContext.tsx new file mode 100644 index 0000000..d930363 --- /dev/null +++ b/src/pages/LeadsPage/contexts/PrefillDealContext.tsx @@ -0,0 +1,71 @@ +import { createContext, Dispatch, FC, SetStateAction, useContext, useState } from "react"; +import { DealSchema, DealService } from "../../../client"; +import { useDisclosure } from "@mantine/hooks"; + +type PrefillDealContextState = { + prefillOpened: boolean; + prefillOnClose: () => void; + prefillOnOpen: () => void; + + selectedPrefillDeal?: DealSchema; + selectPrefillDeal: (dealId: number) => void; + prefillDeal?: DealSchema; + setPrefillDeal: Dispatch>; +}; + +const PrefillDealContext = createContext( + undefined +); +const usePrefillDealContextState = () => { + const [selectedPrefillDeal, setSelectedPrefillDeal] = useState( + undefined, + ); + const [prefillDeal, setPrefillDeal] = useState( + undefined, + ); + const [prefillOpened, { open, close }] = useDisclosure(false); + const prefillOnClose = close; + const prefillOnOpen = open; + + const selectPrefillDeal = (dealId: number) => { + DealService.getDealById({ dealId }).then(deal => { + setSelectedPrefillDeal(deal); + }); + } + + return { + prefillOpened, + prefillOnClose, + prefillOnOpen, + + selectedPrefillDeal, + selectPrefillDeal, + prefillDeal, + setPrefillDeal, + }; +}; + +type PrefillDealContextProviderProps = { + children: React.ReactNode; +}; + +export const PrefillDealContextProvider: FC = ({ + children, + }) => { + const state = usePrefillDealContextState(); + return ( + + {children} + + ); +}; + +export const usePrefillDealContext = () => { + const context = useContext(PrefillDealContext); + if (!context) { + throw new Error( + "usePrefillDealContext must be used within a PrefillDealContextProvider" + ); + } + return context; +}; diff --git a/src/pages/LeadsPage/drawers/DealPrefillDrawer/DealPrefillDrawer.tsx b/src/pages/LeadsPage/drawers/DealPrefillDrawer/DealPrefillDrawer.tsx index 819c78b..47a57f6 100644 --- a/src/pages/LeadsPage/drawers/DealPrefillDrawer/DealPrefillDrawer.tsx +++ b/src/pages/LeadsPage/drawers/DealPrefillDrawer/DealPrefillDrawer.tsx @@ -1,15 +1,15 @@ import { FC, useEffect } from "react"; import { Button, Drawer, Flex, rem, TextInput } from "@mantine/core"; -import { useDealPageContext } from "../../contexts/DealPageContext.tsx"; import DealsTable from "./components/tables/DealsTable/DealsTable.tsx"; import Preview from "./components/Preview/Preview.tsx"; import styles from "./DealPrefillDrawer.module.css"; import BaseMarketplaceSelect from "../../../../components/Selects/BaseMarketplaceSelect/BaseMarketplaceSelect.tsx"; import usePrefillDeal from "./hooks/usePrefillDeal.tsx"; import { notifications } from "../../../../shared/lib/notifications.ts"; +import { usePrefillDealContext } from "../../contexts/PrefillDealContext.tsx"; const DealPrefillDrawer: FC = () => { - const { prefillOpened, prefillOnClose, selectedPrefillDeal, setPrefillDeal, prefillDeal } = useDealPageContext(); + const { prefillOpened, prefillOnClose, selectedPrefillDeal, setPrefillDeal, prefillDeal } = usePrefillDealContext(); const { data, form } = usePrefillDeal(); useEffect(() => { diff --git a/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/Preview/Preview.module.css b/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/Preview/Preview.module.css index 7d9d02d..3a8729e 100644 --- a/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/Preview/Preview.module.css +++ b/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/Preview/Preview.module.css @@ -1,7 +1,6 @@ .container { display: flex; gap: rem(10); - max-height: 95vh; width: 50%; } @@ -20,6 +19,7 @@ } .deal-container-wrapper { + width: 100%; border: dashed var(--item-border-size) var(--mantine-color-default-border); border-radius: var(--item-border-radius); padding: rem(10); diff --git a/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/Preview/Preview.tsx b/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/Preview/Preview.tsx index 942a427..d9b0dea 100644 --- a/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/Preview/Preview.tsx +++ b/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/Preview/Preview.tsx @@ -1,12 +1,12 @@ import { FC } from "react"; import styles from "./Preview.module.css"; import { ScrollArea, Skeleton, Title } from "@mantine/core"; -import { useDealPageContext } from "../../../../contexts/DealPageContext.tsx"; import DealServicesTable from "../tables/DealServicesTable/DealServicesTable.tsx"; import ProductPreview from "../ProductPreview/ProductPreview.tsx"; +import { usePrefillDealContext } from "../../../../contexts/PrefillDealContext.tsx"; const Preview: FC = () => { - const { selectedPrefillDeal } = useDealPageContext(); + const { selectedPrefillDeal } = usePrefillDealContext(); const getTotalPrice = () => { if (!selectedPrefillDeal) return 0; @@ -28,27 +28,29 @@ const Preview: FC = () => { return (
- - -
- - Общая стоимость всех услуг:{" "} - {getTotalPrice().toLocaleString("ru")}₽ - +
+ +
+ + + Общая стоимость всех услуг:{" "} + {getTotalPrice().toLocaleString("ru")}₽ + - + -
- {selectedPrefillDeal?.products.map(product => ( - - ))} -
+
+ {selectedPrefillDeal?.products.map(product => ( + + ))} +
+
- -
+ +
); }; diff --git a/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/tables/DealServicesTable/DealServicesTable.tsx b/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/tables/DealServicesTable/DealServicesTable.tsx index ba38011..32e6baf 100644 --- a/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/tables/DealServicesTable/DealServicesTable.tsx +++ b/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/tables/DealServicesTable/DealServicesTable.tsx @@ -16,7 +16,6 @@ const DealServicesTable: FC = ({ items }) => { = ({ items }) => { - const { selectPrefillDeal } = useDealPageContext(); + const { selectPrefillDeal } = usePrefillDealContext(); const columns = useDealsTableColumns(); const defaultSorting = [{ id: "createdAt", desc: false }]; @@ -36,6 +36,9 @@ const DealsTable: FC = ({ items }) => { mantinePaginationProps: { showRowsPerPage: false, }, + enableStickyHeader: true, + enableStickyFooter: true, + mantineTableContainerProps: { style: { maxHeight: "81vh", height: "81vh" } }, } } /> diff --git a/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/tables/DealsTable/columns.tsx b/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/tables/DealsTable/columns.tsx index 2928d12..aba7066 100644 --- a/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/tables/DealsTable/columns.tsx +++ b/src/pages/LeadsPage/drawers/DealPrefillDrawer/components/tables/DealsTable/columns.tsx @@ -2,7 +2,7 @@ import { useMemo } from "react"; import { MRT_ColumnDef } from "mantine-react-table"; import { ActionIcon, Image, Radio } from "@mantine/core"; import { DealSummary } from "../../../../../../../client"; -import { useDealPageContext } from "../../../../../contexts/DealPageContext.tsx"; +import { usePrefillDealContext } from "../../../../../contexts/PrefillDealContext.tsx"; const useDealsTableColumns = () => { return useMemo[]>( @@ -13,7 +13,7 @@ const useDealsTableColumns = () => { size: 5, enableSorting: false, Cell: ({ row }) => { - const { selectPrefillDeal, selectedPrefillDeal } = useDealPageContext(); + const { selectPrefillDeal, selectedPrefillDeal } = usePrefillDealContext(); const checked = row.original.id === selectedPrefillDeal?.id; return ( { boxShadow: "none", }}> - - + + - Вид - - - setDisplayMode(DisplayMode.BOARD) - } - variant={ - displayMode === DisplayMode.BOARD - ? "filled" - : "default" - }> - - - - setDisplayMode(DisplayMode.TABLE) - } - variant={ - displayMode === DisplayMode.TABLE - ? "filled" - : "default" - }> - - + align={"center"} + justify={"space-between"}> + + Вид + + + setDisplayMode(DisplayMode.BOARD) + } + variant={ + displayMode === DisplayMode.BOARD + ? "filled" + : "default" + }> + + + + setDisplayMode(DisplayMode.TABLE) + } + variant={ + displayMode === DisplayMode.TABLE + ? "filled" + : "default" + }> + + + + +
+ + + form.setFieldValue("dealStatus", null) + } + clearable + placeholder={"Выберите статус "} + {...form.getInputProps("dealStatus")} + /> + + form.setFieldValue("marketplace", null) + } + clearable + placeholder={"Выберите маркетплейс"} + {...form.getInputProps("marketplace")} + /> + + form.setFieldValue("client", null) + } + clearable + searchable + placeholder={"Выберите клиента"} + {...form.getInputProps("client")} + /> +
+
- -
- - - form.setFieldValue("dealStatus", null) - } - clearable - placeholder={"Выберите статус "} - {...form.getInputProps("dealStatus")} - /> - - form.setFieldValue("marketplace", null) - } - clearable - placeholder={"Выберите маркетплейс"} - {...form.getInputProps("marketplace")} - /> - - form.setFieldValue("client", null) - } - clearable - searchable - placeholder={"Выберите клиента"} - {...form.getInputProps("client")} - /> -
-
-
-
- - {getBody()} - - - +
+ + {getBody()} + + + +
);