codicastudio / multi-select
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Language:Vue
Requires
- php: ^7.4 || ^8.0
- laravel/nova: ^3.0
This package is auto-updated.
Last update: 2024-10-27 13:39:05 UTC
README
This Laravel Nova package adds a multiselect to Nova's arsenal of fields.'
Requirements
- Laravel Nova ^2.0.11
For Nova version earlier than 2.0.11 please use nova-multiselect-field
version 1.1.6
or earlier.
This restriction is due to Nova::translatable()
method being added in 2.0.11, which allows this package to be localized.
Features
- Multiselect with search
- Single select with search
- Reordering functionality with drag & drop
- Dependency on other Multiselect instances
Screenshots
Installation
Install the package in a Laravel Nova project via Composer:
composer require optimistdigital/nova-multiselect-field
Usage
The field is used similarly to Nova's native Select field. The field type in the database should be text-based (ie string
, text
or varchar
), selected values are stored as a stringified JSON array.
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 ]; }
Option groups
Option groups are supported. Their syntax is the same as Laravel's option group syntax.
In this example (from Nova docs), all values are grouped by the group
key:
->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'], ])
Dependencies
You can make a Multiselect depend on another by using dependsOn
. This also requires specifying ->dependsOnOptions()
. The value from the dependsOn
Multiselect has to be the key to the options and the value must be a key-value dictionary of options as usual.
Usage:
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,
])
Options
Possible options you can pass to the field using the option name as a function, ie ->placeholder('Choose peanuts')
.
Localization
The translations file can be published by using the following publish command:
php artisan vendor:publish --provider="OptimistDigital\MultiselectField\FieldServiceProvider" --tag="translations"
You can then edit the strings to your liking.
Overwriting the detail field
You can overwrite the detail view value component to customize it as you see fit.
Create a new component for NovaMultiselectDetailFieldValue
and register it in your app.js
. The component receives two props: field
and values
. The values
prop is an array of selected labels.
// 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); });
Credits
License
This project is open-sourced software licensed under the MIT license.