Дія (action) у Filament - це кнопка разом із логікою: що станеться після натискання, чи відкриється модальне вікно, хто її бачить. Усі дії в Filament 5 живуть у просторі імен Filament\Actions - і в таблицях, і на сторінках, і у формах.
Готові дії для типових операцій з Eloquent:
CreateAction,EditAction,ViewAction,DeleteAction;ReplicateAction- копія запису (excludeAttributes(['slug'])- не копіювати унікальні поля);ForceDeleteAction,RestoreAction- для моделей зSoftDeletes;ImportAction,ExportAction- CSV/XLSX через черги;- масові варіанти:
DeleteBulkAction,ForceDeleteBulkAction,RestoreBulkAction.
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ReplicateAction;
->recordActions([
EditAction::make(),
ReplicateAction::make()->excludeAttributes(['slug']),
DeleteAction::make(),
])
Готові дії вже вміють модальне вікно, сповіщення про успіх і перевірку політики моделі в ресурсі.
Власна дія з підтвердженням:
use Filament\Actions\Action;
use Filament\Support\Icons\Heroicon;
Action::make('cancel')
->label('Скасувати замовлення')
->icon(Heroicon::OutlinedXCircle)
->color('danger')
->requiresConfirmation()
->modalHeading('Скасувати замовлення?')
->modalDescription('Клієнт отримає лист, а оплату буде повернено.')
->modalSubmitActionLabel('Так, скасувати')
->action(fn (Order $record) => $record->cancel())
->successNotificationTitle('Замовлення скасовано');
requiresConfirmation() відкриває стандартне вікно підтвердження, і код в action() виконається лише після згоди.
Пастки:
url()і підтвердження несумісні: якщо дія лише відкриває посилання (->url(...)), вікно підтвердження не з'явиться. Для підтвердження перед переходом потрібенaction()з редиректом усередині;- кілька дій з однаковою назвою в одному місці конфліктують - ім'я в
make()має бути унікальним; - підтвердження - не авторизація. Хто може натиснути кнопку, вирішують
visible()/authorize(), а не модальне вікно.