mttzzz / nova-detached-actions
一个 Laravel Nova 工具,允许将操作放置在 Nova 工具栏中,与复选框选择机制分离。
Requires
- php: >=7.1.0
- laravel/nova: ^4.0
This package is auto-updated.
Last update: 2024-09-30 01:43:36 UTC
README
一个 Laravel Nova 工具,允许将操作放置在 Nova 工具栏中,与复选框选择机制分离。
⚠️ 注意,由于操作与资源表中的行选择复选框分离,您将不会有模型集合进行迭代。分离操作旨在独立于表中的选择。⚠️ 此外,请注意,枢轴操作不受支持且未经测试。
安装
您可以通过 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 将将总记录数分块,并为每个块调用您的 DetachedAction 的 handle() 函数。这可能会对性能产生意外影响,因为系统将为每个记录块执行您的操作。这发生在 \Laravel\Nova\Actions\Action.php 的 handleRequest() 函数中。
为了防止这种情况,最简单的方法是在您的 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 Excel 的 DownloadExcel 动作集成。
/** * 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
动作按钮是按钮,因此为它们分配 btn 和 btn-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') ];
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。