A wrapper around the DataTable component, which automatically configures functionality common to list queries that implement the interface, which is the common way of representing lists of data in Vendure.
PaginatedListGiven a GraphQL query document node, the component will automatically configure the required columns with sorting & filtering functionality.
The automatic features can be further customized and enhanced using the many options available in the props.
Example
Parameters
Readonly<PaginatedListDataTableProps<T, U, V, AC>>Props to configure the PaginatedListDataTable component.
TTypedDocumentNode<any, any>(queryKey: any[]) => any[](variables: V) => VCustomizeColumnConfig<T>AC(keyof ListQueryFields<T> | keyof AC | CustomFieldKeysOfItem<ListQueryFields<T>>)[]Partial<Record<AllItemFieldKeys<T> | keyof AC, boolean>>(searchTerm: string) => NonNullable<V['options']>['filter']Called whenever the debounced search term changes (including when it
becomes empty). Return a partial filter to merge with the column /
faceted filters. The returned filter is only applied when the term is
non-empty — when the term is '', the returned value is discarded so
that callers can write { field: { contains: searchTerm } } without
producing tautological contains: '' clauses. The callback itself is
still invoked on every change so pages can use it as a state-sync hook.
stringv3.8.0Placeholder text for the search input. Should say what the search targets, e.g. "Search products...". Defaults to a generic "Search...".
numbernumberSortingStateColumnFiltersState(table: Table<any>, page: number, perPage: number) => void(table: Table<any>, sorting: SortingState) => void(table: Table<any>, filters: ColumnFiltersState) => voidCalled when the user changes the column filters. When omitted, the table is
treated as read-only with respect to filtering: the saved-views tabs and the
"Add filter" menu are not rendered. Useful for embedded tables (e.g. dashboard
widgets) that apply preset filters via transformVariables.
(table: Table<any>, columnVisibility: VisibilityState) => voidFacetedFilterConfig<T>RowAction<PaginatedListItemFields<T>>[]BulkActionsInput | falsePaginatedListItemFields<T>[](selection: PaginatedListItemFields<T>[]) => voidbooleanbooleanv3.8.0falseEnables saved-view controls for this table. This should be used for tables which represent a whole data set, such as top-level list pages. It should not be enabled for embedded tables or tables whose query is already scoped by a predefined filter.
(data: PaginatedListItemFields<T>[]) => PaginatedListItemFields<T>[](table: TableOptions<any>) => TableOptions<any>PaginatedListRefresherRegisterFn( oldIndex: number, newIndex: number, item: PaginatedListItemFields<T>, ) => void | Promise<void>Callback when items are reordered via drag and drop. When provided, enables drag-and-drop functionality.
booleanWhen true, drag and drop will be disabled. This will only have an effect if the onReorder prop is also set
booleantrueWhen false, the row selection checkbox column will not be included.
React.ReactNodeAn optional action rendered inside the first-run empty state (i.e. when the list has no items and no active filters/search). Typically a "create your first X" CTA. The page owns this because the table cannot know the create route or the permissions that gate it.
(params: { error: Error; retry: () => void }) => React.ReactNodeRender prop invoked when the underlying list query fails. Receives the
error and a retry callback (re-runs the query) and should return the
content to display in place of the table — typically an ErrorState.
When omitted, a failed query renders as an empty table.
React.ReactNodev3.8.0An optional title rendered in the table's header band. Intended for tables embedded in detail pages (e.g. "Product variants").
React.ReactNodev3.8.0Optional action buttons (e.g. a "Manage variants" CTA) rendered in the table's header band, next to the view-options and refresh controls.
'card' | 'plain'v3.8.0'card'The table's frame. 'card' (default) renders the table on its own card;
'plain' renders the same band structure without the card chrome, for a
table embedded in an existing card (e.g. a dashboard widget).
Architecture reviews, custom plugin work, migrations, ongoing support. Get a hand from the team that builds Vendure.
Talk to the team