Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Livewire Tables Laravel Package

alp-develop/laravel-livewire-tables

Full-featured reactive data tables for Laravel: search, sort, filter, paginate, export, and bulk actions with zero JavaScript. Supports Livewire 3–4, Tailwind, Bootstrap 5/4, and dark mode.

View on GitHub
Deep Wiki
Context7

Laravel Livewire Tables

Full-featured, reactive data tables for Laravel. Search, sort, filter, paginate, export, bulk actions — zero JavaScript.

Laravel 10–13 | Livewire 3–4 | PHP 8.1–8.5 | Tailwind / Bootstrap 5 / Bootstrap 4 | Dark mode


Install

1. Require the package

composer require alp-develop/laravel-livewire-tables

2. Publish and configure

php artisan vendor:publish --tag=livewire-tables-config

This creates config/livewire-tables.php. This step is required — the config defines the theme, colors, dark mode, and other essential settings.

3. Themes

Set the theme in config/livewire-tables.php:

'theme' => 'tailwind',
Theme Value Alias
Tailwind CSS tailwind —
Bootstrap 5 bootstrap-5 bootstrap5, bootstrap
Bootstrap 4 bootstrap-4 bootstrap4

4. Tailwind only

Add to your CSS: [x-cloak] { display: none !important; }

Quick Start

php artisan make:livewiretable UsersTable User
<?php

namespace App\Livewire\Tables;

use App\Models\User;
use Illuminate\Database\Eloquent\Builder;
use Livewire\Tables\Columns\TextColumn;
use Livewire\Tables\Columns\BooleanColumn;
use Livewire\Tables\Columns\ActionColumn;
use Livewire\Tables\Filters\SelectFilter;
use Livewire\Tables\Livewire\DataTableComponent;

class UsersTable extends DataTableComponent
{
    public function configure(): void
    {
        $this->setDefaultPerPage(25);
        $this->setSearchDebounce(300);
    }

    public function query(): Builder
    {
        return User::query();
    }

    public function columns(): array
    {
        return [
            TextColumn::make('name')->sortable()->searchable(),
            TextColumn::make('email')->sortable()->searchable(),
            BooleanColumn::make('active')->sortable(),
            TextColumn::make('created_at')
                ->label('Joined')->sortable()
                ->format(fn ($value) => $value?
                ->format('M d, Y')),
            ActionColumn::make()
                ->button('Edit', fn ($row) => "edit({$row->id})", 'lt-btn-primary')
                ->button('Delete', fn ($row) => "delete({$row->id})", 'lt-btn-primary'),
        ];
    }

    public function filters(): array
    {
        return [
            SelectFilter::make('active')
                ->label('Status')
                ->setOptions(['' => 'All', '1' => 'Active', '0' => 'Inactive'])
                ->filter(fn (Builder $q, $v) => $q->where('active', (bool) $v)),
        ];
    }

    public function bulkActions(): array
    {
        return [
            'deleteSelected' => 'Delete Selected',
            'exportCsvAuto'  => 'Export CSV',
        ];
    }

    public function deleteSelected(): void
    {
        User::whereIn('id', $this->getSelectedIds())->delete();
    }

    public function edit(int $id): void
    {
        $this->redirect(route('users.edit', $id));
    }

    public function delete(int $id): void
    {
        User::findOrFail($id)->delete();
    }
}
<livewire:tables.users-table />

Multiple Tables in the Same View

When rendering multiple instances of the same table component (or different tables that share the same class), assign a unique table-key to each one so their state (filters, search, sorting, pagination) is isolated:

<livewire:tables.users-table table-key="users-active" />
<livewire:tables.users-table table-key="users-archived" />

You can also pass it dynamically:

<livewire:tables.users-table :table-key="'users-' . $section" :table-theme="$theme" />

If you don't set table-key, all instances of the same component will share state via session.

Documentation

Guide
Installation Setup, config, publishing assets
Configuration Config reference, per-table options, table key
Columns Text, Boolean, Date, Image, Action, Blade
Filters All types, dependent filters, custom logic
Bulk Actions Selection model, custom actions, CSV export
Export Auto CSV, custom exports
Events & Hooks Lifecycle hooks, external refresh
Toolbar Slots 6 hook points for custom content
Theming Themes, dark mode, color palette
Dark Mode .lt-dark class, session detection, $this->darkMode
Joins Joined columns, aliases, search on joins
Security Built-in protections, safe callbacks

Development

composer test       # Run tests
composer analyse    # PHPStan level 8
composer format     # Pint code style

Contributing · Changelog · License

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
oxygen/data
oxygen/core
jengo/base
xiloryx/log-collector
a21ns1g4ts/filament-stripe
la-php/laravel-admin
artisan-build/community-prompts
vleroy/smart
ayles-software/laravel-australian-public-holidays
cboxdk/laravel-id-spatie
cboxdk/laravel-id-billing
cboxdk/laravel-id-billing-bridge
simple-as-fuck/php-performance-log
hsluv/hsluv
seampact/codegen
seampact/hooks
seampact/ir
mehedimi/laravel-amp-mail
happones/laravel-vue-i18n-generator
jwerd/inertia-table