2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-10-30 12:45:42 +00:00
Files
InvenTree/src/frontend/src/tables/general/ExtraLineItemTable.tsx
Oliver 96dfee4018 [feature] Project code per line (#10657)
* Add project code to line items

* Refactor AbstractOrderSerialiazer

* Refactor AbstractOrderLineItem serializer

* Refactoring for AbstractExtraLineSerializer

* UI elements for extra line item project code

* UI for ReturnOrderLineItems

* UI elements for SalesOrderLineItem

* UI elements for PurchaseOrderLineItem

* Docs updates

* Update API version and CHANGELOG
2025-10-24 15:10:58 +11:00

187 lines
4.5 KiB
TypeScript

import { t } from '@lingui/core/macro';
import { useCallback, useMemo, useState } from 'react';
import { AddItemButton } from '@lib/components/AddItemButton';
import {
type RowAction,
RowDeleteAction,
RowDuplicateAction,
RowEditAction
} from '@lib/components/RowActions';
import type { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import type { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api';
import type { TableColumn } from '@lib/types/Tables';
import { formatCurrency } from '../../defaults/formatters';
import { extraLineItemFields } from '../../forms/CommonForms';
import {
useCreateApiFormModal,
useDeleteApiFormModal,
useEditApiFormModal
} from '../../hooks/UseForm';
import { useTable } from '../../hooks/UseTable';
import { useUserState } from '../../states/UserState';
import {
DecimalColumn,
DescriptionColumn,
LinkColumn,
NoteColumn,
ProjectCodeColumn
} from '../ColumnRenderers';
import { InvenTreeTable } from '../InvenTreeTable';
export default function ExtraLineItemTable({
endpoint,
orderId,
orderDetailRefresh,
currency,
editable,
role
}: Readonly<{
endpoint: ApiEndpoints;
orderId: number;
editable: boolean;
orderDetailRefresh: () => void;
currency: string;
role: UserRoles;
}>) {
const table = useTable('extra-line-item');
const user = useUserState();
const tableColumns: TableColumn[] = useMemo(() => {
return [
{
accessor: 'reference',
switchable: false
},
DescriptionColumn({}),
DecimalColumn({
accessor: 'quantity',
switchable: false
}),
{
accessor: 'price',
title: t`Unit Price`,
render: (record: any) =>
formatCurrency(record.price, {
currency: record.price_currency
})
},
{
accessor: 'total_price',
title: t`Total Price`,
render: (record: any) =>
formatCurrency(record.price, {
currency: record.price_currency,
multiplier: record.quantity
})
},
ProjectCodeColumn({}),
NoteColumn({
accessor: 'notes'
}),
LinkColumn({
accessor: 'link'
})
];
}, []);
const [initialData, setInitialData] = useState<any>({});
const [selectedLine, setSelectedLine] = useState<number>(0);
const newLineItem = useCreateApiFormModal({
url: endpoint,
title: t`Add Line Item`,
fields: extraLineItemFields(),
initialData: {
...initialData,
price_currency: currency
},
onFormSuccess: orderDetailRefresh,
table: table
});
const editLineItem = useEditApiFormModal({
url: endpoint,
pk: selectedLine,
title: t`Edit Line Item`,
fields: extraLineItemFields(),
onFormSuccess: orderDetailRefresh,
table: table
});
const deleteLineItem = useDeleteApiFormModal({
url: endpoint,
pk: selectedLine,
title: t`Delete Line Item`,
onFormSuccess: orderDetailRefresh,
table: table
});
const rowActions = useCallback(
(record: any): RowAction[] => {
return [
RowEditAction({
hidden: !editable || !user.hasChangeRole(role),
onClick: () => {
setSelectedLine(record.pk);
editLineItem.open();
}
}),
RowDuplicateAction({
hidden: !editable || !user.hasAddRole(role),
onClick: () => {
setInitialData({ ...record });
newLineItem.open();
}
}),
RowDeleteAction({
hidden: !editable || !user.hasDeleteRole(role),
onClick: () => {
setSelectedLine(record.pk);
deleteLineItem.open();
}
})
];
},
[editable, user, role]
);
const tableActions = useMemo(() => {
return [
<AddItemButton
key='add-line-item'
tooltip={t`Add Extra Line Item`}
hidden={!editable || !user.hasAddRole(role)}
onClick={() => {
setInitialData({
order: orderId
});
newLineItem.open();
}}
/>
];
}, [editable, user, role]);
return (
<>
{newLineItem.modal}
{editLineItem.modal}
{deleteLineItem.modal}
<InvenTreeTable
tableState={table}
url={apiUrl(endpoint)}
columns={tableColumns}
props={{
params: {
order: orderId
},
rowActions: rowActions,
tableActions: tableActions
}}
/>
</>
);
}