CoreControl/app/dashboard/sites/SitesPage.tsx

104 lines
3.9 KiB
TypeScript
Raw Normal View History

2025-05-18 11:53:40 +02:00
"use client";
import Sidebar from "@/components/Sidebar";
import { Plus } from "lucide-react";
import AddSite from "@/components/dialogues/AddSite";
2025-05-18 12:06:21 +02:00
import Sites from "@/components/cards/Sites";
2025-05-18 12:40:11 +02:00
import Pagination from "@/components/Pagination";
2025-05-20 20:23:08 +02:00
import useSite from "@/hooks/useSites";
import SearchAndLayout from "@/components/SearchAndLayout";
2025-05-19 15:05:35 +02:00
import Loading from "@/components/Loading";
2025-05-18 11:53:40 +02:00
interface SitesPageProps {
username: string;
name: string;
}
export default function SitesPage({ username, name }: SitesPageProps) {
const {
sites,
currentPage,
itemPerPage,
total,
search,
setSearch,
handlePageChange,
setItemPerPage,
2025-05-19 15:05:35 +02:00
loadSites,
loading
2025-05-20 20:23:08 +02:00
} = useSite();
2025-05-18 11:53:40 +02:00
return (
<Sidebar
username={username}
fullName={name}
breadcrumbPath={['/', 'Dashboard', 'Ressources', 'Sites']}
>
<main>
<div className="flex gap-4 items-center">
<div className="flex-1">
<h1 className="text-2xl font-bold">Sites</h1>
<p className="text-sm opacity-70">
Manage your sites. Sites are real-world locations where you can
monitor your assets & add networks.
</p>
2025-05-18 11:53:40 +02:00
</div>
<button
className="btn btn-primary"
onClick={() => document.getElementById('add_site')?.showModal()}
>
2025-05-18 11:53:40 +02:00
<Plus className="w-5 h-5" />
Add Site
</button>
</div>
2025-05-18 12:50:56 +02:00
<AddSite onSiteAdded={loadSites} />
<SearchAndLayout
search={search}
setSearch={setSearch}
itemPerPage={itemPerPage}
setItemPerPage={setItemPerPage}
/>
2025-05-18 12:20:33 +02:00
2025-05-19 15:05:35 +02:00
{loading ? (
<div className="flex justify-center items-center h-48 mt-4">
<Loading />
2025-05-19 00:35:23 +02:00
</div>
) : (
2025-05-19 15:05:35 +02:00
<>
{sites.length > 0 ? (
<div className={
itemPerPage === 5
? "flex flex-col gap-4 pt-4"
: "grid grid-cols-1 md:grid-cols-2 gap-4 pt-4"
}>
{sites.map((site: any) => (
<Sites
key={site.id}
id={site.id}
name={site.name}
description={site.description}
networks={site.networks}
/>
))}
</div>
) : (
<div className="flex justify-center items-center h-48 bg-base-200 rounded-lg mt-4">
<div className="text-center">
<h3 className="text-lg font-bold">No Sites Found</h3>
<p className="text-sm opacity-70">No sites match your current search criteria</p>
</div>
</div>
)}
<Pagination
currentPage={currentPage}
totalItems={total}
itemsPerPage={itemPerPage}
onPageChange={handlePageChange}
/>
</>
2025-05-19 00:35:23 +02:00
)}
2025-05-18 11:53:40 +02:00
</main>
</Sidebar>
)
}