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)。有关更多信息,请参阅 许可证文件。