From e2089312c426d77d1b78c844ff9d80163bdfc96c Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 25 Nov 2025 09:18:04 +0000 Subject: [PATCH] Add UI support for parameters against orders --- .../src/components/panels/ParametersPanel.tsx | 4 +- .../pages/purchasing/PurchaseOrderDetail.tsx | 5 ++ .../src/pages/purchasing/PurchasingIndex.tsx | 7 +++ .../src/pages/sales/ReturnOrderDetail.tsx | 5 ++ src/frontend/src/pages/sales/SalesIndex.tsx | 14 +++++ .../src/pages/sales/SalesOrderDetail.tsx | 5 ++ .../tables/general/ParametricDataTable.tsx | 11 +--- .../PurchaseOrderParametricTable.tsx | 60 +++++++++++++++++++ .../sales/ReturnOrderParametricTable.tsx | 60 +++++++++++++++++++ .../sales/SalesOrderParametricTable.tsx | 60 +++++++++++++++++++ 10 files changed, 220 insertions(+), 11 deletions(-) create mode 100644 src/frontend/src/tables/purchasing/PurchaseOrderParametricTable.tsx create mode 100644 src/frontend/src/tables/sales/ReturnOrderParametricTable.tsx create mode 100644 src/frontend/src/tables/sales/SalesOrderParametricTable.tsx diff --git a/src/frontend/src/components/panels/ParametersPanel.tsx b/src/frontend/src/components/panels/ParametersPanel.tsx index 5cc5782c84..14a0afa593 100644 --- a/src/frontend/src/components/panels/ParametersPanel.tsx +++ b/src/frontend/src/components/panels/ParametersPanel.tsx @@ -1,7 +1,7 @@ import type { ModelType } from '@lib/enums/ModelType'; import { t } from '@lingui/core/macro'; import { Skeleton } from '@mantine/core'; -import { IconList } from '@tabler/icons-react'; +import { IconListDetails } from '@tabler/icons-react'; import { ParameterTable } from '../../tables/general/ParameterTable'; import type { PanelType } from './Panel'; @@ -15,7 +15,7 @@ export default function ParametersPanel({ return { name: 'parameters', label: t`Parameters`, - icon: , + icon: , content: model_type && model_id ? ( diff --git a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx index 87e1c4cbba..0d0a2fc754 100644 --- a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx +++ b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx @@ -32,6 +32,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { StatusRenderer } from '../../components/render/StatusRenderer'; import { formatCurrency } from '../../defaults/formatters'; import { usePurchaseOrderFields } from '../../forms/PurchaseOrderForms'; @@ -389,6 +390,10 @@ export default function PurchaseOrderDetail() { /> ) }, + ParametersPanel({ + model_type: ModelType.purchaseorder, + model_id: order.pk + }), AttachmentPanel({ model_type: ModelType.purchaseorder, model_id: order.pk diff --git a/src/frontend/src/pages/purchasing/PurchasingIndex.tsx b/src/frontend/src/pages/purchasing/PurchasingIndex.tsx index c4303ceeb4..706c7e737d 100644 --- a/src/frontend/src/pages/purchasing/PurchasingIndex.tsx +++ b/src/frontend/src/pages/purchasing/PurchasingIndex.tsx @@ -25,6 +25,7 @@ import { CompanyTable } from '../../tables/company/CompanyTable'; import ParametricCompanyTable from '../../tables/company/ParametricCompanyTable'; import ManufacturerPartParametricTable from '../../tables/purchasing/ManufacturerPartParametricTable'; import { ManufacturerPartTable } from '../../tables/purchasing/ManufacturerPartTable'; +import PurchaseOrderParametricTable from '../../tables/purchasing/PurchaseOrderParametricTable'; import { PurchaseOrderTable } from '../../tables/purchasing/PurchaseOrderTable'; import SupplierPartParametricTable from '../../tables/purchasing/SupplierPartParametricTable'; import { SupplierPartTable } from '../../tables/purchasing/SupplierPartTable'; @@ -85,6 +86,12 @@ export default function PurchasingIndex() { params={{ outstanding: true }} /> ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: } ] }), diff --git a/src/frontend/src/pages/sales/ReturnOrderDetail.tsx b/src/frontend/src/pages/sales/ReturnOrderDetail.tsx index 2c644c4be1..5bce7c6306 100644 --- a/src/frontend/src/pages/sales/ReturnOrderDetail.tsx +++ b/src/frontend/src/pages/sales/ReturnOrderDetail.tsx @@ -32,6 +32,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { RenderAddress } from '../../components/render/Company'; import { StatusRenderer } from '../../components/render/StatusRenderer'; import { formatCurrency } from '../../defaults/formatters'; @@ -354,6 +355,10 @@ export default function ReturnOrderDetail() { ) }, + ParametersPanel({ + model_type: ModelType.returnorder, + model_id: order.pk + }), AttachmentPanel({ model_type: ModelType.returnorder, model_id: order.pk diff --git a/src/frontend/src/pages/sales/SalesIndex.tsx b/src/frontend/src/pages/sales/SalesIndex.tsx index 983b06d88e..0fe4b8a31c 100644 --- a/src/frontend/src/pages/sales/SalesIndex.tsx +++ b/src/frontend/src/pages/sales/SalesIndex.tsx @@ -22,7 +22,9 @@ import SegmentedControlPanel from '../../components/panels/SegmentedControlPanel import { useUserState } from '../../states/UserState'; import { CompanyTable } from '../../tables/company/CompanyTable'; import ParametricCompanyTable from '../../tables/company/ParametricCompanyTable'; +import ReturnOrderParametricTable from '../../tables/sales/ReturnOrderParametricTable'; import { ReturnOrderTable } from '../../tables/sales/ReturnOrderTable'; +import SalesOrderParametricTable from '../../tables/sales/SalesOrderParametricTable'; import SalesOrderShipmentTable from '../../tables/sales/SalesOrderShipmentTable'; import { SalesOrderTable } from '../../tables/sales/SalesOrderTable'; @@ -71,6 +73,12 @@ export default function SalesIndex() { params={{ outstanding: true }} /> ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: } ] }), @@ -111,6 +119,12 @@ export default function SalesIndex() { params={{ outstanding: true }} /> ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: } ] }), diff --git a/src/frontend/src/pages/sales/SalesOrderDetail.tsx b/src/frontend/src/pages/sales/SalesOrderDetail.tsx index bd3178fb3d..15bc26cdda 100644 --- a/src/frontend/src/pages/sales/SalesOrderDetail.tsx +++ b/src/frontend/src/pages/sales/SalesOrderDetail.tsx @@ -38,6 +38,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { RenderAddress } from '../../components/render/Company'; import { StatusRenderer } from '../../components/render/StatusRenderer'; import { formatCurrency } from '../../defaults/formatters'; @@ -427,6 +428,10 @@ export default function SalesOrderDetail() { ) }, + ParametersPanel({ + model_type: ModelType.salesorder, + model_id: order.pk + }), AttachmentPanel({ model_type: ModelType.salesorder, model_id: order.pk diff --git a/src/frontend/src/tables/general/ParametricDataTable.tsx b/src/frontend/src/tables/general/ParametricDataTable.tsx index 22339aa613..279f68e90b 100644 --- a/src/frontend/src/tables/general/ParametricDataTable.tsx +++ b/src/frontend/src/tables/general/ParametricDataTable.tsx @@ -3,7 +3,6 @@ import { ApiEndpoints, type ApiFormFieldSet, type ModelType, - RowViewAction, UserRoles, YesNoButton, apiUrl, @@ -399,14 +398,7 @@ export default function ParametricDataTable({ setSelectedTemplate(null); addParameter.open(); } - }, - RowViewAction({ - title: t`View`, - modelType: modelType, - modelId: record.pk, - hidden: !user.hasViewPermission(modelType), - navigate: navigate - }) + } ]; }, [modelType, user] @@ -429,6 +421,7 @@ export default function ParametricDataTable({ parameters: true, ...parametricQueryFilters }, + modelType: modelType, onCellClick: ({ event, record, index, column, columnIndex }) => { cancelEvent(event); diff --git a/src/frontend/src/tables/purchasing/PurchaseOrderParametricTable.tsx b/src/frontend/src/tables/purchasing/PurchaseOrderParametricTable.tsx new file mode 100644 index 0000000000..0beaef6072 --- /dev/null +++ b/src/frontend/src/tables/purchasing/PurchaseOrderParametricTable.tsx @@ -0,0 +1,60 @@ +import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; +import { ModelType } from '@lib/enums/ModelType'; +import type { TableFilter } from '@lib/types/Filters'; +import type { TableColumn } from '@lib/types/Tables'; +import { t } from '@lingui/core/macro'; +import { type ReactNode, useMemo } from 'react'; +import { CompanyColumn, ReferenceColumn } from '../ColumnRenderers'; +import { + AssignedToMeFilter, + OrderStatusFilter, + OutstandingFilter, + OverdueFilter, + ProjectCodeFilter, + ResponsibleFilter +} from '../Filter'; +import ParametricDataTable from '../general/ParametricDataTable'; + +export default function PurchaseOrderParametricTable({ + queryParams +}: { + queryParams?: Record; +}): ReactNode { + const customColumns: TableColumn[] = useMemo(() => { + return [ + ReferenceColumn({}), + { + accessor: 'supplier__name', + title: t`Supplier`, + sortable: true, + render: (record: any) => ( + + ) + } + ]; + }, []); + + const customFilters: TableFilter[] = useMemo(() => { + return [ + OrderStatusFilter({ model: ModelType.purchaseorder }), + OutstandingFilter(), + OverdueFilter(), + AssignedToMeFilter(), + ProjectCodeFilter(), + ResponsibleFilter() + ]; + }, []); + + return ( + + ); +} diff --git a/src/frontend/src/tables/sales/ReturnOrderParametricTable.tsx b/src/frontend/src/tables/sales/ReturnOrderParametricTable.tsx new file mode 100644 index 0000000000..eef91d201e --- /dev/null +++ b/src/frontend/src/tables/sales/ReturnOrderParametricTable.tsx @@ -0,0 +1,60 @@ +import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; +import { ModelType } from '@lib/enums/ModelType'; +import type { TableFilter } from '@lib/types/Filters'; +import type { TableColumn } from '@lib/types/Tables'; +import { t } from '@lingui/core/macro'; +import { type ReactNode, useMemo } from 'react'; +import { CompanyColumn, ReferenceColumn } from '../ColumnRenderers'; +import { + AssignedToMeFilter, + OrderStatusFilter, + OutstandingFilter, + OverdueFilter, + ProjectCodeFilter, + ResponsibleFilter +} from '../Filter'; +import ParametricDataTable from '../general/ParametricDataTable'; + +export default function ReturnOrderParametricTable({ + queryParams +}: { + queryParams?: Record; +}): ReactNode { + const customColumns: TableColumn[] = useMemo(() => { + return [ + ReferenceColumn({}), + { + accessor: 'customer__name', + title: t`Customer`, + sortable: true, + render: (record: any) => ( + + ) + } + ]; + }, []); + + const customFilters: TableFilter[] = useMemo(() => { + return [ + OrderStatusFilter({ model: ModelType.returnorder }), + OutstandingFilter(), + OverdueFilter(), + AssignedToMeFilter(), + ProjectCodeFilter(), + ResponsibleFilter() + ]; + }, []); + + return ( + + ); +} diff --git a/src/frontend/src/tables/sales/SalesOrderParametricTable.tsx b/src/frontend/src/tables/sales/SalesOrderParametricTable.tsx new file mode 100644 index 0000000000..fce8aadc28 --- /dev/null +++ b/src/frontend/src/tables/sales/SalesOrderParametricTable.tsx @@ -0,0 +1,60 @@ +import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; +import { ModelType } from '@lib/enums/ModelType'; +import type { TableFilter } from '@lib/types/Filters'; +import type { TableColumn } from '@lib/types/Tables'; +import { t } from '@lingui/core/macro'; +import { type ReactNode, useMemo } from 'react'; +import { CompanyColumn, ReferenceColumn } from '../ColumnRenderers'; +import { + AssignedToMeFilter, + OrderStatusFilter, + OutstandingFilter, + OverdueFilter, + ProjectCodeFilter, + ResponsibleFilter +} from '../Filter'; +import ParametricDataTable from '../general/ParametricDataTable'; + +export default function SalesOrderParametricTable({ + queryParams +}: { + queryParams?: Record; +}): ReactNode { + const customColumns: TableColumn[] = useMemo(() => { + return [ + ReferenceColumn({}), + { + accessor: 'customer__name', + title: t`Customer`, + sortable: true, + render: (record: any) => ( + + ) + } + ]; + }, []); + + const customFilters: TableFilter[] = useMemo(() => { + return [ + OrderStatusFilter({ model: ModelType.salesorder }), + OutstandingFilter(), + OverdueFilter(), + AssignedToMeFilter(), + ProjectCodeFilter(), + ResponsibleFilter() + ]; + }, []); + + return ( + + ); +}