codicastudio/multi-select

1.0.0 2020-09-23 07:00 UTC

This package is auto-updated.

Last update: 2024-09-27 13:34:55 UTC


README

Laravel Nova 扩展包向 Nova 字段库中添加了多选功能。

要求

  • Laravel Nova ^2.0.11

对于小于 2.0.11 版本的 Nova,请使用 nova-multiselect-field 版本 1.1.6 或更早版本。

此限制是由于在 2.0.11 版本中添加了 Nova::translatable() 方法,这使得本包可以进行本地化。

功能

  • 具有搜索功能的下拉多选
  • 具有搜索功能的单选
  • 拖放重新排序功能
  • 依赖其他多选实例

截图

Detail View

Form View

Index View

Reorder GIF

安装

通过 Composer 在 Laravel Nova 项目中安装此包

composer require optimistdigital/nova-multiselect-field

使用方法

该字段的使用方式类似于 Nova 的原生选择字段。数据库中的字段类型应为基于文本的(例如 stringtextvarchar),选择值以字符串化的 JSON 数组的形式存储。

use OptimistDigital\MultiselectField\Multiselect;

public function fields(Request $request)
{
    return [
      Multiselect
        ::make('Favourite football teams', 'football_teams')
        ->options([
          'liverpool' => 'Liverpool FC',
          'tottenham' => 'Tottenham Hotspur',
          'bvb' => 'Borussia Dortmund',
          'bayern' => 'FC Bayern Munich',
          'barcelona' => 'FC Barcelona',
          'juventus' => 'Juventus FC',
          'psg' => 'Paris Saint-Germain FC',
        ])

        // 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
    ];
}

选项组

支持选项组。它们的语法与 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,
    ])

选项

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

本地化

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

php artisan vendor:publish --provider="OptimistDigital\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 许可协议 授权。