# DataTable Component - Usage Guide This DataTable component follows the shadcn-vue architecture and uses TanStack Table v8 for powerful table functionality. ## Features - ✅ Client-side and server-side pagination - ✅ Sorting (single column) - ✅ Filtering/Search - ✅ Row selection - ✅ Column visibility toggle - ✅ Customizable column definitions - ✅ Loading states - ✅ Empty states - ✅ Flexible toolbar - ✅ Cell-level customization via slots - ✅ Responsive design - ✅ Laravel Inertia integration ## Basic Usage ### Simple Format (Recommended for basic tables) ```vue ``` ### Advanced Format (Full TanStack Table power) ```vue ``` See `columns-example.js` for comprehensive column definition examples. ## Props ### Data Props - `columns` (Array, required) - Column definitions (simple or TanStack format) - `data` (Array, default: []) - Array of data objects - `meta` (Object, default: null) - Laravel pagination meta for server-side - `loading` (Boolean, default: false) - Loading state ### Server-side Props - `routeName` (String) - Laravel route name for server-side requests - `routeParams` (Object) - Additional route parameters - `pageParamName` (String, default: 'page') - Custom page parameter name - `onlyProps` (Array) - Inertia.js only props - `preserveState` (Boolean, default: true) - `preserveScroll` (Boolean, default: true) ### Sorting & Filtering - `sort` (Object, default: {key: null, direction: null}) - `search` (String, default: '') - `filterColumn` (String) - Column to filter on - `filterPlaceholder` (String, default: 'Filter...') ### Pagination - `showPagination` (Boolean, default: true) - `pageSize` (Number, default: 10) - `pageSizeOptions` (Array, default: [10, 25, 50, 100]) ### Features - `enableRowSelection` (Boolean, default: false) - `showToolbar` (Boolean, default: true) - `striped` (Boolean, default: false) - `hoverable` (Boolean, default: true) - `rowKey` (String|Function, default: 'id') ### Empty State - `emptyText` (String, default: 'No results.') - `emptyIcon` (String|Object|Array) - `emptyDescription` (String) ## Events - `@update:search` - Emitted when search changes - `@update:sort` - Emitted when sort changes - `@update:page` - Emitted when page changes - `@update:pageSize` - Emitted when page size changes - `@row:click` - Emitted when row is clicked - `@selection:change` - Emitted when selection changes ## Client-side Example ```vue ``` ## Server-side Example (Laravel Inertia) ### Controller ```php public function index(Request $request) { $query = Client::query(); // Search if ($request->search) { $query->where('name', 'like', "%{$request->search}%") ->orWhere('email', 'like', "%{$request->search}%"); } // Sort if ($request->sort && $request->direction) { $query->orderBy($request->sort, $request->direction); } $clients = $query->paginate($request->per_page ?? 10); return Inertia::render('Clients/Index', [ 'clients' => $clients, 'filters' => $request->only(['search', 'sort', 'direction']), ]); } ``` ### Vue Component ```vue ``` ## Custom Cell Rendering ### Using Slots ```vue ``` ### Using Column Definitions ```javascript import { h } from 'vue'; import { Badge } from '@/Components/ui/badge'; export const columns = [ { accessorKey: 'status', header: 'Status', cell: ({ row }) => { const status = row.getValue('status'); return h(Badge, { variant: status === 'active' ? 'default' : 'secondary' }, () => status); }, }, ]; ``` ## Custom Toolbar The new toolbar is simplified and follows shadcn-vue patterns: ```vue ``` Or completely replace the toolbar: ```vue ``` ## Row Selection ```vue ``` ## Row Click Handler ```vue ``` ## Tips 1. **Column Keys**: Always use consistent keys/accessorKeys across your data 2. **Server-side**: Always provide `meta` and `routeName` props together 3. **Performance**: For large datasets, use server-side pagination 4. **Styling**: Use column `class` property for custom styling 5. **Slots**: Prefer slots for complex cell rendering over h() functions ## Migration from Old DataTable ### Before (Old API) ```vue ``` ### After (New API) ```vue ``` Main changes: - `rows` → `data` - Added `route-name` prop for server-side - More consistent prop naming - Better TypeScript support - More flexible column definitions ## Component Files - `DataTableNew2.vue` - Main table component - `DataTableColumnHeader.vue` - Sortable column header - `DataTablePagination.vue` - Pagination controls - `DataTableViewOptions.vue` - Column visibility toggle - `DataTableToolbar.vue` - Toolbar component - `columns-example.js` - Column definition examples