diff --git a/src/components/DailyProgressRport/TaskReportFilterChips.jsx b/src/components/DailyProgressRport/TaskReportFilterChips.jsx new file mode 100644 index 00000000..fb78094f --- /dev/null +++ b/src/components/DailyProgressRport/TaskReportFilterChips.jsx @@ -0,0 +1,95 @@ +import React, { useMemo } from "react"; +import { formatUTCToLocalTime } from "../../utils/dateUtils"; + +const TaskReportFilterChips = ({ filter, filterData, removeFilterChip, clearFilter }) => { + const data = filterData?.data || filterData || {}; + + const filterChips = useMemo(() => { + const chips = []; + + const addGroup = (ids, list, label, key) => { + if (!ids || ids.length === 0) return; + + const items = ids.map((id) => ({ + id, + name: list?.find((i) => i.id === id)?.name || id, + })); + + chips.push({ key, label, items }); + }; + + // Building + addGroup(filter?.buildingIds, data?.buildings, "Building", "buildingIds"); + + // Floor + addGroup(filter?.floorIds, data?.floors, "Floor", "floorIds"); + + // Activities + addGroup(filter?.activityIds, data?.activities, "Activity", "activityIds"); + + // Date Range Chips + if (filter?.dateFrom || filter?.dateTo) { + chips.push({ + key: "date", + label: "Date Range", + items: [ + { + id: "date-range", + name: `${filter?.dateFrom ? formatUTCToLocalTime(filter.dateFrom) : ""} + ${filter?.dateTo ? " to " + formatUTCToLocalTime(filter.dateTo) : ""}`, + }, + ], + }); + } + + return chips; + }, [filter, filterData]); + + if (!filterChips.length) return null; + + return ( +
+ {filterChips.map((chipGroup) => ( +
+ {chipGroup.label}: + + {chipGroup.items.map((item) => ( + + {item.name} + + {/* If date chip → remove whole date range */} + {chipGroup.key === "date" ? ( +
+ ))} +
+ ); +}; + +export default TaskReportFilterChips; diff --git a/src/components/DailyProgressRport/TaskReportFilterPanel.jsx b/src/components/DailyProgressRport/TaskReportFilterPanel.jsx index e682ad14..b5d831ee 100644 --- a/src/components/DailyProgressRport/TaskReportFilterPanel.jsx +++ b/src/components/DailyProgressRport/TaskReportFilterPanel.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react"; import { useCurrentService } from "../../hooks/useProjects"; import { useSelectedProject } from "../../slices/apiDataManager"; import { FormProvider, useForm } from "react-hook-form"; @@ -11,8 +11,9 @@ import { DateRangePicker1 } from "../common/DateRangePicker"; import SelectMultiple from "../common/SelectMultiple"; import { localToUtc } from "../../utils/appUtils"; import { useTaskFilter } from "../../hooks/useTasks"; +import { set } from "date-fns"; -const TaskReportFilterPanel = ({ handleFilter }) => { +const TaskReportFilterPanel = forwardRef(({ handleFilter, setFilterdata, clearFilter }, ref) => { const [resetKey, setResetKey] = useState(0); const selectedProject = useSelectedProject(); const selectedService = useCurrentService(); @@ -23,10 +24,42 @@ const TaskReportFilterPanel = ({ handleFilter }) => { defaultValues: TaskReportDefaultValue, }); + const dynamicDefaultFilter = useMemo(() => { + return { + ...TaskReportDefaultValue, + buildingIds: TaskReportDefaultValue.buildingIds || [], + floorIds: TaskReportDefaultValue.floorIds || [], + activityIds: TaskReportDefaultValue.activityIds || [], + dateFrom: TaskReportDefaultValue.dateFrom, + dateTo: TaskReportDefaultValue.dateTo, + }; + }, [selectedProject]); + + useImperativeHandle(ref, () => ({ + resetFieldValue: (name, value) => { + // Reset specific field + if (value !== undefined) { + setValue(name, value); + } else { + // Fix: Use TaskReportDefaultValue or get current values before setting new ones + // reset({ ...methods.getValues(), [name]: TaskReportDefaultValue[name] }); // Updated to use TaskReportDefaultValue + setValue(name, TaskReportDefaultValue[name]); + } + }, + getValues: methods.getValues, + onClear: onClear, // 💡 EXPOSE THE ONCLEAR FUNCTION + })); + + useEffect(() => { + if (data && setFilterdata) { + setFilterdata(data); + } + }, [data, setFilterdata]); const { register, reset, handleSubmit, + setValue, formState: { errors }, } = methods; const closePanel = () => { @@ -52,7 +85,7 @@ const TaskReportFilterPanel = ({ handleFilter }) => {
{ ); -}; +}); export default TaskReportFilterPanel; diff --git a/src/components/DailyProgressRport/TaskReportList.jsx b/src/components/DailyProgressRport/TaskReportList.jsx index 5e9cf12d..e9e74c80 100644 --- a/src/components/DailyProgressRport/TaskReportList.jsx +++ b/src/components/DailyProgressRport/TaskReportList.jsx @@ -17,8 +17,9 @@ import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import Pagination from "../common/Pagination"; import { TaskReportListSkeleton } from "./TaskRepprtListSkeleton"; import HoverPopup from "../common/HoverPopup"; +import TaskReportFilterChips from "./TaskReportFilterChips"; -const TaskReportList = () => { +const TaskReportList = ({ filter, filterData, removeFilterChip, clearFilter }) => { const [currentPage, setCurrentPage] = useState(1); const [filters, setFilters] = useState({ selectedBuilding: "", @@ -29,7 +30,7 @@ const TaskReportList = () => { const ApprovedTaskRights = useHasUserPermission(APPROVE_TASK); const ReportTaskRights = useHasUserPermission(ASSIGN_REPORT_TASK); - const { service, openModal, closeModal, filter } = useDailyProgrssContext(); + const { service, openModal, closeModal, filter: contextFilter } = useDailyProgrssContext(); const selectedProject = useSelectedProject(); const { projectNames } = useProjectName(); @@ -37,7 +38,7 @@ const TaskReportList = () => { selectedProject, ITEMS_PER_PAGE, currentPage, - service, filter + service, contextFilter ); const ProgrssReportColumn = [ @@ -193,124 +194,135 @@ const TaskReportList = () => { if (isError) return
Loading....
; return (
-
- - - - - - - - - - - - - - {groupedTasks.length === 0 && ( +
+
+ +
+
+
Activity - - Total Pending{" "} - - This shows the total pending tasks for each activity on that date. - - } - > - - - - - - Reported/Planned{" "} - - This shows the reported versus planned tasks for each activity on that date. - - } - > - - - - Assign DateTeamActions
+ - - - )} + + - {groupedTasks.map(({ date, tasks }) => ( - - - + + + + + + + + {groupedTasks.length === 0 && ( + + - {tasks.map((task, idx) => ( - - - - - - - + - ))} - - ))} - -
- No reports available -
Activity + + Total Pending{" "} + + This shows the total pending tasks for each activity on that date. + + } + > + + + +
- {formatUTCToLocalTime(date)} + + + Reported/Planned{" "} + + This shows the reported versus planned tasks for each activity on that date. + + } + > + + + + Assign DateTeamActions
+ No reports available
-
- {task.workItem.activityMaster?.activityName || "No Activity Name"} -
-
- {task.workItem.workArea?.floor?.building?.name} ›{" "} - {task.workItem.workArea?.floor?.floorName} ›{" "} - {task.workItem.workArea?.areaName} -
-
- {formatNumber(task.workItem.plannedWork)} - {`${formatNumber(task.completedTask)} / ${formatNumber(task.plannedTask)}`}{formatUTCToLocalTime(task.assignmentDate)}{renderTeamMembers(task, idx)} -
- {ReportTaskRights && !task.reportedDate && ( - - )} - {ApprovedTaskRights && task.reportedDate && !task.approvedBy && ( - - )} - -
+ )} + + {groupedTasks.map(({ date, tasks }) => ( + +
+ {formatUTCToLocalTime(date)}
+ {tasks.map((task, idx) => ( + + +
+ {task.workItem.activityMaster?.activityName || "No Activity Name"} +
+
+ {task.workItem.workArea?.floor?.building?.name} ›{" "} + {task.workItem.workArea?.floor?.floorName} ›{" "} + {task.workItem.workArea?.areaName} +
+ + + {formatNumber(task.workItem.plannedWork)} + + {`${formatNumber(task.completedTask)} / ${formatNumber(task.plannedTask)}`} + {formatUTCToLocalTime(task.assignmentDate)} + {renderTeamMembers(task, idx)} + +
+ {ReportTaskRights && !task.reportedDate && ( + + )} + {ApprovedTaskRights && task.reportedDate && !task.approvedBy && ( + + )} + +
+ + + ))} + + ))} + + -
- { - data?.data?.length > 0 && ( - - ) - } +
+ { + data?.data?.length > 0 && ( + + ) + } +
); }; diff --git a/src/components/Documents/DocumentFilterPanel.jsx b/src/components/Documents/DocumentFilterPanel.jsx index 04f54956..f093099b 100644 --- a/src/components/Documents/DocumentFilterPanel.jsx +++ b/src/components/Documents/DocumentFilterPanel.jsx @@ -59,12 +59,18 @@ const DocumentFilterPanel = forwardRef( useImperativeHandle(ref, () => ({ resetFieldValue: (name, value) => { if (value !== undefined) { - setValue(name, value); + setValue(name, value, { shouldValidate: true, shouldDirty: true }); } else { reset({ ...methods.getValues(), [name]: DocumentFilterDefaultValues[name] }); } + + if ((name === "startDate" || name === "endDate") && value === null) { + setTimeout(() => { + setResetKey((prev) => prev + 1); + }, 0); + } }, - getValues: methods.getValues, // optional, to read current filter state + getValues: methods.getValues, })); //changes @@ -141,6 +147,7 @@ const DocumentFilterPanel = forwardRef( defaultRange={false} resetSignal={resetKey} maxDate={new Date()} + className="w-100" /> diff --git a/src/components/Documents/Documents.jsx b/src/components/Documents/Documents.jsx index 930ceb8c..588c801f 100644 --- a/src/components/Documents/Documents.jsx +++ b/src/components/Documents/Documents.jsx @@ -124,26 +124,27 @@ const Documents = ({ Document_Entity, Entity }) => { const updatedFilters = { ...filters }; if (Array.isArray(updatedFilters[key])) { updatedFilters[key] = updatedFilters[key].filter((v) => v !== id); - updatedRef.current?.resetFieldValue(key,updatedFilters[key]); + updatedRef.current?.resetFieldValue(key, updatedFilters[key]); } else if (key === "dateRange") { updatedFilters.startDate = null; updatedFilters.endDate = null; - updatedRef.current?.resetFieldValue("startDate",null); - updatedRef.current?.resetFieldValue("endDate",null); + // These calls correctly tell the DocumentFilterPanel to update its form state: + updatedRef.current?.resetFieldValue("startDate", null); + updatedRef.current?.resetFieldValue("endDate", null); } else { updatedFilters[key] = null; } setFilter(updatedFilters); - return updatedFilters; + return updatedFilters; }; return (
- +
{/* Search */}
@@ -194,6 +195,9 @@ const Documents = ({ Document_Entity, Entity }) => { )}
+
+ +
{ const hasAccessAplication = watch("hasApplicationAccess"); return ( <> -
+

{" "} diff --git a/src/components/Expenses/ExpenseFilterPanel.jsx b/src/components/Expenses/ExpenseFilterPanel.jsx index 88dc7ccd..8b6f149d 100644 --- a/src/components/Expenses/ExpenseFilterPanel.jsx +++ b/src/components/Expenses/ExpenseFilterPanel.jsx @@ -94,6 +94,14 @@ const ExpenseFilterPanel = forwardRef( reset({ ...methods.getValues(), [name]: defaultFilter[name] }); } }, + // --- START FIX: Add resetDateRange method --- + resetDateRange: () => { + setValue("startDate", null); + setValue("endDate", null); + // Trigger re-render/reset of the DateRangePicker component + setResetKey((prev) => prev + 1); + }, + // --- END FIX --- getValues: methods.getValues, // optional, to read current filter state })); @@ -137,13 +145,13 @@ const ExpenseFilterPanel = forwardRef( : dynamicDefaultFilter.projectIds || [], startDate: dynamicDefaultFilter.startDate ? moment - .utc(dynamicDefaultFilter.startDate, "DD-MM-YYYY") - .toISOString() + .utc(dynamicDefaultFilter.startDate, "DD-MM-YYYY") + .toISOString() : undefined, endDate: dynamicDefaultFilter.endDate ? moment - .utc(dynamicDefaultFilter.endDate, "DD-MM-YYYY") - .toISOString() + .utc(dynamicDefaultFilter.endDate, "DD-MM-YYYY") + .toISOString() : undefined, }; @@ -176,18 +184,16 @@ const ExpenseFilterPanel = forwardRef(

+ ))} +
+ ); +}; + +export default TenantFilterChips; diff --git a/src/components/Tenant/TenantFilterPanel.jsx b/src/components/Tenant/TenantFilterPanel.jsx index 1c2c43ca..8700391b 100644 --- a/src/components/Tenant/TenantFilterPanel.jsx +++ b/src/components/Tenant/TenantFilterPanel.jsx @@ -1,5 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod"; -import React, { useState, useCallback, useEffect } from "react"; +import React, { useState, useCallback, useEffect, useImperativeHandle, forwardRef, useMemo } from "react"; import { FormProvider, useForm, useFormContext } from "react-hook-form"; import { defaultFilterValues, filterSchema } from "./TenantSchema"; import Label from "../common/Label"; @@ -10,16 +10,44 @@ import { DateRangePicker1 } from "../common/DateRangePicker"; import moment from "moment"; import { useLocation } from "react-router-dom"; -const TenantFilterPanel = ({ onApply }) => { +const TenantFilterPanel = forwardRef(({ onApply, setFilterdata, clearFilter }, ref) => { const [resetKey, setResetKey] = useState(0); const methods = useForm({ resolver: zodResolver(filterSchema), defaultValues: defaultFilterValues, }); + const { handleSubmit, reset, setValue } = methods; + const { data: industries, isLoading } = useIndustries(); + + const dynamicDefaultFilter = useMemo(() => { + return { + ...defaultFilterValues, + industryIds: defaultFilterValues.industryIds || [], + tenantStatusIds: defaultFilterValues.tenantStatusIds || [], + references: defaultFilterValues.references || [], + startDate: defaultFilterValues.startDate, + endDate: defaultFilterValues.endDate, + }; + }, [defaultFilterValues]); + +useImperativeHandle(ref, () => ({ + resetFieldValue: (name, value) => { + setValue(name, value); + }, + resetFields: () => { + reset(defaultFilterValues); + setResetKey(prev => prev + 1); // reset date picker + } +})); + + + useEffect(() => { + if (industries && setFilterdata) { + setFilterdata(industries); + } + }, [industries, setFilterdata]); - const { handleSubmit, reset } = methods; - const { data: industries = [], isLoading } = useIndustries(); const handleClosePanel = useCallback(() => { document.querySelector(".offcanvas.show .btn-close")?.click(); @@ -32,9 +60,8 @@ const TenantFilterPanel = ({ onApply }) => { startDate: moment.utc(formData.startDate, "DD-MM-YYYY").toISOString(), endDate: moment.utc(formData.endDate, "DD-MM-YYYY").toISOString(), }); - handleClosePanel(); }, - [onApply, handleClosePanel] + [onApply] ); @@ -65,6 +92,7 @@ const TenantFilterPanel = ({ onApply }) => { endField="endDate" resetSignal={resetKey} defaultRange={false} + className="w-100" />
@@ -119,6 +147,6 @@ const TenantFilterPanel = ({ onApply }) => { ); -}; +}); export default TenantFilterPanel; diff --git a/src/components/Tenant/TenantsList.jsx b/src/components/Tenant/TenantsList.jsx index d82cb6f2..bb6ac50c 100644 --- a/src/components/Tenant/TenantsList.jsx +++ b/src/components/Tenant/TenantsList.jsx @@ -7,12 +7,14 @@ import Pagination from "../common/Pagination"; import { TenantTableSkeleton } from "./TenanatSkeleton"; import { useTenantContext } from "../../pages/Tenant/TenantPage"; import { useNavigate } from "react-router-dom"; +import TenantFilterChips from "./TenantFilterChips"; const TenantsList = ({ filters, searchText, setIsRefetching, setRefetchFn, + filterData, removeFilterChip, clearFilter }) => { const [currentPage, setCurrentPage] = useState(1); const navigate = useNavigate(); @@ -135,54 +137,65 @@ const TenantsList = ({ ); return ( <> -
-
- - - - {TenantColumns.map((col) => ( - - ))} - - - - {data?.data.length > 0 ? ( - data.data.map((tenant) => ( - - {TenantColumns.map((col) => ( - - ))} - - )) - ) : ( - - +
+
+ + +
+
+
+
-
{col.label}
-
- {col.customRender - ? col.customRender(tenant) - : col.getValue(tenant)} -
- No Tenants Found -
+ + + {TenantColumns.map((col) => ( + + ))} - )} - -
+
{col.label}
+
- {data?.data?.length > 0 && ( - - )} + + + {data?.data.length > 0 ? ( + data.data.map((tenant) => ( + + {TenantColumns.map((col) => ( + + {col.customRender + ? col.customRender(tenant) + : col.getValue(tenant)} + + ))} + + )) + ) : ( + + + No Tenants Found + + + )} + + + {data?.data?.length > 0 && ( + + )} +
diff --git a/src/pages/DailyProgressReport/DailyProgrssReport.jsx b/src/pages/DailyProgressReport/DailyProgrssReport.jsx index e543895e..73abefac 100644 --- a/src/pages/DailyProgressReport/DailyProgrssReport.jsx +++ b/src/pages/DailyProgressReport/DailyProgrssReport.jsx @@ -1,4 +1,4 @@ -import React, { createContext, useContext, useEffect, useState } from "react"; +import React, { createContext, useContext, useEffect, useRef, useState } from "react"; import Breadcrumb from "../../components/common/Breadcrumb"; import { useServices } from "../../hooks/masterHook/useMaster"; import TaskReportList from "../../components/DailyProgressRport/TaskReportList"; @@ -13,6 +13,7 @@ import { useSelectedProject } from "../../slices/apiDataManager"; import SelectField from "../../components/common/Forms/SelectField"; import { AppFormController } from "../../hooks/appHooks/useAppForm"; import { useForm } from "react-hook-form"; +import { TaskReportDefaultValue } from "../../components/DailyProgressRport/TaskRportScheam"; const DailyProgrssContext = createContext(); export const useDailyProgrssContext = () => { @@ -30,8 +31,9 @@ const DailyProgrssReport = () => { const [service, setService] = useState(""); const [filter, setFilter] = useState('') const { setOffcanvasContent, setShowTrigger } = useFab(); + const updatedRef = useRef(); const { data, isLoading, isError, error } = useProjectAssignedServices(selectedProject); - + const [filterData, setFilterdata] = useState(null); const [modal, setModal] = useState({ type: null, data: null }); const openModal = (type, data = null) => setModal({ type, data }); @@ -49,20 +51,40 @@ const DailyProgrssReport = () => { serviceFilter: "" } }); - + const clearFilter = () => { + updatedRef.current?.onClear(); +}; const handleFilter = (filterObj) => { setFilter(filterObj) } useEffect(() => { setShowTrigger(true); - setOffcanvasContent("Report Filter", ); + setOffcanvasContent("Report Filter", ); return () => { setShowTrigger(false); setOffcanvasContent("", null); }; }, []); + + const handleRemoveChip = (key, id) => { + setFilter((prev) => { + const updated = { ...prev }; + + if (Array.isArray(updated[key])) { + updated[key] = updated[key].filter((v) => v !== id); + setTimeout(() => updatedRef.current?.resetFieldValue(key, updated[key]), 0); + } else { + updated[key] = null; + setTimeout(() => updatedRef.current?.resetFieldValue(key, null), 0); + } + + return updated; + }); + }; return (
@@ -97,7 +119,7 @@ const DailyProgrssReport = () => { ]} /> -
+
{data?.length > 0 && (
{ render={({ field }) => ( { - field.onChange(val); - setService(val); + field.onChange(val); + setService(val); }} className="m-0" /> @@ -125,7 +147,10 @@ const DailyProgrssReport = () => { )}
- +
diff --git a/src/pages/Expense/ExpensePage.jsx b/src/pages/Expense/ExpensePage.jsx index 7a37fd34..c36c8a44 100644 --- a/src/pages/Expense/ExpensePage.jsx +++ b/src/pages/Expense/ExpensePage.jsx @@ -106,10 +106,13 @@ const ExpensePage = () => { updated[key] = updated[key].filter((v) => v !== id); filterPanelRef.current?.resetFieldValue(key, updated[key]); } else if (key === "dateRange") { + // --- START FIX: Use a dedicated function to reset the date range --- updated.startDate = null; updated.endDate = null; - filterPanelRef.current?.resetFieldValue("startDate", null); - filterPanelRef.current?.resetFieldValue("endDate", null); + + // Call the new resetDateRange method on the ref + filterPanelRef.current?.resetDateRange(); + // --- END FIX --- } return updated; }); diff --git a/src/pages/PaymentRequest/PaymentRequestPage.jsx b/src/pages/PaymentRequest/PaymentRequestPage.jsx index 402f325e..f22c4bfb 100644 --- a/src/pages/PaymentRequest/PaymentRequestPage.jsx +++ b/src/pages/PaymentRequest/PaymentRequestPage.jsx @@ -71,6 +71,11 @@ const PaymentRequestPage = () => { if (Array.isArray(updated[key])) { updated[key] = updated[key].filter((v) => v !== id); setTimeout(() => updatedRef.current?.resetFieldValue(key, updated[key]), 0); + } else if (key === "dateRange") { // Handle date range reset + updated.startDate = null; + updated.endDate = null; + // Call the new resetDateRange method on the ref + updatedRef.current?.resetDateRange(); } else { updated[key] = null; setTimeout(() => updatedRef.current?.resetFieldValue(key, null), 0); @@ -80,9 +85,9 @@ const PaymentRequestPage = () => { }); }; - const handleExport = (type) => { + const handleExport = (type) => { HandlePaymentRequestExport(type, filters, search, tableRef, setExportLoading); -}; + }; return ( diff --git a/src/pages/Tenant/TenantPage.jsx b/src/pages/Tenant/TenantPage.jsx index 3ab2015c..8d805cdf 100644 --- a/src/pages/Tenant/TenantPage.jsx +++ b/src/pages/Tenant/TenantPage.jsx @@ -5,6 +5,7 @@ import React, { useContext, useCallback, useMemo, + useRef, } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -59,6 +60,7 @@ const TenantPage = () => { const [refetchFn, setRefetchFn] = useState(null); const [filters, setFilters] = useState(); + // ---------- Hooks ---------- const debouncedSearch = useDebounce(searchText, 500); const { setOffcanvasContent, setShowTrigger } = useFab(); @@ -66,6 +68,9 @@ const TenantPage = () => { const isSuperTenant = useHasUserPermission(SUPPER_TENANT); const canManageTenants = useHasUserPermission(MANAGE_TENANTS); const isSelfTenant = useHasUserPermission(VIEW_TENANTS); + const updatedRef = useRef(); + const [filterData, setFilterdata] = useState(null); + const [filter, setFilter] = useState('') const methods = useForm({ resolver: zodResolver(filterSchema), @@ -77,8 +82,18 @@ const TenantPage = () => { setFilters(values); }, []); + const clearFilter = () => { + setFilters(defaultFilterValues); // update active filters + updatedRef.current?.resetFields?.(); // reset RHF fields in panel + }; + const filterPanelElement = useMemo( - () => , + () => , [handleApplyFilters] ); // ---------- Fab Filter Panel ---------- @@ -112,6 +127,20 @@ const TenantPage = () => { // ---------- Context Value ---------- const contextValue = {}; + const handleRemoveChip = (key, id) => { + setFilters((prev) => { + const updated = { ...prev }; + if (Array.isArray(updated[key])) { + updated[key] = updated[key].filter((v) => v !== id); + } else { + updated[key] = null; + } + + setTimeout(() => updatedRef.current?.resetFieldValue(key, updated[key]), 0); + return updated; + }); + }; + return (
@@ -121,7 +150,7 @@ const TenantPage = () => { { label: "Tenant", link: null }, ]} /> -
+
{/* Super Tenant Actions */} {isSuperTenant && (
@@ -157,10 +186,13 @@ const TenantPage = () => { {/* Tenant List or Access Denied */} {isSuperTenant ? ( ) : !isSelfTenant ? (