diff --git a/src/components/Organization/OrganizationsList.jsx b/src/components/Organization/OrganizationsList.jsx new file mode 100644 index 00000000..09a075df --- /dev/null +++ b/src/components/Organization/OrganizationsList.jsx @@ -0,0 +1,149 @@ +import React from "react"; +import { useOrganizationsList } from "../../hooks/useOrganization"; +import { ITEMS_PER_PAGE } from "../../utils/constants"; +import Avatar from "../common/Avatar"; +import { useDebounce } from "../../utils/appUtils"; + +const OrganizationsList = ({searchText}) => { + const searchString = useDebounce(searchText,500) + const { + data = [], + isLoading, + isFetching, + isError, + error, + } = useOrganizationsList(ITEMS_PER_PAGE, 1, true,null,searchString); + + const organizationsColumns = [ + { + key: "name", + label: "Organization Name", + getValue: (org) => ( +
+ + + {org?.name || "N/A"} + +
+ ), + align: "text-start", + }, + { + key: "contactPerson", + label: "Contact Person", + getValue: (org) => ( + ( +
+ + + {org?.name || "N/A"} + +
+ ) + ), + align: "text-start", + }, + { + key: "contactNumber", + label: "Phone Number", + getValue: (org) => org.contactNumber || "N/A", + align: "text-start", + }, + { + key: "email", + label: "Email", + getValue: (org) => ( + + {org?.email || "N/A"} + + ), + align: "text-start", + }, + { + key: "sprid", + label: "SPRID Id", + getValue: (org) => org.sprid || "N/A", + align: "text-center", + }, + ]; + + if (isFetching && !isFetching) return
Loading...
; + if (isError) return
{error?.message || "Something went wrong"}
; + + return ( +
+
+
+ + + + {organizationsColumns.map((col) => ( + + ))} + + + + + {data.length > 0 ? ( + data.map((org) => ( + + {organizationsColumns.map((col) => ( + + ))} + + + )) + ) : ( + + + + )} + +
+
{col.label}
+
+ Action +
+ {col.customRender + ? col.customRender(org) + : col.getValue(org)} + +
+ + + +
+
+

Not Found

+
+
+
+
+ ); +}; + +export default OrganizationsList; diff --git a/src/hooks/useOrganization.js b/src/hooks/useOrganization.js index 598eace6..dff6d68f 100644 --- a/src/hooks/useOrganization.js +++ b/src/hooks/useOrganization.js @@ -4,7 +4,7 @@ import { openOrgModal, closeOrgModal, } from "../slices/localVariablesSlice"; -import { useMutation } from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import OrganizationRepository from "../repositories/OrganizationRespository"; import showToast from "../services/toastService"; @@ -22,11 +22,24 @@ export const useOrganizationModal = () => { }; }; +export const useOrganizationsList = (pageSize, pageNumber, active, sprid, searchString="") => { + return useQuery({ + queryKey: ["organizationList", pageSize, pageNumber, active, sprid, searchString], + queryFn: async() => { + const resp = await OrganizationRepository.getOrganizationList(pageSize, pageNumber, active, sprid, searchString); + return resp.data; + }, + keepPreviousData: true, + }); +}; + export const useCreateOrganization = (onSuccessCallback) => { + const useClient = useQueryClient() return useMutation({ mutationFn: async (OrgPayload) => await OrganizationRepository.createOrganization(OrgPayload), onSuccess: (_, variables) => { + useClient.invalidateQueries({queryKey:["organizationList"]}) showToast("Organization created successfully", "success"); if (onSuccessCallback) onSuccessCallback(); }, diff --git a/src/pages/Organization/OrganizationPage.jsx b/src/pages/Organization/OrganizationPage.jsx index e4fef80d..b5c70833 100644 --- a/src/pages/Organization/OrganizationPage.jsx +++ b/src/pages/Organization/OrganizationPage.jsx @@ -1,9 +1,12 @@ -import React from "react"; +import React, { useState } from "react"; import Breadcrumb from "../../components/common/Breadcrumb"; import { useOrganizationModal } from "../../hooks/useOrganization"; +import OrganizationsList from "../../components/Organization/OrganizationsList"; const OrganizationPage = () => { const orgModal = useOrganizationModal() + const [searchText,setSearchText] = useState("") + return (
{
-
+
setSearchText(e.target.value)} className="form-control form-control-sm w-auto" placeholder="Search Organization" aria-describedby="search-label" @@ -36,6 +41,8 @@ const OrganizationPage = () => {
+ +
); }; diff --git a/src/repositories/OrganizationRespository.jsx b/src/repositories/OrganizationRespository.jsx index 4bd2f9d4..af87f613 100644 --- a/src/repositories/OrganizationRespository.jsx +++ b/src/repositories/OrganizationRespository.jsx @@ -1,9 +1,14 @@ import { api } from "../utils/axiosClient"; - -const OrganizationRepository = { - createOrganization:(data)=>api.post('/api/Organization/create',data) -} +const OrganizationRepository = { + createOrganization: (data) => api.post("/api/Organization/create", data), + getOrganizationList: (pageSize, pageNumber, active, sprid, searchString) => { + return api.get( + `/api/Organization/list?pageSize=${pageSize}&pageNumber=${pageNumber}&active=${active}&${ + sprid ? `sprid=${sprid}&` : "" + }searchString=${searchString}` + ); + }, +}; export default OrganizationRepository; -