marshmallow/nova-multiselect-field

Laravel Nova的多选字段。

资助包维护!
outl1ne

安装次数: 5,647

依赖项: 3

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 120

语言:Vue

v5.0.2 2022-06-23 10:12 UTC

README

Latest Version on Packagist Total Downloads

Laravel Nova包为Nova的字段库添加了多选功能。

要求

  • php: >=8.1
  • laravel/nova: ^4.1

功能

  • 带有搜索的多选和单选
  • 异步搜索
  • 拖放排序功能
  • 依赖其他多选实例
  • 多个多选之间的唯一值
  • 完全兼容浅色和深色模式

屏幕截图

Detail View

Form View

Index View

Reorder GIF

安装

使用Composer在Laravel Nova项目中安装此包

composer require marshmallow/nova-multiselect-field

用法

该字段与Nova的原生选择字段用法类似。数据库中的字段类型应该是基于文本的(即 stringtextvarchar),选定的值存储为字符串化的JSON数组。

use Outl1ne\MultiselectField\Multiselect;

public function fields(Request $request)
{
    return [
      Multiselect::make('Football teams')
        ->options([
          'liverpool' => 'Liverpool FC',
          'tottenham' => 'Tottenham Hotspur',
        ])

        // Optional:
        ->placeholder('Choose football teams') // Placeholder text
        ->max(4) // Maximum number of items the user can choose
        ->saveAsJSON() // Saves value as JSON if the database column is of JSON type
        ->optionsLimit(5) // How many items to display at once
        ->reorderable() // Allows reordering functionality
        ->singleSelect() // If you want a searchable single select field
        ->distinct('football') // Disables values used by other multiselects in same distinct group
        ->taggable() // Possible to add values ("tags") on the fly

        // Async model querying
        Multiselect::make('Artists')
          ->asyncResource(Artist::class),

          // If you want a custom search, create your own endpoint:
          ->api('/api/multiselect/artists?something=false', Artist::class),
    ];
}

选项组

支持选项组。它们的语法与Laravel的选项组语法相同。

在此示例中(来自Nova文档),所有值都按group键分组

->options([
    'MS' => ['label' => 'Small', 'group' => 'Men Sizes'],
    'MM' => ['label' => 'Medium', 'group' => 'Men Sizes'],
    'WS' => ['label' => 'Small', 'group' => 'Women Sizes'],
    'WM' => ['label' => 'Medium', 'group' => 'Women Sizes'],
])

依赖关系

您可以使用dependsOn使多选依赖于另一个。这也需要指定->dependsOnOptions()。从dependsOn多选获取的值必须是选项的键,而值必须是通常的键值字典选项。

用法

Multiselect::make('Country', 'country')
    ->options([
        'IT' => 'Italy',
        'SG' => 'Singapore',
    ]),

Multiselect::make('Language', 'language')
    ->dependsOn('country')
    ->dependsOnOptions([
        'IT' => [
            'it' => 'Italian',
        ],
        'SG' => [
            'en' => 'English',
            'ms' => 'Malay',
            'zh' => 'Chinese',
        ]
    ]),

    // Optionally define max number of values
    ->dependsOnMax([
        'IT' => 1,
        'SG' => 3,
    ])

多对多

您可以使用此字段进行BelongsToMany关系选择。

// Add your BelongsToMany relationship to your model:
public function categories()
{
    return $this->belongsToMany(\App\Models\Category::class);
}

// Add the field to your Resource for asynchronous option querying:
Multiselect::make('Categories', 'categories')
  ->belongsToMany(\App\Nova\Resources\Category::class),

// Alternatively, you can set the second argument to 'false' to
// query the options on page load and prevent the user from having
// to first type in order to view the available options. Note: Not
// recommended for unbounded relationship row counts.
Multiselect::make('Categories', 'categories')
  ->belongsToMany(\App\Nova\Resources\Category::class, false),

选项

您可以通过使用选项名称作为函数将可能的选项传递给字段,例如 ->placeholder('选择花生')

本地化

可以使用以下发布命令发布翻译文件

php artisan vendor:publish --provider="Outl1ne\MultiselectField\FieldServiceProvider" --tag="translations"

然后您可以根据需要编辑字符串。

覆盖详情字段

您可以覆盖详情视图值组件以按需自定义它。

NovaMultiselectDetailFieldValue创建一个新的组件并将其注册到您的app.js中。该组件接收两个属性:fieldvaluesvalues属性是一个所选标签的数组。

// in NovaMultiselectDetailFieldValue.vue

<template>
  <div class="relative rounded-lg bg-white shadow border border-60" v-if="values">
    <div class="overflow-hidden rounded-b-lg rounded-t-lg">
      <div class="border-b border-50 cursor-text font-mono text-sm py-2 px-4" v-for="(value, i) of values" :key="i">
        {{ value }}
      </div>
    </div>
  </div>

  <div v-else></div>
</template>

<script>
export default {
  props: ['field', 'values'],
};
</script>
// in app.js

import NovaMultiselectDetailFieldValue from './NovaMultiselectDetailFieldValue';

Nova.booting((Vue, router, store) => {
  Vue.component('nova-multiselect-detail-field-value', NovaMultiselectDetailFieldValue);
});

致谢

许可

此项目是开源软件,许可协议为MIT许可