Actions
Getting started
"Actions" are buttons that are displayed next to the page's heading, and allow the user to run a Livewire method on the page or visit a URL.
To define actions for a page, use the getActions()
method:
use Filament\Pages\Actions\Action;
protected function getActions(): array
{
return [
Action::make('settings')->action('openSettingsModal'),
];
}
public function openSettingsModal(): void
{
$this->dispatchBrowserEvent('open-settings-modal');
}
The button's label is generated based on it's name. To override it, you may use the label()
method:
use Filament\Pages\Actions\Action;
protected function getActions(): array
{
return [
Action::make('settings')
->label('Settings')
->action('openSettingsModal'),
];
}
You may also allow the button to open a URL, using the url()
method:
use Filament\Pages\Actions\Action;
protected function getActions(): array
{
return [
Action::make('settings')
->label('Settings')
->url(route('settings')),
];
}
Buttons may have a color()
. The default is primary
, but you may use secondary
, success
, warning
, or danger
:
use Filament\Pages\Actions\Action;
protected function getActions(): array
{
return [
Action::make('settings')->color('secondary'),
];
}
Buttons may have a size()
. The default is md
, but you may also use sm
or lg
:
use Filament\Pages\Actions\Action;
protected function getActions(): array
{
return [
Action::make('settings')->size('lg'),
];
}
Buttons may also have an icon()
, which is the name of any Blade component. By default, the Blade Heroicons v1 package is installed, so you may use the name of any Heroicons v1 out of the box. However, you may create your own custom icon components or install an alternative library if you wish.
use Filament\Pages\Actions\Action;
protected function getActions(): array
{
return [
Action::make('settings')->icon('heroicon-s-cog'),
];
}
Modals
Actions may require additional confirmation or form information before they run. You may open a modal before an action is executed to do this.
Confirmation modals
You may require confirmation before an action is run using the requiresConfirmation()
method. This is useful for particularly destructive actions, such as those that delete records.
use Filament\Pages\Actions\Action;
Action::make('delete')
->action(fn () => $this->record->delete())
->requiresConfirmation()
Note: The confirmation modal is not available when a
url()
is set instead of anaction()
. Instead, you should redirect to the URL within theaction()
callback.
Custom forms
You may also render a form in this modal to collect extra information from the user before the action runs.
You may use components from the Form Builder to create custom action modal forms. The data from the form is available in the $data
array of the action()
callback:
use App\Models\User;
use Filament\Forms;
use Filament\Pages\Actions\Action;
Action::make('updateAuthor')
->action(function (array $data): void {
$this->record->author()->associate($data['authorId']);
$this->record->save();
})
->form([
Forms\Components\Select::make('authorId')
->label('Author')
->options(User::query()->pluck('name', 'id'))
->required(),
])
Filling default data
You may fill the form with default data, using the mountUsing()
method:
use App\Models\User;
use Filament\Forms;
use Filament\Pages\Actions\Action;
Action::make('updateAuthor')
->mountUsing(fn (Forms\ComponentContainer $form) => $form->fill([
'authorId' => $this->record->author->id,
]))
->action(function (array $data): void {
$this->record->author()->associate($data['authorId']);
$this->record->save();
})
->form([
Forms\Components\Select::make('authorId')
->label('Author')
->options(User::query()->pluck('name', 'id'))
->required(),
])
Setting a modal heading, subheading, and button label
You may customize the heading, subheading and button label of the modal:
use Filament\Pages\Actions\Action;
Action::make('delete')
->action(fn () => $this->record->delete())
->requiresConfirmation()
->modalHeading('Delete posts')
->modalSubheading('Are you sure you\'d like to delete these posts? This cannot be undone.')
->modalButton('Yes, delete them')
Custom content
You may define custom content to be rendered inside your modal, which you can specify by passing a Blade view into the modalContent()
method:
use Filament\Pages\Actions\Action;
Action::make('advance')
->action(fn () => $this->record->advance())
->modalContent(view('filament.pages.actions.advance'))
By default, the custom content is displayed above the modal form if there is one, but you can add content below using modalFooter()
if you wish:
use Filament\Pages\Actions\Action;
Action::make('advance')
->action(fn () => $this->record->advance())
->modalFooter(view('filament.pages.actions.advance'))
Conditionally hiding the modal
You may have a need to conditionally show a modal for confirmation reasons while falling back to the default action. This can be achieved using modalHidden()
:
use Filament\Pages\Actions\Action;
Action::make('create')
->action('create')
->modalHidden(fn (): bool => $this->role !== 'admin')
->modalContent(view('filament.pages.actions.create'))
Grouping
You may use an ActionGroup
object to group multiple actions together in a dropdown:
use Filament\Pages\Actions;
protected function getActions(): array
{
return [
Actions\ActionGroup::make([
Actions\ViewAction::make(),
Actions\EditAction::make(),
Actions\DeleteAction::make(),
]),
];
}
Keybindings
You can attach keyboard shortcuts to actions. These use the same key codes as Mousetrap:
use Filament\Pages\Actions\Action;
Action::make('save')
->action(fn () => $this->save())
->keyBindings(['command+s', 'ctrl+s'])
Refreshing form data
If you're using actions on an Edit or View resource page, you can refresh data within the main form using the refreshFormData()
method:
use Filament\Pages\Actions\Action;
Action::make('approve')
->action(function () {
$this->record->approve();
$this->refreshFormData([
'status',
]);
})
This method accepts an array of model attributes that you wish to refresh in the form.