From cbe547b873199a51691996ac1b22617a4e781844 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Oct 2024 07:16:38 +1100 Subject: [PATCH] Add "View Part" action in BuildLineTable (#8335) --- .../src/tables/build/BuildLineTable.tsx | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/frontend/src/tables/build/BuildLineTable.tsx b/src/frontend/src/tables/build/BuildLineTable.tsx index 3a15f525f6..bc95ee134b 100644 --- a/src/frontend/src/tables/build/BuildLineTable.tsx +++ b/src/frontend/src/tables/build/BuildLineTable.tsx @@ -8,6 +8,7 @@ import { IconWand } from '@tabler/icons-react'; import { useCallback, useMemo, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; import { ActionButton } from '../../components/buttons/ActionButton'; import { ProgressBar } from '../../components/items/ProgressBar'; @@ -18,7 +19,9 @@ import { useAllocateStockToBuildForm, useBuildOrderFields } from '../../forms/BuildForms'; +import { navigateToLink } from '../../functions/navigation'; import { notYetImplemented } from '../../functions/notifications'; +import { getDetailUrl } from '../../functions/urls'; import { useCreateApiFormModal } from '../../hooks/UseForm'; import useStatusCodes from '../../hooks/UseStatusCodes'; import { useTable } from '../../hooks/UseTable'; @@ -44,6 +47,7 @@ export default function BuildLineTable({ }>) { const table = useTable('buildline'); const user = useUserState(); + const navigate = useNavigate(); const buildStatus = useStatusCodes({ modelType: ModelType.build }); const isActive: boolean = useMemo(() => { @@ -367,34 +371,38 @@ export default function BuildLineTable({ const rowActions = useCallback( (record: any): RowAction[] => { let part = record.part_detail ?? {}; - - // Consumable items have no appropriate actions - if (record?.bom_item_detail?.consumable) { - return []; - } - - // Only allow actions when build is in production - if (!build?.status || build.status != buildStatus.PRODUCTION) { - return []; - } + const in_production = build.status == buildStatus.PRODUCTION; + const consumable = record.bom_item_detail?.consumable ?? false; const hasOutput = !!outputId; // Can allocate let canAllocate = + in_production && + !consumable && user.hasChangeRole(UserRoles.build) && record.allocated < record.quantity && record.trackable == hasOutput; // Can de-allocate let canDeallocate = + in_production && + !consumable && user.hasChangeRole(UserRoles.build) && record.allocated > 0 && record.trackable == hasOutput; let canOrder = - user.hasAddRole(UserRoles.purchase_order) && part.purchaseable; - let canBuild = user.hasAddRole(UserRoles.build) && part.assembly; + in_production && + !consumable && + user.hasAddRole(UserRoles.purchase_order) && + part.purchaseable; + + let canBuild = + in_production && + !consumable && + user.hasAddRole(UserRoles.build) && + part.assembly; return [ { @@ -437,6 +445,17 @@ export default function BuildLineTable({ }); newBuildOrder.open(); } + }, + { + icon: , + title: t`View Part`, + onClick: (event: any) => { + navigateToLink( + getDetailUrl(ModelType.part, record.part), + navigate, + event + ); + } } ]; },