diff --git a/src/frontend/src/pages/part/pricing/PricingOverviewPanel.tsx b/src/frontend/src/pages/part/pricing/PricingOverviewPanel.tsx index c61603a121..d5382807a1 100644 --- a/src/frontend/src/pages/part/pricing/PricingOverviewPanel.tsx +++ b/src/frontend/src/pages/part/pricing/PricingOverviewPanel.tsx @@ -50,6 +50,7 @@ interface PricingOverviewEntry { min_currency?: string | null | undefined; max_currency?: string | null | undefined; currency?: string | null | undefined; + hide_on_chart?: boolean; } export default function PricingOverviewPanel({ @@ -162,10 +163,12 @@ export default function PricingOverviewPanel({ if (record?.min_value === null || record?.min_value === undefined) { return '-'; } - return formatCurrency(record?.min_value, { - currency: - record.min_currency ?? record.currency ?? pricing?.currency - }); + return ( + formatCurrency(record?.min_value, { + currency: + record.min_currency ?? record.currency ?? pricing?.currency + }) || '-' + ); } }, { @@ -176,10 +179,12 @@ export default function PricingOverviewPanel({ return '-'; } - return formatCurrency(record?.max_value, { - currency: - record.max_currency ?? record.currency ?? pricing?.currency - }); + return ( + formatCurrency(record?.max_value, { + currency: + record.max_currency ?? record.currency ?? pricing?.currency + }) || '-' + ); } } ]; @@ -187,6 +192,14 @@ export default function PricingOverviewPanel({ const overviewData: PricingOverviewEntry[] = useMemo(() => { return [ + { + name: panelOptions.overall, + title: t`Overall Pricing`, + icon: , + min_value: Number.parseFloat(pricing?.overall_min), + max_value: Number.parseFloat(pricing?.overall_max), + valid: pricing?.overall_min != null || pricing?.overall_max != null + }, { name: panelOptions.override, title: t`Override Pricing`, @@ -196,15 +209,8 @@ export default function PricingOverviewPanel({ min_currency: pricing?.override_min_currency ?? pricing?.currency, max_currency: pricing?.override_max_currency ?? pricing?.currency, currency: pricing?.currency, - valid: pricing?.override_min != null && pricing?.override_max != null - }, - { - name: panelOptions.overall, - title: t`Overall Pricing`, - icon: , - min_value: Number.parseFloat(pricing?.overall_min), - max_value: Number.parseFloat(pricing?.overall_max), - valid: pricing?.overall_min != null && pricing?.overall_max != null + valid: pricing?.override_min != null || pricing?.override_max != null, + hide_on_chart: true }, { name: panelOptions.internal, @@ -213,7 +219,7 @@ export default function PricingOverviewPanel({ min_value: Number.parseFloat(pricing?.internal_cost_min), max_value: Number.parseFloat(pricing?.internal_cost_max), valid: - pricing?.internal_cost_min != null && + pricing?.internal_cost_min != null || pricing?.internal_cost_max != null }, { @@ -222,7 +228,7 @@ export default function PricingOverviewPanel({ icon: , min_value: Number.parseFloat(pricing?.bom_cost_min), max_value: Number.parseFloat(pricing?.bom_cost_max), - valid: pricing?.bom_cost_min != null && pricing?.bom_cost_max != null + valid: pricing?.bom_cost_min != null || pricing?.bom_cost_max != null }, { name: panelOptions.purchase, @@ -231,7 +237,7 @@ export default function PricingOverviewPanel({ min_value: Number.parseFloat(pricing?.purchase_cost_min), max_value: Number.parseFloat(pricing?.purchase_cost_max), valid: - pricing?.purchase_cost_min != null && + pricing?.purchase_cost_min != null || pricing?.purchase_cost_max != null }, { @@ -241,7 +247,7 @@ export default function PricingOverviewPanel({ min_value: Number.parseFloat(pricing?.supplier_price_min), max_value: Number.parseFloat(pricing?.supplier_price_max), valid: - pricing?.supplier_price_min != null && + pricing?.supplier_price_min != null || pricing?.supplier_price_max != null }, { @@ -251,7 +257,7 @@ export default function PricingOverviewPanel({ min_value: Number.parseFloat(pricing?.variant_cost_min), max_value: Number.parseFloat(pricing?.variant_cost_max), valid: - pricing?.variant_cost_min != null && pricing?.variant_cost_max != null + pricing?.variant_cost_min != null || pricing?.variant_cost_max != null }, { name: panelOptions.sale_pricing, @@ -260,7 +266,7 @@ export default function PricingOverviewPanel({ min_value: Number.parseFloat(pricing?.sale_price_min), max_value: Number.parseFloat(pricing?.sale_price_max), valid: - pricing?.sale_price_min != null && pricing?.sale_price_max != null + pricing?.sale_price_min != null || pricing?.sale_price_max != null }, { name: panelOptions.sale_history, @@ -269,7 +275,7 @@ export default function PricingOverviewPanel({ min_value: Number.parseFloat(pricing?.sale_history_min), max_value: Number.parseFloat(pricing?.sale_history_max), valid: - pricing?.sale_history_min != null && pricing?.sale_history_max != null + pricing?.sale_history_min != null || pricing?.sale_history_max != null } ].filter((entry) => { return entry.valid; @@ -328,13 +334,29 @@ export default function PricingOverviewPanel({ !entry.hide_on_chart)} title={t`Pricing Overview`} series={[ { name: 'min_value', label: t`Minimum Value`, color: 'blue.6' }, { name: 'max_value', label: t`Maximum Value`, color: 'teal.6' } ]} - valueFormatter={(value) => + referenceLines={[ + { + y: Number.parseFloat(pricing?.override_min), + color: 'orange', + label: t`Override Minimum`, + labelPosition: 'insideBottomLeft' + }, + { + y: Number.parseFloat(pricing?.override_max), + color: 'orange', + label: t`Override Maximum`, + labelPosition: 'insideBottomRight' + } + ]} + xAxisLabel={t`Pricing Category`} + yAxisLabel={t`Price`} + valueFormatter={(value: any) => tooltipFormatter(value, pricing?.currency) } />