pjedesigns/filament-nested-set-table
A Filament table package for Laravel nested set models, making hierarchical records easy to browse and manage in your admin panel with a clean, tree-structured table UI.
Architecture fit. This is a Filament panel plugin that layers drag-and-drop tree reordering (nested-set semantics) onto an existing Eloquent resource. v1.1.0 signals a shift from an embedded table behaviour to a first-class Filament Page (OrderPage) — a dedicated reordering surface with its own header actions. That is architecturally healthier than mutating list-table rows in place: it isolates the write-heavy reorder workflow from the read-optimised list view, gives a natural home for bulk/recovery actions, and reduces the surface area that has to survive Filament table refactors. The plugin remains a presentation-layer concern with a persistence dependency on a nested-set implementation; it is not a domain service, and should not be treated as one.
Integration feasibility. Low-to-moderate effort for a team already on Filament. Expected shape: composer require, register the plugin in the panel provider, generate/publish the OrderPage and point it at the target model plus sort column and depth configuration, ensure the model uses the required nested-set trait, and publish translations if non-English locales are in scope. The new "conditional description text based on max depth" indicates depth is a declared config value rather than inferred — good, because it means the guard rails are explicit and reviewable in config rather than emergent at runtime. Undo surfacing through Filament notifications means no bespoke UI layer to maintain, but it also means undo inherits notification lifecycle semantics (see Operational Impact).
Technical risk. The dominant risk is framework coupling, not logic. Two of the three fixes in this release are cosmetic-geometric: "fix drag clone to preserve table cell layout structure" and "fix border colors to match Filament styling." Those are reliable indicators that the plugin reaches into Filament's table DOM and CSS class contract. Cosmetic regressions of that kind will recur on every Filament minor bump and will not be caught by PHP unit tests — they require visual regression coverage in a real panel. Secondary risks: Fix Tree is a repair operation against a nested-set store and is inherently destructive if the tree is already inconsistent, so it must be permission-gated, transactional where the driver allows, and audited; and drag-reorder is a concurrent-write path with no evident optimistic-locking story in these notes.
Key questions.
Fix Tree run in a transaction, and does it emit an audit event? Can it be disabled or hidden from non-admin roles?Undo durable (server-side), or session/notification-scoped? What is its window, and does it survive page navigation?updated_at checks, or last-write-wins?OrderPage respect Filament authorisation (policy update on the parent resource) and multi-tenancy scoping?Stack fit. Assumes Laravel + Filament admin panel with an Eloquent model shaped as a nested set. It is a clean fit for content-heavy admins (categories, menus, page hierarchies, org structures, taxonomy) and a poor fit where ordering is a business-critical, high-concurrency operation (e.g. warehouse pick paths) — there, a drag UI is the wrong interface regardless of plugin quality.
Migration path. Greenfield: install and configure directly against the target resource. Brownfield with existing manual sort_order columns or a homegrown reorder form: migrate one resource at a time behind the new OrderPage, keeping the old path available until parity is confirmed; backfill the nested-set columns (_lft, _rgt, parent_id, depth) with a one-off script and verify with the plugin's own Fix Tree before cutting over — using the repair tool as a validation step is cheap and doubles as a smoke test. Do not run Fix Tree against production data without a snapshot.
Compatibility. Pin the Filament constraint explicitly and treat Filament upgrades as requiring a plugin re-verification pass. The CSS/DOM fixes in this release mean patch-level plugin updates can carry visual regressions; schedule them like frontend changes, not like library bumps. Confirm the nested-set package version resolves against our Laravel/PHP floor before committing.
Sequencing.
Fix Tree is idempotent on healthy data.update policy, gate Fix Tree to an admin role, confirm tenant scoping.OrderPage) to CI — the only practical guard against the clone/colour class of bug.Maintenance. Expect ongoing cosmetic drift with Filament releases — budget a recurring verification task per Filament upgrade rather than assuming the plugin is set-and-forget. Internal fork risk is real if the plugin stalls, but the codebase is small and the coupling is contained to one page.
Support. Two support themes will dominate: "my reorder didn't save" (concurrency or failed drag) and "the tree looks wrong" (corrupted nested set, usually from direct DB edits or an interrupted write). Both need a runbook. Fix Tree in the UI is a genuine operational asset — it converts a DBA escalation into a self-service action — but only if it is permission-gated and logged, otherwise it becomes a way for a well-meaning admin to silently restructure data.
Scaling. Nested-set writes are O(siblings) per move, and drag interactions issue frequent writes; on wide trees this produces lock contention and slow responses. Mitigations: cap practical tree width, debounce or batch drag commits if the plugin allows, and avoid exposing the OrderPage on trees in the thousands of nodes without load testing. Reads are cheap, so the list view scales far better than the ordering view — another argument for the dedicated page.
Failure modes. (a) Interrupted or concurrent reorder corrupting _lft/_rgt — mitigate with transactions, row locking, and a monitored Fix Tree. (b) Undo being mistaken for durable versioning; users will assume it persists across sessions. Correct this in UI copy. (c) Silent no-op saves where policy allows viewing but not updating — ensure the page is hidden, not just failing on submit. (d) Filament upgrade breaking the drag clone layout mid-sprint — mitigated by the visual regression step. (e) Untranslated keys surfacing raw strings in non-English admin locales.
Ramp-up. Low for developers familiar with Filament — configuration is declarative and the new README section covers OrderPage. Non-trivial for admins: drag-and-drop ordering invites experimentation, and the presence of Expand All/Collapse All/Fix Tree/Undo in the header gives four recovery-looking controls whose blast radius differs sharply. Ramp-up should be a short walkthrough distinguishing "undo my drag" from "repair the whole tree," plus a note that Fix Tree is the escalation path when something looks wrong. Half a day of developer setup, one short admin briefing, and a standing item in the Filament upgrade checklist.
How can I help you explore Laravel packages today?