mttzzz / nova-detached-actions

一个 Laravel Nova 工具,允许将操作放置在 Nova 工具栏中,与复选框选择机制分离。

安装: 25

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 50

语言:Vue

2.0.1 2022-11-29 10:13 UTC

README

一个 Laravel Nova 工具,允许将操作放置在 Nova 工具栏中,与复选框选择机制分离。

⚠️ 注意,由于操作与资源表中的行选择复选框分离,您将不会有模型集合进行迭代。分离操作旨在独立于表中的选择。⚠️ 此外,请注意,枢轴操作不受支持且未经测试。

screenshot

安装

您可以通过 composer 将此包安装到使用 Nova 的 Laravel 应用中

composer require gobrightspot/nova-detached-actions

该工具将通过 ToolServiceProvider 自动注册

使用方法

创建自定义 Nova 操作文件

php artisan nova:action ExportUsers

不要使用 Laravel\Nova\Actions\Action 类扩展 ExportUsers 类,而是用 Brightspot\Nova\Tools\DetachedActions\DetachedAction 类替换它。

由于我们不会收到 $models 的集合,您可以从 handle 方法中删除变量,以便签名是 public function handle(ActionFields $fields)

您还可以通过覆盖 label() 方法来自定义按钮标签。如果您不覆盖标签,它将 'humanize' 类名,例如 ExportUsers 将变为 Export Users

默认情况下,分离操作仅在索引工具栏上显示。

如果您还想在资源索引视图中显示操作(当用户通过复选框选择行时),设置 $public $showOnIndex = true; 如果您还想在资源详细信息视图中显示操作(当用户从下拉菜单中选择操作时),设置 $public $showOnDetail = true;

这里有一个完整的示例

<?php

namespace App\Nova\Actions;

use Brightspot\Nova\Tools\DetachedActions\DetachedAction;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Laravel\Nova\Fields\ActionFields;

class ExportUsers extends DetachedAction
{
    use InteractsWithQueue, Queueable, SerializesModels;
    
    /**
     * Get the displayable label of the button.
     *
     * @return string
     */
    public function label()
    {
        return __('Export Users');
    }

    /**
     * Perform the action.
     *
     * @param  ActionFields  $fields
     *
     * @return mixed
     */
    public function handle(ActionFields $fields)
    {
        // Do work to export records

        return DetachedAction::message('It worked!');
    }

    /**
     * Get the fields available on the action.
     *
     * @return array
     */
    public function fields()
    {
        return [];
    }
}

在您的资源上注册操作

/**
 * Get the actions available for the resource.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function actions(Request $request)
{
    return [
        new App\Nova\Actions\ExportUsers
    ];
}

Chunking 和重复调用 handle()

如果您在后台初始化操作,Nova 将将总记录数分块,并为每个块调用您的 DetachedActionhandle() 函数。这可能会对性能产生意外影响,因为系统将为每个记录块执行您的操作。这发生在 \Laravel\Nova\Actions\Action.phphandleRequest() 函数中。

为了防止这种情况,最简单的方法是在您的 DetachedAction 中覆盖此函数。这是一个仅调度作业的示例,没有任何检查或其他逻辑

/** @return array<int,string> */
public function handleRequest(ActionRequest $request): array
{
    dispatch(new GenerateTicketReport($request->resolveFields()));
    return DetachedAction::message('Nice job!');
}

在不同的屏幕上显示

showOnIndexToolbar()

在索引页面工具栏上显示分离操作按钮(即默认位置)。在索引网格操作下拉菜单中不显示。

onlyOnIndexToolbar()

仅在索引工具栏上显示分离操作按钮。在其他任何地方都不显示。

exceptOnIndexToolbar

除了索引工具栏外,在所有地方显示分离操作按钮。

onlyOnIndex

仅在索引视图中显示分离操作按钮。允许它们在 standalone 下拉菜单或网格操作下拉菜单中显示。

showOnDetailToolbar()

在详细信息页面工具栏上显示分离操作按钮(即默认位置)。

onlyOnDetailToolbar()

仅在索引工具栏上显示分离操作按钮。在其他任何地方都不显示。

exceptOnDetailToolbar

除了详细信息工具栏外,在所有地方显示分离操作按钮。

onlyOnDetail

仅在详细信息视图中显示分离操作按钮。允许它们在 standalone 下拉菜单或操作下拉菜单中显示。

与 Laravel Nova Excel DownloadExcel 操作一起使用

您可以通过使用 withMeta() 简单地传递一些额外的数据来轻松地将 DetachedAction 工具与 Laravel Nova ExcelDownloadExcel 动作集成。

/**
  * Get the actions available for the resource.
  *
  * @param  \Illuminate\Http\Request  $request
  * @return array
  */
 public function actions(Request $request)
 {
     return [
         (new DownloadExcel)->withHeadings()->askForWriterType()->withMeta([
             'detachedAction' => true,
             'label' => 'Export',
             'name' => 'Export',
             'showOnIndexToolbar' => true
         ])->confirmButtonText('Export'),
     ];
 }

自定义按钮

可见与不可见按钮

默认情况下,组件将显示前三个按钮,其余的放入下拉菜单中。如果您想更改每个资源可见按钮的数量,可以使用 additionalInformation 方法,如下所示

public static function additionalInformation(Request $request)
{
    return [
        'visibleActionsLimit' => 4
    ];
}

您还可以更改图标类型以及是否显示不可见动作菜单的向下箭头

public static function additionalInformation(Request $request)
{
    return [
        'visibleActionsLimit' => 2,
        'showInvisibleActionsArrow' => true,
        'invisibleActionsIcon' => 'menu'
    ];
}

自定义按钮样式

此包提供了一些常见的默认 HTML 类,这些类应用于动作按钮。在组件中,我们自动分配以下类

btn btn-default ml-3 detached-action-button flex justify-center items-center

动作按钮是按钮,因此为它们分配 btnbtn-default 类是有意义的。我们还想在按钮之间保持一致的间距,因此应用 ml-3,并使用 flex justify-center items-center 来对齐按钮内部的图标和文本。此外,为了允许主题开发者设置特定的类名来挂钩,我们在索引和详细视图上都应用了 detached-action-button

在这些类的基础上,DetachedAction 类提供了默认的 btn-primary,这将给按钮赋予默认按钮颜色,即在默认 Nova 主题中为蓝色。

开发者可以使用 extraClassesWithDefault()extraClasses() 方法在 DetachedAction 类上动态添加类。

extraClassesWithDefault() 方法

如果您想保留默认类但添加额外的类,那么您可能想使用此方法。您可以传递一个包含单个类名或多个由空格分隔的类名的数组。

return [
    (new ImportUsers)->extraClassesWithDefault('bg-info')
];

extraClasses() 方法

您可以使用任何 tailwind/nova 类。

return [
   (new ImportUsers)->extraClasses('bg-logo text-white hover:black')
];

添加图标

您可以通过指定小写的图标名称来使用任何 104 个 Heroicon 图标。

return [
   (new ImportUsers)->icon('add')
];

您还可以使用 iconClasses 来自定义该图标的显示。

return [
   (new ImportUsers)->icon('upload')->iconClasses('mr-3 -ml-2')
];

screenshot

许可证

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