2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-12-17 09:48:30 +00:00

Add UI support for parameters against orders

This commit is contained in:
Oliver Walters
2025-11-25 09:18:04 +00:00
parent 9e3f3b27db
commit e2089312c4
10 changed files with 220 additions and 11 deletions

View File

@@ -1,7 +1,7 @@
import type { ModelType } from '@lib/enums/ModelType'; import type { ModelType } from '@lib/enums/ModelType';
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { Skeleton } from '@mantine/core'; import { Skeleton } from '@mantine/core';
import { IconList } from '@tabler/icons-react'; import { IconListDetails } from '@tabler/icons-react';
import { ParameterTable } from '../../tables/general/ParameterTable'; import { ParameterTable } from '../../tables/general/ParameterTable';
import type { PanelType } from './Panel'; import type { PanelType } from './Panel';
@@ -15,7 +15,7 @@ export default function ParametersPanel({
return { return {
name: 'parameters', name: 'parameters',
label: t`Parameters`, label: t`Parameters`,
icon: <IconList />, icon: <IconListDetails />,
content: content:
model_type && model_id ? ( model_type && model_id ? (
<ParameterTable modelType={model_type} modelId={model_id} /> <ParameterTable modelType={model_type} modelId={model_id} />

View File

@@ -32,6 +32,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel';
import NotesPanel from '../../components/panels/NotesPanel'; import NotesPanel from '../../components/panels/NotesPanel';
import type { PanelType } from '../../components/panels/Panel'; import type { PanelType } from '../../components/panels/Panel';
import { PanelGroup } from '../../components/panels/PanelGroup'; import { PanelGroup } from '../../components/panels/PanelGroup';
import ParametersPanel from '../../components/panels/ParametersPanel';
import { StatusRenderer } from '../../components/render/StatusRenderer'; import { StatusRenderer } from '../../components/render/StatusRenderer';
import { formatCurrency } from '../../defaults/formatters'; import { formatCurrency } from '../../defaults/formatters';
import { usePurchaseOrderFields } from '../../forms/PurchaseOrderForms'; import { usePurchaseOrderFields } from '../../forms/PurchaseOrderForms';
@@ -389,6 +390,10 @@ export default function PurchaseOrderDetail() {
/> />
) )
}, },
ParametersPanel({
model_type: ModelType.purchaseorder,
model_id: order.pk
}),
AttachmentPanel({ AttachmentPanel({
model_type: ModelType.purchaseorder, model_type: ModelType.purchaseorder,
model_id: order.pk model_id: order.pk

View File

@@ -25,6 +25,7 @@ import { CompanyTable } from '../../tables/company/CompanyTable';
import ParametricCompanyTable from '../../tables/company/ParametricCompanyTable'; import ParametricCompanyTable from '../../tables/company/ParametricCompanyTable';
import ManufacturerPartParametricTable from '../../tables/purchasing/ManufacturerPartParametricTable'; import ManufacturerPartParametricTable from '../../tables/purchasing/ManufacturerPartParametricTable';
import { ManufacturerPartTable } from '../../tables/purchasing/ManufacturerPartTable'; import { ManufacturerPartTable } from '../../tables/purchasing/ManufacturerPartTable';
import PurchaseOrderParametricTable from '../../tables/purchasing/PurchaseOrderParametricTable';
import { PurchaseOrderTable } from '../../tables/purchasing/PurchaseOrderTable'; import { PurchaseOrderTable } from '../../tables/purchasing/PurchaseOrderTable';
import SupplierPartParametricTable from '../../tables/purchasing/SupplierPartParametricTable'; import SupplierPartParametricTable from '../../tables/purchasing/SupplierPartParametricTable';
import { SupplierPartTable } from '../../tables/purchasing/SupplierPartTable'; import { SupplierPartTable } from '../../tables/purchasing/SupplierPartTable';
@@ -85,6 +86,12 @@ export default function PurchasingIndex() {
params={{ outstanding: true }} params={{ outstanding: true }}
/> />
) )
},
{
value: 'parametric',
label: t`Parametric View`,
icon: <IconListDetails />,
content: <PurchaseOrderParametricTable />
} }
] ]
}), }),

