feat: shipping warehouse page

This commit is contained in:
2024-08-25 04:19:05 +03:00
parent 76d37d54d9
commit 9b71738f24
24 changed files with 475 additions and 9 deletions

View File

@@ -0,0 +1,83 @@
import {CRUDTableProps} from "../../../../types/CRUDTable.tsx";
import {DealSummary, ShippingWarehouseSchema} from "../../../../client";
import {FC} from "react";
import {BaseTable} from "../../../../components/BaseTable/BaseTable.tsx";
import useShippingWarehouseTableColumns from "./columns.tsx";
import {ActionIcon, Flex, Text, Tooltip} from "@mantine/core";
import {IconEdit, IconTrash} from "@tabler/icons-react";
import {MRT_TableOptions} from "mantine-react-table";
import {modals} from "@mantine/modals";
type RestProps = {
summaries: DealSummary[];
};
type Props = CRUDTableProps<ShippingWarehouseSchema> & RestProps;
const ShippingWarehouseTable: FC<Props> = ({
onChange,
onDelete,
items,
summaries
}) => {
const columns = useShippingWarehouseTableColumns();
const onEditClick = (element: ShippingWarehouseSchema) => {
if (!onChange) return;
modals.openContextModal({
modal: "shippingWarehouseForm",
title: 'Редактирование склада отгрузки',
withCloseButton: false,
innerProps: {
element,
onChange,
summaries: summaries.filter(s => s.shipmentWarehouseId === element.id).slice(0, 5)
},
size: "xl"
})
}
const onDeleteClick = (element: ShippingWarehouseSchema) => {
if (!onDelete) return;
modals.openConfirmModal({
title: 'Удаление склада отгрузки',
children: (
<Text size="sm">
Вы уверены что хотите удалить склад отгрузки {element.name}
</Text>
),
labels: {confirm: 'Да', cancel: "Нет"},
confirmProps: {color: 'red'},
onConfirm: () => {
onDelete(element);
}
});
}
return (
<BaseTable
data={items}
columns={columns}
restProps={{
enableColumnActions: false,
enableSorting: false,
enableRowActions: true,
renderRowActions: ({row}) => (
<Flex gap="md">
<Tooltip label="Редактировать">
<ActionIcon
onClick={() => onEditClick(row.original)}
variant={"default"}>
<IconEdit/>
</ActionIcon>
</Tooltip>
<Tooltip label="Удалить">
<ActionIcon onClick={() => onDeleteClick(row.original)} variant={"default"}>
<IconTrash/>
</ActionIcon>
</Tooltip>
</Flex>
)
} as MRT_TableOptions<ShippingWarehouseSchema>}
/>
)
}
export default ShippingWarehouseTable;

View File

@@ -0,0 +1,18 @@
import {useMemo} from "react";
import {MRT_ColumnDef} from "mantine-react-table";
import {ShippingWarehouseSchema} from "../../../../client";
const useShippingWarehouseTableColumns = () => {
return useMemo<MRT_ColumnDef<ShippingWarehouseSchema>[]>(() => [
{
accessorKey:"id",
header:"ID"
},
{
accessorKey:"name",
header:"Название"
}
], []);
}
export default useShippingWarehouseTableColumns;

View File

@@ -0,0 +1 @@
export {ShippingWarehousesPage} from './ui/ShippingWarehousesPage.tsx';

View File

