UNPKG

@tanstack/vue-table

Version:

Headless UI for building powerful tables & datagrids for Vue.

155 lines 10.3 kB
import { FlexRenderCell, FlexRenderHeader } from "./FlexRender.js"; import { TableOptionsWithReactiveData, VueTable } from "./useTable.js"; import { Component, PropType } from "vue"; import { AccessorFn, AccessorFnColumnDef, AccessorKeyColumnDef, Cell, CellContext, CellData, Column, ColumnDef, DeepKeys, DeepValue, DisplayColumnDef, GroupColumnDef, Header, IdentifiedColumnDef, NoInfer, Row, RowData, Table, TableFeatures } from "@tanstack/table-core"; //#region src/createTableHook.d.ts type ComponentType<T extends Record<string, any>> = Component<T>; type AppCellContext<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData, TCellComponents extends Record<string, ComponentType<any>>> = { cell: Cell<TFeatures, TData, TValue> & TCellComponents & { FlexRender: Component; }; column: Column<TFeatures, TData, TValue>; getValue: CellContext<TFeatures, TData, TValue>['getValue']; renderValue: CellContext<TFeatures, TData, TValue>['renderValue']; row: Row<TFeatures, TData>; table: Table<TFeatures, TData>; }; type AppHeaderContext<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData, THeaderComponents extends Record<string, ComponentType<any>>> = { column: Column<TFeatures, TData, TValue>; header: Header<TFeatures, TData, TValue> & THeaderComponents & { FlexRender: Component; }; table: Table<TFeatures, TData>; }; type AppColumnDefTemplate<TProps extends object> = string | ((props: TProps) => any); type AppColumnDefBase<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData, TCellComponents extends Record<string, ComponentType<any>>, THeaderComponents extends Record<string, ComponentType<any>>> = Omit<IdentifiedColumnDef<TFeatures, TData, TValue>, 'cell' | 'header' | 'footer'> & { cell?: AppColumnDefTemplate<AppCellContext<TFeatures, TData, TValue, TCellComponents>>; header?: AppColumnDefTemplate<AppHeaderContext<TFeatures, TData, TValue, THeaderComponents>>; footer?: AppColumnDefTemplate<AppHeaderContext<TFeatures, TData, TValue, THeaderComponents>>; }; type AppDisplayColumnDef<TFeatures extends TableFeatures, TData extends RowData, TCellComponents extends Record<string, ComponentType<any>>, THeaderComponents extends Record<string, ComponentType<any>>> = Omit<DisplayColumnDef<TFeatures, TData, unknown>, 'cell' | 'header' | 'footer'> & { cell?: AppColumnDefTemplate<AppCellContext<TFeatures, TData, unknown, TCellComponents>>; header?: AppColumnDefTemplate<AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>>; footer?: AppColumnDefTemplate<AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>>; }; type AppGroupColumnDef<TFeatures extends TableFeatures, TData extends RowData, TCellComponents extends Record<string, ComponentType<any>>, THeaderComponents extends Record<string, ComponentType<any>>> = Omit<GroupColumnDef<TFeatures, TData, unknown>, 'cell' | 'header' | 'footer' | 'columns'> & { cell?: AppColumnDefTemplate<AppCellContext<TFeatures, TData, unknown, TCellComponents>>; header?: AppColumnDefTemplate<AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>>; footer?: AppColumnDefTemplate<AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>>; columns?: ReadonlyArray<ColumnDef<TFeatures, TData, unknown>>; }; type AppColumnHelper<TFeatures extends TableFeatures, TData extends RowData, TCellComponents extends Record<string, ComponentType<any>>, THeaderComponents extends Record<string, ComponentType<any>>> = { accessor: <TAccessor extends AccessorFn<TData> | DeepKeys<TData>, TValue extends (TAccessor extends AccessorFn<TData, infer TReturn> ? TReturn : TAccessor extends DeepKeys<TData> ? DeepValue<TData, TAccessor> : never)>(accessor: TAccessor, column: TAccessor extends AccessorFn<TData> ? AppColumnDefBase<TFeatures, TData, TValue, TCellComponents, THeaderComponents> & { id: string; } : AppColumnDefBase<TFeatures, TData, TValue, TCellComponents, THeaderComponents>) => TAccessor extends AccessorFn<TData> ? AccessorFnColumnDef<TFeatures, TData, TValue> : AccessorKeyColumnDef<TFeatures, TData, TValue>; columns: <TColumns extends ReadonlyArray<ColumnDef<TFeatures, TData, any>>>(columns: [...TColumns]) => Array<ColumnDef<TFeatures, TData, any>> & [...TColumns]; display: (column: AppDisplayColumnDef<TFeatures, TData, TCellComponents, THeaderComponents>) => DisplayColumnDef<TFeatures, TData, unknown>; group: (column: AppGroupColumnDef<TFeatures, TData, TCellComponents, THeaderComponents>) => GroupColumnDef<TFeatures, TData, unknown>; }; type CreateTableHookOptions<TFeatures extends TableFeatures, TTableComponents extends Record<string, ComponentType<any>>, TCellComponents extends Record<string, ComponentType<any>>, THeaderComponents extends Record<string, ComponentType<any>>> = Omit<TableOptionsWithReactiveData<TFeatures, any>, 'columns' | 'data' | 'store' | 'state' | 'initialState'> & { tableComponents?: TTableComponents; cellComponents?: TCellComponents; headerComponents?: THeaderComponents; }; interface AppTableProps {} interface AppCellProps<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData> { cell: Cell<TFeatures, TData, TValue>; } interface AppHeaderProps<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData> { header: Header<TFeatures, TData, TValue>; } type AppVueTable<TFeatures extends TableFeatures, TData extends RowData, TTableComponents extends Record<string, ComponentType<any>>, _TCellComponents extends Record<string, ComponentType<any>>, _THeaderComponents extends Record<string, ComponentType<any>>> = VueTable<TFeatures, TData> & NoInfer<TTableComponents> & { AppTable: Component<AppTableProps>; AppCell: Component<AppCellProps<TFeatures, TData>>; AppHeader: Component<AppHeaderProps<TFeatures, TData>>; AppFooter: Component<AppHeaderProps<TFeatures, TData>>; FlexRender: typeof AppFlexRender; }; interface CreateTableHookResult<TFeatures extends TableFeatures, TTableComponents extends Record<string, ComponentType<any>>, TCellComponents extends Record<string, ComponentType<any>>, THeaderComponents extends Record<string, ComponentType<any>>> { /** The features object that was passed to `createTableHook`. */ appFeatures: TFeatures; /** * A column helper pre-bound to `TFeatures` and the registered components, so * the cell/header/footer render props expose the bound components. */ createAppColumnHelper: <TData extends RowData>() => AppColumnHelper<TFeatures, TData, TCellComponents, THeaderComponents>; /** * Creates a table with the `App*` wrapper components and registered * `tableComponents` attached. `TData` is inferred from the `data` option. */ useAppTable: <TData extends RowData>(tableOptions: Omit<TableOptionsWithReactiveData<TFeatures, TData>, 'features'>) => AppVueTable<TFeatures, TData, TTableComponents, TCellComponents, THeaderComponents>; /** * Reads the table provided by the nearest `<table.AppTable>`. This is the same * extended instance `useAppTable` returns, so the `App*` components and your * `tableComponents` are available on it. */ useTableContext: <TData extends RowData = RowData>() => AppVueTable<TFeatures, TData, TTableComponents, TCellComponents, THeaderComponents>; /** * Reads the cell provided by the nearest `<table.AppCell>`, extended with your * `cellComponents` and a context-bound `FlexRender`. */ useCellContext: <TValue extends CellData = CellData>() => Cell<TFeatures, any, TValue> & TCellComponents & { FlexRender: Component; }; /** * Reads the header provided by the nearest `<table.AppHeader>` / * `<table.AppFooter>`, extended with your `headerComponents` and a * context-bound `FlexRender`. */ useHeaderContext: <TValue extends CellData = CellData>() => Header<TFeatures, any, TValue> & THeaderComponents & { FlexRender: Component; }; } declare const AppFlexRender: import("vue").DefineComponent<import("vue").ExtractPropTypes<{ cell: { type: PropType<FlexRenderCell>; default: undefined; }; header: { type: PropType<FlexRenderHeader>; default: undefined; }; footer: { type: PropType<FlexRenderHeader>; default: undefined; }; }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, { [key: string]: any; }> | null, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{ cell: { type: PropType<FlexRenderCell>; default: undefined; }; header: { type: PropType<FlexRenderHeader>; default: undefined; }; footer: { type: PropType<FlexRenderHeader>; default: undefined; }; }>> & Readonly<{}>, { cell: FlexRenderCell; header: FlexRenderHeader; footer: FlexRenderHeader; }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; /** * Creates app-scoped Vue table helpers with features, row models, and * renderable component maps pre-bound. * * Use this when an app or design system wants typed `useAppTable`, a pre-bound * column helper, and context helpers for table, cell, and header components. * * @example * ```ts * const { useAppTable, createAppColumnHelper } = createTableHook({ * features, * tableComponents: {}, * cellComponents: {}, * headerComponents: {}, * }) * ``` */ declare function createTableHook<TFeatures extends TableFeatures, const TTableComponents extends Record<string, ComponentType<any>>, const TCellComponents extends Record<string, ComponentType<any>>, const THeaderComponents extends Record<string, ComponentType<any>>>({ tableComponents, cellComponents, headerComponents, ...defaultTableOptions }: CreateTableHookOptions<TFeatures, TTableComponents, TCellComponents, THeaderComponents>): CreateTableHookResult<TFeatures, TTableComponents, TCellComponents, THeaderComponents>; //#endregion export { AppCellContext, AppCellProps, AppColumnDefBase, AppColumnDefTemplate, AppColumnHelper, AppDisplayColumnDef, AppFlexRender, AppGroupColumnDef, AppHeaderContext, AppHeaderProps, AppTableProps, AppVueTable, ComponentType, CreateTableHookOptions, CreateTableHookResult, createTableHook };