import { FC, useEffect, useState } from "react"; import styles from "./LeadsPage.module.css"; import Board from "../../../components/Dnd/Board/Board.tsx"; import { DragDropContext, Droppable, DropResult } from "@hello-pangea/dnd"; import { useDealSummaries } from "../hooks/useDealSummaries.tsx"; import { DealStatus, getDealStatusByName } from "../../../shared/enums/DealStatus.ts"; import PageBlock from "../../../components/PageBlock/PageBlock.tsx"; import DealEditDrawer from "../drawers/DealEditDrawer/DealEditDrawer.tsx"; import { DealPageContextProvider } from "../contexts/DealPageContext.tsx"; import { modals } from "@mantine/modals"; import { DealService, DealSummaryReorderRequest } from "../../../client"; import { ActionIcon, Flex, NumberInput, rem, Text } from "@mantine/core"; import classNames from "classnames"; import { notifications } from "../../../shared/lib/notifications.ts"; import { IconMenu2, IconMenuDeep } from "@tabler/icons-react"; import useDealsPageState from "../../DealsPage/hooks/useDealsPageState.tsx"; import DealStatusSelect from "../../DealsPage/components/DealStatusSelect/DealStatusSelect.tsx"; import BaseMarketplaceSelect from "../../../components/Selects/BaseMarketplaceSelect/BaseMarketplaceSelect.tsx"; import ClientSelectNew from "../../../components/Selects/ClientSelectNew/ClientSelectNew.tsx"; import DealsTable from "../../DealsPage/components/DealsTable/DealsTable.tsx"; import { motion } from "framer-motion"; import { dateWithoutTimezone } from "../../../shared/lib/date.ts"; enum DisplayMode { BOARD, TABLE, } export const LeadsPage: FC = () => { const { data, form } = useDealsPageState(); const { summariesRaw, refetch } = useDealSummaries(); const [summaries, setSummaries] = useState(summariesRaw); const [displayMode, setDisplayMode] = useState( DisplayMode.BOARD, ); const [isDragEnded, setIsDragEnded] = useState(true); // const [selectedDeals, setSelectedDeals] = useState([]); useEffect(() => { setSummaries(summariesRaw); }, [summariesRaw]); const onDelete = (dealId: number) => { const summary = summaries.find(summary => summary.id == dealId); if (!summary) return; modals.openConfirmModal({ title: "Удаление сделки", children: ( Вы действительно хотите удалить сделку {summary.name}? ), onConfirm: () => { DealService.deleteDeal({ requestBody: { dealId: dealId }, }).then(async ({ ok, message }) => { notifications.guess(ok, { message }); if (!ok) return; await refetch(); }); }, labels: { confirm: "Удалить", cancel: "Отмена", }, }); }; const onSuccess = (dealId: number) => { const summary = summaries.find(summary => summary.id == dealId); if (!summary) return; modals.openConfirmModal({ title: "Завершение сделки", children: ( Вы действительно хотите завершить сделку {summary.name}? ), onConfirm: () => { DealService.completeDeal({ requestBody: { dealId: dealId }, }).then(async ({ ok, message }) => { notifications.guess(ok, { message }); if (!ok) return; await refetch(); }); }, labels: { confirm: "Завершить", cancel: "Отмена", }, }); }; const onDragEnd = async (result: DropResult) => { setIsDragEnded(true); // If there is no changes if (!result.destination || result.destination == result.source) return; // Checking for valid dealId const dealId = parseInt(result.draggableId); if (isNaN(dealId)) return; // Checking for valid deal const summary = summaries.find(summary => summary.id == dealId); if (!summary) return; // Checking if it is custom actions const droppableId = result.destination.droppableId; if (droppableId === "DELETE") { onDelete(dealId); return; } if (droppableId === "SUCCESS") { onSuccess(dealId); return; } const status = getDealStatusByName(droppableId); const request: Partial = { dealId: dealId, index: result.destination.index, status: status, }; if (status == summary.status) { DealService.reorderDealSummaries({ requestBody: request as DealSummaryReorderRequest, }).then(async response => { setSummaries(response.summaries); await refetch(); }); return; } DealService.reorderDealSummaries({ requestBody: { dealId: dealId, status: status, index: result.destination.index, comment: "", deadline: dateWithoutTimezone(new Date()), }, }).then(async response => { setSummaries(response.summaries); await refetch(); }); }; const getTableBody = () => { return ( ); }; const getBoardBody = () => { return ( { setIsDragEnded(false); }} onDragEnd={onDragEnd}>
summary.status == DealStatus.AWAITING_ACCEPTANCE, )} title={"Ожидает приемки"} droppableId={"AWAITING_ACCEPTANCE"} color={"#4A90E2"} /> summary.status == DealStatus.READY_FOR_WORK, )} title={"Готов к работе"} droppableId={"READY_FOR_WORK"} color={"#D3D3D3"} /> summary.status == DealStatus.PACKAGING, )} title={"Упаковка"} droppableId={"PACKAGING"} color={"#F5A623"} /> summary.status == DealStatus.AWAITING_SHIPMENT, )} title={"Ожидает отгрузки"} droppableId={"AWAITING_SHIPMENT"} color={"#7ED321"} /> summary.status == DealStatus.IN_DELIVERY, )} title={"В доставке"} droppableId={"IN_DELIVERY"} color={"#6A0DAD"} /> summary.status == DealStatus.AWAITING_PAYMENT, )} title={"Ожидает оплаты"} droppableId={"AWAITING_PAYMENT"} color={"#D0021B"} /> summary.status == DealStatus.COMPLETED, )} title={"Завершена"} droppableId={"COMPLETED"} color={"#417505"} />
{(provided, snapshot) => ( <>
{!isDragEnded && !snapshot.isDraggingOver && ( Удалить )}
{provided.placeholder} )}
{(provided, snapshot) => ( <>
{!isDragEnded && !snapshot.isDraggingOver && ( Успешно завершена )}
{provided.placeholder} )}
); }; const getBody = () => { return displayMode === DisplayMode.TABLE ? getTableBody() : getBoardBody(); }; return ( Вид 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")} />
{getBody()}
); };