ziffmedia / nova-select-plus

适用于简单和复杂选择输入的 Nova 选择字段

v2.1.0-beta.1 2024-01-16 19:12 UTC

README

安装

composer require ziffmedia/nova-select-plus

版本与兼容性

  • 版本 ^1.0 支持 Nova 2-3
  • 版本 ^2.0 支持 Nova 4(包含 Vue 3、暗黑模式支持等)

描述与用例

alt text

此 Nova 组件是为了满足 Nova 内置 <select> 组件之外的使用场景而构建的。以下是一些你可能想要使用 SelectPlus(使用 vue-select)而不是简单 Select 的情况

表单屏幕上的 BelongsToMany 和 MorphsToMany 选择

默认的 Nova 体验是对于 BelongsToManyMorphsToMany,有一个独立的 UI 屏幕来通过 "Pivot" 模型来附加/分离和同步关系。对于简单的关系(没有额外的 pivot 值或 pivot 表中的唯一值仅用于排序的关系),将此选择移至表单工作流程而不是独立工作流程是有益的。

选项的 Ajax 加载

对于有几十到几百个选项的选择,仅在需要它的屏幕上加载完整的选项列表(即表单屏幕)会更高效。

对于 Ajax 选项有两种选择,默认是在表单加载时加载所有选项。第二种是允许进行完整的选项搜索(在这种情况下,你可以编写自己的 Ajax 搜索解析器)。

简单 Pivot/BelongsToMany 关系的重新排序

通过 ->reorderable(),你可以启用 SelectPlus 字段可重新排序。这允许在 BelongsToMany->sync() 时刻,填充一个有用的排序关系的 pivot 值。

用法

use ZiffMedia\NovaSelectPlus\SelectPlus;
    // setup model like normal:
    public function statesLivedIn()
    {
        return $this->belongsToMany(State::class, 'state_user_lived_in')->withTimestamps();
    }

    // add Nova Resource Field
    SelectPlus::make('States Lived In', 'statesLivedIn', State::class),

选项与示例

->label(string|closure $attribute) 选择不同的属性作为标签

默认:'name'

SelectPlus::make('States Lived In', 'statesLivedIn', State::class)
  ->label('code')

如果提供闭包,它将被调用,并可以使用值。此外,输出可能是 HTML,因为组件将在前端上 v-html 输出

// Using php 7.4 short functions:
SelectPlus::make('States Visited', 'statesVisited', State::class)
    ->label(fn ($state) => $state->name . " <span class=\"text-xs\">({$state->code})</span>")

->usingIndexLabel() & ->usingDetailLabel()

默认是生成索引和详细屏幕上项目的数量

alt text

如果提供 string 名称,则提取名称属性并以逗号连接

SelectPlus::make('States Lived In', 'statesLivedIn', State::class)
  ->usingIndexLabel('name'),

alt text

如果提供闭包,它将被调用,并将使用值。如果值是字符串,则将其放置

SelectPlus::make('States Lived In', 'statesLivedIn', State::class)
  ->usingIndexLabel(fn($models) => $models->first()->name ?? ''),

alt text

如果返回数组,则索引和详细屏幕将生成 <ol><ul> 列表

SelectPlus::make('States Lived In', 'statesLivedIn', State::class)
  ->usingIndexLabel(fn($models) => $models->pluck('name')),

alt text

->reorderable(string $pivotOrderAttribute) - 多个选择的可重新排序能力

    // assuming in the User model:
    public function statesVisited()
    {
        return $this->belongsToMany(State::class, 'state_user_visited')
            ->withPivot('order')
            ->orderBy('order')
            ->withTimestamps();
    }

    // inside the Nova resource:
    SelectPlus::make('States Lived In', 'statesLivedIn', State::class)
        ->reorderable('order'),

alt text

->optionsQuery(closure) - 应用更改到选项查询对象的能力

    // inside the Nova resource (exclude all states that start with C)
    SelectPlus::make('States Lived In', 'statesLivedIn', State::class)
        ->optionsQuery(function (Builder $query) {
            $query->where('name', 'NOT LIKE', 'C%');
        })
  • 注意:这将应用在所有 ajaxSearchable() 功能性之前,它不会替换它,但会与 ajaxSearchable() 一起应用,如果存在的话

->ajaxSearchable(string|closure|true) 值的 Ajax 搜索

给定一个字符串,模型将通过提供的属性进行资源搜索,使用 WHERE LIKE。给定回调,将返回一个 Collection 以填充下拉列表

    SelectPlus::make('States Visited', 'statesVisited', State::class)
        ->ajaxSearchable(function ($search) {
            return StateModel::where('name', 'LIKE', "%{$search}%")->limit(5);
        })

alt text