asignua/filament-spreadsheet-grid
Add spreadsheet-style editing to Filament with an interactive grid component. Edit cells and rows inline, navigate with the keyboard, and manage tabular data fast—ideal for bulk data entry and quick admin panel workflows.
1.250 is no longer coerced to 1.25, unknown boolean words no longer become false, and an invalid cell is never re-read as a valid grid value on paste or fill. This is the difference between "we accept spreadsheet input" and "we can be trusted with financial or inventory quantities."required() (whitespace-only rejected on both sides), user rules like unique:products / exists:skus resolve under the column's own name, and a save cancelled by a model event is reported as failed, not saved. That last one matters for any UI that shows a success toast — false confirmations are a support-ticket generator.TrashedFilter "With trashed") are now saveable, and the post-save read-back goes through the table's query so pivot/joined columns keep their value. This unlocks admin/back-office features (restore-and-edit, order lines joined to products) that were previously broken-by-default.1.250 typed by a user from 1.250 the grid holds, so it accepts it for number() columns. This is a product call (strict-reject vs. lenient-coerce vs. prompt-for-confirmation), not an engineering one. Put it on the roadmap before you market precision handling.jsdom 30, esbuild 0.28), built assets unchanged, no breaking API changes. Upgrading is a low-risk decision you can make in a sprint rather than a quarter.Consider it when:
unique, exists) to behave identically to Laravel's own validation semantics.Look elsewhere or wait when:
number() payload in at least one path — if your threat model or compliance regime requires the server to re-derive meaning from raw input, this is an open gap.To executives: This is a patch release on our grid-editing component that eliminates several ways bad data could silently enter the system — an ambiguous 1.250 used to become 1.25 (a 1000× error), unknown boolean words became false, and re-pasting an invalid cell could launder it into a valid value. It also fixes false "saved" confirmations when a model event cancels a save. Net effect: fewer data-quality incidents and fewer support tickets, at the cost of a dependency-only upgrade with no interface changes.
To engineering: No breaking changes; dev-dependency bumps only, built assets are byte-identical. The substance is correctness: invalid cells stay dirty and are never transmitted; dirty/copy provenance is tracked per source cell so a valid 1.234 beside an invalid cell holding the same text still pastes in machine form; Livewire morphs no longer nuke the open editor; required() rejects whitespace on both tiers; user rules are validated under the column name so unique:/exists: strings work; read-back goes through the table query so pivot/joined columns survive; save-cancelled-by-saving-event is surfaced as failure. The one thing we did not close is server-side disambiguation of user-typed vs. grid-held ambiguous text for number() columns — flagged as owner decision pending.
To the owner of that open decision: We need a stance before we advertise precision handling. Options are (a) strict-reject any raw text that isn't machine-parseable, (b) accept and coerce with an explicit user-facing confirmation, or (c) accept as today and document the limitation. Option (a) is safest for regulated or financial data; (c) is cheapest and defensible for internal tools where the client is the only writer.
How can I help you explore Laravel packages today?