@@ -0,0 +1,64 @@
import BaseFormModal, {CreateEditFormProps} from "../../ClientsPage/modals/BaseFormModal/BaseFormModal.tsx";
import {DealSummary, ShippingWarehouseSchema} from "../../../client";
import {ContextModalProps} from "@mantine/modals";
import {useForm} from "@mantine/form";
import {Input, TextInput} from "@mantine/core";
import DealsTable from "../../DealsPage/components/DealsTable/DealsTable.tsx";
import {DealPageContextProvider} from "../../LeadsPage/contexts/DealPageContext.tsx";
import DealEditDrawer from "../../LeadsPage/drawers/DealEditDrawer/DealEditDrawer.tsx";
type RestProps = {
summaries: DealSummary[];
}
type Props = CreateEditFormProps<ShippingWarehouseSchema> & RestProps;
const ShippingWarehouseForm = ({
context,
innerProps,
id
}: ContextModalProps<Props>) => {
const isEditing = 'onChange' in innerProps;
const form = useForm<ShippingWarehouseSchema>({
initialValues: isEditing ? innerProps.element : {
id: -1,
name: ""
}
});
return (
<DealPageContextProvider>
<BaseFormModal
{...innerProps}
closeOnSubmit
form={form}
onClose={() => context.closeContextModal(id)}
>
<BaseFormModal.Body>
<>
<TextInput
label={"Склад отгрузки"}
placeholder={"Введите название склада отгрузки"}
{...form.getInputProps("name")}
/>
{isEditing &&
<Input.Wrapper
label={"Последние 5 сделок"}
error={form.getInputProps("phoneNumber").error}
>
<DealsTable
viewOnly={true}
items={innerProps.summaries}/>
</Input.Wrapper>
}
</>
</BaseFormModal.Body>
</BaseFormModal>
<DealEditDrawer
/>
</DealPageContextProvider>
)
}
export default ShippingWarehouseForm;

View File

@@ -0,0 +1,17 @@
.container {
display: flex;
flex-direction: column;
flex: 1;
gap: rem(10);
}
.top-panel {
padding: rem(5);
gap: rem(10);
display: flex;
}
.top-panel-last-item {
margin-left: auto;
}

View File

@@ -0,0 +1,91 @@
import styles from "../../ServicesPage/ui/ServicesPage.module.css";
import PageBlock from "../../../components/PageBlock/PageBlock.tsx";
import ShippingWarehousesTable from "../components/ShippingWarehousesTable/ShippingWarehousesTable.tsx";
import useShippingWarehousesList
from "../../../components/Selects/ShippingWarehouseAutocomplete/hooks/useShippingWarehousesList.tsx";
import {Button} from "@mantine/core";
import {modals} from "@mantine/modals";
import {useCRUD} from "../../../hooks/useCRUD.tsx";
import {ShippingWarehouseSchema, ShippingWarehouseService} from "../../../client";
import {notifications} from "../../../shared/lib/notifications.ts";
import {useDealSummariesFull} from "../../LeadsPage/hooks/useDealSummaries.tsx";
export const ShippingWarehousesPage = () => {
const {shippingWarehouses, refetch} = useShippingWarehousesList();
const {objects: summaries} = useDealSummariesFull();
const crud = useCRUD<ShippingWarehouseSchema>({
onChange: (element) => {
ShippingWarehouseService
.updateShippingWarehouse({
requestBody: {
shippingWarehouse: element
}
})
.then(async ({ok, message}) => {
notifications.guess(ok, {message});
if (!ok) return;
await refetch();
})
},
onCreate: (element) => {
ShippingWarehouseService
.createShippingWarehouse({
requestBody: {
shippingWarehouse: element
}
})
.then(async ({ok, message}) => {
notifications.guess(ok, {message});
if (!ok) return;
await refetch();
})
},
onDelete: (element) => {
ShippingWarehouseService
.deleteShippingWarehouse({
requestBody: {
shippingWarehouseId: element.id
}
})
.then(async ({ok, message}) => {
notifications.guess(ok, {message});
if (!ok) return;
await refetch();
})
}
});
const onCreateClick = () => {
modals.openContextModal({
modal: "shippingWarehouseForm",
title: 'Редактирование склада отгрузки',
withCloseButton: false,
innerProps: {
onCreate: crud.onCreate,
summaries: []
},
})
}
return (
<div className={styles['container']}>
<PageBlock>
<div className={styles['top-panel']}>
<Button
onClick={onCreateClick}
variant={"default"}
>
Создать склад отгрузки
</Button>
</div>
</PageBlock>
<PageBlock>
<ShippingWarehousesTable
items={shippingWarehouses}
summaries={summaries}
{...crud}
/>
</PageBlock>
</div>
)
}