Data tables with column builder pattern and XTable component.
Core Concepts
tables.md - Column builder, XTable, row actions
Column Builder Pattern
// app/tables/posts.ts
import { h } from 'vue'
import type { TableColumn } from '@tanstack/vue-table'
const statusColumn: TableColumn = { id: 'status', accessorKey: 'status', header: 'Status', cell: ({ row }) => h(UBadge, { color: row.getValue('status').color() }, () => row.getValue('status').text), }
export const postsColumnBuilder = createColumnBuilder({ ulid: ulidColumn, author: authorColumn, status: statusColumn, dates: datesColumn, })
// Usage const columns = postsColumnBuilder.all() const columns = postsColumnBuilder.build(['ulid', 'status']) const columns = postsColumnBuilder.except(['dates'])
## XTable Usage
```vue
<XTable
:data="posts"
:columns="columns"
:loading="isLoading"
:fetching="isFetching"
:row-actions="rowActions"
row-id="ulid"
@row-click="handleRowClick"
/>
Row Actions
const rowActions = computed(() => (row: Row<Post>) => [
{ label: 'View', to: `/posts/${row.original.ulid}` },
{ label: 'Edit', onSelect: () => openEdit(row.original) },
{ label: 'Delete', onSelect: () => handleDelete(row.original) },
])