From c031a49a2993ba18c7e4a29026faa42b832dc933 Mon Sep 17 00:00:00 2001 From: chamikaJ Date: Fri, 6 Jun 2025 14:43:30 +0530 Subject: [PATCH] refactor(project-finance): enhance financial statistics display and formatting - Updated the layout of financial statistics in the ProjectViewFinance component for improved responsiveness and visual clarity. - Adjusted the formatting of variance and budget utilization values to ensure consistent presentation, including prefix and suffix adjustments. - Refactored the FinanceTable component to display variance values with appropriate signs and formatting. - Implemented the use of createPortal for rendering the FinanceDrawer, improving modal management. --- .../finance-table/finance-table-wrapper.tsx | 7 +- .../finance-table/finance-table.tsx | 12 +++- .../finance/project-view-finance.tsx | 65 +++++++++++-------- 3 files changed, 52 insertions(+), 32 deletions(-) diff --git a/worklenz-frontend/src/pages/projects/projectView/finance/finance-tab/finance-table/finance-table-wrapper.tsx b/worklenz-frontend/src/pages/projects/projectView/finance/finance-tab/finance-table/finance-table-wrapper.tsx index 1c4419aa..0e5b6dd0 100644 --- a/worklenz-frontend/src/pages/projects/projectView/finance/finance-tab/finance-table/finance-table-wrapper.tsx +++ b/worklenz-frontend/src/pages/projects/projectView/finance/finance-tab/finance-table/finance-table-wrapper.tsx @@ -9,6 +9,7 @@ import { financeTableColumns, FinanceTableColumnKeys } from '@/lib/project/proje import FinanceTable from './finance-table'; import FinanceDrawer from '@/features/finance/finance-drawer/finance-drawer'; import { IProjectFinanceGroup } from '@/types/project/project-finance.types'; +import { createPortal } from 'react-dom'; interface FinanceTableWrapperProps { activeTablesList: IProjectFinanceGroup[]; @@ -128,7 +129,9 @@ const FinanceTableWrapper: React.FC = ({ activeTablesL fontSize: 18, }} > - {`${totals.variance?.toFixed(2)}`} + {totals.variance < 0 ? `+${Math.abs(totals.variance).toFixed(2)}` : + totals.variance > 0 ? `-${totals.variance.toFixed(2)}` : + `${totals.variance?.toFixed(2)}`} ); case FinanceTableColumnKeys.TOTAL_TIME_LOGGED: @@ -243,7 +246,7 @@ const FinanceTableWrapper: React.FC = ({ activeTablesL - + {createPortal(, document.body)} ); }; diff --git a/worklenz-frontend/src/pages/projects/projectView/finance/finance-tab/finance-table/finance-table.tsx b/worklenz-frontend/src/pages/projects/projectView/finance/finance-tab/finance-table/finance-table.tsx index 96809d80..8c8b74b6 100644 --- a/worklenz-frontend/src/pages/projects/projectView/finance/finance-tab/finance-table/finance-table.tsx +++ b/worklenz-frontend/src/pages/projects/projectView/finance/finance-tab/finance-table/finance-table.tsx @@ -125,7 +125,13 @@ const FinanceTable = ({ case FinanceTableColumnKeys.TOTAL_ACTUAL: return {formatNumber(formattedTotals.total_actual)}; case FinanceTableColumnKeys.VARIANCE: - return 0 ? '#FF0000' : '#6DC376' }}>{formatNumber(formattedTotals.variance)}; + return ( + 0 ? '#FF0000' : '#6DC376' }}> + {formattedTotals.variance < 0 ? '+' + formatNumber(Math.abs(formattedTotals.variance)) : + formattedTotals.variance > 0 ? '-' + formatNumber(formattedTotals.variance) : + formatNumber(formattedTotals.variance)} + + ); default: return null; } @@ -325,7 +331,9 @@ const FinanceTable = ({ color: task.variance > 0 ? '#FF0000' : '#6DC376' }} > - {formatNumber(task.variance)} + {task.variance < 0 ? '+' + formatNumber(Math.abs(task.variance)) : + task.variance > 0 ? '-' + formatNumber(task.variance) : + formatNumber(task.variance)} ); case FinanceTableColumnKeys.TOTAL_BUDGET: diff --git a/worklenz-frontend/src/pages/projects/projectView/finance/project-view-finance.tsx b/worklenz-frontend/src/pages/projects/projectView/finance/project-view-finance.tsx index 6d0d9355..4b75d264 100644 --- a/worklenz-frontend/src/pages/projects/projectView/finance/project-view-finance.tsx +++ b/worklenz-frontend/src/pages/projects/projectView/finance/project-view-finance.tsx @@ -314,90 +314,99 @@ const ProjectViewFinance = () => { } style={{ marginBottom: 16 }} loading={loading} + size="small" > - - + + - + - + = 0 ? '+' : ''} - suffix={projectCurrency.toUpperCase()} + prefix={projectCurrency.toUpperCase()} + suffix={budgetStatistics.totalVariance < 0 ? ' under' : budgetStatistics.totalVariance > 0 ? ' over' : ''} valueStyle={{ - color: budgetStatistics.totalVariance > 0 ? '#ff4d4f' : '#52c41a' + color: budgetStatistics.totalVariance > 0 ? '#ff4d4f' : '#52c41a', + fontSize: '16px' }} + style={{ textAlign: 'center' }} /> - + 100 ? '#ff4d4f' : - budgetStatistics.budgetUtilization > 80 ? '#faad14' : '#52c41a' + budgetStatistics.budgetUtilization > 80 ? '#faad14' : '#52c41a', + fontSize: '16px' }} + style={{ textAlign: 'center' }} /> - - - - + - + - + - + = 0 ? '+' : ''} - suffix={`${projectCurrency.toUpperCase()} remaining`} + suffix={projectCurrency.toUpperCase()} valueStyle={{ - color: budgetStatistics.totalBudget - budgetStatistics.totalActualCost >= 0 ? '#52c41a' : '#ff4d4f' + color: budgetStatistics.totalBudget - budgetStatistics.totalActualCost >= 0 ? '#52c41a' : '#ff4d4f', + fontSize: '16px' }} + style={{ textAlign: 'center' }} />