diff --git a/src/components/Tenanat/TenantFilterPanel.jsx b/src/components/Tenanat/TenantFilterPanel.jsx
new file mode 100644
index 00000000..0cfaf2f5
--- /dev/null
+++ b/src/components/Tenanat/TenantFilterPanel.jsx
@@ -0,0 +1,40 @@
+import { zodResolver } from '@hookform/resolvers/zod'
+import React from 'react'
+import { FormProvider, useForm, useFormContext } from 'react-hook-form'
+import { defaultFilterValues, filterSchema } from './TenantSchema'
+import Label from '../common/Label'
+import SelectMultiple from '../common/SelectMultiple'
+import { useIndustries } from '../../hooks/useTenant'
+
+const TenantFilterPanel = () => {
+
+const method = useForm({
+ resolver:zodResolver(filterSchema),
+ defaultValues:defaultFilterValues
+})
+const {control, register, handleSubmit, reset, watch} = method;
+const {data,isError,isLoading} = useIndustries()
+console.log(data)
+const onSubmit =()=>{
+
+}
+if(isLoading) return
Loading...
+ return (
+
+
+
+
+ )
+}
+
+export default TenantFilterPanel
\ No newline at end of file
diff --git a/src/components/Tenanat/TenantSchema.js b/src/components/Tenanat/TenantSchema.js
index dc754730..b1d6aac1 100644
--- a/src/components/Tenanat/TenantSchema.js
+++ b/src/components/Tenanat/TenantSchema.js
@@ -64,6 +64,24 @@ export const subscriptionDefaultValues = {
autoRenew: false,
};
+
+export const filterSchema = z.object({
+ industryIds: z.array(z.string()).optional(),
+ createdByIds: z.array(z.string()).optional(),
+ tenantStatusIds: z.array(z.string()).optional(),
+ references: z.array(z.string()).optional(),
+ startDate: z.string().optional(),
+ endDate: z.string().optional(),
+});
+export const defaultFilterValues = {
+ industryIds: [],
+ createdByIds: [],
+ tenantStatusIds: [],
+ references: [],
+ startDate: "YYYY-MM-DDTHH:mm:ssZ",
+ endDate: "YYYY-MM-DDTHH:mm:ssZ",
+};
+
export const getStepFields = (stepIndex) => {
const stepFieldMap = {
0: [
diff --git a/src/components/Tenanat/TenantsList.jsx b/src/components/Tenanat/TenantsList.jsx
index fe6dada6..aa79c9e1 100644
--- a/src/components/Tenanat/TenantsList.jsx
+++ b/src/components/Tenanat/TenantsList.jsx
@@ -3,12 +3,14 @@ import { useTenants } from "../../hooks/useTenant";
import { ITEMS_PER_PAGE } from "../../utils/constants";
import { getTenantStatus } from "../../utils/dateUtils";
import IconButton from "../common/IconButton";
+import Pagination from "../common/Pagination";
const TenantsList = ({searchText}) => {
const [currentPage, setCurrentPage] = useState(1);
const { data, isLoading, isError, isInitialLoading, error } = useTenants(
- ITEMS_PER_PAGE,
- currentPage
+ currentPage,
+ {},
+ searchText,
);
const paginate = (page) => {
@@ -131,6 +133,13 @@ const TenantsList = ({searchText}) => {
)}
+ {data?.data?.length > 0 && (
+
+ )}
>
diff --git a/src/data/menuData.json b/src/data/menuData.json
index 6491d852..b32d22a2 100644
--- a/src/data/menuData.json
+++ b/src/data/menuData.json
@@ -1,118 +1,124 @@
[
- {
- "header": "",
- "items": [
- {
- "text": "Dashboard",
- "icon": "bx bx-home",
- "available": true,
- "link": "/dashboard"
- },
- {
- "text": "Projects",
- "icon": "bx bx-building-house",
- "available": true,
- "link": "/projects"
- },
- {
- "text": "Employees",
- "icon": "bx bx-user",
- "available": true,
- "link": "/employees"
- },
- {
- "text": "Activities",
- "icon": "bx bx-list-ul",
- "available": true,
- "link": "",
- "submenu": [
- {
- "text": "Attendance",
- "available": true,
- "link": "/activities/Attendance"
- },
- {
- "text": "Daily Task Planning",
- "available": true,
- "link": "/activities/task"
- },
- {
- "text": "Daily Progress Report",
- "available": true,
- "link": "/activities/records"
- },
- {
- "text": "Project Report",
- "available": true,
- "link": "/activities/reports"
- },
-
- {
- "text": "Daily Expenses",
- "available": true,
- "link": "/activities/reports"
- }
- ]
- },
- {
- "text": "Directory",
- "icon": "bx bx-group",
- "available": true,
- "link": "/directory"
- },
- {
- "text": "Image Gallary",
- "icon": "bx bx-images",
- "available": true,
- "link": "/gallary"
- },
- {
- "text": "Administration",
- "icon": "bx bx-box",
- "available": true,
- "link": "",
- "submenu": [
- {
- "text": "Users",
- "available": true,
- "link": "/employees/"
- },
- {
- "text": "Masters",
- "available": true,
- "link": "/masters"
- }
- ]
- },
- {
- "text": "Inventory",
- "icon": "bx bx-store",
- "available": true,
- "link": "/inventory"
- }
+ {
+ "header": "",
+ "items": [
+ {
+ "text": "Dashboard",
+ "icon": "bx bx-home",
+ "available": true,
+ "link": "/dashboard"
+ },
+ {
+ "text": "Projects",
+ "icon": "bx bx-building-house",
+ "available": true,
+ "link": "/projects"
+ },
+ {
+ "text": "Employees",
+ "icon": "bx bx-user",
+ "available": true,
+ "link": "/employees"
+ },
+ {
+ "text": "Activities",
+ "icon": "bx bx-list-ul",
+ "available": true,
+ "link": "",
+ "submenu": [
+ {
+ "text": "Attendance",
+ "available": true,
+ "link": "/activities/Attendance"
+ },
+ {
+ "text": "Daily Task Planning",
+ "available": true,
+ "link": "/activities/task"
+ },
+ {
+ "text": "Daily Progress Report",
+ "available": true,
+ "link": "/activities/records"
+ },
+ {
+ "text": "Project Report",
+ "available": true,
+ "link": "/activities/reports"
+ },
+
+ {
+ "text": "Daily Expenses",
+ "available": true,
+ "link": "/activities/reports"
+ }
]
- },
- {
- "header": "",
- "items": [
- {
- "text": "Support",
- "icon": "bx bx-copy",
- "available": true,
- "link": "/help/support"
- },
- {
- "text": "Documentation",
- "available": true,
- "icon": "bx bx-book-reader",
- "link": "/help/docs"
- },
- {
- "text": "Help Desk",
- "available": true,
- "link": "/help/connect",
- "icon": "bx bx-question-mark"
- }
+ },
+ {
+ "text": "Directory",
+ "icon": "bx bx-group",
+ "available": true,
+ "link": "/directory"
+ },
+ {
+ "text": "Expense",
+ "icon": "bx bx-receipt",
+ "available": true,
+ "link": "/expenses"
+ },
+ {
+ "text": "Image Gallary",
+ "icon": "bx bx-images",
+ "available": true,
+ "link": "/gallary"
+ },
+ {
+ "text": "Administration",
+ "icon": "bx bx-box",
+ "available": true,
+ "link": "",
+ "submenu": [
+ {
+ "text": "Tenant",
+ "available": true,
+ "link": "/tenants/"
+ },
+ {
+ "text": "Masters",
+ "available": true,
+ "link": "/masters"
+ }
]
- }
+ },
+ {
+ "text": "Inventory",
+ "icon": "bx bx-store",
+ "available": true,
+ "link": "/inventory"
+ }
+ ]
+ },
+ {
+ "header": "",
+ "items": [
+ {
+ "text": "Support",
+ "icon": "bx bx-copy",
+ "available": true,
+ "link": "/help/support"
+ },
+ {
+ "text": "Documentation",
+ "available": true,
+ "icon": "bx bx-book-reader",
+ "link": "/help/docs"
+ },
+ {
+ "text": "Help Desk",
+ "available": true,
+ "link": "/help/connect",
+ "icon": "bx bx-question-mark"
+ }
+ ]
+ }
]
diff --git a/src/hooks/useTenant.js b/src/hooks/useTenant.js
index 52d7a0c8..a1342870 100644
--- a/src/hooks/useTenant.js
+++ b/src/hooks/useTenant.js
@@ -4,23 +4,22 @@ import { MarketRepository } from "../repositories/MarketRepository";
import showToast from "../services/toastService";
import { useDispatch } from "react-redux";
import { setCurrentTenant } from "../slices/globalVariablesSlice";
+import { ITEMS_PER_PAGE } from "../utils/constants";
-export const useTenants = (
- pageSize,
- pageNumber,
- filter,
- searchString = ""
-) => {
+export const useTenants = (pageNumber, filter = {}, searchString = "") => {
return useQuery({
- queryKey: ["Tenants", pageNumber, pageSize],
+ queryKey: ["Tenants", pageNumber, JSON.stringify(filter), searchString],
queryFn: async () => {
const response = await TenantRepository.getTenantList(
- pageSize,
+ ITEMS_PER_PAGE,
pageNumber,
+ filter,
+ searchString
);
return response.data;
},
keepPreviousData: true,
+ staleTime: 60_000
});
};
diff --git a/src/pages/Activities/DailyTask.jsx b/src/pages/Activities/DailyTask.jsx
index a545736f..79b0ddf2 100644
--- a/src/pages/Activities/DailyTask.jsx
+++ b/src/pages/Activities/DailyTask.jsx
@@ -48,11 +48,13 @@ const DailyTask = () => {
dateRange?.endDate || null
);
- useEffect(() => {
- if(selectedProject == null){
- dispatch(setProjectId(projectNames[0]?.id));
- }
- },[])
+ useEffect(() => {
+ if (!selectedProject?.id && projectNames.length > 0) {
+ dispatch(setProjectId(projectNames[0].id));
+}
+
+}, [selectedProject, projectNames, dispatch]);
+
const [TaskLists, setTaskLists] = useState([]);
const [dates, setDates] = useState([]);
const popoverRefs = useRef([]);
diff --git a/src/pages/Tenant/TenantPage.jsx b/src/pages/Tenant/TenantPage.jsx
index 47bc0800..aecce42f 100644
--- a/src/pages/Tenant/TenantPage.jsx
+++ b/src/pages/Tenant/TenantPage.jsx
@@ -1,9 +1,19 @@
-import React, { useState,createContext } from "react";
+import React, { useState, createContext, useEffect } from "react";
+import { useForm } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+// ------Components-------
import Breadcrumb from "../../components/common/Breadcrumb";
import TenantsList from "../../components/Tenanat/TenantsList";
import { useNavigate } from "react-router-dom";
+import { useDebounce } from "../../utils/appUtils";
+import { useFab } from "../../Context/FabContext";
+
+//---------- Schema and defaultValues----
+import { defaultFilterValues, filterSchema } from "../../components/Tenanat/TenantSchema";
+import TenantFilterPanel from "../../components/Tenanat/TenantFilterPanel";
+// This is context that wrapping all components tenant releated , but must pass inside 'TenantContext.Provider'
export const TenantContext = createContext();
export const useTenantContext = () => {
const context = useContext(TenantContext);
@@ -12,52 +22,72 @@ export const useTenantContext = () => {
}
return context;
};
+
const TenantPage = () => {
const [searchText, setSearchText] = useState("");
+ const debouncedSearch = useDebounce(searchText, 500);
+ const contextValue = {};
const navigate = useNavigate();
- const contextValue = {
-
- };
- return (
-
-
-
-
-
-
-
-
+ const { setOffcanvasContent, setShowTrigger } = useFab();
-
-
+
+ // This Hook allow us to right-side bar for filter Tenants
+
+ useEffect(() => {
+ setShowTrigger(true);
+ setOffcanvasContent(
+ "Expense Filters",
+
+ );
+ return () => {
+ setShowTrigger(false);
+ setOffcanvasContent("", null);
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+ setSearchText(e.target.value)}
+ className="form-control form-control-sm"
+ placeholder="Search..."
+ />
+
+
+
+
+
-
-
-
+
+
);
};
diff --git a/src/router/AppRoutes.jsx b/src/router/AppRoutes.jsx
index b489a311..013933d9 100644
--- a/src/router/AppRoutes.jsx
+++ b/src/router/AppRoutes.jsx
@@ -40,6 +40,7 @@ import Directory from "../pages/Directory/Directory";
import LoginWithOtp from "../pages/authentication/LoginWithOtp";
import TenantPage from "../pages/Tenant/TenantPage";
import CreateTenant from "../pages/Tenant/CreateTenant";
+import ExpensePage from "../pages/Expense/ExpensePage";
const router = createBrowserRouter(
[
diff --git a/src/utils/constants.jsx b/src/utils/constants.jsx
index 371ae4f7..87fe1719 100644
--- a/src/utils/constants.jsx
+++ b/src/utils/constants.jsx
@@ -1,6 +1,6 @@
export const THRESH_HOLD = 48; // hours
-export const DURATION_TIME = 10; // minutes
-export const ITEMS_PER_PAGE = 20;
+export const DURATION_TIME = 20; // minutes
+export const ITEMS_PER_PAGE = 10;
export const OTP_EXPIRY_SECONDS = 600 // OTP time
export const MANAGE_MASTER = "588a8824-f924-4955-82d8-fc51956cf323";
@@ -41,14 +41,36 @@ export const DIRECTORY_MANAGER = "62668630-13ce-4f52-a0f0-db38af2230c5"
export const DIRECTORY_USER = "0f919170-92d4-4337-abd3-49b66fc871bb"
-export const BASIC_PLAN = "08ddd43e-ca62-4cf4-8d7b-569a364307f4"
+export const VIEW_SELF_EXPENSE = "385be49f-8fde-440e-bdbc-3dffeb8dd116"
+
+export const VIEW_ALL_EXPNESE = "01e06444-9ca7-4df4-b900-8c3fa051b92f";
+
+export const CREATE_EXEPENSE = "0f57885d-bcb2-4711-ac95-d841ace6d5a7";
+
+export const REVIEW_EXPENSE = "1f4bda08-1873-449a-bb66-3e8222bd871b";
+
+export const APPROVE_EXPENSE = "eaafdd76-8aac-45f9-a530-315589c6deca";
+
+
+export const PROCESS_EXPENSE = "ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"
+
+export const EXPENSE_MANAGE = "ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"
+
+export const EXPENSE_REJECTEDBY = ["d1ee5eec-24b6-4364-8673-a8f859c60729","965eda62-7907-4963-b4a1-657fb0b2724b"]
+
+export const EXPENSE_DRAFT = "297e0d8f-f668-41b5-bfea-e03b354251c8"
+
+
+export const ActiveTenant = "297e0d8f-f668-41b5-bfea-e03b354251c8"
+// -------------------Application Role------------------------------
+
+// 1 - Expense Manage
+export const EXPENSE_MANAGEMENT = "a4e25142-449b-4334-a6e5-22f70e4732d7"
+
+
+export const CONSTANT_TEXT = {
+
+}
export const BASE_URL = process.env.VITE_BASE_URL;
-
-export const ActiveTenant = "62b05792-5115-4f99-8ff5-e8374859b191"
// export const BASE_URL = "https://api.marcoaiot.com";
-
-
-export const CONSTANT_TEXT = {
- RenewsubscriptionLabel : " This option; if checked, will renew your productive subscription, if the current plan expires."
-}