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');
});