stevenyangtw/livewire-datatable-views-bs4
Install Dependencies
composer require stevenyangtw/livewire-datatable-views-bs4
composer require livewire/livewire mediconesystems/livewire-datatables
(Optional but recommended: composer require nascent-africa/jetstrap for enhanced UI components.)
Publish Views
php artisan vendor:publish --tag="livewire-datatable-views-bs4"
This publishes Bootstrap 4-compatible views to resources/views/vendor/livewire-datatable-views-bs4.
First Use Case: Basic Datatable
Create a Livewire component (e.g., UserTable) and extend MedicOneSystems\LivewireDatatable\View\View:
use MedicOneSystems\LivewireDatatable\View\View;
use StevenYang\LivewireDatatableViewsBs4\View as Bs4View;
class UserTable extends View
{
public function configure(): void
{
$this->setView(Bs4View::class); // Override default view with BS4
$this->column('id');
$this->column('name');
$this->column('email');
}
}
Render it in a Blade view:
<livewire:user-table />
View Overrides
table.blade.php, pagination.blade.php) by publishing and modifying files in resources/views/vendor/livewire-datatable-views-bs4.pagination.blade.php:
<nav aria-label="Page navigation">
<ul class="pagination">
@if ($paginator->hasPages())
<li class="page-item {{ $paginator->currentPage === 1 ? 'disabled' : '' }}">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}">Previous</a>
</li>
<!-- Customize middle pages here -->
<li class="page-item {{ $paginator->currentPage === $paginator->lastPage ? 'disabled' : '' }}">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}">Next</a>
</li>
@endif
</ul>
</nav>
Component Integration
MedicOneSystems\LivewireDatatable\View\View and inject BS4 views:
class ProductTable extends View
{
public function configure(): void
{
$this->setView(Bs4View::class);
$this->column('sku')->sortable();
$this->column('price')->format('$###,###.00');
}
}
wire:model for dynamic interactions (e.g., search, sorting):
<livewire:product-table :key="$refreshId" />
Theming with Jetstrap
<x-jetstrap::modal wire:model="showDeleteModal">
<x-slot name="title">Confirm Deletion</x-slot>
<x-slot name="content">
Are you sure you want to delete these {{ $selectedRows }} items?
</x-slot>
<x-slot name="footer">
<button wire:click="deleteSelected" class="btn btn-danger">Delete</button>
</x-slot>
</x-jetstrap::modal>
Dynamic Columns
public function configure(): void
{
$this->setView(Bs4View::class);
$this->columns = collect(request('columns', []))
->map(fn ($column) => $this->column($column['name'])->label($column['label']));
}
View Publishing Overwrite
resources/views/vendor/livewire-datatable-views-bs4 before customizing.git checkout or cp -r to preserve changes.Bootstrap 4 vs. 5 Conflicts
.pagination). If your project uses BS5, conflicts may arise (e.g., .form-control styles).Livewire Datatables Version Lock
mediconesystems/livewire-datatables (v1.x). Ensure compatibility:
composer require mediconesystems/livewire-datatables:^1.0
Language Files Missing
AppServiceProvider:
public function boot(): void
{
$this->loadTranslationsFrom(__DIR__.'/../resources/lang', 'datatable');
}
View Resolution Issues
resources/views/vendor/livewire-datatable-views-bs4).View and calls setView(Bs4View::class).{{ dd($this->view) }} in the component to check the view class.CSS/JS Conflicts
table-responsive wrapper.@popperjs/core).styles.blade.php:
@push('styles')
<link href="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js" integrity="...">
@endpush
Performance with Large Datasets
public function configure(): void
{
$this->setView(Bs4View::class);
$this->enableServerSide(); // Critical for performance
}
Custom Actions
action():
$this->action('Edit', 'edit', function ($row) {
return '<a href="/users/'.$row->id.'/edit" class="btn btn-sm btn-primary">Edit</a>';
})->format('html');
btn btn-warning for "View").Modal-Based Edits
<livewire:user-table @this.deleted="showSuccessToast" />
<x-jetstrap::toast wire:model="showToast" />
Export Buttons
action():
$this->action('Export', 'export', function () {
return '<a href="/users/export" class="btn btn-sm btn-success">Export</a>';
});
Conditional Columns
$this->column('secret_data')->visible(auth()->user()->isAdmin());
How can I help you explore Laravel packages today?