kisame76/filament-tree-table
Expandable parent/child tree rows for Filament v4 and v5 tables. Show top-level parents, expand with a chevron to reveal inline child rows while search and filters stay correct. Includes expand-all/collapse-all actions and optional pagination by root.
^4.3||^5.0. If you're pinned to Filament 4.0–4.2 you must bump Filament before installing — Table::persistColumnsInSession() does not exist before 4.3.0, and the package's own suite is only green from 4.3 upward.composer require the package, then run php artisan filament:upgrade (or filament:assets if you publish assets manually) so the column/chevron views are registered with your panel.table(Table $table), and the expand-all / collapse-all controls are table actions. That is where 90% of your day-to-day work will happen.persistColumnsInSession() on the table so those visibility choices survive navigation between pages.Toggle column placement. Add the toggle column first in the column list so the chevron sits at the row's leading edge and acts as the click target for the whole row. Keep the columns you want revealed after it — the toggle is about progressive disclosure, not a replacement for the record view page.
Expand-all / collapse-all as table actions. Register them in the table's header/toolbar area rather than as per-row actions; they are bulk-in-spirit and read better at the top. Pair them with search so a user can filter to a handful of rows and expand only those.
Column manager + session persistence. This is the combination the release notes explicitly test. In table():
->persistColumnsInSession()
With that in place, hidden/reordered columns (and the toggle column's own state) survive Livewire navigation for the session. Without it, the manager resets on every page change — a common "the feature is broken" report that is really a missing one-liner.
Search integration. Keep searchable columns visible-by-default in the manager; if a user hides the column they search on, the results look arbitrary. Consider ->searchable() only on columns you expect to stay visible.
Testing pattern worth copying. The upstream suite now mounts the table through Livewire and actually draws a row, instead of only asserting on the underlying query. Mirror that: Livewire::test(ListOrders::class) then assert on rendered output / action existence. Query-only assertions will not catch a chevron that fails to render.
Contributing / releasing. If you're patching upstream, the release workflow publishes from a v* tag using the matching changelog section — a tag without a section fails the job. Write the changelog entry in the same PR as the change.
^4.0||^5.0 → ^4.3||^5.0. Composer will pull the newest 4.x on a fresh install, so most people notice nothing; projects with an explicit filament/filament: 4.2.* in composer.json or a tight lock file will fail to resolve. Bump Filament deliberately rather than fighting the conflict.persistColumnsInSession() is exactly what it says. Column choices are lost on session expiry, on logout, and for the next device. If you need durable per-user preferences, store them yourself and hydrate the table state from there.view:clear).SECURITY.md asks for private disclosure with a defined scope rather than public issues — worth honouring if you find something in the render path, which is where the newly added integration tests concentrate.How can I help you explore Laravel packages today?