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 9b8fda8f..93eb85fb 100644 --- a/src/pages/master/MasterPage.jsx +++ b/src/pages/master/MasterPage.jsx @@ -1,226 +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 && ( - closeModal()}> - + {modalConfig && ( + 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 a677588b..3f3297b5 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 ? ( <> - + - - + + ) : ( <> 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), diff --git a/src/router/AppRoutes.jsx b/src/router/AppRoutes.jsx index b2a32e5c..c2d15a0f 100644 --- a/src/router/AppRoutes.jsx +++ b/src/router/AppRoutes.jsx @@ -47,7 +47,11 @@ import MainRegisterPage from "../pages/authentication/MainRegisterPage"; import MainForgetPage from "../pages/authentication/MainForgetPage"; 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( [ { @@ -91,6 +95,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: },