daguilarm/belich-tables
Belich Tables is a Laravel package for building dynamic, customizable data tables. Define columns, filters, sorting, pagination, and row actions in PHP, then render responsive tables in Blade. It simplifies admin listings and CRUD interfaces while remaining flexible and easy to integrate.
This release targets the Livewire/Alpine stack, so the first step is aligning your frontend dependencies before touching package code:
php artisan vendor:publish --tag=...) and read the config file first. The new default filters are defined there; that file is the single best map of how the package wires filtering into your components.@livewireScripts first, then Alpine 3 (deferred). Alpine 3 expects to be loaded with defer and will initialise on DOMContentLoaded.If you are upgrading, treat this as a frontend-dependency upgrade first and a package upgrade second — most breakage will surface in Alpine directives, not PHP.
Component-first integration. Mount the package component (or extend its base Livewire component / apply its trait) inside your existing views rather than rebuilding filter UI by hand. Keep your own wrapper thin so package updates don't collide with custom markup.
Filters as configuration, not code. With defaults now shipped, the idiomatic pattern is to accept the defaults and append custom filters in config rather than redefining the whole set. Use the package's filter contract/abstract class for anything bespoke, and register it alongside — not instead of — the defaults.
Alpine 3 for the interaction layer. Use x-data to wrap filter widgets, $wire to call Livewire methods from Alpine handlers, and $dispatch for cross-component events. This is the pattern the Alpine 3 support is built for: Livewire owns server state, Alpine owns transient UI state (open/closed panels, debounce visuals, dropdowns).
Shareable filter state. Push filter properties into the query string via Livewire's $queryString so filtered views are linkable. This is the day-to-day win: users share a URL, the same default-plus-custom filter combination hydrates on load.
Event-driven filter changes. Emit a filter-changed event from the filter UI and listen in the results component. This keeps filter controls and result rendering decoupled and makes it trivial to add a second consumer (e.g. an export button) later.
Test at the Livewire boundary. Use Livewire::test() to assert that setting a filter property produces the expected result set, and that defaults are applied on mount. You get most of the coverage without browser tests; reserve Dusk/browser tests for Alpine-driven interactions.
x-spread is gone, x-init timing changed, the global Alpine object and magic properties behave differently, and x-on shorthand parsing is stricter. Audit any custom directives in your own Blade partials, not just package views.defer.x-data scope. Use wire:ignore around Alpine-managed widgets and wire:key on repeated filter rows.php artisan config:cache (and clear it in local). A stale cached config makes it look like your filter changes were ignored.wire:model deferral, and component lifecycle. If you're starting fresh, budget for a Livewire 3 migration rather than pinning to 2.5 long-term.$wire.get('filters') in the console is the fastest way to confirm what the server actually received.How can I help you explore Laravel packages today?