PHPackages                             sheavescapital/filament-kanban - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. sheavescapital/filament-kanban

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

sheavescapital/filament-kanban
==============================

Add kanban boards to your Filament pages

v5.1(1mo ago)05.6k↑65.1%1MITPHPPHP ^8.1

Since May 6Pushed 1mo agoCompare

[ Source](https://github.com/sheavescapital/filament-kanban)[ Packagist](https://packagist.org/packages/sheavescapital/filament-kanban)[ Docs](https://github.com/sheavescapital/filament-kanban)[ RSS](/packages/sheavescapital-filament-kanban/feed)WikiDiscussions main Synced 3d ago

READMEChangelogDependencies (33)Versions (6)Used By (0)

Add kanban boards to your Filament pages
========================================

[](#add-kanban-boards-to-your-filament-pages)

A fork of [(https://github.com/mokhosh/filament-kanban)](https://github.com/mokhosh/filament-kanban)

Installation
------------

[](#installation)

You can install the package via composer:

```
composer require sheavescapital/filament-kanban
```

Publish the assets so the styles are correct:

```
php artisan filament:assets
```

Before You Start
----------------

[](#before-you-start)

Important

You should have some `Model` with a `status` column. This column can be called `status` in the database or anything else.

I'm also assuming there's a `title` column on your model, but you can have `name` or any other column to represent a title.

I recommend you create a string backed `Enum` to define your statuses.

You can use our `IsKanbanStatus` trait, so you can easily transform your enum cases for the Kanban board using the `statuses` method on your enum.

```
use SheavesCapital\FilamentKanban\Concerns\IsKanbanStatus;

enum UserStatus: string
{
    use IsKanbanStatus;

    case User = 'User';
    case Admin = 'Admin';
}
```

I recommend you cast the `status` attribute on your `Model` to the enum that you have created.

Tip

I also recommend you use the [Spatie Eloquent Sortable](https://github.com/spatie/eloquent-sortable) package on your `Model`, and we will magically add sorting abilities to your Kanban boards.

Usage
-----

[](#usage)

You can create a new Kanban board called `UsersKanbanBoard` using this artisan command:

```
php artisan make:kanban UsersKanbanBoard
```

This creates a good starting point for your Kanban board. You can customize the Kanban board to your liking.

You should override the `model` property, so we can load your records.

```
protected static string $model = User::class;
```

You should also override the `statusEnum` property, which defines your statuses.

```
protected static string $statusEnum = UserStatus::class;
```

Upgrade Guide
-------------

[](#upgrade-guide)

If you have version 1.x on your application, and you want to upgrade to version 2.x, here is your checklist:

- You need to override `$model` and `$statusEnum` as mentioned in [the last part](#usage)
- If you have published `kanban-record.blade.php` view, you can use `$record` as a `Model` instance instead of an `array`.
- If you're overriding `KanbanBoard` methods just to do the default behaviour, you can safely remove them now. You should be able to get away with overriding 0 methods, if you don't have special requirements 🥳

Advanced Usage
--------------

[](#advanced-usage)

You can override the `records` method, to customize how the records or items that you want to see on your board are retrieved.

```
protected function records(): Collection
{
    return User::where('role', 'admin')->get();
}
```

If you don't want to define an `Enum` for your statuses, or you have a special logic for retrieving your statuses, you can override the `statuses` method:

```
protected function statuses(): Collection
{
     return collect([
         ['id' => 'user', 'title' => 'User'],
         ['id' => 'admin', 'title' => 'Admin'],
     ]);
}
```

You can also override these methods to change your board's behavior when records are dragged and dropped:

- `onStatusChanged` which defines what happens when a record is moved between statuses.
- `onSortChanged` which defines what happens when a record is moved inside the same status.

```
public function onStatusChanged(int $recordId, string $status, array $fromOrderedIds, array $toOrderedIds): void
{
    User::find($recordId)->update(['status' => $status]);
    User::setNewOrder($toOrderedIds);
}

public function onSortChanged(int $recordId, string $status, array $orderedIds): void
{
    User::setNewOrder($orderedIds);
}
```

### Customizing the Status Enum

[](#customizing-the-status-enum)

If you add `IsKanbanStatus` to your status `Enum`, this trait adds a static `statuses()` method to your enum that will return the statuses defined in your enum in the appropriate format.

If you don't want all cases of your enum to be present on the board, you can override this method and return a subset of cases:

```
public static function kanbanCases(): array
{
    return [
        static::CaseOne,
        static::CaseThree,
    ];
}
```

`IsKanbanStatus` uses the `value` of your cases for the `title` of your statuses. You can customize how the title is retrieved as well:

```
public function getTitle(): string
{
    return __($this->label());
}
```

Edit modal
----------

[](#edit-modal)

### Disabling the modal

[](#disabling-the-modal)

Edit modal is enabled by default, and you can show it by clicking on records.

If you need to disable the edit modal override this property:

```
public bool $disableEditModal = false;
```

### Edit modal form schema

[](#edit-modal-form-schema)

You can define the edit modal form schema by overriding this method:

```
protected function getEditModalFormSchema(null|int $recordId): array
{
    return [
        TextInput::make('title'),
    ];
}
```

As you can see you have access to the `id` of the record being edited, if that's helpful in building your schema.

### Customizing edit form submit action

[](#customizing-edit-form-submit-action)

You can define what happens when the edit form is submitted by overriding this method:

```
protected function editRecord($recordId, array $data, array $state): void
{
    Model::find($recordId)->update([
        'phone' => $data['phone']
    ]);
}
```

The `data` array contains the form data, and the `state` array contains the full record data.

### Customizing modal's appearance

[](#customizing-modals-appearance)

You can customize modal's title, size and the labels for save and cancel buttons, or use Filament's slide-over instead of a modal:

```
protected string $editModalTitle = 'Edit Record';

protected string $editModalWidth = '2xl';

protected string $editModalSaveButtonLabel = 'Save';

protected string $editModalCancelButtonLabel = 'Cancel';

protected bool $editModalSlideOver = true;
```

Customization
-------------

[](#customization)

### Changing the navigation icon

[](#changing-the-navigation-icon)

```
protected static ?string $navigationIcon = 'heroicon-o-document-text';
```

### Changing the model property that's used as the title

[](#changing-the-model-property-thats-used-as-the-title)

```
protected static string $recordTitleAttribute = 'title';
```

### Changing the model property that's used as the status

[](#changing-the-model-property-thats-used-as-the-status)

```
protected static string $recordStatusAttribute = 'status';
```

### Customizing views

[](#customizing-views)

You can publish the views using this artisan command:

```
php artisan vendor:publish --tag="filament-kanban-views"
```

I recommend you delete the files that you don't intend to customize and keep the ones you want to change. This way you will get any possible future updates for the original views.

The above method will replace the views for all Kanban boards in your applications.

Alternatively, you might want to change views for one of your boards. You can override each view by overriding these properties:

```
protected static string $view = 'filament-kanban::kanban-board';

protected static string $headerView = 'filament-kanban::kanban-header';

protected static string $recordView = 'filament-kanban::kanban-record';

protected static string $statusView = 'filament-kanban::kanban-status';

protected static string $scriptsView = 'filament-kanban::kanban-scripts';
```

Testing
-------

[](#testing)

```
composer test
```

Credits
-------

[](#credits)

- [Mo Khosh](https://github.com/mokhosh)
- [All Contributors](../../contributors)
- This original idea and structure of this package borrows heavily from [David Vincent](https://github.com/invaders-xx)'s [filament-kanban-board](https://github.com/invaders-xx/filament-kanban-board/)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

48

—

FairBetter than 93% of packages

Maintenance93

Actively maintained with recent releases

Popularity25

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 88.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~98 days

Total

5

Last Release

33d ago

Major Versions

v3.0 → v4.02026-01-13

v4.1 → v5.02026-03-24

### Community

Maintainers

![](https://www.gravatar.com/avatar/9a569d5234542e6c4e6136a93fc7930397f05537795382d630f5313b0190e001?d=identicon)[yparitcher](/maintainers/yparitcher)

---

Top Contributors

[![mokhosh](https://avatars.githubusercontent.com/u/6499685?v=4)](https://github.com/mokhosh "mokhosh (245 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (12 commits)")[![yparitcher](https://avatars.githubusercontent.com/u/38916402?v=4)](https://github.com/yparitcher "yparitcher (7 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (6 commits)")[![Log1x](https://avatars.githubusercontent.com/u/5745907?v=4)](https://github.com/Log1x "Log1x (2 commits)")[![ryanmortier](https://avatars.githubusercontent.com/u/2053960?v=4)](https://github.com/ryanmortier "ryanmortier (1 commits)")[![gnovaro](https://avatars.githubusercontent.com/u/270990?v=4)](https://github.com/gnovaro "gnovaro (1 commits)")[![brenjt](https://avatars.githubusercontent.com/u/1713885?v=4)](https://github.com/brenjt "brenjt (1 commits)")[![dipesh79](https://avatars.githubusercontent.com/u/63183800?v=4)](https://github.com/dipesh79 "dipesh79 (1 commits)")[![aislandener](https://avatars.githubusercontent.com/u/12144342?v=4)](https://github.com/aislandener "aislandener (1 commits)")[![hussain4real](https://avatars.githubusercontent.com/u/45605752?v=4)](https://github.com/hussain4real "hussain4real (1 commits)")

---

Tags

laravelfilament-kanban

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/sheavescapital-filament-kanban/health.svg)

```
[![Health](https://phpackages.com/badges/sheavescapital-filament-kanban/health.svg)](https://phpackages.com/packages/sheavescapital-filament-kanban)
```

###  Alternatives

[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3914.6k](/packages/rawilk-profile-filament-plugin)[stephenjude/filament-jetstream

A Laravel starter kit built with Filament inspired by Jetstream.

17760.2k3](/packages/stephenjude-filament-jetstream)[stephenjude/filament-debugger

About

104162.2k2](/packages/stephenjude-filament-debugger)[codewithdennis/filament-select-tree

The multi-level select field enables you to make single selections from a predefined list of options that are organized into multiple levels or depths.

329530.5k29](/packages/codewithdennis-filament-select-tree)[stephenjude/filament-feature-flags

Filament implementation of feature flags and segmentation with Laravel Pennant.

122177.8k1](/packages/stephenjude-filament-feature-flags)[finity-labs/fin-mail

A powerful email template manager and composer for Filament with dynamic token replacement, template versioning, and inline email sending.

284.5k1](/packages/finity-labs-fin-mail)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
