feat: add search in department
This commit is contained in:
@@ -51,6 +51,8 @@ export default function DepartmentPage() {
|
|||||||
const [openModal, setOpenModal] = useState(false);
|
const [openModal, setOpenModal] = useState(false);
|
||||||
const [editing, setEditing] = useState<Department | null>(null);
|
const [editing, setEditing] = useState<Department | null>(null);
|
||||||
|
|
||||||
|
const [searchText, setSearchText] = useState("");
|
||||||
|
|
||||||
const [form, setForm] = useState<Department>({
|
const [form, setForm] = useState<Department>({
|
||||||
departmentId: "",
|
departmentId: "",
|
||||||
name: "",
|
name: "",
|
||||||
@@ -83,6 +85,20 @@ export default function DepartmentPage() {
|
|||||||
fetchDepartments();
|
fetchDepartments();
|
||||||
}, [fetchDepartments]);
|
}, [fetchDepartments]);
|
||||||
|
|
||||||
|
const filteredDepartments = departments.filter((dep) => {
|
||||||
|
const text = searchText.toLowerCase();
|
||||||
|
|
||||||
|
return (
|
||||||
|
dep.name.toLowerCase().includes(text) ||
|
||||||
|
dep.departmentId.toLowerCase().includes(text) ||
|
||||||
|
dep.para1.toLowerCase().includes(text) ||
|
||||||
|
dep.para2.toLowerCase().includes(text) ||
|
||||||
|
dep.para3.toLowerCase().includes(text) ||
|
||||||
|
dep.facilities.toLowerCase().includes(text) ||
|
||||||
|
dep.services.toLowerCase().includes(text)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
function handleChange(
|
function handleChange(
|
||||||
e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,
|
e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,
|
||||||
) {
|
) {
|
||||||
@@ -144,10 +160,18 @@ export default function DepartmentPage() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="p-6 space-y-6">
|
<div className="p-6 space-y-6">
|
||||||
<div className="flex justify-between items-center">
|
{/* HEADER */}
|
||||||
|
<div className="flex flex-col md:flex-row md:justify-between md:items-center gap-3">
|
||||||
<h1 className="text-2xl font-bold">Departments</h1>
|
<h1 className="text-2xl font-bold">Departments</h1>
|
||||||
|
|
||||||
<div className="flex gap-3">
|
<div className="flex flex-wrap gap-3">
|
||||||
|
<Input
|
||||||
|
placeholder="Search department..."
|
||||||
|
value={searchText}
|
||||||
|
onChange={(e) => setSearchText(e.target.value)}
|
||||||
|
className="w-[220px]"
|
||||||
|
/>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onClick={fetchDepartments}
|
onClick={fetchDepartments}
|
||||||
@@ -198,14 +222,14 @@ export default function DepartmentPage() {
|
|||||||
<Loader2 className="h-6 w-6 animate-spin mx-auto" />
|
<Loader2 className="h-6 w-6 animate-spin mx-auto" />
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
) : departments.length === 0 ? (
|
) : filteredDepartments.length === 0 ? (
|
||||||
<TableRow>
|
<TableRow>
|
||||||
<TableCell colSpan={8} className="text-center">
|
<TableCell colSpan={8} className="text-center">
|
||||||
No departments found
|
No departments found
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
) : (
|
) : (
|
||||||
departments.map((dep) => (
|
filteredDepartments.map((dep) => (
|
||||||
<TableRow key={dep.departmentId}>
|
<TableRow key={dep.departmentId}>
|
||||||
<TableCell>{dep.departmentId}</TableCell>
|
<TableCell>{dep.departmentId}</TableCell>
|
||||||
|
|
||||||
@@ -258,7 +282,6 @@ export default function DepartmentPage() {
|
|||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
{/* MODAL */}
|
{/* MODAL */}
|
||||||
|
|
||||||
<Dialog open={openModal} onOpenChange={setOpenModal}>
|
<Dialog open={openModal} onOpenChange={setOpenModal}>
|
||||||
<DialogContent className="max-w-4xl">
|
<DialogContent className="max-w-4xl">
|
||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
|
|||||||
Reference in New Issue
Block a user