
Summary
Two-panel multi-select listbox with search, transfer buttons, drag reorder, and double-click to move items.| Class | Bjanczak\FilamentFlexFields\Filament\Forms\Components\DualListboxField |
| State type | list<string> — ordered selected option keys |
| Model cast | 'permissions' => 'array' or 'json' |
| FieldType | dual_listbox |
['read', 'write', 'delete'].
Basic usage
Validation
| Rule / method | Description |
|---|---|
array | Built-in — state must be an array |
| Option keys | Unknown keys fail with dual_listbox.invalid_option |
minItems(n) | Minimum selected items |
maxItems(n) | Maximum selected items |
exactItems(n) | Exactly n items (sets both min and max) |
filament-flex-fields::default.validation.dual_listbox.*
Configuration API
icons(array|Closure $icons)
Overrides the default icons for all action buttons. Expects an associative array matching action keys to icon strings.
Custom action icon overrides
Configure specific action icons individually using fluent methods:FlexField schema config
| Config key | Maps to |
|---|---|
options | options() |
size | size() |
variant | variant() |
list_height | listHeight() |
searchable | searchable() |
reorderable | reorderable() |
move_on_double_click | moveOnDoubleClick() |
show_transfer_buttons | showTransferButtons() |
available_label | availableLabel() |
selected_label | selectedLabel() |
disabled_options | disabledOptions() |
min_items | minItems() |
max_items | maxItems() |
exact_items | exactItems() |
Public helper methods
| Method | Returns | Description |
|---|---|---|
normalizeState(array $state) | list<string> | Filters state to allowed, non-disabled option keys; preserves order and deduplicates. |
getNormalizedOptions() | array<string, array<label, description, disabled>> | Flattened option map from simple strings or rich arrays plus disabledOptions(). |
getOptionsForJs() | list<array<value, label, description, disabled>> | Option list shape passed to the Alpine/JS layer. |