will2therich/livewire-status-board

根据当前状态显示模型/数据的Livewire组件

dev-master 2022-09-01 04:40 UTC

This package is auto-updated.

Last update: 2024-09-29 06:25:58 UTC


README

根据当前状态显示记录/数据的Livewire组件

预览

preview

安装

您可以通过composer安装此包

composer require will2therich/livewire-status-board

需求

此包在内部使用 livewire/livewire (https://laravel-livewire.com/)。

它还使用TailwindCSS (https://tailwind.org.cn/)进行基本样式化。

在使用此组件之前,请确保包含这两个依赖项。

用法

为了使用此组件,您必须创建一个新的Livewire组件,该组件扩展自LivewireStatusBoard

您可以使用make:livewire创建新组件。例如。

php artisan make:livewire SalesOrdersStatusBoard

SalesOrdersStatusBoard类中,不要从基本Livewire Component类扩展,而要从LivewireStatusBoard扩展。同时删除render方法。您将有一个类似于以下片段的类。

class SalesOrdersStatusBoard extends LivewireStatusBoard
{
    //
}

在此类中,您必须覆盖以下方法来显示数据

public function statuses() : Collection 
{
    //
}

public function records() : Collection 
{
    //
}

如您所注意到的,这两个方法都返回一个集合。statuses()指的是您数据在不同时间点可能具有的所有不同状态值。records()另一方面,代表您想要显示的数据,这些数据可能位于之前定义的statuses()集合中的任何状态。

为了说明这两个方法如何协同工作,让我们讨论一个关于销售订单及其在销售过程中的不同状态的示例:注册、等待确认、确认、已交付。每个销售订单可能在特定时间处于不同的状态。对于此示例,我们可能为statuses()定义以下集合

public function statuses() : Collection
{
    return collect([
        [
            'id' => 'registered',
            'title' => 'Registered',
        ],
        [
            'id' => 'awaiting_confirmation',
            'title' => 'Awaiting Confirmation',
        ],
        [
            'id' => 'confirmed',
            'title' => 'Confirmed',
        ],
        [
            'id' => 'delivered',
            'title' => 'Delivered',
        ],
    ]);
}

对于每个我们定义的状态,我们必须返回一个至少包含2个键的数组:idtitle

现在,对于records(),我们可能定义一个销售订单列表,这些订单来自我们项目中Eloquent模型

public function records() : Collection
{
    return SalesOrder::query()
        ->map(function (SalesOrder $salesOrder) {
            return [
                'id' => $salesOrder->id,
                'title' => $salesOrder->client,
                'status' => $salesOrder->status,
            ];
        });
}

如您在上述片段中看到的,我们必须返回一个包含数组项的集合,其中每个项至少必须包含3个键:idtitlestatus。最后一个是最重要的,因为它将被用于将record匹配到它所属的status。为此,组件通过以下比较匹配statusrecords

$status['id'] == $record['status'];

要渲染组件,只需在视图中使用Livewire标签或include语法即可

<livewire:sales-orders-status-board />

填充销售订单模型,您应该会有以下截图所示的类似内容

basic

您可以使用这种方法渲染项目的任何渲染和状态 👍

排序和拖动

默认情况下,排序和在不同状态之间拖动是禁用的。要启用它,当使用视图时,您必须包含以下props:sortablesortable-between-statuses

<livewire:sales-orders-status-board 
    :sortable="true"
    :sortable-between-statuses="true"
/>

sortable启用每个状态内的排序,而sortable-between-statuses允许从一种状态拖放到另一种状态。添加这两个属性,允许您有拖放功能。

您还必须在项目中安装以下JS依赖项以启用排序和拖动。

npm install sortablejs

安装后,使它们在全局的window对象中可用。这可以在Laravel应用程序附带的bootstrap.js文件中完成。

window.Sortable = require('sortablejs').default;

行为和交互

当启用排序和拖动时,组件会在以下事件发生时收到通知。由这两个事件触发的回调是 onStatusSortedonStatusChanged

onStatusSorted 中,您会收到关于哪个 record 在其 status 中改变了位置的通知。同时,您还会得到一个包含已排序 records 的 id 的 $orderedIds 数组。您必须重写以下方法以在更改时收到通知。

public function onStatusSorted($recordId, $statusId, $orderedIds)
{
    //   
}

record 被移动到另一个 status 时,会触发 onStatusChanged。在这种情况下,您会收到关于更改的 record、新的 status、来自上一个状态的排序 id 和记录进入的新状态的排序 id 的通知。要接收此事件的通知,您必须重写以下方法

public function onStatusChanged($recordId, $statusId, $fromOrderedIds, $toOrderedIds)
{
    //
}

onStatusSortedonStatusChanged 从不会同时触发。当发生交互时,您将收到其中一个的通知。

您还可以通过 onRecordClick 事件在状态板上单击记录时收到通知

public function onRecordClick($recordId)
{
    //
}

要启用 onRecordClick,您必须在通过 record-click-enabled 参数渲染组件时指定此行为

<livewire:sales-orders-status-board 
    :record-click-enabled="true"
/>

样式

要修改组件的外观和感觉,您可以重写 styles 方法,并将此方法返回的基样式修改到视图中。styles() 返回一个键值数组,其中包含用于渲染每个组件的 Tailwind CSS 类。这些基键和样式如下

return [
    'wrapper' => 'w-full h-full flex space-x-4 overflow-x-auto', // component wrapper
    'statusWrapper' => 'h-full flex-1', // statuses wrapper
    'status' => 'bg-blue-200 rounded px-2 flex flex-col h-full', // status column wrapper 
    'statusHeader' => 'p-2 text-sm text-gray-700', // status header
    'statusFooter' => '', // status footer
    'statusRecords' => 'space-y-2 p-2 flex-1 overflow-y-auto', // status records wrapper 
    'record' => 'shadow bg-white p-2 rounded border', // record wrapper
    'recordContent' => '', // record content
]; 

以下是一个重写 styles() 方法的示例

public function styles()
{
    $baseStyles = parent::styles();

    $baseStyles['wrapper'] = 'w-full flex space-x-4 overflow-x-auto bg-blue-500 px-4 py-8';

    $baseStyles['statusWrapper'] = 'flex-1';

    $baseStyles['status'] = 'bg-gray-200 rounded px-2 flex flex-col flex-1';

    $baseStyles['statusHeader'] = 'text-sm font-medium py-2 text-gray-700';

    $baseStyles['statusRecords'] = 'space-y-2 px-1 pt-2 pb-2';

    $baseStyles['record'] = 'shadow bg-white p-2 rounded border text-sm text-gray-800';

    return $baseStyles;
}

使用这些新样式,您的组件应该看起来像下面的截图

basic

看起来像 Trello,对吧? 😅

高级样式和行为

可以根据需要通过将它们导出到您的项目中来自定义组件的基本视图。要这样做,请运行 php artisan vendor:publish 命令并导出 livewire-status-board-views 标签。该命令将在 /resources/views/vendor/livewire-status-board 下发布基本视图。您可以根据需要修改这些基本组件,同时注意在途中保持 data 属性和 ids

另一种方法是复制基本视图文件到您自己的视图文件中,并将其直接传递给组件

<livewire:sales-orders-status-board 
    status-board-view="path/to/your/status-board-view"
    status-view="path/to/your/status-view"
    status-header-view="path/to/your/status-header-view"
    status-footer-view="path/to/your/status-footer-view"
    record-view="path/to/your/record-view"
    record-content-view="path/to/your/record-content-view"
/>

注意:使用此方法还可以让您向组件添加额外的行为,例如在标题、页脚上添加点击事件,例如过滤器或任何其他操作

添加额外视图

组件允许您在状态板渲染前后添加视图。这两个占位符可用于向组件添加额外功能,例如搜索输入或操作工具栏。要使用它们,只需在显示组件时传递 before-status-board-viewafter-status-board-view 属性中要使用的视图即可。

<livewire:sales-orders-status-board 
    before-status-board-view="path/to/your/before-status-board-view"
    after-status-board-view="path/to/your/after-status-board-view"  
/>

注意:这些视图是可选的。

在以下示例中,已指定 before-status-board-view 以添加一个搜索文本框和一个按钮

extra-views

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 变更日志

贡献

有关详细信息,请参阅 贡献指南

安全

如果您发现任何安全相关的问题,请通过电子邮件 santibanez.andres@gmail.com 而不是使用问题跟踪器

鸣谢

许可证

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