import {useState, useEffect, useCallback} from "react"; import {AxiosError} from "axios"; import {BytescaleUploader} from "@/components/BytescaleUploader/BytescaleUploader"; import { getDepartmentsApi, createDepartmentApi, updateDepartmentApi, } 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 {Switch} from "@/components/ui/switch"; import {Label} from "@/components/ui/label"; import {Badge} from "@/components/ui/badge"; import { Loader2, RefreshCw, Plus, Pencil, Eye, ChevronLeft, ChevronRight, } from "lucide-react"; interface Department { departmentId: string; name: string; image?: string; para1: string; para2: string; para3: string; facilities: string; services: string; isActive: boolean; sortOrder: number; } 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: "", isActive: true, sortOrder: 0, }); 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) { const value = e.target.type === "number" ? Number(e.target.value) : e.target.value; setForm({...form, [e.target.name]: value}); } const handleToggleStatus = async (dep: Department) => { try { const {departmentId, ...updateData} = dep; await updateDepartmentApi(departmentId, { ...updateData, isActive: !dep.isActive, } as any); fetchDepartments(); } catch (error) { console.error("Failed to toggle status", error); } }; function openAdd() { setEditing(null); setForm({ departmentId: "", name: "", image: "", para1: "", para2: "", para3: "", facilities: "", services: "", isActive: true, sortOrder: 0, }); setOpenModal(true); } function openEdit(dep: Department) { setEditing(dep); setForm({ ...dep, isActive: dep.isActive ?? true, sortOrder: dep.sortOrder ?? 0, }); setOpenModal(true); } function openView(dep: Department) { setViewData(dep); setViewOpen(true); } async function handleSubmit() { try { if (editing) { const {departmentId, ...updateData} = form; await updateDepartmentApi(editing.departmentId, form as any); } else { await createDepartmentApi(form); } setOpenModal(false); fetchDepartments(); } catch (error) { console.error(error); } } return (

Departments

setSearchText(e.target.value)} className="w-[250px] text-base" />
{error && (
{error}
)} Department List
Priority Name Status (Active) Actions {loading ? ( ) : currentItems.length === 0 ? ( No departments found ) : ( currentItems.map((dep) => ( {dep.sortOrder}
{dep.name}
{dep.departmentId}
handleToggleStatus(dep)} /> {dep.isActive ? "Active" : "Hidden"}
)) )}
{!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})} />