Releases
Changelog
Every notable change to Advanced Kanban, newest first. The format follows Keep a Changelog, and versions follow Semantic Versioning.
1.6.0 — 3 August 2026
Promoted from 1.6.0-beta.1 with no code changes.
Added
- Documentation site. These pages, built with Nuxt Content and kept out of the Composer dist.
- Card reordering. Cards can be dropped into an exact position, inside a column and across
columns. Opt in with
Kanban::orderField('position')against a nullable decimal column. A dropped card takes the midpoint between the two cards it landed between, so only the moved row is written — columns stay paginated and the records you never loaded are never touched. See card reordering. - Reorder hooks.
beforeRecordReorder(),handleRecordReorder(), andafterRecordReorder()run for a drag that only changes position, so status side effects stay out of a plain reorder. Existing move hook signatures are unchanged. - Positions for new cards.
Asmit\AdvancedKanban\Actions\CreateActionfills the order field, sending a new card to the bottom of its column. The column comes from thestatusform field, or from the column header the button was rendered under, so a per-column add button needs no status field in the form. It stands down when the board isn't ordered, when no column can be resolved, or when the caller supplied a position. See new records. - Filament 5 support, alongside Filament 4.
- Component generator.
advanced-kanban:make-componentsscaffolds custom column header and card components intocomponents/kanban/{resource-name}/, and prints how to wire them up.
Changed
- Same-column drags are no longer rejected outright. They now resolve against the reorderable
flag, so they succeed when
orderField()is set and are ignored when it isn't. - A cross-column move sets the new position before
handleRecordMove()runs, so the default$record->update([...])persists status and position in one query.
Fixed
- Switching
orderField()on over an existing table left every positionNULL, so every drop resolved to the same number and the card landed wherever the database sorts nulls. A column is now numbered the first time it is reordered, in the order the board is already showing, and the heal runs once. It writes through the base builder, so no model events fire and no timestamps are touched. - Records are ordered by position and then by primary key, so rows sharing a position keep a stable order instead of shuffling between renders.
- The card lock check in the drag handler compared against the string
'false', so it was always truthy and locked cards were never actually consulted. Locked cards now stay put. - Removed a named argument from
unmountAction()calls that broke on some Filament builds.
1.0.0
First stable release.
Added
- Drag and drop between columns
- Workflow transitions with allowed status movement
- Real-time search across multiple fields and relations
- Filters built from a Filament form schema, plus tab filters
- Pagination per column with infinite scroll
- Header, record, and column header actions
- Custom card and column header components
- Record locking
- Responsive layout down to mobile
- Translations through Filament's translation system
- Licensing, license validation, and domain restrictions
Fixed
- PHPStan compatibility issues
- Type annotations and generics
- Method signature conflicts
- Query performance under large boards
Upgrading
To 1.6.0-beta.1
Reordering is opt-in and nothing changes until you enable it.
- Add a sortable column:
$table->decimal('position', 16, 8)->nullable()->index(); - Point the board at it:
->orderField('position') - Existing rows need nothing — a column is numbered the first time it is reordered, keeping the
order the board already shows. Seed them only if that isn't the order you want:
Task::query()->orderBy('created_at')->get() ->each(fn ($task, $index) => $task->update(['position' => $index + 1])); - Swap the create button on a column header to the kanban's
CreateActionif you want new cards positioned as they are made:use Asmit\AdvancedKanban\Actions\CreateAction;
If you overrode handleRecordMove(), check that it writes the whole record rather than only the
status — the position is set on the model before your override runs.
From a development version
- Buy a license and activate it for your domain
- Point
composer.jsonat the stable version and runcomposer update - Clear caches:
php artisan cache:clear - Republish assets:
php artisan filament:assets