diff --git a/src/app/deals/components/desktop/TopToolPanel/TopToolPanel.tsx b/src/app/deals/components/desktop/TopToolPanel/TopToolPanel.tsx index ffed66c..3287418 100644 --- a/src/app/deals/components/desktop/TopToolPanel/TopToolPanel.tsx +++ b/src/app/deals/components/desktop/TopToolPanel/TopToolPanel.tsx @@ -8,7 +8,7 @@ import ToolPanelAction from "@/app/deals/components/desktop/ToolPanelAction/Tool import ViewSelector from "@/app/deals/components/desktop/ViewSelector/ViewSelector"; import { useDealsContext } from "@/app/deals/contexts/DealsContext"; import { useProjectsContext } from "@/app/deals/contexts/ProjectsContext"; -import DealsTableFiltersModal from "@/app/deals/modals/DealsTableFiltersModal/DealsTableFiltersModal"; +import { DealsFiltersForm } from "@/app/deals/hooks/useDealsFilters"; import ProjectSelect from "@/components/selects/ProjectSelect/ProjectSelect"; import { useDrawersContext } from "@/drawers/DrawersContext"; import useIsMobile from "@/hooks/utils/useIsMobile"; @@ -49,6 +49,21 @@ const TopToolPanel: FC = ({ view, setView }) => { }); }; + const onFiltersClick = () => { + modals.openContextModal({ + modal: "dealsFiltersModal", + title: "Фильтры", + withCloseButton: true, + innerProps: { + value: dealsFiltersForm.values, + onChange: (values: DealsFiltersForm) => + dealsFiltersForm.setValues(values), + project: selectedProject, + boardAndStatusEnabled: view === "table", + }, + }); + }; + return ( = ({ view, setView }) => { wrap={"nowrap"} align={"center"} gap={"sm"}> - ( - - - - - - )} - filtersForm={dealsFiltersForm} - selectedProject={selectedProject} - boardAndStatusEnabled={view === "table"} - /> + + + + + diff --git a/src/app/deals/modals/DealsFiltersModal/DealsFiltersModal.tsx b/src/app/deals/modals/DealsFiltersModal/DealsFiltersModal.tsx new file mode 100644 index 0000000..862f120 --- /dev/null +++ b/src/app/deals/modals/DealsFiltersModal/DealsFiltersModal.tsx @@ -0,0 +1,91 @@ +"use client"; + +import { + Button, + Flex, + NumberInput, + rem, + Space, + Text, + TextInput, +} from "@mantine/core"; +import { useForm } from "@mantine/form"; +import { ContextModalProps } from "@mantine/modals"; +import { DealsFiltersForm } from "@/app/deals/hooks/useDealsFilters"; +import BoardSelect from "@/components/selects/BoardSelect/BoardSelect"; +import StatusSelect from "@/components/selects/StatusSelect/StatusSelect"; +import { ProjectSchema } from "@/lib/client"; + +type Props = { + value: DealsFiltersForm; + onChange: (values: DealsFiltersForm) => void; + project: ProjectSchema | null; + boardAndStatusEnabled: boolean; +}; + +const DealsFiltersModal = ({ + id, + context, + innerProps, +}: ContextModalProps) => { + const filtersForm = useForm({ + initialValues: innerProps.value, + }); + + const onSubmit = (values: DealsFiltersForm) => { + innerProps.onChange(values); + context.closeModal(id); + }; + + return ( +
+ + + typeof value === "number" + ? filtersForm.setFieldValue("id", Number(value)) + : filtersForm.setFieldValue("id", null) + } + hideControls + min={1} + /> + + {innerProps.boardAndStatusEnabled && ( + <> + + + + )} + + + +
+ ); +}; + +export default DealsFiltersModal; diff --git a/src/app/deals/modals/DealsTableFiltersModal/DealsTableFiltersModal.tsx b/src/app/deals/modals/DealsTableFiltersModal/DealsTableFiltersModal.tsx deleted file mode 100644 index 670ea7d..0000000 --- a/src/app/deals/modals/DealsTableFiltersModal/DealsTableFiltersModal.tsx +++ /dev/null @@ -1,78 +0,0 @@ -"use client"; - -import { ReactNode } from "react"; -import { Flex, Modal, NumberInput, rem, TextInput } from "@mantine/core"; -import { UseFormReturnType } from "@mantine/form"; -import { useDisclosure } from "@mantine/hooks"; -import { DealsFiltersForm } from "@/app/deals/hooks/useDealsFilters"; -import BoardSelect from "@/components/selects/BoardSelect/BoardSelect"; -import StatusSelect from "@/components/selects/StatusSelect/StatusSelect"; -import { ProjectSchema } from "@/lib/client"; - -type Props = { - filtersForm: UseFormReturnType; - selectedProject: ProjectSchema | null; - boardAndStatusEnabled: boolean; - getOpener: (open: () => void) => ReactNode; -}; - -const DealsTableFiltersModal = ({ - filtersForm, - selectedProject, - boardAndStatusEnabled, - getOpener, -}: Props) => { - const [opened, { open, close }] = useDisclosure(); - - return ( - <> - {getOpener(open)} - - - - typeof value === "number" - ? filtersForm.setFieldValue("id", Number(value)) - : filtersForm.setFieldValue("id", null) - } - hideControls - min={1} - /> - - {boardAndStatusEnabled && ( - <> - - - - )} - - - - ); -}; - -export default DealsTableFiltersModal; diff --git a/src/modals/modals.ts b/src/modals/modals.ts index 82c72c6..261f119 100644 --- a/src/modals/modals.ts +++ b/src/modals/modals.ts @@ -1,5 +1,7 @@ +import DealsFiltersModal from "@/app/deals/modals/DealsFiltersModal/DealsFiltersModal"; import EnterNameModal from "@/modals/EnterNameModal/EnterNameModal"; export const modals = { enterNameModal: EnterNameModal, + dealsFiltersModal: DealsFiltersModal, };