View File

@@ -32,6 +32,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel';
import NotesPanel from '../../components/panels/NotesPanel'; import NotesPanel from '../../components/panels/NotesPanel';
import type { PanelType } from '../../components/panels/Panel'; import type { PanelType } from '../../components/panels/Panel';
import { PanelGroup } from '../../components/panels/PanelGroup'; import { PanelGroup } from '../../components/panels/PanelGroup';
import ParametersPanel from '../../components/panels/ParametersPanel';
import { RenderAddress } from '../../components/render/Company'; import { RenderAddress } from '../../components/render/Company';
import { StatusRenderer } from '../../components/render/StatusRenderer'; import { StatusRenderer } from '../../components/render/StatusRenderer';
import { formatCurrency } from '../../defaults/formatters'; import { formatCurrency } from '../../defaults/formatters';
@@ -354,6 +355,10 @@ export default function ReturnOrderDetail() {
</Accordion> </Accordion>
) )
}, },
ParametersPanel({
model_type: ModelType.returnorder,
model_id: order.pk
}),
AttachmentPanel({ AttachmentPanel({
model_type: ModelType.returnorder, model_type: ModelType.returnorder,
model_id: order.pk model_id: order.pk

View File

@@ -22,7 +22,9 @@ import SegmentedControlPanel from '../../components/panels/SegmentedControlPanel
import { useUserState } from '../../states/UserState'; import { useUserState } from '../../states/UserState';
import { CompanyTable } from '../../tables/company/CompanyTable'; import { CompanyTable } from '../../tables/company/CompanyTable';
import ParametricCompanyTable from '../../tables/company/ParametricCompanyTable'; import ParametricCompanyTable from '../../tables/company/ParametricCompanyTable';
import ReturnOrderParametricTable from '../../tables/sales/ReturnOrderParametricTable';
import { ReturnOrderTable } from '../../tables/sales/ReturnOrderTable'; import { ReturnOrderTable } from '../../tables/sales/ReturnOrderTable';
import SalesOrderParametricTable from '../../tables/sales/SalesOrderParametricTable';
import SalesOrderShipmentTable from '../../tables/sales/SalesOrderShipmentTable'; import SalesOrderShipmentTable from '../../tables/sales/SalesOrderShipmentTable';
import { SalesOrderTable } from '../../tables/sales/SalesOrderTable'; import { SalesOrderTable } from '../../tables/sales/SalesOrderTable';
@@ -71,6 +73,12 @@ export default function SalesIndex() {
params={{ outstanding: true }} params={{ outstanding: true }}
/> />
) )
},
{
value: 'parametric',
label: t`Parametric View`,
icon: <IconListDetails />,
content: <SalesOrderParametricTable />
} }
] ]
}), }),
@@ -111,6 +119,12 @@ export default function SalesIndex() {
params={{ outstanding: true }} params={{ outstanding: true }}
/> />
) )
},
{
value: 'parametric',
label: t`Parametric View`,
icon: <IconListDetails />,
content: <ReturnOrderParametricTable />
} }
] ]
}), }),

View File

