From e567d6b3459c0adfebb18f72919404f238e94e2a Mon Sep 17 00:00:00 2001 From: shancds Date: Mon, 26 May 2025 08:59:58 +0530 Subject: [PATCH 1/6] feat(ratecard): add minimum value constraint to rate input fields --- .../src/features/finance/ratecard-drawer/ratecard-drawer.tsx | 1 + .../finance/ratecard-tab/reatecard-table/ratecard-table.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx b/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx index 15a0d62a..e39ca10d 100644 --- a/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx +++ b/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx @@ -259,6 +259,7 @@ const RatecardDrawer = ({ { Date: Mon, 26 May 2025 10:18:49 +0530 Subject: [PATCH 2/6] feat(ratecard-drawer): enhance rate card deletion logic and button disable condition feat(ratecard-settings): update useEffect dependencies for fetching rate cards --- .../src/features/finance/ratecard-drawer/ratecard-drawer.tsx | 4 ++-- .../src/pages/settings/ratecard/ratecard-settings.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx b/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx index e39ca10d..70db6293 100644 --- a/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx +++ b/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx @@ -292,7 +292,7 @@ const RatecardDrawer = ({ if ( drawerRatecard && (drawerRatecard.jobRolesList?.length === 0 || !drawerRatecard.jobRolesList) && - name === 'Untitled Rate Card' + (name === 'Untitled Rate Card' || name === '' || name === undefined) ) { await dispatch(deleteRateCard(drawerRatecard.id as string)); } @@ -344,7 +344,7 @@ const RatecardDrawer = ({ width={700} footer={ - + } > diff --git a/worklenz-frontend/src/pages/settings/ratecard/ratecard-settings.tsx b/worklenz-frontend/src/pages/settings/ratecard/ratecard-settings.tsx index 4e149e84..d236e91a 100644 --- a/worklenz-frontend/src/pages/settings/ratecard/ratecard-settings.tsx +++ b/worklenz-frontend/src/pages/settings/ratecard/ratecard-settings.tsx @@ -87,7 +87,7 @@ const RatecardSettings: React.FC = () => { useEffect(() => { fetchRateCards(); - }, [toggleRatecardDrawer]); + }, [toggleRatecardDrawer, dispatch]); From f68c72a92a85f5155e9052216f516bd8034c61d2 Mon Sep 17 00:00:00 2001 From: shancds Date: Mon, 26 May 2025 10:26:51 +0530 Subject: [PATCH 3/6] feat(ratecard-drawer): add confirmation popover for role deletion and improve button styling --- .../ratecard-drawer/ratecard-drawer.tsx | 49 ++++++++++++------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx b/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx index 70db6293..2855cea0 100644 --- a/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx +++ b/worklenz-frontend/src/features/finance/ratecard-drawer/ratecard-drawer.tsx @@ -1,4 +1,4 @@ -import { Drawer, Select, Typography, Flex, Button, Input, Table } from 'antd'; +import { Drawer, Select, Typography, Flex, Button, Input, Table, Popconfirm, Tooltip } from 'antd'; import React, { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useAppSelector } from '../../../hooks/useAppSelector'; @@ -7,7 +7,8 @@ import { deleteRateCard, fetchRateCardById, fetchRateCards, toggleRatecardDrawer import { RatecardType, IJobType } from '@/types/project/ratecard.types'; import { IJobTitlesViewModel } from '@/types/job.types'; import { jobTitlesApiService } from '@/api/settings/job-titles/job-titles.api.service'; -import { DeleteOutlined } from '@ant-design/icons'; +import { DeleteOutlined, ExclamationCircleFilled } from '@ant-design/icons'; +import { colors } from '@/styles/colors'; interface PaginationType { current: number; @@ -220,7 +221,7 @@ const RatecardDrawer = ({ setAddingRowIndex(null); }} onBlur={() => { - if (roles[index].job_title_id === ""){ + if (roles[index].job_title_id === "") { handleDeleteRole(index); } setEditingRowIndex(null); @@ -244,7 +245,7 @@ const RatecardDrawer = ({ return ( setEditingRowIndex(index)} + // onClick={() => setEditingRowIndex(index)} > {record.jobtitle} @@ -280,11 +281,25 @@ const RatecardDrawer = ({ title: t('actionsColumn') || 'Actions', dataIndex: 'actions', render: (_: any, __: any, index: number) => ( - + } > @@ -356,13 +371,13 @@ const RatecardDrawer = ({ pagination={false} footer={() => ( + type="dashed" + onClick={handleAddRole} + block + style={{ margin: 0, padding: 0 }} + > + {t('addRoleButton')} + )} /> From 85280c33d27d73b05a5952c48316549921bc2ff2 Mon Sep 17 00:00:00 2001 From: shancds Date: Mon, 26 May 2025 16:25:12 +0530 Subject: [PATCH 4/6] feat(members-time-sheet): enhance tooltip display with utilization status and color coding --- .../members-time-sheet/members-time-sheet.tsx | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/worklenz-frontend/src/pages/reporting/time-reports/members-time-sheet/members-time-sheet.tsx b/worklenz-frontend/src/pages/reporting/time-reports/members-time-sheet/members-time-sheet.tsx index 7283a40a..12248c70 100644 --- a/worklenz-frontend/src/pages/reporting/time-reports/members-time-sheet/members-time-sheet.tsx +++ b/worklenz-frontend/src/pages/reporting/time-reports/members-time-sheet/members-time-sheet.tsx @@ -83,17 +83,38 @@ const MembersTimeSheet = forwardRef((_, ref) => { }, tooltip: { callbacks: { - label: function(context: any) { + label: function (context: any) { const idx = context.dataIndex; const member = jsonData[idx]; const hours = member?.utilized_hours || '0.00'; - const percent = member?.utilization_percent || '0.00'; + const percent = parseFloat(member?.utilization_percent || '0.00'); const overUnder = member?.over_under_utilized_hours || '0.00'; + let status = ''; + let color = ''; + if (percent < 90) { + status = 'Under'; + } else if (percent <= 110) { + status = 'Optimal'; + } else { + status = 'Over'; + } return [ `${context.dataset.label}: ${hours} h`, `Utilization: ${percent}%`, - `Over/Under Utilized: ${overUnder} h` + `${status} Utilized: ${overUnder} h` ]; + }, + labelTextColor: function (context: any) { + const idx = context.dataIndex; + const member = jsonData[idx]; + const utilization = parseFloat(member?.utilization_percent || '0'); + if (utilization < 90) { + return '#FFB546'; + } else if (utilization >= 90 && utilization <= 110) { + return '#B2EF9A'; + } else { + return '#FE7173'; + } } } } @@ -136,7 +157,7 @@ const MembersTimeSheet = forwardRef((_, ref) => { const fetchChartData = async () => { try { setLoading(true); - + const selectedTeams = teams.filter(team => team.selected); const selectedProjects = filterProjects.filter(project => project.selected); const selectedCategories = categories.filter(category => category.selected); @@ -169,7 +190,7 @@ const MembersTimeSheet = forwardRef((_, ref) => { if (chartRef.current) { // Get the canvas element const canvas = chartRef.current.canvas; - + // Create a temporary canvas to draw with background const tempCanvas = document.createElement('canvas'); const tempCtx = tempCanvas.getContext('2d'); @@ -216,4 +237,4 @@ const MembersTimeSheet = forwardRef((_, ref) => { MembersTimeSheet.displayName = 'MembersTimeSheet'; -export default MembersTimeSheet; +export default MembersTimeSheet; \ No newline at end of file From da98fe26abd8d85eb8d073ca78ae1888ef0d6e81 Mon Sep 17 00:00:00 2001 From: shancds Date: Mon, 26 May 2025 16:46:53 +0530 Subject: [PATCH 5/6] feat(subtask-table): add titles to table columns for better clarity --- .../task-drawer/shared/info-tab/subtask-table.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/subtask-table.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/subtask-table.tsx index 5d63c177..45b48b96 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/subtask-table.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/subtask-table.tsx @@ -166,9 +166,11 @@ const SubTaskTable = ({ subTasks, loadingSubTasks, refreshSubTasks, t }: SubTask { key: 'name', dataIndex: 'name', + title: 'Name', }, { key: 'priority', + title: 'Priority', render: (record: IProjectTask) => ( ( , }, { key: 'actionBtns', + title: 'Actions', width: 80, render: (record: IProjectTask) => ( @@ -230,7 +235,6 @@ const SubTaskTable = ({ subTasks, loadingSubTasks, refreshSubTasks, t }: SubTask {subTasks.length > 0 && ( record?.id || nanoid()} From c55e593535ea92d747bc5b84c209c10607052ed4 Mon Sep 17 00:00:00 2001 From: shancds Date: Mon, 26 May 2025 16:58:51 +0530 Subject: [PATCH 6/6] feat(project-view-finance): add confirmation messages for delete actions --- .../public/locales/en/project-view-finance.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worklenz-frontend/public/locales/en/project-view-finance.json b/worklenz-frontend/public/locales/en/project-view-finance.json index bb2bc30b..2b7e4d54 100644 --- a/worklenz-frontend/public/locales/en/project-view-finance.json +++ b/worklenz-frontend/public/locales/en/project-view-finance.json @@ -29,7 +29,10 @@ "labourHoursColumn": "Labour Hours", "actions": "Actions", "selectJobTitle": "Select Job Title", - "ratecardsPluralText": "Rate Card Templates" + "ratecardsPluralText": "Rate Card Templates", + "deleteConfirm": "Are you sure ?", + "yes": "Yes", + "no": "No" } \ No newline at end of file