From 9112f9f673d13ad3a46e65456778c09cdd8c33f1 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Wed, 6 Aug 2025 16:56:45 +0530 Subject: [PATCH 1/9] mis out remove expense id from action function --- src/hooks/useExpense.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useExpense.js b/src/hooks/useExpense.js index 233a796c..ec1a45bf 100644 --- a/src/hooks/useExpense.js +++ b/src/hooks/useExpense.js @@ -200,7 +200,7 @@ export const useActionOnExpense = (onSuccessCallBack) => { // } // ); queryClient.invalidateQueries({queryKey:["Expense",updatedExpense.id]}) - queryClient.invalidateQueries({queryKey:["Expenses",updatedExpense.id]}) + queryClient.invalidateQueries({queryKey:["Expenses"]}) if (onSuccessCallBack) onSuccessCallBack(); }, From bd5c2206ddcc72681589233a1735335e857623f8 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 7 Aug 2025 14:27:19 +0530 Subject: [PATCH 2/9] handler run time error --- src/components/Expenses/ExpenseList.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Expenses/ExpenseList.jsx b/src/components/Expenses/ExpenseList.jsx index 37e6b9a9..2c494c09 100644 --- a/src/components/Expenses/ExpenseList.jsx +++ b/src/components/Expenses/ExpenseList.jsx @@ -162,7 +162,7 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText }) => { ]; if (isInitialLoading) return ; - if (isError) return
{error}
; + if (isError) return
{error.message}
; const grouped = groupBy ? groupByField(data?.data ?? [], groupBy) From 466f362221c7706560441d2bbb48dc0e196bd7d8 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 7 Aug 2025 14:39:55 +0530 Subject: [PATCH 3/9] handle condition if project haven't selected --- src/pages/Activities/AttendancePage.jsx | 50 +++++++++++++------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/pages/Activities/AttendancePage.jsx b/src/pages/Activities/AttendancePage.jsx index 65917c3f..d6a3463b 100644 --- a/src/pages/Activities/AttendancePage.jsx +++ b/src/pages/Activities/AttendancePage.jsx @@ -27,7 +27,7 @@ const AttendancePage = () => { const [ShowPending, setShowPending] = useState(false); const queryClient = useQueryClient(); const loginUser = getCachedProfileData(); - var selectedProject = useSelector((store) => store.localVariables.projectId); + const selectedProject = useSelector((store) => store.localVariables.projectId); const dispatch = useDispatch(); const [attendances, setAttendances] = useState(); @@ -155,28 +155,32 @@ const AttendancePage = () => { -
- {activeTab === "all" && ( -
- -
- )} - {activeTab === "logs" && ( -
- -
- )} - {activeTab === "regularization" && DoRegularized && ( -
- -
- )} -
+
+ {selectedProject ? ( + <> + {activeTab === "all" && ( +
+ +
+ )} + {activeTab === "logs" && ( +
+ +
+ )} + {activeTab === "regularization" && DoRegularized && ( +
+ +
+ )} + + ) : ( +
+ Please Select Project! +
+ )} +
+ From 6963e8ca8c2ff32cef9a8241881c78f8dddc2d80 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 7 Aug 2025 15:24:13 +0530 Subject: [PATCH 4/9] resolved taking incorrect date range --- public/assets/vendor/css/core.css | 2 +- src/components/Expenses/ExpenseStatusLogs.jsx | 49 ++++++++++--------- src/components/Expenses/ManageExpense.jsx | 2 +- src/components/Expenses/ViewExpense.jsx | 49 +++++++++++-------- src/components/common/DatePicker.jsx | 33 +++++++------ src/hooks/usePositionTracker.js | 39 +++++++++------ 6 files changed, 96 insertions(+), 78 deletions(-) diff --git a/public/assets/vendor/css/core.css b/public/assets/vendor/css/core.css index 85124986..79538366 100644 --- a/public/assets/vendor/css/core.css +++ b/public/assets/vendor/css/core.css @@ -20475,7 +20475,7 @@ li:not(:first-child) .dropdown-item, } /* text-size */ .text-tiny{ - font-size: 13px; + font-size: 10px; } /* rtl:end:remove */ .text-primary { diff --git a/src/components/Expenses/ExpenseStatusLogs.jsx b/src/components/Expenses/ExpenseStatusLogs.jsx index 443b07ba..575508db 100644 --- a/src/components/Expenses/ExpenseStatusLogs.jsx +++ b/src/components/Expenses/ExpenseStatusLogs.jsx @@ -1,14 +1,19 @@ -import { useState } from "react"; +import { useState,useMemo } from "react"; import Avatar from "../common/Avatar"; import { formatUTCToLocalTime } from "../../utils/dateUtils"; + const ExpenseStatusLogs = ({ data }) => { const [visibleCount, setVisibleCount] = useState(4); - const logsToShow = [...(data?.expenseLogs || [])] - .sort((a, b) => new Date(b.updateAt) - new Date(a.updateAt)) - .slice(0, visibleCount); + const sortedLogs = useMemo(() => { + if (!data?.expenseLogs) return []; + return [...data.expenseLogs].sort( + (a, b) => new Date(b.updateAt) - new Date(a.updateAt) + ); + }, [data?.expenseLogs]); + const logsToShow = sortedLogs.slice(0, visibleCount); const handleShowMore = () => { setVisibleCount((prev) => prev + 4); @@ -17,11 +22,8 @@ const ExpenseStatusLogs = ({ data }) => { return ( <>
- {logsToShow.map((log, index) => ( -
+ {logsToShow.map((log) => ( +
{ />
-
-
-
-
- {`${log.updatedBy.firstName} ${log.updatedBy.lastName}`} - - {log.action} - - {formatUTCToLocalTime(log?.updateAt)} -
-
-
- {log.comment} -
+
+
+ {`${log.updatedBy.firstName} ${log.updatedBy.lastName}`} + + {log.action} + + + {formatUTCToLocalTime(log.updateAt,true)} + +
+
+ {log.comment}
@@ -50,7 +50,7 @@ const ExpenseStatusLogs = ({ data }) => { ))}
- {data?.expenseLogs?.length > visibleCount && ( + {sortedLogs.length > visibleCount && (
-
+
{" "}
-
-
- -
- {data?.gstNumber} + {data?.gstNumber && ( +
+
+ +
{data?.gstNumber}
-
- + )} {/* Row 4 */}
@@ -257,7 +256,7 @@ const ViewExpense = ({ ExpenseId }) => { > Created By : -
+
{
)} -
-
+
+
-
- {data?.paidBy?.firstName} {data?.paidBy?.lastName} +
+ + + {`${data.paidBy?.firstName ?? ""} ${ + data.paidBy?.lastName ?? "" + }`.trim() || "N/A"} +
@@ -363,7 +372,7 @@ const ViewExpense = ({ ExpenseId }) => { )}
)} -
+
{Array.isArray(data?.nextStatus) && data.nextStatus.length > 0 && ( <> diff --git a/src/components/common/DatePicker.jsx b/src/components/common/DatePicker.jsx index 9645fddb..bc0af783 100644 --- a/src/components/common/DatePicker.jsx +++ b/src/components/common/DatePicker.jsx @@ -22,22 +22,23 @@ const DatePicker = ({ }); useEffect(() => { - if (inputRef.current) { - flatpickr(inputRef.current, { - dateFormat: "d-m-Y", - allowInput: allowText, - defaultDate: value - ? flatpickr.parseDate(value, "Y-m-d") - : null, - maxDate:maxDate, - minDate:new Date(minDate?.split("T")[0]) ?? undefined, - onChange: function (selectedDates, dateStr) { - onChange(dateStr); - }, - ...rest - }); - } - }, [inputRef]); + if (inputRef.current) { + const parsedMinDate = minDate ? new Date(minDate.split("T")[0]) : undefined; + + flatpickr(inputRef.current, { + dateFormat: "d-m-Y", + allowInput: allowText, + defaultDate: value ? flatpickr.parseDate(value, "Y-m-d") : null, + maxDate: maxDate, + minDate: parsedMinDate, + onChange: function (selectedDates, dateStr) { + onChange(dateStr); + }, + ...rest + }); + } +}, [inputRef, minDate, maxDate]); + return (
diff --git a/src/hooks/usePositionTracker.js b/src/hooks/usePositionTracker.js index 43ed4e9d..9c180b1f 100644 --- a/src/hooks/usePositionTracker.js +++ b/src/hooks/usePositionTracker.js @@ -1,20 +1,27 @@ import { useState, useEffect } from 'react'; import showToast from '../services/toastService'; -export const usePositionTracker = () => { - const [coords, setCoords] = useState({ latitude: 0, longitude: 0 }); +let hasShownLocationErrorToast = false; // global flag - useEffect(() => { - const locationID = navigator.geolocation.watchPosition( - ({ coords }) => { - setCoords(coords); - }, - (error) => { - showToast("Please Allow Location","warn"); - }, - { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 } - ); - return () => navigator.geolocation.clearWatch(locationID); - }, []); - return coords; - }; \ No newline at end of file +export const usePositionTracker = () => { + const [coords, setCoords] = useState({ latitude: 0, longitude: 0 }); + + useEffect(() => { + const locationID = navigator.geolocation.watchPosition( + ({ coords }) => { + setCoords(coords); + }, + (error) => { + if (!hasShownLocationErrorToast) { + showToast("Please Allow Location", "warn"); + hasShownLocationErrorToast = true; + } + }, + { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 } + ); + + return () => navigator.geolocation.clearWatch(locationID); + }, []); + + return coords; +}; From f3e60bf8bcfb15ce56f1b034e28a72a8be851f57 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 7 Aug 2025 15:50:33 +0530 Subject: [PATCH 5/9] added proper date --- public/assets/vendor/css/core.css | 2 +- src/components/common/DatePicker.jsx | 33 ++++++++++++++-------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/public/assets/vendor/css/core.css b/public/assets/vendor/css/core.css index 79538366..85124986 100644 --- a/public/assets/vendor/css/core.css +++ b/public/assets/vendor/css/core.css @@ -20475,7 +20475,7 @@ li:not(:first-child) .dropdown-item, } /* text-size */ .text-tiny{ - font-size: 10px; + font-size: 13px; } /* rtl:end:remove */ .text-primary { diff --git a/src/components/common/DatePicker.jsx b/src/components/common/DatePicker.jsx index bc0af783..929cb5b2 100644 --- a/src/components/common/DatePicker.jsx +++ b/src/components/common/DatePicker.jsx @@ -22,23 +22,22 @@ const DatePicker = ({ }); useEffect(() => { - if (inputRef.current) { - const parsedMinDate = minDate ? new Date(minDate.split("T")[0]) : undefined; - - flatpickr(inputRef.current, { - dateFormat: "d-m-Y", - allowInput: allowText, - defaultDate: value ? flatpickr.parseDate(value, "Y-m-d") : null, - maxDate: maxDate, - minDate: parsedMinDate, - onChange: function (selectedDates, dateStr) { - onChange(dateStr); - }, - ...rest - }); - } -}, [inputRef, minDate, maxDate]); - + if (inputRef.current) { + flatpickr(inputRef.current, { + dateFormat: "d-m-Y", + allowInput: allowText, + defaultDate: value + ? flatpickr.parseDate(value, "Y-m-d") + : null, + maxDate:maxDate, + minDate:new Date(minDate?.split("T")[0]) ?? null, + onChange: (selectedDates, dateStr) => { + onChange(dateStr); + }, + ...rest + }); + } + }, [inputRef]); return (
From 11b1cf22b5a06f0bbf10117f2d9eee9c76cebfc4 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 7 Aug 2025 16:09:47 +0530 Subject: [PATCH 6/9] handle expense view permission --- src/pages/Expense/ExpensePage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Expense/ExpensePage.jsx b/src/pages/Expense/ExpensePage.jsx index 4afdb194..8b2e44ba 100644 --- a/src/pages/Expense/ExpensePage.jsx +++ b/src/pages/Expense/ExpensePage.jsx @@ -107,7 +107,7 @@ const ExpensePage = () => {
- {(IsViewAll || IsViewSelf) ? ( + {(IsViewAll || IsViewSelf && IsCreatedAble) ? ( <>
From a0762c3f0f0127f98249e45fb1470e078e72c152 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 7 Aug 2025 16:55:52 +0530 Subject: [PATCH 7/9] correct date picker --- src/components/common/DatePicker.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/common/DatePicker.jsx b/src/components/common/DatePicker.jsx index 929cb5b2..9645fddb 100644 --- a/src/components/common/DatePicker.jsx +++ b/src/components/common/DatePicker.jsx @@ -30,8 +30,8 @@ const DatePicker = ({ ? flatpickr.parseDate(value, "Y-m-d") : null, maxDate:maxDate, - minDate:new Date(minDate?.split("T")[0]) ?? null, - onChange: (selectedDates, dateStr) => { + minDate:new Date(minDate?.split("T")[0]) ?? undefined, + onChange: function (selectedDates, dateStr) { onChange(dateStr); }, ...rest From 248254ba3bcac9fa99f9c18067c45c9e5c69b09f Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 7 Aug 2025 17:36:25 +0530 Subject: [PATCH 8/9] view expense if have any one permission of - viewself, upload, viewALl --- src/pages/Expense/ExpensePage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Expense/ExpensePage.jsx b/src/pages/Expense/ExpensePage.jsx index 8b2e44ba..a8be4e72 100644 --- a/src/pages/Expense/ExpensePage.jsx +++ b/src/pages/Expense/ExpensePage.jsx @@ -107,7 +107,7 @@ const ExpensePage = () => {
- {(IsViewAll || IsViewSelf && IsCreatedAble) ? ( + {(IsViewAll || IsViewSelf || IsCreatedAble) ? ( <>
From 27bbdae43383171e1f4255cf928b6f76b1a9d609 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Thu, 7 Aug 2025 17:38:01 +0530 Subject: [PATCH 9/9] added margin for reimburment sectin --- src/components/Expenses/ViewExpense.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Expenses/ViewExpense.jsx b/src/components/Expenses/ViewExpense.jsx index b56ed868..568b695d 100644 --- a/src/components/Expenses/ViewExpense.jsx +++ b/src/components/Expenses/ViewExpense.jsx @@ -338,7 +338,7 @@ const ViewExpense = ({ ExpenseId }) => {
{data.expensesReimburse && ( -
+