diff --git a/src/frontend/src/pages/build/BuildDetail.tsx b/src/frontend/src/pages/build/BuildDetail.tsx index 4e3944a24d..c67ef54c47 100644 --- a/src/frontend/src/pages/build/BuildDetail.tsx +++ b/src/frontend/src/pages/build/BuildDetail.tsx @@ -59,8 +59,8 @@ import { useUserState } from '../../states/UserState'; import BuildAllocatedStockTable from '../../tables/build/BuildAllocatedStockTable'; import BuildLineTable from '../../tables/build/BuildLineTable'; import { BuildOrderTable } from '../../tables/build/BuildOrderTable'; -import BuildOrderTestTable from '../../tables/build/BuildOrderTestTable'; import BuildOutputTable from '../../tables/build/BuildOutputTable'; +import PartTestResultTable from '../../tables/part/PartTestResultTable'; import { PurchaseOrderTable } from '../../tables/purchasing/PurchaseOrderTable'; import { StockItemTable } from '../../tables/stock/StockItemTable'; @@ -525,7 +525,7 @@ export default function BuildDetail() { icon: , hidden: !build.part_detail?.testable, content: build.pk ? ( - + ) : ( ) diff --git a/src/frontend/src/pages/part/PartDetail.tsx b/src/frontend/src/pages/part/PartDetail.tsx index 9fe8174b41..12a8a22ad6 100644 --- a/src/frontend/src/pages/part/PartDetail.tsx +++ b/src/frontend/src/pages/part/PartDetail.tsx @@ -15,6 +15,7 @@ import { import { IconBookmarks, IconBuilding, + IconChecklist, IconCircleCheck, IconClipboardList, IconCurrencyDollar, @@ -101,6 +102,7 @@ import { UsedInTable } from '../../tables/bom/UsedInTable'; import { BuildOrderTable } from '../../tables/build/BuildOrderTable'; import { PartParameterTable } from '../../tables/part/PartParameterTable'; import PartPurchaseOrdersTable from '../../tables/part/PartPurchaseOrdersTable'; +import PartTestResultTable from '../../tables/part/PartTestResultTable'; import PartTestTemplateTable from '../../tables/part/PartTestTemplateTable'; import { PartVariantTable } from '../../tables/part/PartVariantTable'; import { RelatedPartTable } from '../../tables/part/RelatedPartTable'; @@ -933,6 +935,17 @@ export default function PartDetail() { ) }, + { + name: 'test_results', + label: t`Test Results`, + icon: , + hidden: !part.testable || !user.hasViewRole(UserRoles.stock), + content: part?.pk ? ( + + ) : ( + + ) + }, { name: 'related_parts', label: t`Related Parts`, diff --git a/src/frontend/src/pages/stock/StockDetail.tsx b/src/frontend/src/pages/stock/StockDetail.tsx index 5648bda33e..b3eddaddda 100644 --- a/src/frontend/src/pages/stock/StockDetail.tsx +++ b/src/frontend/src/pages/stock/StockDetail.tsx @@ -575,8 +575,8 @@ export default function StockDetail() { ) }, { - name: 'testdata', - label: t`Test Data`, + name: 'test-results', + label: t`Test Results`, icon: , hidden: !stockitem?.part_detail?.testable, content: stockitem?.pk ? ( diff --git a/src/frontend/src/tables/Filter.tsx b/src/frontend/src/tables/Filter.tsx index 4aed278029..9970c72add 100644 --- a/src/frontend/src/tables/Filter.tsx +++ b/src/frontend/src/tables/Filter.tsx @@ -86,6 +86,14 @@ export function BatchFilter(): TableFilter { }; } +export function InStockFilter(): TableFilter { + return { + name: 'in_stock', + label: t`In Stock`, + description: t`Show items which are in stock` + }; +} + export function IsSerializedFilter(): TableFilter { return { name: 'serialized', diff --git a/src/frontend/src/tables/build/BuildOrderTestTable.tsx b/src/frontend/src/tables/part/PartTestResultTable.tsx similarity index 90% rename from src/frontend/src/tables/build/BuildOrderTestTable.tsx rename to src/frontend/src/tables/part/PartTestResultTable.tsx index 99a4f27d44..f4c9cc5d29 100644 --- a/src/frontend/src/tables/build/BuildOrderTestTable.tsx +++ b/src/frontend/src/tables/part/PartTestResultTable.tsx @@ -27,20 +27,38 @@ import { useTestResultFields } from '../../forms/StockForms'; import { useCreateApiFormModal } from '../../hooks/UseForm'; import { useTable } from '../../hooks/UseTable'; import { LocationColumn } from '../ColumnRenderers'; +import { + BatchFilter, + HasBatchCodeFilter, + InStockFilter, + IsSerializedFilter, + SerialFilter, + SerialGTEFilter, + SerialLTEFilter, + StatusFilterOptions +} from '../Filter'; import { InvenTreeTable } from '../InvenTreeTable'; import { TableHoverCard } from '../TableHoverCard'; /** * A table which displays all "test results" for the outputs generated by a build order. */ -export default function BuildOrderTestTable({ +export default function PartTestResultTable({ buildId, partId }: Readonly<{ - buildId: number; + buildId?: number; partId: number; }>) { - const table = useTable('build-tests'); + const tableName = useMemo(() => { + if (buildId) { + return 'build-test-results'; + } else { + return 'part-test-results'; + } + }, [buildId]); + + const table = useTable(tableName); const api = useApi(); // Fetch the test templates required for this build order @@ -227,7 +245,7 @@ export default function BuildOrderTestTable({ const columns: TableColumn[] = [ { accessor: 'stock', - title: t`Build Output`, + title: t`Stock Item`, sortable: true, switchable: false, render: (record: any) => { @@ -258,6 +276,12 @@ export default function BuildOrderTestTable({ } } }, + { + accessor: 'batch', + title: t`Batch Code`, + sortable: true, + switchable: true + }, LocationColumn({ accessor: 'location_detail' }) @@ -272,6 +296,19 @@ export default function BuildOrderTestTable({ name: 'is_building', label: t`In Production`, description: t`Show build outputs currently in production` + }, + InStockFilter(), + SerialFilter(), + SerialGTEFilter(), + SerialLTEFilter(), + HasBatchCodeFilter(), + BatchFilter(), + IsSerializedFilter(), + { + name: 'status', + label: t`Status`, + description: t`Filter by stock status`, + choiceFunction: StatusFilterOptions(ModelType.stockitem) } ]; }, []); diff --git a/src/frontend/src/tables/stock/StockItemTable.tsx b/src/frontend/src/tables/stock/StockItemTable.tsx index 599d1bd7d5..a7a546e45d 100644 --- a/src/frontend/src/tables/stock/StockItemTable.tsx +++ b/src/frontend/src/tables/stock/StockItemTable.tsx @@ -38,6 +38,7 @@ import { import { BatchFilter, HasBatchCodeFilter, + InStockFilter, IncludeVariantsFilter, IsSerializedFilter, ManufacturerFilter, @@ -354,11 +355,7 @@ function stockItemTableFilters({ label: t`Depleted`, description: t`Show depleted stock items` }, - { - name: 'in_stock', - label: t`In Stock`, - description: t`Show items which are in stock` - }, + InStockFilter(), { name: 'is_building', label: t`In Production`, diff --git a/src/frontend/tests/pages/pui_stock.spec.ts b/src/frontend/tests/pages/pui_stock.spec.ts index c198e39d5b..d3b37bc136 100644 --- a/src/frontend/tests/pages/pui_stock.spec.ts +++ b/src/frontend/tests/pages/pui_stock.spec.ts @@ -33,7 +33,7 @@ test('Stock - Basic Tests', async ({ browser }) => { await page.getByText('D.123 | Doohickey').waitFor(); await page.getByText('Batch Code: BX-123-2024-2-7').waitFor(); await loadTab(page, 'Stock Tracking'); - await loadTab(page, 'Test Data'); + await loadTab(page, 'Test Results'); await page.getByText('395c6d5586e5fb656901d047be27e1f7').waitFor(); await loadTab(page, 'Installed Items'); });