giacomomasseron/filament-async-column
Filament Async Column loads table column values asynchronously, so slow or expensive data (API calls, heavy queries, computed stats) no longer blocks your Filament tables from rendering. Cells show a placeholder and fill in when ready, keeping admin lists fast and responsive.
AsyncColumn decouples "the table renders" from "the value resolves," so those features can ship on the current data architecture instead of waiting on a caching/batching initiative.skeleton default, spinner, dots, bar) plus loaderColor() bound to the Filament palette. That is design-system work — CSS animation, color tokens, dark-mode variants, reduced-motion handling — that would otherwise be specced, built, and maintained in-house across every panel. Buying it removes a recurring line item from the design/frontend backlog.loader() and loaderColor() accept per-row closures, design can standardize rules like "spinner in primary for externally-fetched values, skeleton for enrichment," or vary by severity (amber tint for a late ETA). That becomes a documented convention, not a per-table code change.prefers-reduced-motion, and loaderColor() resolves through registered Filament colors including dark mode. An audit finding that would normally get its own ticket is closed by adoption.loadingState() still takes precedence, and columns using neither method render the same skeleton as before — so the dependency bump can ride a routine maintenance window while loader adoption is planned independently.Adopt when most of these hold:
loadingState() markup.FilamentColor::register() entries, dark mode) and respect reduced-motion, for brand or accessibility reasons.Look elsewhere or defer when:
loadingState() remains the escape hatch.resolveUsing() fire on every sort/filter/paginate?) is the single most important unknown to measure first.For executives: This is a small, additive release to a package that keeps data-heavy admin tables responsive when individual values come from outside services. It gives us four ready-made loading indicators and brand-color theming out of the box, plus automatic support for users who disable motion — work we would otherwise scope and maintain ourselves. It is backward compatible: existing columns render exactly as before unless we opt in, so it can ride a routine dependency update with no migration and no downtime. The value is faster perceived performance on slow-data screens and one less piece of custom UI to own. The caveat is dependency risk, not technical risk: it is a single-maintainer, MIT-licensed package with a small surface, so we pin to a tested minor and keep a one-afternoon fallback.
For engineering: v1.1.2 adds AsyncColumn::loader() with skeleton (default), spinner, dots, and bar, plus loaderColor() accepting any Filament palette color, including FilamentColor::register() entries, following dark mode. Both accept closures evaluated per row. Implementation is pure CSS — no JS bundle — and each preset stops animating under prefers-reduced-motion. Precedence is explicit: loadingState() still wins, and columns using neither method emit the same skeleton as before, so the bump should be a no-op diff. Note that loaders change perceived performance, not actual call volume: confirm the pinned Filament major is supported, measure whether resolveUsing() fires on initial render versus every Livewire re-render (sort, filter, search, paginate, poll), and check failure/timeout behavior before broadening adoption. Then pilot loader()/loaderColor() on one genuinely slow internal table, agree a convention (skeleton default, spinner for waits past a threshold), and roll out with caching and throttling in application code ahead of wider use.
How can I help you explore Laravel packages today?