"use client"; /** * ViewRouter — maps a DatabaseView to its renderer (the view-type dispatch * shared by the embedded block (db-embedded) and the full database page * (database-page-view)). Keeping it here means both surfaces render views * identically and a new view type is added in exactly one place. * * The record-panel / record-page callbacks are provided by the parent: * - onOpenRecord(record) → open the right-hand record panel * - onOpenRecordPage(record) → navigate to the record's page * Ad-hoc sort/filter/group are applied by the parent toolbar; the router * receives the already-composed UseDatabaseRecordsResult. */ import { DatabaseDto, DatabaseView as ViewDto, RecordDto, UseDatabaseRecordsResult, UseDatabaseRecordsOptions } from "@/hooks/use-database"; import { TableView } from "@/components/database/table-view"; import { BoardView } from "@/components/database/board-view"; import { GalleryView } from "@/components/database/gallery-view"; import { ListView } from "@/components/database/list-view"; import { CalendarView } from "@/components/database/calendar-view"; import { TimelineView } from "@/components/database/timeline-view"; import { ChartView } from "@/components/database/chart-view"; import { FormView } from "@/components/form/form-view"; export interface ViewRouterCallbacks { onOpenRecord: (record: RecordDto) => void; onOpenRecordPage: (record: RecordDto) => void; /** Ad-hoc sort override (table header cycle / board). */ onSortChange?: (sort: import("@/hooks/use-database").SortSpec[] | null) => void; /** Ad-hoc filter override (table column quick-filter). */ onFilterChange?: (filter: import("@/hooks/use-database").FilterTree | null) => void; /** T-166: persist the rows-per-page on the view (`view.pageSize`). */ onPageSizeChange?: (pageSize: number) => void; } export interface ViewRouterProps { database: DatabaseDto; view: ViewDto; records: UseDatabaseRecordsResult; callbacks: ViewRouterCallbacks; readOnly?: boolean; } export function ViewRouter({ database, view, records, callbacks, readOnly }: ViewRouterProps) { const properties = database.properties; const { onOpenRecord, onOpenRecordPage, onSortChange, onFilterChange, onPageSizeChange } = callbacks; switch (view.type) { case "table": return ( undefined)} onFilterChange={onFilterChange ?? (() => undefined)} onPageSizeChange={onPageSizeChange} readOnly={readOnly} /> ); case "board": return ; case "gallery": return ; case "list": return ; case "calendar": return ; case "timeline": return ; case "chart": return ; case "form": return ( ); case "dashboard": return ; default: return ( undefined)} onFilterChange={onFilterChange ?? (() => undefined)} onPageSizeChange={onPageSizeChange} readOnly={readOnly} /> ); } } export function EmptyNote({ text }: { text: string }) { return (
{text}
); } export type { UseDatabaseRecordsOptions };