PHP code example of salioudiabate / livewire-datatable
1. Go to this page and download the library: Download salioudiabate/livewire-datatable library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
salioudiabate / livewire-datatable example snippets
class UsersTable extends DataTableComponent
{
public function builder(): Builder
{
return User::query();
}
public function columns(): array
{
return [
Column::make('Name', 'name')->searchable()->sortable(),
Column::make('Email', 'email')->searchable(),
Column::make('Joined', 'created_at')->sortable()
->format(fn ($value) => $value->format('d/m/Y')),
];
}
public function filters(): array
{
return [
SelectFilter::make('Role', 'role')->options(['admin' => 'Admin', 'member' => 'Member']),
];
}
}
use Illuminate\Database\Eloquent\Builder;
use Salioudiabate\LivewireDatatable\Column;
use Salioudiabate\LivewireDatatable\DataTableComponent;
class UsersTable extends DataTableComponent
{
public function builder(): Builder
{
return User::query();
}
public function columns(): array
{
return [
Column::make('Name', 'name')->searchable()->sortable(),
Column::make('Email', 'email')->searchable(),
];
}
}
public function builder(): Builder
{
return User::query()->where('active', true);
}
use Illuminate\Support\Facades\DB;
public function builder(): \Illuminate\Database\Query\Builder
{
return DB::table('users')->where('active', true);
}
use Salioudiabate\LivewireDatatable\DataSources\RawSql;
public function builder(): RawSql
{
return RawSql::query(
'select u.*, count(o.id) as orders_count from users u left join orders o on o.user_id = u.id group by u.id',
);
}
Column::make('Status', 'status')
->format(fn ($value, $row) => ucfirst($value)) // custom display
->view('partials.status-badge') // or a full Blade partial instead of format()
->thView('partials.status-header') // custom header cell
->thClass('text-right') // extra <th> classes
->tdClass('text-right tabular-nums') // extra <td> classes, for this column only
->searchable() // // user can hide/show this column
->toggleable(visibleByDefault: false); // ...hidden by default
public function showSearch(): bool // default true
{
return false;
}
public function showPerPage(): bool // default true
{
return false;
}
public function perPageOptions(): array
{
return [15, 30, 60];
}
public function pollInterval(): ?int
{
return 5000; // milliseconds
}
public function showOfflineIndicator(): bool
{
return false; // opt out per-table
}
class UsersTableForTeamA extends UsersTable
{
protected function urlKey(): string
{
return 'team-a-users';
}
}
protected function withoutUrlBinding(): bool
{
return true;
}
use Salioudiabate\LivewireDatatable\BulkAction;
public function bulkActions(): array
{
return [
BulkAction::make('exportSelected', 'Export selected')
->icon('<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1M7 10l5 5 5-5M12 15V3" /></svg>'),
BulkAction::make('archiveSelected', 'Archive')
->confirm('Archive the selected rows?')
->cssClass('text-amber-600')
->permission('archive-users'),
];
}
public function archiveSelected(): void
{
User::query()->whereIn('id', $this->getSelected())->update(['archived' => true]);
$this->clearSelection();
}
public function recordKey(): string
{
return 'uuid';
}
public function bulkActions(): array
{
return [
BulkAction::make('emailAllFiltered', 'Email everyone matching this search'),
];
}
public function emailAllFiltered(): void
{
foreach ($this->allFilteredRows() as $user) {
Mail::to($user)->queue(new WeeklyDigest);
}
}
public function bulkActions(): array
{
return [
BulkAction::make('destroySelected', 'Delete')->permission('delete-users'),
];
}
protected function deletePermission(): ?string
{
return 'delete-users';
}
protected function beforeDelete(mixed $row): bool
{
return $row->id !== auth()->id(); // veto: never let a user delete themself
}
protected function afterDelete(mixed $row): void
{
Log::info("Deleted user {$row->id}");
}
protected function persistColumnVisibility(): ?string
{
return 'users-table';
}
protected function defaultDensity(): string // or config('livewire-datatable.density.default')
{
return 'compact';
}
protected function persistDensity(): ?string
{
return 'users-table';
}
public function columns(): array
{
return [
Column::make('Name', 'name')->frozen(200),
Column::make('Email', 'email'),
// ...many more columns that scroll under "Name"
];
}
public function stickyHeader(): bool
{
return true;
}
protected function stickyHeaderMaxHeight(): string
{
return '600px'; // any valid CSS length — default '70vh'
}
use Salioudiabate\LivewireDatatable\Export\ExcelExporter;
use Salioudiabate\LivewireDatatable\Export\Exporter;
protected function exporter(): Exporter
{
return new ExcelExporter();
}
protected function exportFilename(): string
{
return 'users-'.now()->format('Y-m-d').'.xlsx';
}
use Salioudiabate\LivewireDatatable\Export\PdfExporter;
protected function exporter(): Exporter
{
return new PdfExporter();
}
protected function exportFilename(): string
{
return 'users-'.now()->format('Y-m-d').'.pdf';
}
use Salioudiabate\LivewireDatatable\RowAction;
public function rowActions(): array
{
return [
RowAction::make('Edit')->url(fn ($user) => route('users.edit', $user)),
RowAction::make('Delete')
->action('deleteUser')
->confirm('Delete this user?')
->visible(fn ($user) => $user->id !== auth()->id()),
];
}
public function deleteUser(string $id): void
{
User::query()->whereKey($id)->delete();
}
public function rowUrl(mixed $row): ?string
{
return route('users.edit', $row);
}
use Salioudiabate\LivewireDatatable\ToolbarAction;
use Salioudiabate\LivewireDatatable\ToolbarActionGroup;
public function toolbarActions(): array
{
return [
ToolbarAction::make('New product')
->dispatch('openModal', ['component' => 'product.create-modal']) // fires Livewire's $dispatch()
->cssClass('bg-[var(--dt-primary,#4f46e5)] text-white hover:opacity-90')
->permission('products.create'),
ToolbarAction::make('Docs')->url('https://example.com/docs', target: '_blank')->align('left'),
ToolbarActionGroup::make([
ToolbarAction::make('Sort by price')->action('sortByPrice'),
ToolbarAction::make('Sort by stock')->action('sortByStock'),
]),
];
}
public function sortByPrice(): void
{
$this->sortBy('price');
}
ToolbarAction::make('Export as PDF')
->submit(
action: route('products.export-pdf'),
data: fn () => ['status' => $this->filterValues['status'] ?? null, 'search' => $this->search],
target: '_blank',
)
->confirm('Generate a PDF of the current results?'),
ToolbarActionGroup::make([
ToolbarAction::make('Sort by price')->action('sortByPrice'),
ToolbarAction::make('Sort by stock')->action('sortByStock'),
ToolbarAction::make('Sort by name')->action('sortByName'),
])->dropdown('Sort by...'),
public function emptyStateView(): ?string
{
return 'partials.no-products-yet';
}
use Salioudiabate\LivewireDatatable\DataSources\DataSourceFactory;
DataSourceFactory::extend(YourQueryType::class, fn ($query) => new YourDataSource($query));