This reference is generated before development, checking and building from declarations reachable through the package’s published entry points, following re-exports. Internal source-module exports are omitted. Types shown together share their source module; follow the source link for imports and implementation. Use the guides for examples and runtime behavior.
src/definition/table.ts
export type QueryCallback = (query: ModelQueryBuilderContract<LucidModel>, ctx: HttpContext) => unknown;
export type TextColumnDefinition = TableColumnBase & {
kind: 'text';
limit?: number;
wrap?: boolean;
description?: (args: {
record: unknown;
}) => unknown;
badge?: boolean;
money?: string;
numeric?: boolean;
dateTime?: boolean;
date?: boolean;
since?: boolean;
copyable?: boolean;
timezone?: string;
options?: SelectOptions;
url?: (args: {
record: unknown;
ctx?: HttpContext;
}) => string | undefined | Promise<string | undefined>;
};
export type BadgeColumnDefinition = TableColumnBase & {
kind: 'badge';
colors?: Record<string, string>;
options?: SelectOptions;
};
export type IconColumnDefinition = TableColumnBase & {
kind: 'icon';
icons?: Record<string, string>;
colors?: Record<string, string>;
boolean?: boolean;
};
export type ImageColumnDefinition = TableColumnBase & {
kind: 'image';
circular?: boolean;
stacked?: boolean;
};
export type ColorColumnDefinition = TableColumnBase & {
kind: 'color';
};
export type CustomColumnDefinition = TableColumnBase & {
kind: 'custom';
component: string;
extension?: string;
extensionKind?: string;
extensionProps?: Record<string, unknown>;
format?: (value: unknown, record: Record<string, unknown>) => unknown;
};
export type FragmentColumnDefinition = {
kind: 'fragment';
component: string;
};
export type TableColumnDefinition = TextColumnDefinition | BadgeColumnDefinition | IconColumnDefinition | ImageColumnDefinition | ColorColumnDefinition | CustomColumnDefinition | FragmentColumnDefinition | ToggleColumnDefinition | CheckboxColumnDefinition | SelectColumnDefinition | TextInputColumnDefinition;
export type SelectFilterDefinition = {
kind: 'select';
name: string;
options?: Record<string, unknown>;
multiple?: boolean;
attribute?: string;
};
export type TernaryFilterDefinition = {
kind: 'ternary';
name: string;
trueLabel?: string;
falseLabel?: string;
attribute?: string;
};
export type DateRangeFilterDefinition = {
kind: 'dateRange';
name: string;
attribute?: string;
timezone?: string;
};
export type CustomFilterDefinition = {
kind: 'custom';
name: string;
form?: readonly SchemaNodeDefinition[];
query?: (query: ModelQueryBuilderContract<LucidModel>, data: Record<string, unknown>) => unknown;
};
export type QueryConstraintDefinition = {
type: QueryConstraintType;
name: string;
label?: string;
attribute?: string;
relatedAttribute?: string;
options?: Record<string, unknown>;
timezone?: string;
integer?: boolean;
};
export interface QueryConstraintBuilder {
readonly definition: QueryConstraintDefinition;
toDefinition(): QueryConstraintDefinition;
label(value: string): QueryConstraintBuilder;
attribute(value: string): QueryConstraintBuilder;
options(value: Record<string, unknown>): QueryConstraintBuilder;
timezone(value: string): QueryConstraintBuilder;
/** Signed 32-bit integer constraint, matching PostgreSQL integer columns. */
integer(): QueryConstraintBuilder;
}
export type QueryBuilderFilterDefinition = {
kind: 'queryBuilder';
name: string;
label?: string;
constraints: QueryConstraintDefinition[];
};
export interface QueryBuilderFilterBuilder extends TableFilterBuilder<QueryBuilderFilterDefinition> {
constraints(value: readonly QueryConstraintBuilder[]): QueryBuilderFilterBuilder;
label(value: string): QueryBuilderFilterBuilder;
}
export type TableFilterDefinition = SelectFilterDefinition | TernaryFilterDefinition | DateRangeFilterDefinition | CustomFilterDefinition | TrashedFilterDefinition | QueryBuilderFilterDefinition;
export type TableEmptyStateDefinition = {
heading: string;
description?: string;
icon?: string;
action?: ActionDefinition;
};
export type TableEmptyStateInput = Omit<TableEmptyStateDefinition, 'action'> & {
action?: ActionBuilder | ActionDefinition;
};
export type CustomTableRecords = (args: {
ctx: HttpContext;
record?: unknown;
search: string;
filters: Record<string, unknown>;
sort: {
column: string;
direction: 'asc' | 'desc';
}[];
page: number;
perPage: number | 'all';
}) => {
rows: Record<string, unknown>[];
total?: number;
} | Promise<{
rows: Record<string, unknown>[];
total?: number;
}>;
export type TableDefinition = {
records?: CustomTableRecords;
recordKey?: string;
resolveRecord?: (key: string | number, ctx: HttpContext) => Record<string, unknown> | null | Promise<Record<string, unknown> | null>;
actions?: {
row?: readonly ActionDefinition[];
header?: readonly ActionDefinition[];
bulk?: readonly ActionDefinition[];
};
savedViews?: boolean;
presetViews?: TableViewDefinition[];
query?: QueryCallback;
defaultSort?: {
column: string;
direction: 'asc' | 'desc';
};
defaultSorts?: {
column: string;
direction: 'asc' | 'desc';
}[];
multiSort?: number;
columns: TableColumnDefinition[];
filters: TableFilterDefinition[];
filtersLayout: 'dropdown' | 'above' | 'slideover';
searchDebounce: number;
paginated: readonly (number | 'all')[] | false;
striped: boolean;
recordUrl?: ((args: {
record: unknown;
}) => string) | false;
rowClass?: (args: {
record: unknown;
}) => string;
groups?: TableGroupDefinition[];
defaultGroup?: string;
deferLoading?: boolean;
emptyState?: TableEmptyStateDefinition;
reorderable?: string;
poll?: string;
deferFilters?: boolean;
layout?: {
type: 'grid';
columns: {
default?: number;
md?: number;
xl?: number;
};
};
};
export interface TableSchema {
records(value: CustomTableRecords): this;
recordKey(value: string): this;
resolveRecord(value: NonNullable<TableDefinition['resolveRecord']>): this;
actions(value: {
row?: readonly ActionBuilder[];
header?: readonly ActionBuilder[];
bulk?: readonly ActionBuilder[];
}): this;
savedViews(value?: boolean): this;
presetViews(value: readonly TableViewBuilder[]): this;
columns(value: readonly TableColumnBuilderUnion[]): this;
filters(value: readonly TableFilterBuilderUnion[]): this;
query(value: QueryCallback): this;
defaultSort(column: string, direction: 'asc' | 'desc'): this;
defaultSort(columns: readonly {
column: string;
direction: 'asc' | 'desc';
}[]): this;
multiSort(max?: number): this;
filtersLayout(value: TableDefinition['filtersLayout']): this;
searchDebounce(value: number): this;
paginated(value: TableDefinition['paginated']): this;
striped(value?: boolean): this;
recordUrl(value: NonNullable<TableDefinition['recordUrl']> | false): this;
rowClass(value: NonNullable<TableDefinition['rowClass']>): this;
groups(value: readonly TableGroupBuilder[]): this;
defaultGroup(value?: string): this;
deferLoading(value?: boolean): this;
summarize(column: string, summaries: readonly NonNullable<TableColumnBase['summaries']>[number][]): this;
count(relation: string): TableColumnBuilderUnion;
group(key: string): TableGroupBuilder;
emptyState(value: TableEmptyStateInput): this;
layout: {
grid(columns: {
default?: number;
md?: number;
xl?: number;
}): TableSchema;
};
reorderable(column: string): this;
poll(interval: string): this;
deferFilters(value?: boolean): this;
toDefinition(): TableDefinition;
}
export interface TableColumnBuilder<D extends TableColumnDefinition> {
readonly definition: D;
toDefinition(): D;
}
export interface TextColumnBuilder extends TableColumnBuilder<TextColumnDefinition> {
searchable(value?: boolean | {
individually?: boolean;
}): this;
summarize(value: readonly NonNullable<TableColumnBase['summaries']>[number][]): this;
sortable(value?: boolean): this;
limit(value: number): this;
wrap(value?: boolean): this;
description(value: NonNullable<TextColumnDefinition['description']>): this;
badge(value?: boolean): this;
money(currency: string): this;
numeric(value?: boolean): this;
dateTime(value?: boolean): this;
date(value?: boolean): this;
since(value?: boolean): this;
timezone(value: string): this;
url(value: NonNullable<TextColumnDefinition['url']>): this;
/** Display labels for stored option values, e.g. `{ draft: 'Draft' }`. */
options(value: SelectOptions): this;
label(value: string): this;
alignment(value: NonNullable<TableColumnBase['alignment']>): this;
width(value: string): this;
toggleable(value?: NonNullable<TableColumnBase['toggleable']>): this;
}
export interface BadgeColumnBuilder extends TableColumnBuilder<BadgeColumnDefinition> {
searchable(value?: boolean): this;
sortable(value?: boolean): this;
label(value: string): this;
alignment(value: NonNullable<TableColumnBase['alignment']>): this;
width(value: string): this;
toggleable(value?: NonNullable<TableColumnBase['toggleable']>): this;
colors(value: Record<string, string>): this;
/** Display labels for stored option values; `colors` stay keyed by the raw value. */
options(value: SelectOptions): this;
}
export interface IconColumnBuilder extends TableColumnBuilder<IconColumnDefinition> {
label(value: string): this;
alignment(value: NonNullable<TableColumnBase['alignment']>): this;
width(value: string): this;
toggleable(value?: NonNullable<TableColumnBase['toggleable']>): this;
icons(value: Record<string, string>): this;
colors(value: Record<string, string>): this;
boolean(value?: boolean): this;
}
export interface ImageColumnBuilder extends TableColumnBuilder<ImageColumnDefinition> {
label(value: string): this;
width(value: string): this;
toggleable(value?: NonNullable<TableColumnBase['toggleable']>): this;
circular(value?: boolean): this;
stacked(value?: boolean): this;
}
export interface ColorColumnBuilder extends TableColumnBuilder<ColorColumnDefinition> {
label(value: string): this;
alignment(value: NonNullable<TableColumnBase['alignment']>): this;
width(value: string): this;
toggleable(value?: NonNullable<TableColumnBase['toggleable']>): this;
}
export interface CustomColumnBuilder extends TableColumnBuilder<CustomColumnDefinition> {
label(value: string): this;
width(value: string): this;
}
export interface FragmentColumnBuilder extends TableColumnBuilder<FragmentColumnDefinition> {
}
export type TableColumnBuilderUnion = TextColumnBuilder | BadgeColumnBuilder | IconColumnBuilder | ImageColumnBuilder | ColorColumnBuilder | CustomColumnBuilder | FragmentColumnBuilder | ToggleColumnBuilder | CheckboxColumnBuilder | SelectColumnBuilder | TextInputColumnBuilder;
export interface TableFilterBuilder<D extends TableFilterDefinition> {
readonly definition: D;
toDefinition(): D;
}
export interface SelectFilterBuilder extends TableFilterBuilder<SelectFilterDefinition> {
options(value: Record<string, unknown>): this;
multiple(value?: boolean): this;
attribute(value: string): this;
}
export interface TernaryFilterBuilder extends TableFilterBuilder<TernaryFilterDefinition> {
trueLabel(value: string): this;
falseLabel(value: string): this;
attribute(value: string): this;
}
export interface DateRangeFilterBuilder extends TableFilterBuilder<DateRangeFilterDefinition> {
attribute(value: string): this;
timezone(value: string): this;
}
export interface CustomFilterBuilder extends TableFilterBuilder<CustomFilterDefinition> {
form(value: readonly SchemaNodeBuilder[]): this;
query(value: NonNullable<CustomFilterDefinition['query']>): this;
}
export type TableFilterBuilderUnion = SelectFilterBuilder | TernaryFilterBuilder | DateRangeFilterBuilder | CustomFilterBuilder | TrashedFilterBuilder | QueryBuilderFilterBuilder;