@@ -38,6 +38,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel';
import NotesPanel from '../../components/panels/NotesPanel'; import NotesPanel from '../../components/panels/NotesPanel';
import type { PanelType } from '../../components/panels/Panel'; import type { PanelType } from '../../components/panels/Panel';
import { PanelGroup } from '../../components/panels/PanelGroup'; import { PanelGroup } from '../../components/panels/PanelGroup';
import ParametersPanel from '../../components/panels/ParametersPanel';
import { RenderAddress } from '../../components/render/Company'; import { RenderAddress } from '../../components/render/Company';
import { StatusRenderer } from '../../components/render/StatusRenderer'; import { StatusRenderer } from '../../components/render/StatusRenderer';
import { formatCurrency } from '../../defaults/formatters'; import { formatCurrency } from '../../defaults/formatters';
@@ -427,6 +428,10 @@ export default function SalesOrderDetail() {
<Skeleton /> <Skeleton />
) )
}, },
ParametersPanel({
model_type: ModelType.salesorder,
model_id: order.pk
}),
AttachmentPanel({ AttachmentPanel({
model_type: ModelType.salesorder, model_type: ModelType.salesorder,
model_id: order.pk model_id: order.pk

View File

@@ -3,7 +3,6 @@ import {
ApiEndpoints, ApiEndpoints,
type ApiFormFieldSet, type ApiFormFieldSet,
type ModelType, type ModelType,
RowViewAction,
UserRoles, UserRoles,
YesNoButton, YesNoButton,
apiUrl, apiUrl,
@@ -399,14 +398,7 @@ export default function ParametricDataTable({
setSelectedTemplate(null); setSelectedTemplate(null);
addParameter.open(); addParameter.open();
} }
}, }
RowViewAction({
title: t`View`,
modelType: modelType,
modelId: record.pk,
hidden: !user.hasViewPermission(modelType),
navigate: navigate
})
]; ];
}, },
[modelType, user] [modelType, user]
@@ -429,6 +421,7 @@ export default function ParametricDataTable({
parameters: true, parameters: true,
...parametricQueryFilters ...parametricQueryFilters
}, },
modelType: modelType,
onCellClick: ({ event, record, index, column, columnIndex }) => { onCellClick: ({ event, record, index, column, columnIndex }) => {
cancelEvent(event); cancelEvent(event);

View File

@@ -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<string, any>;
}): ReactNode {
const customColumns: TableColumn[] = useMemo(() => {
return [
ReferenceColumn({}),
{
accessor: 'supplier__name',
title: t`Supplier`,
sortable: true,
render: (record: any) => (
<CompanyColumn company={record.supplier_detail} />
)
}
];
}, []);
const customFilters: TableFilter[] = useMemo(() => {
return [
OrderStatusFilter({ model: ModelType.purchaseorder }),
OutstandingFilter(),
OverdueFilter(),
AssignedToMeFilter(),
ProjectCodeFilter(),
ResponsibleFilter()
];
}, []);
return (
<ParametricDataTable
modelType={ModelType.purchaseorder}
endpoint={ApiEndpoints.purchase_order_list}
customColumns={customColumns}
customFilters={customFilters}
queryParams={{
...queryParams,
supplier_detail: true
}}
/>
);
}

View File

@@ -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<string, any>;
}): ReactNode {
const customColumns: TableColumn[] = useMemo(() => {
return [
ReferenceColumn({}),
{
accessor: 'customer__name',
title: t`Customer`,
sortable: true,
render: (record: any) => (
<CompanyColumn company={record.customer_detail} />
)
}
];
}, []);
const customFilters: TableFilter[] = useMemo(() => {
return [
OrderStatusFilter({ model: ModelType.returnorder }),
OutstandingFilter(),
OverdueFilter(),
AssignedToMeFilter(),
ProjectCodeFilter(),
ResponsibleFilter()
];
}, []);
return (
<ParametricDataTable
modelType={ModelType.returnorder}
endpoint={ApiEndpoints.return_order_list}
customColumns={customColumns}
customFilters={customFilters}
queryParams={{
...queryParams,
customer_detail: true
}}
/>
);
}

View File

@@ -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<string, any>;
}): ReactNode {
const customColumns: TableColumn[] = useMemo(() => {
return [
ReferenceColumn({}),
{
accessor: 'customer__name',
title: t`Customer`,
sortable: true,
render: (record: any) => (
<CompanyColumn company={record.customer_detail} />
)
}
];
}, []);
const customFilters: TableFilter[] = useMemo(() => {
return [
OrderStatusFilter({ model: ModelType.salesorder }),
OutstandingFilter(),
OverdueFilter(),
AssignedToMeFilter(),
ProjectCodeFilter(),
ResponsibleFilter()
];
}, []);
return (
<ParametricDataTable
modelType={ModelType.salesorder}
endpoint={ApiEndpoints.sales_order_list}
customColumns={customColumns}
customFilters={customFilters}
queryParams={{
...queryParams,
customer_detail: true
}}
/>
);
}