import type { JSX } from "solid-js"; import type { SimpleTableProps, SimpleTableConfig, ColumnDef, TableAPI, CellValue, CellRendererProps, HeaderRendererProps, FooterRendererProps, LoadingStateRendererProps, ErrorStateRendererProps, EmptyStateRendererProps, HeaderDropdownProps, ColumnEditorRowRendererProps, ColumnEditorCustomRendererProps, ColumnEditorConfig, RowButtonProps } from "simple-table-core"; /** * Default `TData` for Solid props bags / helpers: open records so untyped * object arrays keep assigning to `rows` without `asRows`. * * Prefer letting `` infer `TData` from * those props — an explicit `SimpleTable` is only needed when inference * can't see a typed `rows`/`columns` (or for a typed `ref` callback). */ export type SolidDefaultRowData = Record; export interface TableInstance { mount(): void; update(config: Partial): void; destroy(): void; getAPI(): TableAPI; /** Re-measure `width: "auto"` columns after custom renderer DOM settles. */ refitAutoSizeColumns?(): void; } export type SolidIconElement = JSX.Element; export interface SolidIconsConfig { drag?: SolidIconElement; expand?: SolidIconElement; filter?: SolidIconElement; headerCollapse?: SolidIconElement; headerExpand?: SolidIconElement; next?: SolidIconElement; prev?: SolidIconElement; sortDown?: SolidIconElement; sortUp?: SolidIconElement; pinnedLeftIcon?: SolidIconElement; pinnedRightIcon?: SolidIconElement; } export type SolidCellRenderer = (props: CellRendererProps) => JSX.Element; export type SolidHeaderRenderer = (props: HeaderRendererProps) => JSX.Element; export type SolidFooterRenderer = (props: FooterRendererProps) => JSX.Element; export type SolidHeaderDropdown = (props: HeaderDropdownProps) => JSX.Element; export type SolidColumnEditorRowRenderer = (props: ColumnEditorRowRendererProps) => JSX.Element; export type SolidColumnEditorCustomRenderer = (props: ColumnEditorCustomRendererProps) => JSX.Element; export type SolidRowButton = (props: RowButtonProps) => JSX.Element; export type SolidLoadingStateRenderer = ((props: LoadingStateRendererProps) => JSX.Element) | JSX.Element; export type SolidErrorStateRenderer = ((props: ErrorStateRendererProps) => JSX.Element) | JSX.Element; export type SolidEmptyStateRenderer = ((props: EmptyStateRendererProps) => JSX.Element) | JSX.Element; export interface SolidColumnEditorConfig extends Omit { rowRenderer?: SolidColumnEditorRowRenderer; customRenderer?: SolidColumnEditorCustomRenderer; } /** * Column definition for `columns`: same column metadata as core * columns, but `cellRenderer` / `headerRenderer` / `children` / `nestedTable` are Solid-only. */ export interface SolidColumnDef extends Omit, "cellRenderer" | "headerRenderer" | "children" | "nestedTable"> { cellRenderer?: SolidCellRenderer; headerRenderer?: SolidHeaderRenderer; children?: ReadonlyArray>; /** Nested grid; child columns may use a different row type than `TData`. */ nestedTable?: NestedTableSolidConfig; } export interface SimpleTableSolidProps extends Omit, "columns" | "footerRenderer" | "emptyStateRenderer" | "errorStateRenderer" | "loadingStateRenderer" | "tableEmptyStateRenderer" | "headerDropdown" | "columnEditorConfig" | "icons" | "rows" | "rowButtons" | "onColumnOrderChange" | "onColumnWidthChange" | "onHeaderEdit" | "onColumnSelect"> { /** Column definitions. */ columns?: ReadonlyArray>; onColumnOrderChange?: (newHeaders: SolidColumnDef[]) => void; onColumnWidthChange?: (headers: SolidColumnDef[]) => void; onHeaderEdit?: (header: SolidColumnDef, newLabel: string) => void; onColumnSelect?: (header: SolidColumnDef) => void; /** Row data; cast to vanilla `Row[]` inside the adapter. */ rows: readonly TData[]; footerRenderer?: SolidFooterRenderer; loadingStateRenderer?: SolidLoadingStateRenderer; errorStateRenderer?: SolidErrorStateRenderer; emptyStateRenderer?: SolidEmptyStateRenderer; tableEmptyStateRenderer?: JSX.Element; headerDropdown?: SolidHeaderDropdown; columnEditorConfig?: SolidColumnEditorConfig; icons?: SolidIconsConfig; /** Per-row action buttons; each entry returns JSX rendered into the row's selection column. */ rowButtons?: SolidRowButton[]; /** Callback ref — receives the TableAPI once the table is mounted. */ ref?: (api: TableAPI) => void; } /** * TData-bound call signatures omitted at nest boundaries so * `SolidColumnDef[]` assigns under a parent column without casts/`any`. * Child columns stay fully checked at their own declaration site. */ type SolidColumnDefCallbacks = "cellRenderer" | "headerRenderer" | "children" | "nestedTable" | "comparator" | "exportValueGetter" | "valueFormatter" | "valueGetter" | "quickFilterGetter"; /** Column shape accepted on nested grids — metadata only, no TData-bound callbacks. */ export type NestedSolidColumnDef = Omit, SolidColumnDefCallbacks> & { children?: ReadonlyArray; nestedTable?: NestedTableSolidConfig; }; /** * Nested grid props (no `rows` / inherited state renderers). * Child row shape may differ from the parent column's `TData`. */ export type NestedTableSolidConfig = Omit & { columns?: ReadonlyArray; }; export type { CellRendererProps, HeaderRendererProps, FooterRendererProps, LoadingStateRendererProps, ErrorStateRendererProps, EmptyStateRendererProps, HeaderDropdownProps, ColumnEditorRowRendererProps, ColumnEditorCustomRendererProps, };