165 lines
5.2 KiB
JavaScript
165 lines
5.2 KiB
JavaScript
import React, { useState } from "react";
|
|
import { useOrganizationModal, useOrganizationsList } from "../../hooks/useOrganization";
|
|
import { ITEMS_PER_PAGE } from "../../utils/constants";
|
|
import Avatar from "../common/Avatar";
|
|
import { useDebounce } from "../../utils/appUtils";
|
|
import Pagination from "../common/Pagination";
|
|
|
|
const OrganizationsList = ({searchText}) => {
|
|
const [currentPage, setCurrentPage] = useState(1);
|
|
const searchString = useDebounce(searchText,500)
|
|
const {
|
|
data = [],
|
|
isLoading,
|
|
isFetching,
|
|
isError,
|
|
error,
|
|
} = useOrganizationsList(ITEMS_PER_PAGE, 1, true,null,searchString);
|
|
const {onClose, startStep, flowType, onOpen,orgData } = useOrganizationModal();
|
|
|
|
const organizationsColumns = [
|
|
{
|
|
key: "name",
|
|
label: "Organization Name",
|
|
getValue: (org) => (
|
|
<div className="d-flex gap-2 py-1 ">
|
|
<i class="bx bx-buildings"></i>
|
|
<span
|
|
className="text-truncate d-inline-block "
|
|
style={{ maxWidth: "150px" }}
|
|
>
|
|
{org?.name || "N/A"}
|
|
</span>
|
|
</div>
|
|
),
|
|
align: "text-start",
|
|
},
|
|
{
|
|
key: "contactPerson",
|
|
label: "Contact Person",
|
|
getValue: (org) => (
|
|
(
|
|
<div className="d-flex align-items-center ps-1">
|
|
<Avatar
|
|
size="xs"
|
|
classAvatar="m-0"
|
|
firstName={(org?.name || "").trim().split(" ")[0] || ""}
|
|
lastName={(org?.name || "").trim().split(" ")[1] || ""}
|
|
/>
|
|
<span
|
|
className="text-truncate d-inline-block "
|
|
style={{ maxWidth: "150px" }}
|
|
>
|
|
{org?.name || "N/A"}
|
|
</span>
|
|
</div>
|
|
)
|
|
),
|
|
align: "text-start",
|
|
},
|
|
{
|
|
key: "contactNumber",
|
|
label: "Phone Number",
|
|
getValue: (org) => org.contactNumber || "N/A",
|
|
align: "text-start",
|
|
},
|
|
{
|
|
key: "email",
|
|
label: "Email",
|
|
getValue: (org) => (
|
|
<span
|
|
className="text-truncate d-inline-block"
|
|
style={{ maxWidth: "200px" }}
|
|
>
|
|
{org?.email || "N/A"}
|
|
</span>
|
|
),
|
|
align: "text-start",
|
|
},
|
|
{
|
|
key: "sprid",
|
|
label: "SPRID Id",
|
|
getValue: (org) => org.sprid || "N/A",
|
|
align: "text-center",
|
|
},
|
|
];
|
|
|
|
const paginate = (page) => {
|
|
if (page >= 1 && page <= (data?.totalPages ?? 1)) {
|
|
setCurrentPage(page);
|
|
}
|
|
};
|
|
if (isFetching && !isFetching) return <div>Loading...</div>;
|
|
if (isError) return <div>{error?.message || "Something went wrong"}</div>;
|
|
|
|
return (
|
|
<div className="card px-0 px-sm-4 pb-12 pt-5">
|
|
<div className="card-datatable table-responsive" id="horizontal-example">
|
|
<div className="dataTables_wrapper no-footer px-2">
|
|
<table className="table border-top dataTable text-nowrap">
|
|
<thead>
|
|
<tr className="table_header_border">
|
|
{organizationsColumns.map((col) => (
|
|
<th
|
|
key={col.key}
|
|
className="sorting d-table-cell"
|
|
aria-sort="descending"
|
|
>
|
|
<div className={`${col.align}`}>{col.label}</div>
|
|
</th>
|
|
))}
|
|
<th className="sticky-action-column bg-white text-center">
|
|
Action
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{data?.data?.length > 0 ? (
|
|
data?.data?.map((org) => (
|
|
<tr key={org.id}>
|
|
{organizationsColumns.map((col) => (
|
|
<td
|
|
key={col.key}
|
|
className={`d-table-cell ${col.align ?? ""}`}
|
|
>
|
|
{col.customRender
|
|
? col.customRender(org)
|
|
: col.getValue(org)}
|
|
</td>
|
|
))}
|
|
<td className="sticky-action-column ">
|
|
<div className="d-flex justify-content-center gap-2">
|
|
<i className="bx bx-show text-primary cursor-pointer" onClick={()=>onOpen({startStep:5,orgData:org.id,flowType:"view"})}></i>
|
|
<i className="bx bx-edit text-secondary cursor-pointer" onClick={()=>onOpen({startStep:4,orgData:org,flowType:"edit"})}></i>
|
|
<i className="bx bx-trash text-danger cursor-pointer"></i>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
))
|
|
) : (
|
|
<tr>
|
|
<td
|
|
colSpan={organizationsColumns.length + 1}
|
|
className="text-center"
|
|
>
|
|
<p className="fw-semibold">Not Found</p>
|
|
</td>
|
|
</tr>
|
|
)}
|
|
</tbody>
|
|
</table>
|
|
{data?.data?.length > 0 && (
|
|
<Pagination
|
|
currentPage={currentPage}
|
|
totalPages={data.totalPages}
|
|
onPageChange={paginate}
|
|
/>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default OrganizationsList;
|