2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 11:36:44 +00:00
InvenTree/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx
Oliver a7d9600c3d
[PUI] Refactor "notYetImplemented" (#7913)
* Remove default "not yet implemented" action

- Will force us to manually add "not yet implemented"
- Intended to highlight where we still need to work

* Refactor more components

* Fix for onClick
2024-08-19 21:01:05 +10:00

178 lines
4.6 KiB
TypeScript

import { t } from '@lingui/macro';
import { IconTruckDelivery } from '@tabler/icons-react';
import { useCallback, useMemo, useState } from 'react';
import { AddItemButton } from '../../components/buttons/AddItemButton';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { UserRoles } from '../../enums/Roles';
import { useSalesOrderShipmentFields } from '../../forms/SalesOrderForms';
import { notYetImplemented } from '../../functions/notifications';
import {
useCreateApiFormModal,
useDeleteApiFormModal,
useEditApiFormModal
} from '../../hooks/UseForm';
import { useTable } from '../../hooks/UseTable';
import { apiUrl } from '../../states/ApiState';
import { useUserState } from '../../states/UserState';
import { TableColumn } from '../Column';
import { DateColumn, LinkColumn, NoteColumn } from '../ColumnRenderers';
import { TableFilter } from '../Filter';
import { InvenTreeTable } from '../InvenTreeTable';
import { RowAction, RowDeleteAction, RowEditAction } from '../RowActions';
export default function SalesOrderShipmentTable({
orderId
}: {
orderId: number;
}) {
const user = useUserState();
const table = useTable('sales-order-shipment');
const [selectedShipment, setSelectedShipment] = useState<number>(0);
const newShipmentFields = useSalesOrderShipmentFields();
const editShipmentFields = useSalesOrderShipmentFields();
const newShipment = useCreateApiFormModal({
url: ApiEndpoints.sales_order_shipment_list,
fields: newShipmentFields,
title: t`Create Shipment`,
table: table,
initialData: {
order: orderId
}
});
const deleteShipment = useDeleteApiFormModal({
url: ApiEndpoints.sales_order_shipment_list,
pk: selectedShipment,
title: t`Delete Shipment`,
table: table
});
const editShipment = useEditApiFormModal({
url: ApiEndpoints.sales_order_shipment_list,
pk: selectedShipment,
fields: editShipmentFields,
title: t`Edit Shipment`,
table: table
});
const tableColumns: TableColumn[] = useMemo(() => {
return [
{
accessor: 'reference',
title: t`Shipment Reference`,
switchable: false
},
{
accessor: 'allocations',
title: t`Items`,
render: (record: any) => {
let allocations = record?.allocations ?? [];
return allocations.length;
}
},
DateColumn({
accessor: 'shipment_date',
title: t`Shipment Date`
}),
DateColumn({
accessor: 'delivery_date',
title: t`Delivery Date`
}),
{
accessor: 'tracking_number'
},
{
accessor: 'invoice_number'
},
LinkColumn({
accessor: 'link'
}),
NoteColumn({
accessor: 'notes'
})
];
}, []);
const rowActions = useCallback(
(record: any): RowAction[] => {
const shipped: boolean = !!record.shipment_date;
return [
{
hidden: shipped || !user.hasChangeRole(UserRoles.sales_order),
title: t`Complete Shipment`,
icon: <IconTruckDelivery />,
onClick: notYetImplemented
},
RowEditAction({
hidden: !user.hasChangeRole(UserRoles.sales_order),
onClick: () => {
setSelectedShipment(record.pk);
editShipment.open();
}
}),
RowDeleteAction({
hidden: !user.hasDeleteRole(UserRoles.sales_order),
onClick: () => {
setSelectedShipment(record.pk);
deleteShipment.open();
}
})
];
},
[user]
);
const tableActions = useMemo(() => {
return [
<AddItemButton
tooltip={t`Add shipment`}
hidden={!user.hasAddRole(UserRoles.sales_order)}
onClick={() => {
newShipment.open();
}}
/>
];
}, [user]);
const tableFilters: TableFilter[] = useMemo(() => {
return [
{
name: 'shipped',
label: t`Shipped`,
description: t`Show shipments which have been shipped`
},
{
name: 'delivered',
label: t`Delivered`,
description: t`Show shipments which have been delivered`
}
];
}, []);
return (
<>
{newShipment.modal}
{editShipment.modal}
{deleteShipment.modal}
<InvenTreeTable
url={apiUrl(ApiEndpoints.sales_order_shipment_list)}
tableState={table}
columns={tableColumns}
props={{
tableActions: tableActions,
tableFilters: tableFilters,
rowActions: rowActions,
params: {
order: orderId
}
}}
/>
</>
);
}