DataTable enables users to act upon complex datasets with a variety of features including filtering and sorting.
Basic — Non-interactive table for comparative display. Provide only data, columns, and caption.Interactive — Enable features like withRowSelection, withSearch, withSorting, withPagination, and bulkActions for user-driven data workflows.layout="fixed" (default) — Columns divide equally regardless of content. Horizontal scrolling is disabled.layout="auto" — Columns adjust to content size. Horizontal scrolling is enabled. Use when column content must remain readable.layout="auto".isStriped — Alternates row backgrounds to improve readability. Use for large datasets, especially with infinite scrolling.isBorderless — Removes row borders. Use for a cleaner presentation on smaller datasets.shouldHighlightOnHover — Highlights rows on hover. Automatically enabled when rows are selectable; set explicitly on non-selectable rows when needed.meta.width on column definitions. Accepts pixel values ("200px"), fractional units ("2fr"), and percentages.meta.minWidth and meta.maxWidth.isLoading) — Displays skeleton rows. Set loadingState.rowCount to control placeholder row count.withEmptyState, default true) — Displays when data is empty. Configure title, description, icon, and action buttons via emptyState. Provide a custom component via emptyStateComponent.withRowSelection is enabled.withRowSelection. Accepts true for all rows or a function to conditionally enable per row.rowSelection and onRowSelectionChange.enableMultiRowSelection={false}.getRowCanSelect.withRowExpanding. Adds an expander toggle column.children array by default) expand to show nested rows. Override with getSubRows.expandedRowComponent to render custom content on expansion instead of sub-rows.getRowCanExpand.initiallyExpandedRows.rowActions as an object or a function receiving the row. Renders a dropdown menu in the last cell of each row.dropdownActions accepts an array of action items or action groups.bulkActions when withRowSelection is enabled. Appears in the header when rows are selected.promotedActions render as buttons in the header. dropdownActions render inside a dropdown.withSorting. Sorts by clicking column headers or using the Sort dropdown in the header.sorting.value and sorting.onChange. Set sorting.isManual for server-side sorting.withSearch. Renders a search input in the header. Filters across all columns by default.search.value, search.onSearch, and search.onSearchInput.search.isManual for server-side search. Provide search.globalFilterFn for a custom client-side filter.search.defaultIsExpanded={false}.withFilters. Pass a filters config object with filter definitions, active values, and change handlers.withPagination. Renders page controls below the table.pagination. Control externally by providing pagination.page and pagination.onPageChange.pagination.isManual for server-side pagination when data is already paginated.withVirtualizer. Renders only visible rows for large datasets as an alternative to pagination.virtualizerOptions to customize the virtualizer.withColumnsSettings. Renders a Columns button in the header for toggling column visibility.defaultColumnVisibility (e.g., { rainfall: false }).defaultColumnOrder or columnOrder/onColumnOrderChange.columnVisibility/onColumnVisibilityChange.meta.getCellColSpan on a column definition to span a cell across multiple columns conditionally.withSavedViews. Configure views, creation, editing, and deletion via savedViews.loadNew to show a row at the top when new data is available.loadMore to show a row at the bottom for appending more data.caption (required). Use a short, descriptive noun or noun phrase. Captions are hidden visually but required for assistive technology.withColumnsSettings.data and columns are required. columns follow TanStack Table column definitions — use createColumnHelper from @tanstack/table-core.id property on each data row, then fall back to row index. Override with getRowId.children to fully replace the default layout (Header + Table + Pagination) with custom composition.<PlumaDataTable @data={{this.data}} @columns={{this.columns}} @caption="Items" />. Feature props use @ prefix (e.g., @withSearch={{true}}).as (defaults to div). It extends Box.onSortingChange at the top level is deprecated. Use sorting.onChange instead.