From 30b45a917c7cc3892d3919535c2b0e2e5b6c05e4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 1 Mar 2024 03:22:43 +0000 Subject: [PATCH] PurchaseOrder detail page --- .../pages/purchasing/PurchaseOrderDetail.tsx | 182 +++++++++++++++++- .../src/pages/sales/ReturnOrderDetail.tsx | 8 + .../src/pages/sales/SalesOrderDetail.tsx | 8 + 3 files changed, 194 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx index 0464f7d4b5..4ae7bc82a8 100644 --- a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx +++ b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx @@ -1,5 +1,5 @@ import { t } from '@lingui/macro'; -import { LoadingOverlay, Stack } from '@mantine/core'; +import { Grid, LoadingOverlay, Skeleton, Stack } from '@mantine/core'; import { IconDots, IconInfoCircle, @@ -11,6 +11,8 @@ import { import { useMemo } from 'react'; import { useParams } from 'react-router-dom'; +import { DetailsImage } from '../../components/details/DetailsImage'; +import { ItemDetailsGrid } from '../../components/details/ItemDetails'; import { ActionDropdown, BarcodeActionDropdown, @@ -24,9 +26,14 @@ import { PageDetail } from '../../components/nav/PageDetail'; import { PanelGroup, PanelType } from '../../components/nav/PanelGroup'; import { NotesEditor } from '../../components/widgets/MarkdownEditor'; import { ApiEndpoints } from '../../enums/ApiEndpoints'; +import { ModelType } from '../../enums/ModelType'; +import { UserRoles } from '../../enums/Roles'; +import { purchaseOrderFields } from '../../forms/PurchaseOrderForms'; +import { useEditApiFormModal } from '../../hooks/UseForm'; import { useInstance } from '../../hooks/UseInstance'; import { apiUrl } from '../../states/ApiState'; import { useUserState } from '../../states/UserState'; +import { DetailsField, DetailsTable } from '../../tables/Details'; import { AttachmentTable } from '../../tables/general/AttachmentTable'; import { PurchaseOrderLineItemTable } from '../../tables/purchasing/PurchaseOrderLineItemTable'; import { StockItemTable } from '../../tables/stock/StockItemTable'; @@ -39,7 +46,11 @@ export default function PurchaseOrderDetail() { const user = useUserState(); - const { instance: order, instanceQuery } = useInstance({ + const { + instance: order, + instanceQuery, + refreshInstance + } = useInstance({ endpoint: ApiEndpoints.purchase_order_list, pk: id, params: { @@ -48,12 +59,167 @@ export default function PurchaseOrderDetail() { refetchOnMount: true }); + const editPurchaseOrder = useEditApiFormModal({ + url: ApiEndpoints.purchase_order_list, + pk: id, + title: t`Edit Purchase Order`, + fields: purchaseOrderFields(), + onFormSuccess: () => { + refreshInstance(); + } + }); + + const detailsPanel = useMemo(() => { + if (instanceQuery.isFetching) { + return ; + } + + let tl: DetailsField[] = [ + { + type: 'text', + name: 'reference', + label: t`Reference`, + copy: true + }, + { + type: 'text', + name: 'supplier_reference', + label: t`Supplier Reference`, + icon: 'reference', + hidden: !order.supplier_reference, + copy: true + }, + { + type: 'link', + name: 'supplier', + icon: 'suppliers', + label: t`Supplier`, + model: ModelType.company + }, + { + type: 'text', + name: 'description', + label: t`Description`, + copy: true + }, + { + type: 'status', + name: 'status', + label: t`Status`, + model: ModelType.purchaseorder + } + ]; + + let tr: DetailsField[] = [ + { + type: 'text', + name: 'line_items', + label: t`Line Items`, + icon: 'list' + }, + { + type: 'progressbar', + name: 'completed', + icon: 'progress', + label: t`Completed Line Items`, + total: order.line_items, + progress: order.completed_lines + }, + { + type: 'progressbar', + name: 'shipments', + icon: 'shipment', + label: t`Completed Shipments`, + total: order.shipments, + progress: order.completed_shipments + // TODO: Fix this progress bar + }, + { + type: 'text', + name: 'currency', + label: t`Order Currency,` + }, + { + type: 'text', + name: 'total_cost', + label: t`Total Cost` + // TODO: Implement this! + } + ]; + + let bl: DetailsField[] = [ + { + type: 'link', + external: true, + name: 'link', + label: t`Link`, + copy: true, + hidden: !order.link + }, + { + type: 'link', + model: ModelType.contact, + link: false, + name: 'contact', + label: t`Contact`, + icon: 'user', + copy: true + } + // TODO: Project code + ]; + + let br: DetailsField[] = [ + { + type: 'text', + name: 'creation_date', + label: t`Created On`, + icon: 'calendar' + }, + { + type: 'text', + name: 'target_date', + label: t`Target Date`, + icon: 'calendar', + hidden: !order.target_date + }, + { + type: 'text', + name: 'responsible', + label: t`Responsible`, + badge: 'owner', + hidden: !order.responsible + } + ]; + + return ( + + + + + + + + + + + + + + ); + }, [order, instanceQuery]); + const orderPanels: PanelType[] = useMemo(() => { return [ { name: 'detail', label: t`Order Details`, - icon: + icon: , + content: detailsPanel }, { name: 'line-items', @@ -118,13 +284,21 @@ export default function PurchaseOrderDetail() { key="order-actions" tooltip={t`Order Actions`} icon={} - actions={[EditItemAction({}), DeleteItemAction({})]} + actions={[ + EditItemAction({ + onClick: () => { + editPurchaseOrder.open(); + } + }), + DeleteItemAction({}) + ]} /> ]; }, [id, order, user]); return ( <> + {editPurchaseOrder.modal}