diff --git a/src/components/Expenses/ViewExpense.jsx b/src/components/Expenses/ViewExpense.jsx index 664a315b..e535495e 100644 --- a/src/components/Expenses/ViewExpense.jsx +++ b/src/components/Expenses/ViewExpense.jsx @@ -30,7 +30,7 @@ import moment from "moment"; import ExpenseStatusLogs from "./ExpenseStatusLogs"; const ViewExpense = ({ ExpenseId }) => { - const { data, isLoading, isError, error } = useExpense(ExpenseId); + const { data, isLoading, isError, error, isFetching } = useExpense(ExpenseId); const [IsPaymentProcess, setIsPaymentProcess] = useState(false); const [clickedStatusId, setClickedStatusId] = useState(null); @@ -363,7 +363,7 @@ const ViewExpense = ({ ExpenseId }) => { )} )} -
+
{Array.isArray(data?.nextStatus) && data.nextStatus.length > 0 && ( <> @@ -435,7 +435,7 @@ const ViewExpense = ({ ExpenseId }) => { setValue("statusId", status.id); handleSubmit(onSubmit)(); }} - disabled={isPending} + disabled={isPending || isFetching} className="btn btn-primary btn-sm cursor-pointer mx-2 border-0" > {isPending && clickedStatusId === status.id diff --git a/src/components/common/SelectMultiple.jsx b/src/components/common/SelectMultiple.jsx index 0873637e..3e80b696 100644 --- a/src/components/common/SelectMultiple.jsx +++ b/src/components/common/SelectMultiple.jsx @@ -67,7 +67,7 @@ const SelectMultiple = ({ const dropdownElement = (
{ onSuccess: (updatedExpense, variables) => { showToast("Request processed successfully.", "success"); - queryClient.setQueriesData( - { - queryKey: ["Expenses"], - exact: false, - }, - (oldData) => { - if (!oldData) return oldData; - return { - ...oldData, - data: oldData.data.map((item) => - item.id === updatedExpense.id - ? { - ...item, - nextStatus: updatedExpense.nextStatus, - status: updatedExpense.status, - } - : item - ), - }; - } - ); + // queryClient.setQueriesData( + // { + // queryKey: ["Expenses"], + // exact: false, + // }, + // (oldData) => { + // if (!oldData) return oldData; + // return { + // ...oldData, + // data: oldData.data.map((item) => + // item.id === updatedExpense.id + // ? { + // ...item, + // nextStatus: updatedExpense.nextStatus, + // status: updatedExpense.status, + // } + // : item + // ), + // }; + // } + // ); // queryClient.setQueriesData( // { queryKey: ["Expense", updatedExpense.id] }, // (oldData) => { @@ -200,6 +200,7 @@ export const useActionOnExpense = (onSuccessCallBack) => { // } // ); queryClient.invalidateQueries({queryKey:["Expense",updatedExpense.id]}) + queryClient.invalidateQueries({queryKey:["Expenses",updatedExpense.id]}) if (onSuccessCallBack) onSuccessCallBack(); }, diff --git a/src/pages/master/MasterPage.jsx b/src/pages/master/MasterPage.jsx index c11f5861..7904e6af 100644 --- a/src/pages/master/MasterPage.jsx +++ b/src/pages/master/MasterPage.jsx @@ -1,94 +1,94 @@ import React, { useState, useEffect, useMemo } from "react"; import Breadcrumb from "../../components/common/Breadcrumb"; import MasterModal from "../../components/master/MasterModal"; -import { mastersList} from "../../data/masters"; +import { mastersList } from "../../data/masters"; import { useDispatch, useSelector } from "react-redux"; import { changeMaster } from "../../slices/localVariablesSlice"; import useMaster from "../../hooks/masterHook/useMaster" import MasterTable from "./MasterTable"; import { getCachedData } from "../../slices/apiDataManager"; -import {useHasUserPermission} from "../../hooks/useHasUserPermission"; +import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { MANAGE_MASTER } from "../../utils/constants"; -import {useQueryClient} from "@tanstack/react-query"; +import { useQueryClient } from "@tanstack/react-query"; const MasterPage = () => { -const [modalConfig, setModalConfig] = useState({ modalType: "", item: null, masterType: null }); -const [searchTerm, setSearchTerm] = useState(''); -const [filteredResults, setFilteredResults] = useState([]); -const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); + const [modalConfig, setModalConfig] = useState({ modalType: "", item: null, masterType: null }); + const [searchTerm, setSearchTerm] = useState(''); + const [filteredResults, setFilteredResults] = useState([]); + const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); -const hasMasterPermission = useHasUserPermission(MANAGE_MASTER); -const dispatch = useDispatch(); -const selectedMaster = useSelector((store) => store.localVariables.selectedMaster); -const queryClient = useQueryClient(); + const hasMasterPermission = useHasUserPermission(MANAGE_MASTER); + const dispatch = useDispatch(); + const selectedMaster = useSelector((store) => store.localVariables.selectedMaster); + const queryClient = useQueryClient(); -const { data: masterData = [], loading, error, RecallApi } = useMaster(); + const { data: masterData = [], loading, error, RecallApi } = useMaster(); -const openModal = () => setIsCreateModalOpen(true); + const openModal = () => setIsCreateModalOpen(true); -const closeModal = () => { - setIsCreateModalOpen(false); - setModalConfig(null); - - // Clean up Bootstrap modal manually - const modalEl = document.getElementById('master-modal'); - modalEl?.classList.remove('show'); - if (modalEl) modalEl.style.display = 'none'; - - document.body.classList.remove('modal-open'); - document.body.style.overflow = 'auto'; - - document.querySelectorAll('.modal-backdrop').forEach((el) => el.remove()); -}; - -const handleModalData = (modalType, item, masterType = selectedMaster) => { - setModalConfig({ modalType, item, masterType }); -}; - -const handleSearch = (e) => { - const value = e.target.value.toLowerCase(); - setSearchTerm(value); - - if (!masterData?.length) return; - - const results = masterData.filter((item) => - Object.values(item).some( - (field) => field?.toString().toLowerCase().includes(value) - ) - ); - setFilteredResults(results); -}; -const displayData = useMemo(() => { - if (searchTerm) return filteredResults; - return queryClient.getQueryData(["masterData", selectedMaster]) || masterData; -}, [searchTerm, filteredResults, selectedMaster, masterData]); - -const columns = useMemo(() => { - if (!displayData?.length) return []; - return Object.keys(displayData[0]).map((key) => ({ - key, - label: key.toUpperCase(), - })); -}, [displayData]); - -useEffect(() => { - if (modalConfig) openModal(); -}, [modalConfig]); - -useEffect(() => { - return () => { + const closeModal = () => { setIsCreateModalOpen(false); - closeModal(); + setModalConfig(null); + + // Clean up Bootstrap modal manually + const modalEl = document.getElementById('master-modal'); + modalEl?.classList.remove('show'); + if (modalEl) modalEl.style.display = 'none'; + + document.body.classList.remove('modal-open'); + document.body.style.overflow = 'auto'; + + document.querySelectorAll('.modal-backdrop').forEach((el) => el.remove()); }; -}, []); + + const handleModalData = (modalType, item, masterType = selectedMaster) => { + setModalConfig({ modalType, item, masterType }); + }; + + const handleSearch = (e) => { + const value = e.target.value.toLowerCase(); + setSearchTerm(value); + + if (!masterData?.length) return; + + const results = masterData.filter((item) => + Object.values(item).some( + (field) => field?.toString().toLowerCase().includes(value) + ) + ); + setFilteredResults(results); + }; + const displayData = useMemo(() => { + if (searchTerm) return filteredResults; + return queryClient.getQueryData(["masterData", selectedMaster]) || masterData; + }, [searchTerm, filteredResults, selectedMaster, masterData]); + + const columns = useMemo(() => { + if (!displayData?.length) return []; + return Object.keys(displayData[0]).map((key) => ({ + key, + label: key.toUpperCase(), + })); + }, [displayData]); + + useEffect(() => { + if (modalConfig) openModal(); + }, [modalConfig]); + + useEffect(() => { + return () => { + setIsCreateModalOpen(false); + closeModal(); + }; + }, []); return ( <> {isCreateModalOpen && ( - - + + )}
@@ -100,7 +100,7 @@ useEffect(() => { >
-
+
{ >
- +
diff --git a/src/pages/master/MasterTable.jsx b/src/pages/master/MasterTable.jsx index b5f65857..bc7c10c0 100644 --- a/src/pages/master/MasterTable.jsx +++ b/src/pages/master/MasterTable.jsx @@ -184,7 +184,7 @@ const MasterTable = ({ data, columns, loading, handleModalData }) => { {/* Pagination */} {!loading && safeData.length > 20 && (