rafazingano/filament-kanban

将看板板添加到您的Filament页面

v2.9.10 2024-03-28 14:26 UTC

README

Latest Version on Packagist Total Downloads

轻松将看板页面添加到您的Filament面板。

Customized kanban board views

Customized edit modal

Cards with progress indicator

Another example by @Log1x

安装

您可以通过composer安装此包

composer require rafazingano/filament-kanban

发布资产以确保样式正确

php artisan filament-kanban:install

开始之前

重要

您应该有一些具有status列的Model。此列可以称为数据库中的status或任何其他名称。

我还假设您的模型中有一个title列,但您可以使用name或任何其他列来表示标题。

我建议您创建一个基于字符串的Enum来定义您的状态。

您可以使用我们的IsKanbanStatus特性,这样您就可以使用枚举的statuses方法轻松地将枚举情况转换为看板。

use Rafazingano\FilamentKanban\Concerns\IsKanbanStatus;

enum UserStatus: string
{
    use IsKanbanStatus;

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

我建议您将Model上的status属性强制转换为您创建的枚举。

提示

我还建议您在Model上使用Spatie Eloquent Sortable包,我们将神奇地将排序功能添加到您的看板。

用法

您可以使用以下Artisan命令创建一个名为UsersKanbanBoard的新看板

php artisan make:kanban UsersKanbanBoard

这为您的看板提供了一个良好的起点。您可以根据需要自定义看板。

您应该覆盖model属性,以便我们可以加载您的记录。

protected static string $model = User::class;

您还应覆盖statusEnum属性,该属性定义了您的状态。

protected static string $statusEnum = UserStatus::class;

升级指南

如果您应用中已安装1.x版本,并且想要升级到2.x版本,以下是您的清单

  • 您需要覆盖$model$statusEnum,如最后一部分中所述
  • 如果您已发布kanban-record.blade.php视图,您可以使用$record作为Model实例,而不是数组。
  • 如果您只是覆盖KanbanBoard方法以执行默认行为,现在可以安全地删除它们。如果没有特殊要求,您应该能够通过覆盖0个方法完成工作 🥳

高级用法

您可以覆盖records方法,以自定义要在板上显示的记录或项目的检索方式。

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

如果您不想为状态定义Enum,或者您有检索状态的特定逻辑,您可以覆盖statuses方法

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

您还可以覆盖这些方法,以更改在拖放记录时看板的行为

  • onStatusChanged定义了当记录在状态之间移动时会发生什么。
  • onSortChanged定义了当记录在相同状态内移动时会发生什么。
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);
}

自定义状态枚举

如果您将IsKanbanStatus添加到您的状态Enum,此特性将为您的枚举添加一个静态的statuses方法,该方法将返回枚举中定义的状态,格式正确。

如果您不希望枚举的所有情况都出现在板上,您可以覆盖此方法并返回一组情况

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

IsKanbanStatus使用您的情况的value作为状态的title。您还可以自定义获取标题的方式。

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

编辑模式

禁用模式

默认情况下启用了编辑模式,您可以通过点击记录来显示它。

如果您需要禁用编辑模式,请覆盖此属性

public bool $disableEditModal = false;

编辑模态表单架构

您可以通过覆盖此方法来定义编辑模态表单架构

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

如您所见,您可以访问正在编辑的记录的 id,这在构建您的架构时可能很有帮助。

自定义编辑表单提交操作

您可以通过覆盖此方法来定义编辑表单提交时会发生什么

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

data 数组包含表单数据,而 state 数组包含完整的记录数据。

自定义模态外观

您可以自定义模态的标题、大小以及保存和取消按钮的标签

protected string $editModalTitle = 'Edit Record';

protected string $editModalWidth = '2xl';

protected string $editModalSaveButtonLabel = 'Save';

protected string $editModalCancelButtonLabel = 'Cancel';

自定义

更改导航图标

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

更改用作标题的模型属性

protected static string $recordTitleAttribute = 'title';

更改用作状态的模型属性

protected static string $recordStatusAttribute = 'status';

自定义视图

您可以使用此 artisan 命令发布视图

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

我建议您删除您不打算自定义的文件,保留您想要更改的文件。这样,您将获得原始视图的任何可能的未来更新。

上述方法将替换应用程序中所有看板的所有视图。

或者,您可能想要更改其中一个看板的视图。您可以通过覆盖这些属性来覆盖每个视图

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';

闪烁最近更新的记录

当记录刚刚更新时,您会获得一些视觉反馈。

如果您还使用 Spatie Eloquent Sortable,您可能会同时看到所有记录都被闪烁。这是因为 Eloquent Sortable 更新所有模型当排序改变时的 order_column。为了解决这个问题,发布它们的配置并将 ignore_timestamps 设置为 true

视频教程

您是视觉学习者吗?我创建了一些 YouTube 视频来帮助您开始使用这个包

警告

这些视频是用包的 1.x 版本录制的。现在使用这个包要简单得多,并且需要您编写的代码要少得多。

希望 2.x 版本足够简单,无需视频,但您仍然可以从这些视频中学习一些东西。

Creating a Kanban Board in FilamentPHP using filament-kanban: Part 1, Basic setup

Creating a Kanban Board in FilamentPHP: Part 2, Sorting Records with Spatie Eloquent Sortable

Creating a Kanban Board in FilamentPHP: Part 3, Multiple Kanban boards per model and customizations

Create a Kanban Task Management App in 15 Minutes: Part 4, Create and Edit Actions

Create a Kanban Task Management App with FilamentPHP: Part 5, Customize the Views

Create a Kanban Task Management App with FilamentPHP: Part 6, Customize the Theme

Create a Kanban Task Management App with FilamentPHP: Part 7, Custom Views per Kanban Board

演示和示例

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

安全漏洞

有关报告安全漏洞的详细信息,请参阅 我们的安全策略

TODO

  • 删除已弃用的最近更新特质
  • 停止将记录传递给视图进行记录点击
  • 使用 filament 动作进行编辑模态

致谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件