From ebab03dc9fcd79b105f0bdf278f621f19afd5cc6 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Wed, 10 Sep 2025 18:52:09 +0530 Subject: [PATCH 1/5] updated method for update contact category --- src/repositories/MastersRepository.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/repositories/MastersRepository.jsx b/src/repositories/MastersRepository.jsx index 84f56aeb..a853fdbe 100644 --- a/src/repositories/MastersRepository.jsx +++ b/src/repositories/MastersRepository.jsx @@ -61,7 +61,7 @@ export const MasterRespository = { createContactCategory: (data) => api.post(`/api/master/contact-category`, data), updateContactCategory: (id, data) => - api.put(`/api/master/contact-category/edit/${id}`, data), + api.post(`/api/master/contact-category/edit/${id}`, data), getContactTag: () => api.get(`/api/master/contact-tags`), createContactTag: (data) => api.post(`/api/master/contact-tag`, data), From f20c3a64f6e0d0a83d3954342b80ac5e0a0ce6e3 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Wed, 10 Sep 2025 19:00:07 +0530 Subject: [PATCH 2/5] added proper modal size for Master Modal - Application Role --- src/pages/master/MasterPage.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pages/master/MasterPage.jsx b/src/pages/master/MasterPage.jsx index 9b8fda8f..86640587 100644 --- a/src/pages/master/MasterPage.jsx +++ b/src/pages/master/MasterPage.jsx @@ -111,7 +111,11 @@ const MasterPage = () => { return ( <> {isCreateModalOpen && ( - closeModal()}> + closeModal()}> )} From b1a2250c4885563b4827943d53da7646dbb85dfe Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Wed, 10 Sep 2025 19:03:29 +0530 Subject: [PATCH 3/5] imported missing routes during merged --- src/router/AppRoutes.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/router/AppRoutes.jsx b/src/router/AppRoutes.jsx index 6fec430a..5e71c0b6 100644 --- a/src/router/AppRoutes.jsx +++ b/src/router/AppRoutes.jsx @@ -46,6 +46,9 @@ import MainResetPasswordPage from "../pages/authentication/MainResetPasswordPage import TenantPage from "../pages/Tenant/TenantPage"; import { Navigate } from "react-router-dom"; import RootRedirect from "./RootRedirect"; +import CreateTenant from "../pages/Tenant/CreateTenant"; +import SuperTenantDetails from "../pages/Tenant/SuperTenantDetails"; +import SelfTenantDetails from "../pages/Tenant/SelfTenantDetails"; const router = createBrowserRouter( [ { @@ -87,6 +90,9 @@ const router = createBrowserRouter( { path: "/expenses", element: }, { path: "/masters", element: }, { path: "/tenants", element: }, + { path: "/tenants/new-tenant", element: }, + { path: "/tenant/:tenantId", element: }, + { path: "/tenant/self", element: }, { path: "/help/support", element: }, { path: "/help/docs", element: }, { path: "/help/connect", element: }, From 1a7e77c8146dd8f6c269e2a81bc32c7b5ba6ebc0 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Wed, 10 Sep 2025 19:09:55 +0530 Subject: [PATCH 4/5] structured code --- src/pages/master/MasterPage.jsx | 15 ++++-- src/pages/master/MasterTable.jsx | 88 ++++++++++++++++++-------------- 2 files changed, 61 insertions(+), 42 deletions(-) diff --git a/src/pages/master/MasterPage.jsx b/src/pages/master/MasterPage.jsx index 86640587..0991b7f5 100644 --- a/src/pages/master/MasterPage.jsx +++ b/src/pages/master/MasterPage.jsx @@ -111,11 +111,16 @@ const MasterPage = () => { return ( <> {isCreateModalOpen && ( - closeModal()}> + closeModal()} + > )} diff --git a/src/pages/master/MasterTable.jsx b/src/pages/master/MasterTable.jsx index a677588b..b2285842 100644 --- a/src/pages/master/MasterTable.jsx +++ b/src/pages/master/MasterTable.jsx @@ -9,7 +9,7 @@ const MasterTable = ({ data, columns, loading, handleModalData }) => { const selectedMaster = useSelector( (store) => store.localVariables.selectedMaster ); - const hiddenColumns = [ + const hiddenColumns = [ "id", "featurePermission", "tenant", @@ -27,7 +27,7 @@ const MasterTable = ({ data, columns, loading, handleModalData }) => { "maxFilesAllowed", "maxSizeAllowedInMB", "isValidationRequired", - "documentCategory" + "documentCategory", ]; const safeData = Array.isArray(data) ? data : []; @@ -71,11 +71,13 @@ const MasterTable = ({ data, columns, loading, handleModalData }) => { : col.label, })); - const handleSystemDefined = (message) =>{ - if(message){ - showToast(`The system-defined item ${selectedMaster} cannot be ${message}.`) - } + const handleSystemDefined = (message) => { + if (message) { + showToast( + `The system-defined item ${selectedMaster} cannot be ${message}.` + ); } + }; return (
@@ -86,12 +88,18 @@ const MasterTable = ({ data, columns, loading, handleModalData }) => { - {selectedMaster === "Activity" ? "Activity" : "Name"} - {selectedMaster === "Activity" - ? "Unit" - : selectedMaster === "Document Type" - ? "Content Type" - : "Description"} + + {" "} + {selectedMaster === "Activity" ? "Activity" : "Name"} + + + {" "} + {selectedMaster === "Activity" + ? "Unit" + : selectedMaster === "Document Type" + ? "Content Type" + : "Description"} + Actions @@ -126,28 +134,28 @@ const MasterTable = ({ data, columns, loading, handleModalData }) => { ))} - {(selectedMaster === "Application Role" || selectedMaster === "Work Category") && item?.isSystem ? ( + {(selectedMaster === "Application Role" || + selectedMaster === "Work Category") && + item?.isSystem ? ( <> - + - - + + ) : ( <> From eea36a2722fdb4f07041cd00a90985d491da98de Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Wed, 10 Sep 2025 20:01:06 +0530 Subject: [PATCH 5/5] handle delete master modal --- src/components/master/DeleteMaster.jsx | 42 ++-- src/pages/master/MasterPage.jsx | 286 ++++++++----------------- src/pages/master/MasterTable.jsx | 5 +- 3 files changed, 115 insertions(+), 218 deletions(-) diff --git a/src/components/master/DeleteMaster.jsx b/src/components/master/DeleteMaster.jsx index f6c877ec..82be4902 100644 --- a/src/components/master/DeleteMaster.jsx +++ b/src/components/master/DeleteMaster.jsx @@ -1,48 +1,46 @@ -import React, { useState } from "react"; -import axios from "axios"; +import { useDeleteMasterItem } from "../../hooks/masterHook/useMaster"; -const API_URL = "http://localhost:5000/mastersdata"; const DeleteMaster = ({ master, onClose }) => { - const [loader, setLoader] = useState(false); + const { mutate: deleteMaster, isPending } = useDeleteMasterItem(); const handleDelete = () => { - const index = mastersdata[master?.masterType]?.findIndex( - (item) => String(item?.id) === String(master?.item?.id) + deleteMaster( + { masterType: master?.masterType, item: master?.item }, + { + onSuccess: () => { + onClose(); + }, + } ); - if (index !== -1) { - mastersdata[master?.masterType].splice(index, 1); - } - onClose(); }; return (
-

Are your sure , you want delete

-
+

Are you sure you want to delete?

+
-
); diff --git a/src/pages/master/MasterPage.jsx b/src/pages/master/MasterPage.jsx index 0991b7f5..93eb85fb 100644 --- a/src/pages/master/MasterPage.jsx +++ b/src/pages/master/MasterPage.jsx @@ -1,235 +1,135 @@ -import React, { useState, useEffect, useMemo } from "react"; +import React, { useState, useMemo, useEffect } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { useQueryClient } from "@tanstack/react-query"; import Breadcrumb from "../../components/common/Breadcrumb"; import MasterModal from "../../components/master/MasterModal"; -import { mastersList } from "../../data/masters"; -import { useDispatch, useSelector } from "react-redux"; -import { changeMaster } from "../../slices/localVariablesSlice"; -import useMaster, { useMasterMenu } from "../../hooks/masterHook/useMaster"; +import ConfirmModal from "../../components/common/ConfirmModal"; import MasterTable from "./MasterTable"; -import { getCachedData } from "../../slices/apiDataManager"; +import useMaster, { useDeleteMasterItem, useMasterMenu } from "../../hooks/masterHook/useMaster"; +import { changeMaster } from "../../slices/localVariablesSlice"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { MANAGE_MASTER } from "../../utils/constants"; -import { useQueryClient } from "@tanstack/react-query"; import GlobalModel from "../../components/common/GlobalModel"; const MasterPage = () => { - const { data, isLoading, isError, error: menuError } = useMasterMenu(); - const [modalConfig, setModalConfig] = useState(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 selectedMaster = useSelector((store) => store.localVariables.selectedMaster); + const hasMasterPermission = useHasUserPermission(MANAGE_MASTER); - const { - data: masterData = [], - loading, - error, - RecallApi, - isError: isMasterError, - } = useMaster(); + const { data: menuData, isLoading: menuLoading, isError: menuErrorFlag, error: menuError } = useMasterMenu(); + const { data: masterData = [], loading, isError: isMasterError } = useMaster(); + const { mutate: DeleteMaster, isPending: isDeleting } = useDeleteMasterItem(); - const openModal = () => setIsCreateModalOpen(true); + const [modalConfig, setModalConfig] = useState(null); + const [deleteData, setDeleteData] = useState(null); + const [searchTerm, setSearchTerm] = useState(""); - 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 = null, - 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) + const displayData = useMemo(() => { + const dataSource = queryClient.getQueryData(["masterData", selectedMaster]) || masterData; + if (!searchTerm) return dataSource; + return dataSource.filter((item) => + Object.values(item).some((val) => + val?.toString().toLowerCase().includes(searchTerm.toLowerCase()) ) ); - setFilteredResults(results); - }; - const displayData = useMemo(() => { - if (searchTerm) return filteredResults; - return ( - queryClient.getQueryData(["masterData", selectedMaster]) || masterData - ); - }, [searchTerm, filteredResults, selectedMaster, masterData]); + }, [searchTerm, masterData, selectedMaster, queryClient]); const columns = useMemo(() => { - if (!displayData?.length) return []; - return Object.keys(displayData[0]).map((key) => ({ - key, - label: key.toUpperCase(), - })); + if (!displayData.length) return []; + return Object.keys(displayData[0]).map((key) => ({ key, label: key.toUpperCase() })); }, [displayData]); - useEffect(() => { - if (modalConfig) openModal(); - }, [modalConfig]); + const handleModalData = (type, item = null, masterType = selectedMaster) => { + if (type === "delete") setDeleteData({ item, masterType }); + else setModalConfig({ modalType: type, item, masterType }); + }; - useEffect(() => { - return () => { - setIsCreateModalOpen(false); - closeModal(); - }; - }, []); + const handleDeleteSubmit = () => { + if (!deleteData) return; + DeleteMaster({ masterType: deleteData.masterType, item: deleteData.item }, { + onSuccess: () => setDeleteData(null), + }); + }; - if (isError || isMasterError) + if (menuErrorFlag || isMasterError) return (
-

- Oops, an error - occurred +

+ Oops, an error occurred

-

{error?.message || menuError?.message}

+

{menuError?.message || "Error fetching master data"}

); + return ( <> - {isCreateModalOpen && ( + {modalConfig && ( closeModal()} + size={["Application Role", "Edit-Application Role"].includes(modalConfig.masterType) ? "lg" : "md"} + isOpen={!!modalConfig} + closeModal={() => setModalConfig(null)} > - + setModalConfig(null)} /> )} + setDeleteData(null)} + /> +
- + +
-
-
-
-
-
- -
-
-
-
-
-
- -
-
- {" "} -
- {" "} -
-
-
-
+
+
+ +
+
+
setSearchTerm(e.target.value)} + />
+ {hasMasterPermission && ( + + )}
- - -
+ +
diff --git a/src/pages/master/MasterTable.jsx b/src/pages/master/MasterTable.jsx index b2285842..3f3297b5 100644 --- a/src/pages/master/MasterTable.jsx +++ b/src/pages/master/MasterTable.jsx @@ -179,9 +179,8 @@ const MasterTable = ({ data, columns, loading, handleModalData }) => { aria-label="Delete" type="button" className="btn p-0 dropdown-toggle hide-arrow" - onClick={() => - handleModalData("delete", item, selectedMaster) - } + onClick={() => handleModalData("delete", item, selectedMaster)} + >