diff --git a/src/components/Dashboard/Dashboard.jsx b/src/components/Dashboard/Dashboard.jsx index dbedb169..534fb43f 100644 --- a/src/components/Dashboard/Dashboard.jsx +++ b/src/components/Dashboard/Dashboard.jsx @@ -37,7 +37,6 @@ const Dashboard = () => { const canSelfAttendance = useHasUserPermission(SELF_ATTENDANCE); const { data,isLoading,isError } = useGetCollectionOverview(); - console.log("data-->", data); return (
diff --git a/src/components/Expenses/ExpenseFilterPanel.jsx b/src/components/Expenses/ExpenseFilterPanel.jsx index 61583902..88dc7ccd 100644 --- a/src/components/Expenses/ExpenseFilterPanel.jsx +++ b/src/components/Expenses/ExpenseFilterPanel.jsx @@ -1,4 +1,10 @@ -import React, { forwardRef, useEffect, useImperativeHandle, useState, useMemo } from "react"; +import React, { + forwardRef, + useEffect, + useImperativeHandle, + useState, + useMemo, +} from "react"; import { FormProvider, useForm, Controller } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { defaultFilter, SearchSchema } from "./ExpenseSchema"; @@ -15,282 +21,291 @@ import { useExpenseFilter } from "../../hooks/useExpense"; import { ExpenseFilterSkeleton } from "./ExpenseSkeleton"; import { useLocation, useNavigate, useParams } from "react-router-dom"; -const ExpenseFilterPanel = forwardRef(({ onApply, handleGroupBy, setFilterdata }, ref) => { - const { status } = useParams(); - const navigate = useNavigate(); - const selectedProjectId = useSelector( - (store) => store.localVariables.projectId - ); - const { data, isLoading, isError, error, isFetching, isFetched } = - useExpenseFilter(); +const ExpenseFilterPanel = forwardRef( + ({ onApply, handleGroupBy, setFilterdata }, ref) => { + const { status } = useParams(); + const navigate = useNavigate(); + const selectedProjectId = useSelector( + (store) => store.localVariables.projectId + ); + const { data, isLoading, isError, error, isFetching, isFetched } = + useExpenseFilter(); - const groupByList = useMemo(() => { - return [ - { id: "transactionDate", name: "Transaction Date" }, - { id: "status", name: "Status" }, - { id: "submittedBy", name: "Submitted By" }, - { id: "project", name: "Project" }, - { id: "paymentMode", name: "Payment Mode" }, - { id: "expenseCategory", name: "Expense Category" }, - { id: "createdAt", name: "Submitted Date" }, - ].sort((a, b) => a.name.localeCompare(b.name)); - }, []); + const groupByList = useMemo(() => { + return [ + { id: "none", name: "None" }, + { id: "transactionDate", name: "Transaction Date" }, + { id: "status", name: "Status" }, + { id: "submittedBy", name: "Submitted By" }, + { id: "project", name: "Project" }, + { id: "paymentMode", name: "Payment Mode" }, + { id: "expenseCategory", name: "Expense Category" }, + { id: "createdAt", name: "Submitted Date" }, + ].sort((a, b) => a.name.localeCompare(b.name)); + }, []); - const [selectedGroup, setSelectedGroup] = useState(groupByList[6]); - const [resetKey, setResetKey] = useState(0); + const [selectedGroup, setSelectedGroup] = useState(groupByList[0]); + const [resetKey, setResetKey] = useState(0); - const dynamicDefaultFilter = useMemo(() => { - return { - ...defaultFilter, - statusIds: status ? [status] : defaultFilter.statusIds || [], - projectIds: defaultFilter.projectIds || [], - createdByIds: defaultFilter.createdByIds || [], - paidById: defaultFilter.paidById || [], - expenseCategoryIds: defaultFilter.expenseCategoryIds || [], - isTransactionDate: defaultFilter.isTransactionDate ?? true, - startDate: defaultFilter.startDate, - endDate: defaultFilter.endDate, - }; - }, [status, selectedProjectId]); - - const methods = useForm({ - resolver: zodResolver(SearchSchema), - defaultValues: dynamicDefaultFilter, - }); - - const { control, handleSubmit, reset, setValue, watch } = methods; - const isTransactionDate = watch("isTransactionDate"); - - const closePanel = () => { - document.querySelector(".offcanvas.show .btn-close")?.click(); - }; - - // Change here - useEffect(() => { - if (data && setFilterdata) { - setFilterdata(data); - } - }, [data, setFilterdata]); - - const handleGroupChange = (e) => { - const group = groupByList.find((g) => g.id === e.target.value); - if (group) setSelectedGroup(group); - }; - - useImperativeHandle(ref, () => ({ - resetFieldValue: (name, value) => { - // Reset specific field - if (value !== undefined) { - setValue(name, value); - } else { - reset({ ...methods.getValues(), [name]: defaultFilter[name] }); - } - }, - getValues: methods.getValues, // optional, to read current filter state - })); - - const onSubmit = (formData) => { - onApply({ - ...formData, - startDate: moment.utc(formData.startDate, "DD-MM-YYYY").toISOString(), - endDate: moment.utc(formData.endDate, "DD-MM-YYYY").toISOString(), - }); - handleGroupBy(selectedGroup.id); - // closePanel(); - }; - - const onClear = () => { - reset(defaultFilter); - setResetKey((prev) => prev + 1); - setSelectedGroup(groupByList[0]); - onApply(defaultFilter); - handleGroupBy(groupByList[0].id); - // closePanel(); - if (status) { - navigate("/expenses", { replace: true }); - } - }; - - const location = useLocation(); - useEffect(() => { - closePanel(); - }, [location]); - - const [appliedStatusId, setAppliedStatusId] = useState(null); - - useEffect(() => { - if (!status || !data) return; - - if (status !== appliedStatusId) { - const filterWithStatus = { - ...dynamicDefaultFilter, - projectIds: selectedProjectId ? [selectedProjectId] : dynamicDefaultFilter.projectIds || [], - startDate: dynamicDefaultFilter.startDate - ? moment.utc(dynamicDefaultFilter.startDate, "DD-MM-YYYY").toISOString() - : undefined, - endDate: dynamicDefaultFilter.endDate - ? moment.utc(dynamicDefaultFilter.endDate, "DD-MM-YYYY").toISOString() - : undefined, + const dynamicDefaultFilter = useMemo(() => { + return { + ...defaultFilter, + statusIds: status ? [status] : defaultFilter.statusIds || [], + projectIds: defaultFilter.projectIds || [], + createdByIds: defaultFilter.createdByIds || [], + paidById: defaultFilter.paidById || [], + expenseCategoryIds: defaultFilter.expenseCategoryIds || [], + isTransactionDate: defaultFilter.isTransactionDate ?? true, + startDate: defaultFilter.startDate, + endDate: defaultFilter.endDate, }; + }, [status, selectedProjectId]); - onApply(filterWithStatus); + const methods = useForm({ + resolver: zodResolver(SearchSchema), + defaultValues: dynamicDefaultFilter, + }); + + const { control, handleSubmit, reset, setValue, watch } = methods; + const isTransactionDate = watch("isTransactionDate"); + + const closePanel = () => { + document.querySelector(".offcanvas.show .btn-close")?.click(); + }; + + // Change here + useEffect(() => { + if (data && setFilterdata) { + setFilterdata(data); + } + }, [data, setFilterdata]); + + const handleGroupChange = (e) => { + const group = groupByList.find((g) => g.id === e.target.value); + if (group) setSelectedGroup(group); + }; + + useImperativeHandle(ref, () => ({ + resetFieldValue: (name, value) => { + // Reset specific field + if (value !== undefined) { + setValue(name, value); + } else { + reset({ ...methods.getValues(), [name]: defaultFilter[name] }); + } + }, + getValues: methods.getValues, // optional, to read current filter state + })); + + const onSubmit = (formData) => { + onApply({ + ...formData, + startDate: moment.utc(formData.startDate, "DD-MM-YYYY").toISOString(), + endDate: moment.utc(formData.endDate, "DD-MM-YYYY").toISOString(), + }); handleGroupBy(selectedGroup.id); - setAppliedStatusId(status); - } - }, [ - status, - data, - dynamicDefaultFilter, - onApply, - handleGroupBy, - selectedGroup.id, - appliedStatusId, - selectedProjectId, - ]); + // closePanel(); + }; - if (isLoading || isFetching) return ; - if (isError && isFetched) - return
Something went wrong Here- {error.message}
; + const onClear = () => { + reset(defaultFilter); + setResetKey((prev) => prev + 1); + setSelectedGroup(groupByList[0]); + onApply(defaultFilter); + handleGroupBy(groupByList[0].id); + // closePanel(); + if (status) { + navigate("/expenses", { replace: true }); + } + }; + const location = useLocation(); + useEffect(() => { + closePanel(); + }, [location]); + const [appliedStatusId, setAppliedStatusId] = useState(null); - return ( - <> - -
-
-
- -
- - + + onClick={() => setValue("isTransactionDate", false)} + > + Submitted Date + +
+
+ +
+ +
+ + item.name} + valueKey="id" + /> + item.name} + valueKey="id" + /> + item.name} + valueKey="id" + /> + +
+ +
+ {data?.status + ?.slice() + .sort((a, b) => a.name.localeCompare(b.name)) + .map((status) => ( +
+ ( +
+ { + const checked = e.target.checked; + onChange( + checked + ? [...value, status.id] + : value.filter((v) => v !== status.id) + ); + }} + /> + +
+ )} + /> +
+ ))} +
- -
- -
- - item.name} - valueKey="id" - /> - item.name} - valueKey="id" - /> - item.name} - valueKey="id" - /> - -
- -
- {data?.status - ?.slice() - .sort((a, b) => a.name.localeCompare(b.name)) - .map((status) => ( -
- ( -
- { - const checked = e.target.checked; - onChange( - checked - ? [...value, status.id] - : value.filter((v) => v !== status.id) - ); - }} - /> - -
- )} - /> -
- ))} -
+
+ +
-
-
- - -
-
- - -
- - - - ); -}); +
+ + +
+ + + + ); + } +); -export default ExpenseFilterPanel; \ No newline at end of file +export default ExpenseFilterPanel; diff --git a/src/components/Expenses/ExpenseList.jsx b/src/components/Expenses/ExpenseList.jsx index c1bf72f0..b274b4ce 100644 --- a/src/components/Expenses/ExpenseList.jsx +++ b/src/components/Expenses/ExpenseList.jsx @@ -23,8 +23,15 @@ import { useSelector } from "react-redux"; import ExpenseFilterChips from "./ExpenseFilterChips"; import { defaultFilter } from "./ExpenseSchema"; import { useNavigate } from "react-router-dom"; +import { displayName } from "react-quill"; -const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRef, onDataFiltered }) => { +const ExpenseList = ({ + filters, + groupBy, + searchText, + tableRef, + onDataFiltered, +}) => { const [deletingId, setDeletingId] = useState(null); const [IsDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const { @@ -46,7 +53,7 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRe filters, debouncedSearch ); - + useEffect(() => { if (onDataFiltered) { onDataFiltered(data?.data ?? []); @@ -76,55 +83,65 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRe } }; - const groupByField = (items, field) => { - return items.reduce((acc, item) => { - let key; - let displayField; - - switch (field) { - case "transactionDate": - key = formatUTCToLocalTime(item?.transactionDate); - displayField = "Transaction Date"; - break; - case "status": - key = item?.status?.displayName || "Unknown"; - displayField = "Status"; - break; - case "submittedBy": - key = `${item?.createdBy?.firstName ?? ""} ${item.createdBy?.lastName ?? "" - }`.trim(); - displayField = "Submitted By"; - break; - case "project": - key = item?.project?.name || "Unknown Project"; - displayField = "Project"; - break; - case "paymentMode": - key = item?.paymentMode?.name || "Unknown Mode"; - displayField = "Payment Mode"; - break; - case "expenseCategory": - key = item?.expenseCategory?.name || "Unknown Type"; - displayField = "Expense Category"; - break; - case "createdAt": - key = item?.createdAt?.split("T")[0] || "Unknown Date"; - displayField = "Created Date"; - break; - default: - key = "Others"; - displayField = "Others"; +const groupByField = (items, field) => { + if (!field || field === "none") { + return { + All: { + key: "All", + displayField: "All", + items: items || [] } + }; + } - const groupKey = `${field}_${key}`; // unique key for object property - if (!acc[groupKey]) { - acc[groupKey] = { key, displayField, items: [] }; - } + return items.reduce((acc, item) => { + let key; + let displayField; + + switch (field) { + case "transactionDate": + key = formatUTCToLocalTime(item?.transactionDate); + displayField = "Transaction Date"; + break; + case "status": + key = item?.status?.displayName || "Unknown"; + displayField = "Status"; + break; + case "submittedBy": + key = `${item?.createdBy?.firstName ?? ""} ${item?.createdBy?.lastName ?? ""}`.trim(); + displayField = "Submitted By"; + break; + case "project": + key = item?.project?.name || "Unknown Project"; + displayField = "Project"; + break; + case "paymentMode": + key = item?.paymentMode?.name || "Unknown Mode"; + displayField = "Payment Mode"; + break; + case "expenseCategory": + key = item?.expenseCategory?.name || "Unknown Type"; + displayField = "Expense Category"; + break; + case "createdAt": + key = item?.createdAt?.split("T")[0] || "Unknown Date"; + displayField = "Created Date"; + break; + default: + key = "Others"; + displayField = "Others"; + } + + const groupKey = `${field}_${key}`; + if (!acc[groupKey]) { + acc[groupKey] = { key, displayField, items: [] }; + } + + acc[groupKey].items.push(item); + return acc; + }, {}); +}; - acc[groupKey].items.push(item); - return acc; - }, {}); - }; const expenseColumns = [ { @@ -150,8 +167,9 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRe label: "Submitted By", align: "text-start", getValue: (e) => - `${e.createdBy?.firstName ?? ""} ${e.createdBy?.lastName ?? "" - }`.trim() || "N/A", + `${e.createdBy?.firstName ?? ""} ${ + e.createdBy?.lastName ?? "" + }`.trim() || "N/A", customRender: (e) => (
- {`${e.createdBy?.firstName ?? ""} ${e.createdBy?.lastName ?? "" - }`.trim() || "N/A"} + {`${e.createdBy?.firstName ?? ""} ${ + e.createdBy?.lastName ?? "" + }`.trim() || "N/A"}
), @@ -197,8 +216,9 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRe align: "text-center", getValue: (e) => ( {e.status?.name || "Unknown"} @@ -218,12 +238,18 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRe return ; if (isError) return
{error?.message}
; - const grouped = groupBy - ? groupByField(data?.data ?? [], groupBy) - : { All: data?.data ?? [] }; +const isNoGrouping = !groupBy || groupBy === "none"; +const grouped = isNoGrouping + ? { All: { key: "All", displayField: "All", items: data?.data ?? [] } } + : groupByField(data?.data ?? [], groupBy); + + + + const IsGroupedByDate = [ + {key:"none",displayField:"None"}, { key: "transactionDate", displayField: "Transaction Date" }, - { key: "createdAt", displayField: "created Date" }, + { key: "createdAt", displayField: "created Date", }, ]?.includes(groupBy); const canEditExpense = (expense) => { @@ -264,7 +290,8 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRe groupBy={groupBy} />
@@ -292,21 +319,23 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRe {Object.keys(grouped).length > 0 ? ( Object.values(grouped).map(({ key, displayField, items }) => ( - - -
- {" "} - - {displayField} :{" "} - {" "} - - {IsGroupedByDate - ? formatUTCToLocalTime(key) - : key} - -
- - + {!isNoGrouping && ( + + +
+ {" "} + + {displayField} :{" "} + {" "} + + {IsGroupedByDate + ? formatUTCToLocalTime(key) + : key} + +
+ + + )} {items?.map((expense) => ( {expenseColumns.map( @@ -314,22 +343,26 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText, tableRe (col.isAlwaysVisible || groupBy !== col.key) && (
{col.customRender diff --git a/src/components/Tenant/OrganizationInfo.jsx b/src/components/Tenant/OrganizationInfo.jsx index 7bbf26b2..aef24325 100644 --- a/src/components/Tenant/OrganizationInfo.jsx +++ b/src/components/Tenant/OrganizationInfo.jsx @@ -57,7 +57,6 @@ const OrganizationInfo = ({ onNext, onPrev, onSubmitTenant }) => { // onNext(); const tenantPayload = { ...data, onBoardingDate: moment.utc(data.onBoardingDate, "DD-MM-YYYY").toISOString() } // CreateTenant(tenantPayload); - console.log(tenantPayload) } }; diff --git a/src/components/common/Error.jsx b/src/components/common/Error.jsx index 1e44947f..6ac47e4f 100644 --- a/src/components/common/Error.jsx +++ b/src/components/common/Error.jsx @@ -1,7 +1,6 @@ import React from 'react' const Error = ({error,close}) => { - console.log(error) return (

{error.statusCode || error?.response?.status diff --git a/src/hooks/useDocument.js b/src/hooks/useDocument.js index 5569d878..00b44ff4 100644 --- a/src/hooks/useDocument.js +++ b/src/hooks/useDocument.js @@ -124,7 +124,6 @@ export const useUploadDocument = (onSuccessCallBack) => { if (onSuccessCallBack) onSuccessCallBack(); }, onError: (error) => { - console.log(error); showToast( error.response.data.message || "Something went wrong please try again !", @@ -145,7 +144,6 @@ export const useUpdateDocument = (onSuccessCallBack) => { if (onSuccessCallBack) onSuccessCallBack(); }, onError: (error) => { - console.log(error); showToast( error.response.data.message || "Something went wrong please try again !", diff --git a/src/pages/Expense/ExpensePage.jsx b/src/pages/Expense/ExpensePage.jsx index 0a9b1661..7a37fd34 100644 --- a/src/pages/Expense/ExpensePage.jsx +++ b/src/pages/Expense/ExpensePage.jsx @@ -50,7 +50,7 @@ const ExpensePage = () => { ); const [filters, setFilters] = useState(defaultFilter); - const [groupBy, setGroupBy] = useState("transactionDate"); + const [groupBy, setGroupBy] = useState("none"); const [searchText, setSearchText] = useState(""); const filterPanelRef = useRef(); const [ManageExpenseModal, setManageExpenseModal] = useState({