"use client"; import { useMemo, useState } from "react"; import { PageHeader, DataTable, EmptyState, Input } from "@/components/ds"; import { Search } from "lucide-react"; import { HospitalityBreadcrumbs } from "@/modules/hospitality/components/HospitalityBreadcrumbs"; export type HospitalityTableColumn = { key: string; header: string; className?: string; render?: (row: Record) => React.ReactNode; searchable?: boolean; }; export function HospitalityTablePage({ title, description, breadcrumb, columns, rows, empty, actions, searchPlaceholder = "جستجو…", filterFn, toolbar, }: { title: string; description?: string; breadcrumb?: string; columns: HospitalityTableColumn[]; rows: Record[]; empty?: React.ReactNode; actions?: React.ReactNode; searchPlaceholder?: string; filterFn?: (row: Record, query: string) => boolean; toolbar?: React.ReactNode; }) { const [query, setQuery] = useState(""); const filtered = useMemo(() => { const q = query.trim().toLowerCase(); if (!q) return rows; if (filterFn) return rows.filter((r) => filterFn(r, q)); return rows.filter((r) => columns.some((c) => { if (c.searchable === false) return false; const val = r[c.key]; return val != null && String(val).toLowerCase().includes(q); }) ); }, [rows, query, columns, filterFn]); return (
{breadcrumb ? : null}
setQuery(e.target.value)} placeholder={searchPlaceholder} className="pr-10" aria-label="جستجو" />
{toolbar}
} />
); }