diff --git a/src/frontend/src/pages/part/PartDetailsPanel.tsx b/src/frontend/src/pages/part/PartDetailsPanel.tsx index 1860f6e6a2..64cea50a98 100644 --- a/src/frontend/src/pages/part/PartDetailsPanel.tsx +++ b/src/frontend/src/pages/part/PartDetailsPanel.tsx @@ -266,6 +266,7 @@ export function PartDetailsPanel({ label: t`Saleable Part` }, { type: 'boolean', name: 'virtual', label: t`Virtual Part` }, + { type: 'boolean', name: 'consumable', label: t`Consumable Part` }, { type: 'boolean', name: 'starred', label: t`Subscribed`, icon: 'bell' } ]; diff --git a/src/frontend/tests/pages/pui_part.spec.ts b/src/frontend/tests/pages/pui_part.spec.ts index ff79ff3187..2990d4d49f 100644 --- a/src/frontend/tests/pages/pui_part.spec.ts +++ b/src/frontend/tests/pages/pui_part.spec.ts @@ -627,6 +627,18 @@ test('Parts - Details', async ({ browser }) => { await page.getByText('2022-04-29').waitFor(); await page.getByText('Latest Serial Number').waitFor(); + + // Non-consumable part + await expect( + page.getByRole('row', { name: 'Consumable Part' }) + ).toContainText('No'); + + // Consumable part + await navigate(page, 'part/921/details'); + + await expect( + page.getByRole('row', { name: 'Consumable Part' }) + ).toContainText('Yes'); }); test('Parts - Details - Upload image modal accepts pasted clipboard image', async ({