gorlabs/tailwind-datatables
Laravel package that integrates Yajra DataTables with a Tailwind CSS + Alpine.js UI. Supports server-side processing, search, pagination, sorting, buttons, and rich column customization. Publish config and optional CSS assets for easy theming.
Installation
composer require gorlabs/tailwind-datatables
npm install --save-dev @gorlabs/tailwind-datatables
Add the package to tailwind.config.js:
plugins: [
require('@gorlabs/tailwind-datatables'),
],
Publish Assets
npm run dev # or `npm run build` for production
First Use Case Create a basic DataTable in a Blade view:
<x-datatable :data="users" :columns="$columns">
<x-slot name="columns">
<x-datatable.column>ID</x-datatable.column>
<x-datatable.column>Name</x-datatable.column>
<x-datatable.column>Email</x-datatable.column>
</x-slot>
</x-datatable>
Define $columns in your controller:
$columns = [
'id', 'name', 'email'
];
Server-Side Processing
Ensure your controller extends Gorlabs\TailwindDataTables\DataTablesController and overrides getDataTable():
public function getDataTable()
{
return $this->datatable
->eloquent($this->model)
->make(true);
}
Blade Integration
Use the <x-datatable> component with slots for columns, headers, and footers:
<x-datatable :data="$users" :columns="$columns">
<x-slot name="header">
<h1 class="text-2xl font-bold">User Management</h1>
</x-slot>
</x-datatable>
Dynamic Column Customization Customize columns with Alpine.js directives and Tailwind classes:
<x-datatable.column>
<span x-text="row.name" class="font-medium"></span>
<span x-text="row.email" class="text-gray-500"></span>
</x-datatable.column>
Server-Side Processing
Leverage Yajra’s DataTables for server-side logic:
$this->datatable->eloquent($model)
->addColumn('action', function($row) {
return '<button class="btn btn-sm btn-primary">Edit</button>';
})
->rawColumns(['action']);
Livewire/Vue Integration
LivewireDataTable component and bind to Livewire properties.VueDataTable with v-model for reactivity.API-Driven Tables Fetch data via API and bind to the DataTable:
<x-datatable :data="fetchData('api/users')" :columns="$columns"></x-datatable>
tailwind.config.js:
theme: {
extend: {
colors: {
primary: '#3b82f6', // Customize primary color
},
},
},
datatable:row-selected):
<div x-data="{ selected: null }"
x-on:datatable:row-selected="selected = $event.detail">
@gorlabs/tailwind-datatables is processed in your build.Missing Alpine.js Ensure Alpine.js is loaded before the DataTable script:
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script src="{{ asset('js/datatables.js') }}"></script>
Server-Side Processing Mismatch
Verify getDataTable() returns a valid DataTables response:
// Avoid returning raw data; use `make(true)`:
return $this->datatable->make(true);
Column Binding Issues Ensure column names in Blade match those in the server-side response (case-sensitive).
Tailwind Conflicts Reset default styles if Tailwind classes clash:
<x-datatable :options="{ classes: { table: 'w-full', cell: 'py-2 px-4' } }">
x-init to log Alpine state:
<div x-data x-init="console.log($data)">
$this->datatable->debug(true);
Custom Components
Extend the <x-datatable> component in resources/views/components/datatable.blade.php.
Alpine.js Mixins Add custom logic via Alpine mixins:
document.addEventListener('alpine:init', () => {
Alpine.mixin({ customMethod() { /* ... */ } });
});
Server-Side Extensions
Override DataTablesController methods (e.g., getDataTable()) for custom logic.
Tailwind Plugins
Extend the @gorlabs/tailwind-datatables plugin in tailwind.config.js:
plugins: [
require('@gorlabs/tailwind-datatables')({
table: {
base: 'min-w-full divide-y divide-gray-200',
},
}),
],
<div x-data x-init="initDataTable()" @load.debounce="initDataTable()">
$this->datatable->eloquent($model)->paginate(10);
How can I help you explore Laravel packages today?