X-Splade-Select Component
The Select Component can render the options based on a key-value array or Collection
, with support for groups.
$countries = [ 'be' => 'Belgium', 'nl' => 'The Netherlands',];
<x-splade-select name="country_code" :options="$countries" />
You may also pass a set of objects, like an Eloquent Collection, and specify the value and label keys for the option elements:
<x-splade-select name="company" :options="$companies" option-label="name" option-value="id" />
You can provide a slot to the select element as well:
<x-splade-select name="country_code"> <option value="be">Belgium</option> <option value="nl">The Netherlands</option></x-splade-select>
If you want a select element where multiple options can be selected, add the multiple
attribute to the element.
<x-splade-select name="countries[]" :options="$countries" multiple />
Placeholder
You may add a placeholder
attribute to the select element. This will prepend a disabled option.
<x-splade-select name="country_code" placeholder="Select your country..." />
Rendered HTML:
<select> <option value="" disabled>Select your country...</option> <!-- other options... --></select>
Eloquent Relationships
The component has built-in support for BelongsToMany
and MorphToMany
relationships. To utilize this feature, you must add both the multiple
and relation
attributes to the select element.
In the example below, you can attach one or more tags to the video. Using the relation
attribute will correctly retrieve the selected options (attached tags) from the database.
<x-splade-form :default="$video"> <x-splade-select name="tags[]" :options="$tags" multiple relation /></x-splade-form>
Choices.js
The Choices.js integration comes with a default stylesheet which you should import into the main JavaScript file. If you've used the automatic installer, it has already done this for you.
import "@protonemedia/laravel-splade/dist/style.css";import { renderSpladeApp, SpladePlugin } from "@protonemedia/laravel-splade";
Now you may add the choices
attribute to the component:
<x-splade-select name="framework" :options="$frameworks" choices />
It works for selecting multiple values as well:
<x-splade-select name="frameworks[]" :options="$frameworks" multiple choices />
You can instantiate Choices.js with a custom set of options by passing a JavaScript object to the choices
attribute. To pass a PHP array, you may use the :choices
attribute (note the colon).
<x-splade-select name="framework" :options="$frameworks" choices="{ searchEnabled: false }" /> <x-splade-select name="framework" :options="$frameworks" :choices="['searchEnabled' => false ]" />
Default settings
If you want to use Choices.js for every select element by default, you may use the static defaultChoices
method on the Select
class, for example, in the AppServiceProvider
class:
use ProtoneMedia\Splade\Components\Form\Select; Select::defaultChoices();
You may even pass an array with default options to the method:
Select::defaultChoices([ 'searchEnabled' => false]);
Remote Options
The component has support for loading the options using an asynchronous ajax request. For this, you may use the remote-url
attribute:
<x-splade-select remote-url="/api/locations" />
Just like the regular pre-defined options, it supports objects as well:
<x-splade-select remote-url="/api/servers" option-label="ip" option-value="uuid" />
You might want to load the remote options from a nested dataset. In the example below, you want to extract the options from the data.users
path.
{ "data": { "users": [ { "id": 1, "name": "John" }, { "id": 2, "name": "Jane" } ] }}
You may use the remote-root
attribute to set a base path for the options:
<x-splade-select remote-url="/api/users" remote-root="data.users" option-label="name" option-value="id" />
Dynamic Remote URL
The remote-url
attribute supports Template literals, making it perfect for building dependent selects:
<x-splade-select name="country" :options="$countries" /><x-splade-select name="region" remote-url="`/api/regions/${form.country}`" />
When the user selects a country, it will reload the regions based on the chosen country.
When you're dealing with dynamic options, you probably don't know the option values beforehand. Therefore, you may instruct the component to automatically choose the first option of the freshly loaded options using the select-first-remote-option
attribute:
<x-splade-select name="region" remote-url="`/api/regions/${form.country}`" select-first-remote-option />
Additionally, you may clear the selected option whenever the Remote URL changes using the reset-on-new-remote-url
attribute:
<x-splade-select name="region" remote-url="`/api/regions/${form.country}`" reset-on-new-remote-url />
Both options can be configured to be applied by default. You may use the static methods on the Select
class, for example, in the AppServiceProvider
class:
Select::defaultResetOnNewRemoteUrl();Select::defaultSelectFirstRemoteOption();
All remote options features work with the Choices.js integration as well. It doesn't support groups yet, but that's coming in a future version of Splade.
Customize Choices.js styling
Choices.js uses an SCSS stylesheet to style the library. Our stylesheet extends the vendor stylesheet (of Choices.js) and adds some Tailwind-specific tweaks. Make sure your bundler handles SCSS stylesheets correctly, for example, by installing sass
. The splade:publish-form-stylesheets
Artisan command copies the stylesheet to the resources
directory of your app.
npm install sass -D php artisan splade:publish-form-stylesheets
Then import the stylesheet in your main JavaScript file (instead of the default @protonemedia/laravel-splade/dist/style.css
stylesheet):
import "../css/choices.scss"
Laravel Dusk macro
Splade has two macros that help you test Choices.js instances with Laravel Dusk. Instead of calling select
with the field and value arguments, you may use the choicesSelect
method:
$browser->select('size', 'Large'); $browser->choicesSelect('size', 'Large');
If you want to remove an item from a Choices.js instance with multiple options, you may use the choicesRemoveItem
method:
$browser->choicesRemoveItem('countries[]', 'NL');
You may change the name of the macros with the dusk.choices_select_macro
and dusk.choices_remove_item_macro
keys in the splade.php
configuration file.