diff --git a/src/frontend/src/components/forms/ApiForm.tsx b/src/frontend/src/components/forms/ApiForm.tsx index df6c56e5ad..86c5144ad7 100644 --- a/src/frontend/src/components/forms/ApiForm.tsx +++ b/src/frontend/src/components/forms/ApiForm.tsx @@ -455,6 +455,12 @@ export function ApiForm({ } }) .then((response) => { + const followPk = Array.isArray(response.data) + ? response.data.length === 1 + ? response.data[0]?.pk + : undefined + : response.data?.pk; + switch (response.status) { case 200: case 201: @@ -469,12 +475,12 @@ export function ApiForm({ if ( props.follow && props.modelType && - response.data?.pk && + followPk && !keepOpenRef.current ) { // If we want to automatically follow the returned data if (!!navigate && !keepOpenRef.current) { - navigate(getDetailUrl(props.modelType, response.data?.pk)); + navigate(getDetailUrl(props.modelType, followPk)); } } else if (props.table) { // If we want to automatically update or reload a linked table diff --git a/src/frontend/src/pages/stock/StockDetail.tsx b/src/frontend/src/pages/stock/StockDetail.tsx index 5d73866074..fa4bb80fa9 100644 --- a/src/frontend/src/pages/stock/StockDetail.tsx +++ b/src/frontend/src/pages/stock/StockDetail.tsx @@ -431,17 +431,24 @@ export default function StockDetail() { hidden: !stockitem.packaging }, { - type: 'text', + type: 'date', + name: 'creation_date', + icon: 'calendar', + label: t`Created`, + hidden: !stockitem.creation_date + }, + { + type: 'date', name: 'updated', icon: 'calendar', label: t`Last Updated` }, { - type: 'text', - name: 'stocktake', + type: 'date', + name: 'stocktake_date', icon: 'calendar', label: t`Last Stocktake`, - hidden: !stockitem.stocktake + hidden: !stockitem.stocktake_date } ]; diff --git a/src/frontend/src/tables/ColumnRenderers.tsx b/src/frontend/src/tables/ColumnRenderers.tsx index 8d947bbe32..f4c8e9a65b 100644 --- a/src/frontend/src/tables/ColumnRenderers.tsx +++ b/src/frontend/src/tables/ColumnRenderers.tsx @@ -94,6 +94,13 @@ export function PartColumn(props: PartColumnProps): TableColumn { sortable: true, switchable: false, minWidth: '175px', + copyable: (record: any) => { + const part = resolveItem( + record, + props.part ?? props.accessor ?? 'part_detail' + ); + return part?.full_name ?? part?.name ?? ''; + }, render: (record: any) => { const part = resolveItem( record, diff --git a/src/frontend/src/tables/build/BuildLineTable.tsx b/src/frontend/src/tables/build/BuildLineTable.tsx index 26ba76ba23..7bdfb844c5 100644 --- a/src/frontend/src/tables/build/BuildLineTable.tsx +++ b/src/frontend/src/tables/build/BuildLineTable.tsx @@ -304,6 +304,7 @@ export default function BuildLineTable({ {t`No stock available`} ) } @@ -447,7 +448,9 @@ export default function BuildLineTable({ extra={extra} value={ - {formatDecimal(record.requiredQuantity)} + + {formatDecimal(record.requiredQuantity)} + {record?.part_detail?.units && ( [{record.part_detail.units}] )} diff --git a/src/frontend/src/tables/part/PartTable.tsx b/src/frontend/src/tables/part/PartTable.tsx index 583bdacac2..715529ddf0 100644 --- a/src/frontend/src/tables/part/PartTable.tsx +++ b/src/frontend/src/tables/part/PartTable.tsx @@ -181,7 +181,9 @@ function partTableColumns(): TableColumn[] { - {text} + + {text} + {record.units && ( [{record.units}] diff --git a/src/frontend/src/tables/stock/StockItemTable.tsx b/src/frontend/src/tables/stock/StockItemTable.tsx index 3191ce97ed..45b3d1f639 100644 --- a/src/frontend/src/tables/stock/StockItemTable.tsx +++ b/src/frontend/src/tables/stock/StockItemTable.tsx @@ -1,6 +1,5 @@ import { t } from '@lingui/core/macro'; import { useMemo, useState } from 'react'; -import { useNavigate } from 'react-router-dom'; import { ActionButton } from '@lib/components/ActionButton'; import { AddItemButton } from '@lib/components/AddItemButton'; @@ -8,7 +7,6 @@ import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { ModelType } from '@lib/enums/ModelType'; import { UserRoles } from '@lib/enums/Roles'; import { apiUrl } from '@lib/functions/Api'; -import { getDetailUrl } from '@lib/functions/Navigation'; import useTable from '@lib/hooks/UseTable'; import type { TableFilter } from '@lib/types/Filters'; import type { StockOperationProps } from '@lib/types/Forms'; @@ -381,8 +379,6 @@ export function StockItemTable({ [settings] ); - const navigate = useNavigate(); - const tableColumns = useMemo( () => stockItemTableColumns({ @@ -433,11 +429,7 @@ export function StockItemTable({ }, follow: params.openNewStockItem ?? true, table: table, - onFormSuccess: (response: any) => { - // Returns a list that may contain multiple serialized stock items - // Navigate to the first result - navigate(getDetailUrl(ModelType.stockitem, response[0].pk)); - }, + modelType: ModelType.stockitem, successMessage: t`Stock item created`, keepOpenOption: true }); diff --git a/src/frontend/vite.config.ts b/src/frontend/vite.config.ts index 2aa813204e..19175a62ba 100644 --- a/src/frontend/vite.config.ts +++ b/src/frontend/vite.config.ts @@ -90,7 +90,8 @@ export default defineConfig(({ command, mode }) => { } }, define: { - ...__INVENTREE_VERSION_INFO__ + ...__INVENTREE_VERSION_INFO__, + 'process.env.NODE_ENV': JSON.stringify(mode) } }; });