spindle.by jsj
spindle/table

Coming from Filament

How the Filament table feature set maps across, and what is still to do.

Baseline: the public Filament 5 Tables documentation and column types. This is functional compatibility work, not a claim that Filament classes, Blade views or Livewire traits run inside Inertia. Saved views are an additional Spindle feature inspired by the general preset/favorites workflow, not a copy of a third-party paid plugin.

Implemented

Feature area Spindle support
Fluent definitions Table, columns, filters, groups, header/row/bulk actions
Display columns Text, badge, numeric/money/date, sanitized HTML/Markdown, escaped syntax-highlighted code, icon/boolean, image stacks, color
Editable columns Text, select, toggle, checkbox; validation and authorization
Custom columns/filters PHP subclasses, callbacks, metadata, Svelte snippets
Searching Global, individual, relationship, table/column query callbacks and optional bounded Scout integration
Sorting Allowlisted multiple sorts, custom queries, stable primary-key ordering
Filters Checkbox, select/multiple/relationship, local/remote option search, preload, ternary, range/date, soft-deleted; live/deferred application, configurable grid/placement/overlays
Advanced rules Nested AND/OR builder, typed constraints, bounded depth/count
Visibility/order Server-hidden columns, searchable column manager, live/deferred toggles and drag/keyboard ordering, resets, modal/dropdown/slide-over layouts, saved order
Pagination Cursor, simple and length-aware; native Inertia infinite scroll
Actions Toolbar, row, cell and bulk handlers; configurable record-action placement; bulk actions in toolbars; authorized selected-record context; frontend-owned UI; async submission/cancellation; Laravel validation, confirmation and policy checks
CRUD helpers Create, edit, delete, restore, force delete, replication exclusions/save hooks/relationship copying, bulk delete
Bulk callback modes Eager models, chunked lazy models, or IDs; preflight authorization, fixed target IDs and one transaction; optional per-ID authorization without model hydration
Selection Loaded and all-matching records with exclusions; explicit enable/disable, maximum count, loaded-page and single-group restrictions; group selection controls
Background bulk execution Durable scoped per-record jobs, encrypted input, chunked target preparation, progress props, headless monitoring, Svelte progress/notifications/history, cancellation, unread completion state, recovery and retention
Grouping Server ordering, default groups, titles, collapsible loaded groups, SQL aggregate-only reports and group pagination
Summaries All/page/group scopes, sum, average, min, max, count, range and custom summarizers
Reordering Authorized subset reordering with preserved external positions
Presentation Heading, description, row URLs/classes, stripes, empty state, responsive overflow, cards, nested Split/Stack/Grid/Panel/custom layouts and collapsible details
Refresh Polling, partial reload, deferred scroll props
Custom data Bounded Laravel paginator provider contract
Import/export Scoped streamed CSV export, queued CSV/XLSX exports with private authorized downloads/progress/retention, bounded transactional CSV import, and queued CSV imports with server-defined destinations, user mappings, per-row results and private failure reports
Views Preset tabs, private user views, defaults, favorites, replacement, deletion, reordering API and session persistence
Localization Per-table message overrides, placeholders/pluralization functions, accessible labels, Intl locale formatting and Laravel translation hooks
Framework independence Zero-dependency headless TS core; Svelte driver

Action UI design

Per the package requirements, action forms, wizards, read-only details and other interactions belong to the frontend application. A PHP schema/form/infolist builder is intentionally excluded. The package provides typed handler hooks, initial data, submission and authorization; applications can use any UI or form library. This is the requested action architecture, not a pending form-builder feature.

Remaining work before a full-parity claim

  • Close the remaining interaction and configuration gaps. Implemented feature categories alone do not establish full parity.

Public/shared views and approval workflows are additional future work, not core Filament table features being claimed here. The Svelte table virtualizes rows automatically (see rendering performance), which Filament does not. Vue and React renderers are intentionally deferred per the package direction.

Verification scope

Backend tests run against SQLite and the locked Laravel/Inertia versions, including Scout’s database and collection engines. The isolated Laravel 12 / PHP 8.3 suite also passes; exact versions and limits are recorded with the package. Remote Scout services are not exercised. The browser fixture exercises a real Laravel + Inertia + Svelte app with CSRF/session middleware. MySQL/PostgreSQL and the lowest dependency versions require CI matrix verification before release. No registry publication or production deployment has been performed.