import {useState, useEffect, useCallback} from "react"; import {AxiosError} from "axios"; import {BytescaleUploader} from "@/components/BytescaleUploader/BytescaleUploader"; import { getDepartmentsApi, createDepartmentApi, updateDepartmentApi, deleteDepartmentApi, } from "@/api/department"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import {Card, CardContent, CardHeader, CardTitle} from "@/components/ui/card"; import {Button} from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import {Input} from "@/components/ui/input"; import {Textarea} from "@/components/ui/textarea"; import { Loader2, RefreshCw, Plus, Pencil, Trash, Eye, ChevronLeft, ChevronRight, } from "lucide-react"; interface Department { departmentId: string; name: string; image?: string; para1: string; para2: string; para3: string; facilities: string; services: string; } export default function DepartmentPage() { const [departments, setDepartments] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [openModal, setOpenModal] = useState(false); const [editing, setEditing] = useState(null); const [viewOpen, setViewOpen] = useState(false); const [viewData, setViewData] = useState(null); const [searchText, setSearchText] = useState(""); const [currentPage, setCurrentPage] = useState(1); const itemsPerPage = 10; const [form, setForm] = useState({ departmentId: "", name: "", image: "", para1: "", para2: "", para3: "", facilities: "", services: "", }); const fetchDepartments = useCallback(async () => { setLoading(true); setError(""); try { const res = await getDepartmentsApi(); setDepartments(res?.data || []); } catch (err) { if (err instanceof AxiosError) { setError(err.response?.data?.message || "Failed to load departments"); } else { setError("Something went wrong"); } } finally { setLoading(false); } }, []); useEffect(() => { fetchDepartments(); }, [fetchDepartments]); const filteredDepartments = departments.filter( (dep) => dep.name.toLowerCase().includes(searchText.toLowerCase()) || dep.departmentId.toLowerCase().includes(searchText.toLowerCase()), ); useEffect(() => { setCurrentPage(1); }, [searchText]); const totalPages = Math.ceil(filteredDepartments.length / itemsPerPage); const indexOfLastItem = currentPage * itemsPerPage; const indexOfFirstItem = indexOfLastItem - itemsPerPage; const currentItems = filteredDepartments.slice( indexOfFirstItem, indexOfLastItem, ); function handleChange(e: any) { setForm({...form, [e.target.name]: e.target.value}); } function truncate(text: string, limit = 60) { if (!text) return "-"; return text.length > limit ? text.substring(0, limit) + "..." : text; } function openAdd() { setEditing(null); setForm({ departmentId: "", name: "", image: "", para1: "", para2: "", para3: "", facilities: "", services: "", }); setOpenModal(true); } function openEdit(dep: Department) { setEditing(dep); setForm(dep); setOpenModal(true); } function openView(dep: Department) { setViewData(dep); setViewOpen(true); } async function handleSubmit() { try { if (editing) { const {departmentId, ...updateData} = form; await updateDepartmentApi(editing.departmentId, updateData); } else { await createDepartmentApi(form); } setOpenModal(false); fetchDepartments(); } catch (error) { console.error(error); } } async function handleDelete(id: string) { if (!confirm("Delete this department?")) return; try { await deleteDepartmentApi(id); fetchDepartments(); } catch (error) { console.error(error); } } return (

Departments

setSearchText(e.target.value)} className="w-[250px] text-base" />
{error && (
{error}
)} Department List
ID Name Para 1 Facilities Services Actions {loading ? ( ) : currentItems.length === 0 ? ( No departments found ) : ( currentItems.map((dep) => ( {dep.departmentId}
{dep.name}
{truncate(dep.para1)}
{truncate(dep.facilities)}
{truncate(dep.services)}
)) )}
{!loading && filteredDepartments.length > 0 && (
Showing{" "} {indexOfFirstItem + 1} to{" "} {Math.min(indexOfLastItem, filteredDepartments.length)} {" "} of{" "} {filteredDepartments.length} {" "} departments
Page {currentPage} of {totalPages}
)}
{editing ? "Edit Department" : "Add Department"}
setForm({...form, image: url})} />