-
{ `${modaldata?.modalType} `}
-
-
+
{`${modaldata?.modalType} `}
+
+
{modaldata.modalType === "Application Role" && (
-
+
)}
{modaldata.modalType === "Edit-Application Role" && (
@@ -122,7 +147,10 @@ const MasterModal = ({ modaldata, closeModal }) => {
)}
{modaldata.modalType === "Edit-Activity" && (
-
+
)}
{modaldata.modalType === "Work Category" && (
@@ -133,10 +161,10 @@ const MasterModal = ({ modaldata, closeModal }) => {
{modaldata.modalType === "Contact Category" && (
)}
- {modaldata.modalType === "Edit-Contact Category" && (
+ {modaldata.modalType === "Edit-Contact Category" && (
)}
- {modaldata.modalType === "Contact Tag" && (
+ {modaldata.modalType === "Contact Tag" && (
)}
{modaldata.modalType === "Edit-Contact Tag" && (
diff --git a/src/hooks/masterHook/useMaster.js b/src/hooks/masterHook/useMaster.js
index a5c43a51..74c84eec 100644
--- a/src/hooks/masterHook/useMaster.js
+++ b/src/hooks/masterHook/useMaster.js
@@ -2,6 +2,8 @@ import {useState,useEffect} from "react"
import { MasterRespository } from "../../repositories/MastersRepository";
import { cacheData,getCachedData } from "../../slices/apiDataManager";
import { useSelector } from "react-redux";
+import {useMutation, useQueries, useQuery, useQueryClient} from "@tanstack/react-query";
+import showToast from "../../services/toastService";
@@ -9,214 +11,687 @@ import { useSelector } from "react-redux";
-export const useFeatures = () =>
- useMasterData("masterFeatures", MasterRespository.getFeatures);
-export const useMasterRole = () =>
- useMasterData("masterRole", MasterRespository.getRoles);
+// const useMaster = () => {
-
-const useMaster = (isMa) => {
-
- const selectedMaster = useSelector((store)=>store.localVariables.selectedMaster);
- const [data, setData] = useState([]);
- const [loading, setLoading] = useState(true);
- const [error, setError] = useState("");
- useEffect(() => {
- const fetchData = async () => {
- if (!selectedMaster) return;
- setLoading(true);
- try {
- const cachedData = getCachedData(selectedMaster);
- if (cachedData) {
+// const selectedMaster = useSelector((store)=>store.localVariables.selectedMaster);
+// const [data, setData] = useState([]);
+// const [loading, setLoading] = useState(true);
+// const [error, setError] = useState("");
+// useEffect(() => {
+// const fetchData = async () => {
+// if (!selectedMaster) return;
+// setLoading(true);
+// try {
+// const cachedData = getCachedData(selectedMaster);
+// if (cachedData) {
- setData(cachedData);
+// setData(cachedData);
- } else {
- let response;
- switch (selectedMaster) {
- case "Application Role":
- response = await MasterRespository.getRoles();
- response = response.data;
- break;
- case "Job Role":
- response = await MasterRespository.getJobRole();
- response = response.data
- break;
- case "Activity":
- response = await MasterRespository.getActivites();
- response = response.data
- break;
- case "Work Category":
- response = await MasterRespository.getWorkCategory();
- response = response.data
- break;
- case "Contact Category":
- response = await MasterRespository.getContactCategory();
- response = response.data
- break;
- case "Contact Tag":
- response = await MasterRespository.getContactTag();
- response = response.data
- break;
- case "Status":
- response = [{description: null,featurePermission: null,id: "02dd4761-363c-49ed-8851-3d2489a3e98d",status:"status 1"},{description: null,featurePermission: null,id: "03dy9761-363c-49ed-8851-3d2489a3e98d",status:"status 2"},{description: null,featurePermission: null,id: "03dy7761-263c-49ed-8851-3d2489a3e98d",status:"Status 3"}];
- break;
- default:
- response = [];
- }
+// } else {
+// let response;
+// switch (selectedMaster) {
+// case "Application Role":
+// response = await MasterRespository.getRoles();
+// response = response.data;
+// break;
+// case "Job Role":
+// response = await MasterRespository.getJobRole();
+// response = response.data
+// break;
+// case "Activity":
+// response = await MasterRespository.getActivites();
+// response = response.data
+// break;
+// case "Work Category":
+// response = await MasterRespository.getWorkCategory();
+// response = response.data
+// break;
+// case "Contact Category":
+// response = await MasterRespository.getContactCategory();
+// response = response.data
+// break;
+// case "Contact Tag":
+// response = await MasterRespository.getContactTag();
+// response = response.data
+// break;
+// case "Status":
+// response = [{description: null,featurePermission: null,id: "02dd4761-363c-49ed-8851-3d2489a3e98d",status:"status 1"},{description: null,featurePermission: null,id: "03dy9761-363c-49ed-8851-3d2489a3e98d",status:"status 2"},{description: null,featurePermission: null,id: "03dy7761-263c-49ed-8851-3d2489a3e98d",status:"Status 3"}];
+// break;
+// default:
+// response = [];
+// }
- if (response) {
- setData(response);
- cacheData(selectedMaster, response);
- }
- }
- } catch (err) {
- setError("Failed to fetch data.");
- } finally {
- setLoading(false);
- }
- };
+// if (response) {
+// setData(response);
+// cacheData(selectedMaster, response);
+// }
+// }
+// } catch (err) {
+// setError("Failed to fetch data.");
+// } finally {
+// setLoading(false);
+// }
+// };
- if ( selectedMaster )
- {
+// if ( selectedMaster )
+// {
- fetchData();
- }
+// fetchData();
+// }
- }, [selectedMaster]);
+// }, [selectedMaster]);
- return { data, loading, error }
+// return { data, loading, error }
+// };
+
+
+
+
+// export const useActivitiesMaster = () =>
+// {
+// const [ activities, setActivites ] = useState( [] )
+// const [ loading, setloading ] = useState( false );
+// const [ error, setError ] = useState()
+// const fetchActivities =async () => {
+// setloading(true);
+// try {
+// const response = await MasterRespository.getActivites();
+// setActivites(response.data);
+// cacheData( "ActivityMaster", response.data );
+// setloading(false);
+// } catch (err) {
+// setError(err);
+// setloading(false);
+// }
+// }
+// useEffect( () =>
+// {
+// const cacheddata = getCachedData( "ActivityMaster" );
+// if ( !cacheddata )
+// {
+// fetchActivities()
+// } else
+// {
+// setActivites(cacheddata);
+// }
+// }, [] )
+
+// return {activities,loading,error}
+// }
+
+// export const useWorkCategoriesMaster = () =>
+// {
+// const [ categories, setCategories ] = useState( [] )
+// const [ categoryLoading, setloading ] = useState( false );
+// const [ categoryError, setError ] = useState( "" )
+
+// const fetchCategories =async () => {
+// const cacheddata = getCachedData("Work Category");
+
+// if (!cacheddata) {
+// setloading(true);
+// try {
+// const response = await MasterRespository.getWorkCategory();
+// setCategories(response.data);
+// cacheData("Work Category", response.data);
+// } catch (err) {
+// setError(err);
+// console.log(err);
+// } finally {
+// setloading(false);
+// }
+// } else {
+// setCategories(cacheddata);
+// }
+// }
+// useEffect( () =>
+// {
+// fetchCategories()
+// }, [] )
+
+// return {categories,categoryLoading,categoryError}
+// }
+
+// export const useContactCategory = () =>
+// {
+// const [ contactCategory, setContactCategory ] = useState( [] )
+// const [ loading, setLoading ] = useState( false )
+// const [ Error, setError ] = useState()
+
+// const fetchConatctCategory = async() =>
+// {
+// const cache_Category = getCachedData( "Contact Category" );
+// if ( !cache_Category )
+// {
+// try
+// {
+// let resp = await MasterRespository.getContactCategory();
+// setContactCategory( resp.data );
+// cacheData("Contact Category",resp.data)
+// } catch ( error )
+// {
+// setError(error)
+// }
+// } else
+// {
+// setContactCategory(cache_Category)
+// }
+// }
+
+// useEffect( () =>
+// {
+// fetchConatctCategory()
+// }, [] )
+// return { contactCategory,loading,Error}
+// }
+// export const useContactTags = () => {
+// const [contactTags, setContactTags] = useState([]);
+// const [loading, setLoading] = useState(false);
+// const [error, setError] = useState(null);
+
+// useEffect(() => {
+// const fetchContactTag = async () => {
+// const cache_Tags = getCachedData("Contact Tag");
+
+// if (!cache_Tags) {
+// setLoading(true);
+// try {
+// const resp = await MasterRespository.getContactTag();
+// setContactTags(resp.data);
+// cacheData("Contact Tag", resp.data);
+// } catch (err) {
+// setError(err);
+// } finally {
+// setLoading(false);
+// }
+// } else {
+// setContactTags(cache_Tags);
+// }
+// };
+
+// fetchContactTag();
+// }, []);
+
+// return { contactTags, loading, error };
+// };
+
+// Separate matser-------------
+
+export const useActivitiesMaster = () =>
+{
+ const { data:activities=[],isLoading:loading,error} = useQuery( {
+ queryKey: [ "ActivityMaster" ],
+ queryFn: async() =>
+ {
+ const response = await MasterRespository.getActivites();
+ return response.data
+ },
+ onError: (error) => {
+ showToast(error?.response?.data?.message || error.message || "Failed to fetch ActivityMasters", "error");
+ },
+ } )
+ return {activities,loading,error}
+}
+export const useWorkCategoriesMaster = () => {
+ const {
+ data: categories = [],
+ isLoading: categoryLoading,
+ error: categoryError,
+ } = useQuery({
+ queryKey: ["Work Category"],
+ queryFn: async () => {
+ const response = await MasterRespository.getWorkCategory();
+ return response.data;
+ },
+ onError: (error) => {
+ showToast(
+ error?.response?.data?.message ||
+ error.message ||
+ "Failed to fetch work categories",
+ "error"
+ );
+ },
+ });
+
+ return { categories, categoryLoading, categoryError };
+};
+
+
+export const useContactCategory = () =>
+{
+ const {data:contactCategory=[],isLoading:loading,error:Error } = useQuery( {
+ queryKey: [ "Contact Category" ],
+ queryFn: async () =>
+ {
+ let resp = await MasterRespository.getContactCategory();
+ return resp.data
+ },
+ onError: (error) => {
+ showToast(error?.response?.data?.message || error.message || "Failed to fetch Contact categories", "error");
+ },
+ } )
+ return { contactCategory,loading,Error}
+}
+
+export const useContactTags = () => {
+ const {
+ data: contactTags = [],
+ isLoading: loading,
+ error,
+ } = useQuery({
+ queryKey: ["Contact Tag"],
+ queryFn: async () => {
+ const res = await MasterRespository.getContactTag();
+ return res.data;
+ },
+ onError: (error) => {
+ showToast(
+ error?.response?.data?.message ||
+ error.message ||
+ "Failed to fetch Contact Tag",
+ "error"
+ );
+ },
+ });
+
+ return { contactTags, loading, error };
+};
+
+// ===Application Masters Query=================================================
+
+const fetchMasterData = async (masterType) => {
+ switch (masterType) {
+ case "Application Role":
+ return (await MasterRespository.getRoles()).data;
+ case "Job Role":
+ return (await MasterRespository.getJobRole()).data;
+ case "Activity":
+ return (await MasterRespository.getActivites()).data;
+ case "Work Category":
+ return (await MasterRespository.getWorkCategory()).data;
+ case "Contact Category":
+ return (await MasterRespository.getContactCategory()).data;
+ case "Contact Tag":
+ return (await MasterRespository.getContactTag()).data;
+ case "Status":
+ return [
+ {
+ description: null,
+ featurePermission: null,
+ id: "02dd4761-363c-49ed-8851-3d2489a3e98d",
+ status: "status 1",
+ },
+ {
+ description: null,
+ featurePermission: null,
+ id: "03dy9761-363c-49ed-8851-3d2489a3e98d",
+ status: "status 2",
+ },
+ {
+ description: null,
+ featurePermission: null,
+ id: "03dy7761-263c-49ed-8851-3d2489a3e98d",
+ status: "Status 3",
+ },
+ ];
+ default:
+ return [];
+ }
+};
+
+const useMaster = () => {
+ const selectedMaster = useSelector((store) => store.localVariables.selectedMaster);
+
+ const {
+ data = [],
+ isLoading,
+ error,
+ } = useQuery({
+ queryKey: ["masterData", selectedMaster],
+ queryFn: () => fetchMasterData(selectedMaster),
+ enabled: !!selectedMaster,
+ staleTime: 1000 * 60 * 10,
+ refetchOnWindowFocus: false,
+ onError: (error) => {
+ showToast(error?.response?.data?.message || error.message || `Failed to fetch ${selectedMaster} Maseter`, "error");
+ },
+ });
+
+ return { data, loading: isLoading, error };
};
export default useMaster;
-export const useActivitiesMaster = () =>
- {
- const [ activities, setActivites ] = useState( [] )
- const [ loading, setloading ] = useState( false );
- const [ error, setError ] = useState()
- const fetchActivities =async () => {
- setloading(true);
- try {
- const response = await MasterRespository.getActivites();
- setActivites(response.data);
- cacheData( "ActivityMaster", response.data );
- setloading(false);
- } catch (err) {
- setError(err);
- setloading(false);
- }
- }
- useEffect( () =>
- {
- const cacheddata = getCachedData( "ActivityMaster" );
- if ( !cacheddata )
- {
- fetchActivities()
- } else
- {
- setActivites(cacheddata);
- }
- }, [] )
-
- return {activities,loading,error}
- }
+// ================================Mutation====================================
- export const useWorkCategoriesMaster = () =>
- {
- const [ categories, setCategories ] = useState( [] )
- const [ categoryLoading, setloading ] = useState( false );
- const [ categoryError, setError ] = useState( "" )
-
- const fetchCategories =async () => {
- const cacheddata = getCachedData("Work Category");
-
- if (!cacheddata) {
- setloading(true);
- try {
- const response = await MasterRespository.getWorkCategory();
- setCategories(response.data);
- cacheData("Work Category", response.data);
- } catch (err) {
- setError(err);
- console.log(err);
- } finally {
- setloading(false);
- }
- } else {
- setCategories(cacheddata);
- }
- }
- useEffect( () =>
- {
- fetchCategories()
- }, [] )
-
- return {categories,categoryLoading,categoryError}
-}
-
-export const useContactCategory = () =>
+// Job Role-----------------------------------
+export const useUpdateJobRole = (onSuccessCallback, onErrorCallback) => {
+ const queryClient = useQueryClient();
+
+ return useMutation({
+ mutationFn: async ({ id, payload }) => {
+ const response = await MasterRespository.updateJobRole(id, payload);
+ return response.data;
+ },
+ onSuccess: (data, variables) => {
+ showToast("JobRole updated successfully.", "success");
+
+ queryClient.invalidateQueries({
+ queryKey: ["masterData", "Job Role"],
+ });
+
+ if (onSuccessCallback) onSuccessCallback(data);
+ },
+ onError: (error) => {
+ showToast(error.message || "Something went wrong", "error");
+ if (onErrorCallback) onErrorCallback(error);
+ },
+ });
+};
+
+export const useCreateJobRole = (onSuccessCallback) => {
+ const queryClient = useQueryClient();
+
+ return useMutation({
+ mutationFn: async (payload) => {
+ const response = await MasterRespository.createJobRole(payload);
+ return response.data;
+ },
+ onSuccess: (data) => {
+ showToast("JobRole added successfully.", "success");
+
+ queryClient.invalidateQueries(["masterData", "Job Role"]);
+
+ if (onSuccessCallback) onSuccessCallback(data);
+ },
+ onError: (error) => {
+ showToast(error.message || "Something went wrong", "error");
+ },
+ });
+};
+
+// Application Role-------------------------------------------
+
+export const useCreateApplicationRole = (onSuccessCallback) =>
{
- const [ contactCategory, setContactCategory ] = useState( [] )
- const [ loading, setLoading ] = useState( false )
- const [ Error, setError ] = useState()
-
- const fetchConatctCategory = async() =>
- {
- const cache_Category = getCachedData( "Contact Category" );
- if ( !cache_Category )
+ const queryClient = useQueryClient();
+
+ return useMutation( {
+ mutationFn: async ( payload ) =>
{
- try
- {
- let resp = await MasterRespository.getContactCategory();
- setContactCategory( resp.data );
- cacheData("Contact Category",resp.data)
- } catch ( error )
- {
- setError(error)
- }
- } else
+ const resp = await MasterRespository.createRole( payload );
+ return resp.data;
+ },
+ onSuccess: ( data ) =>
{
- setContactCategory(cache_Category)
+ queryClient.invalidateQueries( [ "masterData", "Application Role" ] )
+ showToast( "Application Role added successfully", "success" );
+ if(onSuccessCallback) onSuccessCallback(data)
+ },
+ onError: ( error ) =>
+ {
+ showToast(error.message || "Something went wrong", "error");
}
- }
-
- useEffect( () =>
- {
- fetchConatctCategory()
- }, [] )
- return { contactCategory,loading,Error}
+ })
}
-export const useContactTags = () => {
- const [contactTags, setContactTags] = useState([]);
- const [loading, setLoading] = useState(false);
- const [error, setError] = useState(null);
- useEffect(() => {
- const fetchContactTag = async () => {
- const cache_Tags = getCachedData("Contact Tag");
+export const useUpdateApplicationRole = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
- if (!cache_Tags) {
- setLoading(true);
- try {
- const resp = await MasterRespository.getContactTag();
- setContactTags(resp.data);
- cacheData("Contact Tag", resp.data);
- } catch (err) {
- setError(err);
- } finally {
- setLoading(false);
- }
- } else {
- setContactTags(cache_Tags);
+ return useMutation({
+ mutationFn: async ( {id, payload} ) =>
+ {
+ const response = await MasterRespository.updateRoles(id,payload);
+ return response.data;
+ },
+ onSuccess: (data, variables) => {
+
+ queryClient.invalidateQueries({
+ queryKey: ["masterData", "Application Role"],
+ });
+ showToast("Application Role updated successfully.", "success");
+
+ if (onSuccessCallback) onSuccessCallback(data);
+ },
+ onError: (error) => {
+ showToast(error.message || "Something went wrong", "error");
+ },
+ });
+}
+
+// Activity------------------------------
+export const useCreateActivity = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
+
+ return useMutation( {
+ mutationFn: async ( payload ) =>
+ {
+ const resp = await MasterRespository.createActivity(payload);
+ return resp.data;
+ },
+ onSuccess: ( data ) =>
+ {
+ queryClient.invalidateQueries( [ "masterData", "Activity" ] )
+ showToast( "Activity added successfully", "success" );
+ if(onSuccessCallback) onSuccessCallback(data)
+ },
+ onError: ( error ) =>
+ {
+ showToast(error.message || "Something went wrong", "error");
+ }
+ })
+}
+
+export const useUpdateActivity = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
+
+ return useMutation({
+ mutationFn: async ( {id, payload} ) =>
+ {
+ const response = await MasterRespository.updateActivity(id,payload);
+ return response.data;
+ },
+ onSuccess: (data, variables) => {
+
+ queryClient.invalidateQueries({
+ queryKey: ["masterData", "Activity"],
+ });
+ showToast("Activity updated successfully.", "success");
+
+ if (onSuccessCallback) onSuccessCallback(data);
+ },
+ onError: (error) => {
+ showToast(error.message || "Something went wrong", "error");
+ },
+ });
+}
+
+
+//-----Create work Category-------------------------------
+export const useCreateWorkCategory = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
+
+ return useMutation( {
+ mutationFn: async ( payload ) =>
+ {
+ const resp = await MasterRespository.createWorkCategory(payload);
+ return resp.data;
+ },
+ onSuccess: ( data ) =>
+ {
+ queryClient.invalidateQueries( [ "masterData", "Work Category" ] )
+ showToast( "Work Category added successfully", "success" );
+ if(onSuccessCallback) onSuccessCallback(data)
+ },
+ onError: ( error ) =>
+ {
+ showToast(error.message || "Something went wrong", "error");
+ }
+ })
+}
+
+export const useUpdateWorkCategory = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
+
+ return useMutation({
+ mutationFn: async ( {id, payload} ) =>
+ {
+ const response = await MasterRespository.updateWorkCategory(id,payload);
+ return response.data;
+ },
+ onSuccess: (data, variables) => {
+
+ queryClient.invalidateQueries({
+ queryKey: ["masterData", "Work Category"],
+ });
+ showToast("Work Category updated successfully.", "success");
+
+ if (onSuccessCallback) onSuccessCallback(data);
+ },
+ onError: (error) => {
+ showToast(error.message || "Something went wrong", "error");
+ },
+ });
+}
+
+//-- Contact Category---------------------------
+
+
+export const useCreateContactCategory = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
+
+ return useMutation( {
+ mutationFn: async ( payload ) =>
+ {
+ const resp = await MasterRespository.createContactCategory(payload);
+ return resp.data;
+ },
+ onSuccess: ( data ) =>
+ {
+ queryClient.invalidateQueries( [ "masterData", "Contact Category" ] )
+ showToast( "Contact Category added successfully", "success" );
+ if(onSuccessCallback) onSuccessCallback(data)
+ },
+ onError: ( error ) =>
+ {
+ showToast(error.message || "Something went wrong", "error");
+ }
+ })
+}
+
+
+export const useUpdateContactCategory = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
+
+ return useMutation({
+ mutationFn: async ( {id, payload} ) =>
+ {
+ const response = await MasterRespository.updateContactCategory(id,payload);
+ return response.data;
+ },
+ onSuccess: (data, variables) => {
+
+ queryClient.invalidateQueries({
+ queryKey: ["masterData", "Contact Category"],
+ });
+ showToast("Contact Category updated successfully.", "success");
+
+ if (onSuccessCallback) onSuccessCallback(data);
+ },
+ onError: (error) => {
+ showToast(error.message || "Something went wrong", "error");
+ },
+ });
+}
+
+// ---------Contact Tag-------------------
+
+export const useCreateContactTag = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
+
+ return useMutation( {
+ mutationFn: async ( payload ) =>
+ {
+ const resp = await MasterRespository.createContactTag(payload);
+ return resp.data;
+ },
+ onSuccess: ( data ) =>
+ {
+ queryClient.invalidateQueries( [ "masterData", "Contact Tag" ] )
+ showToast( "Contact Tag added successfully", "success" );
+ if(onSuccessCallback) onSuccessCallback(data)
+ },
+ onError: ( error ) =>
+ {
+ showToast(error.message || "Something went wrong", "error");
+ }
+ })
+}
+
+
+export const useUpdateContactTag = (onSuccessCallback) =>
+{
+ const queryClient = useQueryClient();
+
+ return useMutation({
+ mutationFn: async ( {id, payload} ) =>
+ {
+ debugger
+ const response = await MasterRespository.updateContactTag(id,payload);
+ return response.data;
+ },
+ onSuccess: (data, variables) => {
+
+ queryClient.invalidateQueries({
+ queryKey: ["masterData", "Contact Tag"],
+ });
+ showToast("Contact Tag updated successfully.", "success");
+
+ if (onSuccessCallback) onSuccessCallback(data);
+ },
+ onError: (error) => {
+ showToast(error.message || "Something went wrong", "error");
+ },
+ });
+}
+
+// -Delete Master --------
+export const useDeleteMasterItem = () => {
+ const queryClient = useQueryClient();
+
+ return useMutation({
+ mutationFn: async ( {masterType, item} ) =>
+ {
+ const deleteFn = MasterRespository[masterType];
+ if (!deleteFn) {
+ throw new Error(`No delete strategy defined for master type: ${masterType}`);
}
- };
- fetchContactTag();
- }, []);
+ await deleteFn(item.id);
+ return { masterType };
+ },
- return { contactTags, loading, error };
+ onSuccess: ({ masterType }) => {
+ queryClient.invalidateQueries({ queryKey: ["masterData", masterType] });
+
+ showToast(`${masterType} deleted successfully.`, "success");
+ },
+
+ onError: (error) => {
+ const message =
+ error?.response?.data?.message || error?.message || "Error occurred during deletion";
+ showToast(message, "error");
+ },
+ });
};
\ No newline at end of file
diff --git a/src/pages/master/MasterPage.jsx b/src/pages/master/MasterPage.jsx
index 3852f7d3..68d790b6 100644
--- a/src/pages/master/MasterPage.jsx
+++ b/src/pages/master/MasterPage.jsx
@@ -1,4 +1,4 @@
-import React, { useState, useEffect } from "react";
+import React, { useState, useEffect, useMemo } from "react";
import Breadcrumb from "../../components/common/Breadcrumb";
import MasterModal from "../../components/master/MasterModal";
import { mastersList} from "../../data/masters";
@@ -9,92 +9,80 @@ import MasterTable from "./MasterTable";
import { getCachedData } from "../../slices/apiDataManager";
import {useHasUserPermission} from "../../hooks/useHasUserPermission";
import { MANAGE_MASTER } from "../../utils/constants";
+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 hasMasterPermission = useHasUserPermission( MANAGE_MASTER )
- const dispatch = useDispatch();
- const selectedMaster = useSelector((store)=>store.localVariables.selectedMaster)
-
- const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
-
- const openModal = () => {
- setIsCreateModalOpen(true);
+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 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 () => {
+ setIsCreateModalOpen(false);
+ closeModal();
};
+}, []);
- const closeModal = () => {
- setIsCreateModalOpen(false);
- setmodalConfig(null);
-
-
- const modalElement = document.getElementById('master-modal');
- if (modalElement) {
- modalElement.classList.remove('show');
- modalElement.style.display = 'none';
- document.body.classList.remove('modal-open');
-
-
- const backdropElement = document.querySelector('.modal-backdrop');
- if (backdropElement) {
- backdropElement.classList.remove('modal-backdrop');
- backdropElement.style.display = 'none';
- }
- }
- const modalBackdropElement = document.querySelector('.modal-backdrop');
- if (modalBackdropElement) {
- modalBackdropElement.remove();
- }
- document.body.style.overflow = 'auto';
-
- };
-
- const {data:masterData, loading,error , RecallApi} = useMaster();
-
-
- 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 && field.toString().toLowerCase().includes(value)
- )
- );
-
- setFilteredResults(results);
- };
-
- const displayData = searchTerm ? filteredResults : getCachedData(selectedMaster) ? getCachedData(selectedMaster) : masterData
-
- const columns = displayData?.length
- ? Object.keys(displayData[0]).map((key) => ({ key, label: key.toUpperCase() }))
- : [];
-
- const handleModalData =(modalType,item,masterType = selectedMaster)=>{
- setmodalConfig({ modalType: modalType, item:item,masterType:masterType });
- }
-
- useEffect(() => {
- if (modalConfig !== null) {
- openModal();
- }
-
- }, [ modalConfig, isCreateModalOpen ] );
-
-
- useEffect(() => {
- return () => {
- setIsCreateModalOpen(false)
- closeModal();
- };
- }, [])
return (
<>
diff --git a/src/repositories/MastersRepository.jsx b/src/repositories/MastersRepository.jsx
index a2557574..aebfc157 100644
--- a/src/repositories/MastersRepository.jsx
+++ b/src/repositories/MastersRepository.jsx
@@ -41,7 +41,7 @@ export const MasterRespository = {
"Activity": ( id ) => api.delete( `/api/master/activity/delete/${ id }` ),
"Application Role":(id)=>api.delete(`/api/roles/${id}`),
"Work Category": ( id ) => api.delete( `api/master/work-category/${ id }` ),
- "Contact Category": ( id ) => api.delete( `/api/master/contact-category` ),
+ "Contact Category": ( id ) => api.delete( `/api/master/contact-category/${id}` ),
"Contact Tag" :(id)=>api.delete(`/api/master/contact-tag/${id}`),
getWorkCategory:() => api.get(`/api/master/work-categories`),