From e6470ffdea081f930eb24f9c95069771172b5764 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 27 Sep 2024 22:44:39 +1000 Subject: [PATCH] [PUI] Adjust stock details page (#8196) * Adjust stock details page * Remove unused import * Details rendering fix * Cleanup * Handle null / undefined cases * More cleanup --- .../src/components/details/Details.tsx | 50 ++++++++----------- .../src/components/items/ErrorItem.tsx | 15 +++--- src/frontend/src/pages/stock/StockDetail.tsx | 19 ++++--- 3 files changed, 40 insertions(+), 44 deletions(-) diff --git a/src/frontend/src/components/details/Details.tsx b/src/frontend/src/components/details/Details.tsx index dc3bf96150..c1c9ff0849 100644 --- a/src/frontend/src/components/details/Details.tsx +++ b/src/frontend/src/components/details/Details.tsx @@ -11,7 +11,7 @@ import { } from '@mantine/core'; import { useQuery } from '@tanstack/react-query'; import { getValueAtPath } from 'mantine-datatable'; -import { useCallback, useMemo } from 'react'; +import { ReactNode, useCallback, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { api } from '../../App'; @@ -182,37 +182,28 @@ function NameBadge({ function TableStringValue(props: Readonly) { let value = props?.field_value; - if (props?.field_data?.value_formatter) { - value = props.field_data.value_formatter(); - } - - if (value === undefined) { - return '---'; - } + let renderedValue = null; if (props.field_data?.badge) { return ; + } else if (props?.field_data?.value_formatter) { + renderedValue = props.field_data.value_formatter(); + } else if (value === null || value === undefined) { + renderedValue = '---'; + } else { + renderedValue = {value.toString()}; } return ( -
- - - {value ? value : props.field_data?.unit && '0'}{' '} - {props.field_data.unit == true && props.unit} - - {props.field_data.user && ( - - )} + + + {renderedValue} + {props.field_data.unit == true && {props.unit}} -
+ {props.field_data.user && ( + + )} + ); } @@ -306,7 +297,7 @@ function TableAnchorValue(props: Readonly) { } return ( -
+ <> {make_link ? ( {value} @@ -314,7 +305,7 @@ function TableAnchorValue(props: Readonly) { ) : ( {value} )} -
+ ); } @@ -347,9 +338,6 @@ export function DetailsTableField({ }>) { function getFieldType(type: string) { switch (type) { - case 'text': - case 'string': - return TableStringValue; case 'boolean': return BooleanValue; case 'link': @@ -358,6 +346,8 @@ export function DetailsTableField({ return ProgressBarValue; case 'status': return StatusValue; + case 'text': + case 'string': default: return TableStringValue; } diff --git a/src/frontend/src/components/items/ErrorItem.tsx b/src/frontend/src/components/items/ErrorItem.tsx index b4e1813010..e25e650655 100644 --- a/src/frontend/src/components/items/ErrorItem.tsx +++ b/src/frontend/src/components/items/ErrorItem.tsx @@ -1,18 +1,17 @@ -import { Trans } from '@lingui/macro'; +import { t } from '@lingui/macro'; +import { Alert, Text } from '@mantine/core'; export function ErrorItem({ id, error }: Readonly<{ id: string; error?: any }>) { - const error_message = error?.message || error?.toString() || ( - Unknown error - ); + const error_message = error?.message || error?.toString() || t`Unknown error`; + return ( <> -

- An error occurred: -

- {error_message} + + {error_message} + ); } diff --git a/src/frontend/src/pages/stock/StockDetail.tsx b/src/frontend/src/pages/stock/StockDetail.tsx index fa8d460e5b..5f506a579b 100644 --- a/src/frontend/src/pages/stock/StockDetail.tsx +++ b/src/frontend/src/pages/stock/StockDetail.tsx @@ -94,7 +94,7 @@ export default function StockDetail() { }); const detailsPanel = useMemo(() => { - let data = stockitem; + let data = { ...stockitem }; let part = stockitem?.part_detail ?? {}; data.available_stock = Math.max(0, data.quantity - data.allocated); @@ -164,7 +164,14 @@ export default function StockDetail() { type: 'text', name: 'available_stock', label: t`Available`, - icon: 'quantity' + icon: 'stock' + }, + { + type: 'text', + name: 'allocated', + label: t`Allocated to Orders`, + icon: 'tick_off', + hidden: !stockitem.allocated }, { type: 'text', @@ -281,12 +288,12 @@ export default function StockDetail() { /> - + - - - + + + ); }, [stockitem, instanceQuery]);