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 })} />