--- title: Checkbox list --- import Aside from "@components/Aside.astro" import AutoScreenshot from "@components/AutoScreenshot.astro" import UtilityInjection from "@components/UtilityInjection.astro" ## Introduction The checkbox list component allows you to select multiple values from a list of predefined options: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ 'tailwind' => 'Tailwind CSS', 'alpine' => 'Alpine.js', 'laravel' => 'Laravel', 'livewire' => 'Laravel Livewire', ]) ``` As well as allowing a static array, the `options()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. These options are returned in JSON format. If you're saving them using Eloquent, you should be sure to add an `array` [cast](https://laravel.com/docs/eloquent-mutators#array-and-json-casting) to the model property: ```php use Illuminate\Database\Eloquent\Model; class App extends Model { /** * @return array */ protected function casts(): array { return [ 'technologies' => 'array', ]; } // ... } ``` ## Setting option descriptions You can optionally provide descriptions to each option using the `descriptions()` method. This method accepts an array of plain text strings, or instances of `Illuminate\Support\HtmlString` or `Illuminate\Contracts\Support\Htmlable`. This allows you to render HTML, or even markdown, in the descriptions: ```php use Filament\Forms\Components\CheckboxList; use Illuminate\Support\HtmlString; CheckboxList::make('technologies') ->options([ 'tailwind' => 'Tailwind CSS', 'alpine' => 'Alpine.js', 'laravel' => 'Laravel', 'livewire' => 'Laravel Livewire', ]) ->descriptions([ 'tailwind' => 'A utility-first CSS framework for rapidly building modern websites without ever leaving your HTML.', 'alpine' => new HtmlString('A rugged, minimal tool for composing behavior directly in your markup.'), 'laravel' => str('A **web application** framework with expressive, elegant syntax.')->inlineMarkdown()->toHtmlString(), 'livewire' => 'A full-stack framework for Laravel building dynamic interfaces simple, without leaving the comfort of Laravel.', ]) ``` As well as allowing a static array, the `descriptions()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Splitting options into columns You may split options into columns by using the `columns()` method: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->columns(2) ``` As well as allowing a static value, the `columns()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. This method accepts the same options as the `columns()` method of the [grid](../schemas/layouts#grid-system). This allows you to responsively customize the number of columns at various breakpoints. ### Setting the grid direction By default, when you arrange checkboxes into columns, they will be listed in order vertically. If you'd like to list them horizontally, you may use the `gridDirection(GridDirection::Row)` method: ```php use Filament\Forms\Components\CheckboxList; use Filament\Support\Enums\GridDirection; CheckboxList::make('technologies') ->options([ // ... ]) ->columns(2) ->gridDirection(GridDirection::Row) ``` As well as allowing a static value, the `gridDirection()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Searching options You may enable a search input to allow easier access to many options, using the `searchable()` method: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->searchable() ``` Optionally, you may pass a boolean value to control if the options should be searchable or not: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->searchable(FeatureFlag::active()) ``` As well as allowing a static value, the `searchable()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Bulk toggling checkboxes You may allow users to toggle all checkboxes at once using the `bulkToggleable()` method: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->bulkToggleable() ``` Optionally, you may pass a boolean value to control if the checkboxes should be bulk toggleable or not: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->bulkToggleable(FeatureFlag::active()) ``` As well as allowing a static value, the `bulkToggleable()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Disabling specific options You can disable specific options using the `disableOptionWhen()` method. It accepts a closure, in which you can check if the option with a specific `$value` should be disabled: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ 'tailwind' => 'Tailwind CSS', 'alpine' => 'Alpine.js', 'laravel' => 'Laravel', 'livewire' => 'Laravel Livewire', ]) ->disableOptionWhen(fn (string $value): bool => $value === 'livewire') ``` You can inject various utilities into the function as parameters. If you want to retrieve the options that have not been disabled, e.g. for validation purposes, you can do so using `getEnabledOptions()`: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ 'tailwind' => 'Tailwind CSS', 'alpine' => 'Alpine.js', 'laravel' => 'Laravel', 'livewire' => 'Laravel Livewire', 'heroicons' => 'SVG icons', ]) ->disableOptionWhen(fn (string $value): bool => $value === 'heroicons') ->in(fn (CheckboxList $component): array => array_keys($component->getEnabledOptions())) ``` For more information about the `in()` function, please see the [Validation documentation](validation#in). ## Allowing HTML in the option labels By default, Filament will escape any HTML in the option labels. If you'd like to allow HTML, you can use the `allowHtml()` method: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technology') ->options([ 'tailwind' => 'Tailwind', 'alpine' => 'Alpine', 'laravel' => 'Laravel', 'livewire' => 'Livewire', ]) ->searchable() ->allowHtml() ``` Optionally, you may pass a boolean value to control if the options should allow HTML or not: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technology') ->options([ 'tailwind' => 'Tailwind', 'alpine' => 'Alpine', 'laravel' => 'Laravel', 'livewire' => 'Livewire', ]) ->searchable() ->allowHtml(FeatureFlag::active()) ``` As well as allowing a static value, the `allowHtml()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Integrating with an Eloquent relationship > If you're building a form inside your Livewire component, make sure you have set up the [form's model](../components/form#setting-a-form-model). Otherwise, Filament doesn't know which model to use to retrieve the relationship from. You may employ the `relationship()` method of the `CheckboxList` to point to a `BelongsToMany` relationship. Filament will load the options from the relationship, and save them back to the relationship's pivot table when the form is submitted. The `titleAttribute` is the name of a column that will be used to generate a label for each option: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->relationship(titleAttribute: 'name') ``` ### Customizing the relationship query You may customize the database query that retrieves options using the `modifyOptionsQueryUsing` parameter of the `relationship()` method: ```php use Filament\Forms\Components\CheckboxList; use Illuminate\Database\Eloquent\Builder; CheckboxList::make('technologies') ->relationship( titleAttribute: 'name', modifyQueryUsing: fn (Builder $query) => $query->withTrashed(), ) ``` The `modifyQueryUsing` argument can inject various utilities into the function as parameters. ### Customizing the relationship option labels If you'd like to customize the label of each option, maybe to be more descriptive, or to concatenate a first and last name, you could use a virtual column in your database migration: ```php $table->string('full_name')->virtualAs('concat(first_name, \' \', last_name)'); ``` ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('authors') ->relationship(titleAttribute: 'full_name') ``` Alternatively, you can use the `getOptionLabelFromRecordUsing()` method to transform an option's Eloquent model into a label: ```php use Filament\Forms\Components\CheckboxList; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; CheckboxList::make('authors') ->relationship( modifyQueryUsing: fn (Builder $query) => $query->orderBy('first_name')->orderBy('last_name'), ) ->getOptionLabelFromRecordUsing(fn (Model $record) => "{$record->first_name} {$record->last_name}") ``` The `getOptionLabelFromRecordUsing()` method can inject various utilities into the function as parameters. ### Saving pivot data to the relationship If your pivot table has additional columns, you can use the `pivotData()` method to specify the data that should be saved in them: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('primaryTechnologies') ->relationship(name: 'technologies', titleAttribute: 'name') ->pivotData([ 'is_primary' => true, ]) ``` As well as allowing a static value, the `pivotData()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Setting a custom no search results message When you're using a searchable checkbox list, you may want to display a custom message when no search results are found. You can do this using the `noSearchResultsMessage()` method: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->searchable() ->noSearchResultsMessage('No technologies found.') ``` As well as allowing a static value, the `noSearchResultsMessage()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Setting a custom search prompt When you're using a searchable checkbox list, you may want to tweak the search input's placeholder when the user has not yet entered a search term. You can do this using the `searchPrompt()` method: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->searchable() ->searchPrompt('Search for a technology') ``` As well as allowing a static value, the `searchPrompt()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Tweaking the search debounce By default, Filament will wait 1000 milliseconds (1 second) before searching for options when the user types in a searchable checkbox list. It will also wait 1000 milliseconds between searches if the user is continuously typing into the search input. You can change this using the `searchDebounce()` method: ```php use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->searchable() ->searchDebounce(500) ``` As well as allowing a static value, the `searchDebounce()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters. ## Customizing the checkbox list action objects This field uses action objects for easy customization of buttons within it. You can customize these buttons by passing a function to an action registration method. The function has access to the `$action` object, which you can use to [customize it](../actions/overview). The following methods are available to customize the actions: - `selectAllAction()` - `deselectAllAction()` Here is an example of how you might customize an action: ```php use Filament\Actions\Action; use Filament\Forms\Components\CheckboxList; CheckboxList::make('technologies') ->options([ // ... ]) ->selectAllAction( fn (Action $action) => $action->label('Select all technologies'), ) ``` The action registration methods can inject various utilities into the function as parameters.