import { useId } from "react"; import { AuthRequiredSurface, ForbiddenSurface, NotFoundSurface, } from "../../components/state-surfaces.jsx"; import { Button } from "../primitives/core.js"; import { Pagination } from "../primitives/navigation.js"; export type DataTableColumn = Readonly<{ id: string; header: string; cell(row: Row): React.ReactNode; }>; export function DataTable({ caption, columns, rows, rowKey, empty, }: Readonly<{ caption: string; columns: readonly DataTableColumn[]; rows: readonly Row[]; rowKey(row: Row): string; empty: React.ReactNode; }>) { if (rows.length === 0) return <>{empty}; return (
{columns.map((column) => ( ))} {rows.map((row) => ( {columns.map((column) => ( ))} ))}
{caption}
{column.header}
{column.cell(row)}
); } export function SearchFilterToolbar({ label, search, filters, resetLabel, onReset, resultCount, }: Readonly<{ label: string; search: React.ReactNode; filters?: React.ReactNode; resetLabel: string; onReset(): void; resultCount: React.ReactNode; }>) { return (
{search}
{filters ?
{filters}
: null} {resultCount}
); } export function PaginationBar({ range, ...pagination }: React.ComponentProps & Readonly<{ range: string }>) { return (

{range}

); } export type DisclosureDefinition = Readonly<{ id: string; title: string; content: React.ReactNode; }>; export function DisclosureGroup({ label, items, }: Readonly<{ label: string; items: readonly DisclosureDefinition[]; }>) { const groupId = useId(); return (

{label}

{items.map((item) => (
{item.title}
{item.content}
))}
); } export type AccessSurfaceProps = | Readonly<{ kind: "auth-required"; onAction(): void }> | Readonly<{ kind: "forbidden"; onAction(): void }> | Readonly<{ kind: "not-found"; onAction(): void }>; export function AccessSurface(props: AccessSurfaceProps) { if (props.kind === "auth-required") { return ; } if (props.kind === "forbidden") { return ; } return ; }