icetalker/filament-table-repeater
Filament Table Repeater extends Filament's Repeater form component to display repeatable fields in a table layout. Install via Composer, then use TableRepeater::make() with schema, reorderable, cloneable, collapsible, and min/max items support.
Architecture fit. The package is a thin subclass of Filament\Forms\Components\Repeater that replaces the Blade rendering layer with a table layout. It contributes no service provider of consequence, no migrations, no configuration surface, no queues, no external services, and no persistence of its own. Validation, ->relationship() binding, minItems/maxItems, reorderable(), cloneable(), and collapsible() are all inherited from the upstream Repeater, which is exactly what a TPM wants to hear: the dependency adds presentation, not behavior, so it carries none of the usual integration baggage (schema ownership, data backfill, auth surface, background processing).
It fits only where Filament is already the admin framework and the repeated payload is genuinely rectangular — line items, invoice rows, variant matrices, shipping rules, permission grids, batch records. It does not fit heterogeneous row schemas, per-row conditional field sets, or forms that need client-side computation before submit. That scoping judgment is the single highest-value thing a TPM does with this package: it is a UI ergonomics win, not a platform capability.
Integration feasibility. composer require icetalker/filament-table-repeater, optionally php artisan vendor:publish --tag="filament-table-repeater" to own the views, then swap Repeater::make() for TableRepeater::make() in the form schema. No migration, no routing, no data backfill, no auth changes. Realistically a one-to-two day spike per form including regression checks, with the dominant uncertainty being Filament version compatibility rather than the package's own behavior. The published-views escape hatch is the primary lever: we absorb UI gaps by owning CSS, not by forking PHP.
Technical risk.
Repeater ships a table() method and recommends it for v4 users. Adopting this on a v4 codebase is buying a scheduled migration; adopting it on v3 is buying a stopgap. That framing should drive scoping, not the feature list.filament-table-repeater-header-cell → it-table-repeater-cell-label, filament-table-repeater-tbody-cell → it-table-repeater-cell) and changed colStyles() from array-only to array-or-Closure. Any custom theming built against pre-1.3 classes is broken. That is a signal about the stability contract: minor versions can break presentation contracts.inset(), grid(), and columns() are unsupported. Product specs that assume them will fail late in build, not at kickoff, so they must be screened in design review rather than discovered in QA.Key questions to resolve before committing.
Repeater::table().inset(), grid(), or columns() for layout? If so, scope is larger than it appears.Stack fit. Requires Laravel + Filament, with v3 as the practical target for this package. No constraint on PHP version beyond what Filament already imposes, no constraint on database driver, no constraint on hosting model. Works in any Filament panel that renders forms — resource forms, custom pages, action modals — provided the underlying data is columnar. It assumes the Tailwind/Filament asset pipeline is present, which it will be in any Filament install.
Migration path. Two directions, both cheap, and that cheapness is the core argument for adoption:
Repeater by changing the class and the make() call. Schema arrays, relationships, validation rules, and item limits carry over unchanged. Budget half a day per form for the swap plus visual QA in light and dark mode.Repeater, or move to Filament v4's native table(). Because the component wraps rather than replaces Repeater semantics, the persisted data shape is unchanged — no migration, no backfill, no dual-write period. This is the reason to wrap every usage in one internal component (e.g. App\Forms\Components\DataTableRepeater) so the exit is a one-file edit rather than a grep across the codebase.Compatibility. Pin icetalker/filament-table-repeater to a specific 2.0.x in composer.json (caret on minor, or an exact pin if the form is business-critical) and record the resolved version in the dependency inventory. The real compatibility risk is transitively the Filament major version, not this package: a composer update that pulls Filament 4 will break the subclass contract. Land a filament/filament constraint or CI guard in the same change so the Filament major cannot move silently underneath this package.
Sequencing.
inset()/grid()/columns(), confirm the target is internal admin tooling rather than customer-facing.Repeater without touching consumer code. An hour of work that de-risks the entire bet.Maintenance. Low ongoing effort but non-zero, and concentrated in the wrong place: the risk is not bug-fixing this package, it is tracking Filament's major version. Nominate an owner for "Filament upgrade readiness," because the v4 transition silently removes this package's reason to exist. Do not fork. Do not let product features depend on package-specific behavior (colStyles, renamed CSS classes) beyond what a wrapper insulates. Total cost of ownership over a year is roughly the initial spike plus a couple of hours per Filament release review — cheap enough that the decision should hinge on the v4 question, not on effort.
Support. No SLA, no vendor, no security policy beyond a CONTRIBUTING pointer to a Spatie template. Support is GitHub issues on a single-maintainer project with 136 stars. Set expectations accordingly: internal triage first, upstream issue second, fork or remove third. Keep a short decision log (version pinned, wrapper location, owner, exit criteria) so the next TPM does not re-derive this evaluation.
Scaling. Server-side Blade rendering; no runtime performance concern beyond normal Filament form render cost. The practical scaling limit is DOM width and cognitive load, not throughput: a table of many columns on a narrow viewport degrades faster than a stacked repeater. Enforce maxItems on any table that can grow unbounded, and be aware that relationship-backed repeaters inherit Repeater's eager/lazy loading behavior — an N+1 on a large item set is a Repeater concern, not a package one. Nothing here touches queues, caching, or the database schema.
Failure modes. (a) Filament major bump breaks the subclass contract — mitigated by the version guard and wrapper. (b) Reorder regression silently corrupts persisted order — mitigated by the pilot's persistence test and a version pin. (c) CSS class rename breaks custom theming — mitigated by publishing views and owning the CSS in-repo. (d) colStyles() signature change — mitigated by keeping call sites few and inside the wrapper. (e) Unsupported layout methods surfacing as late build failures — mitigated by design-review screening. (f) Package abandonment — mitigated by the exit rehearsal; the blast radius is one internal file.
Ramp-up. Near-zero for any developer who already knows Filament's Repeater, which is the whole point: the API is familiar, the docs are one page plus a changelog, and onboarding is "change the class name." QA and design need a one-paragraph brief covering the table layout, dark mode, and the fact that inset()/grid()/columns() are unavailable. The genuine ramp-up cost sits with the TPM, not the team: understanding that this is a temporary ergonomics layer with a known expiry date, and planning the v4 transition rather than treating the package as permanent infrastructure.
How can I help you explore Laravel packages today?