columns([ Tables\Columns\TextColumn::make('uuid')->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('payload')->formatStateUsing(function ($state) { $state = json_decode($state); // List displayName return $state->displayName; }), Tables\Columns\TextColumn::make('exception')->formatStateUsing(function ($state) { return explode("\n", $state)[0]; })->wrap()->tooltip(function ($state) { return $state; })->limit(200), Tables\Columns\TextColumn::make('failed_at'), ]) ->poll() ->actions([ Tables\Actions\Action::make('retry') ->label('Retry') ->requiresConfirmation() ->action(function (FailedJob $record): void { Artisan::call("queue:retry {$record->uuid}"); Notification::make() ->title("The job with uuid '{$record->uuid}' has been pushed back onto the queue.") ->success() ->send(); }), Tables\Actions\Action::make('delete') ->label('Mark as Resolved') ->requiresConfirmation() ->color('danger') ->action(function (FailedJob $failedJob) { $failedJob->delete(); }), ]) ->bulkActions([ BulkAction::make('retry') ->label('Retry') ->requiresConfirmation() ->action(function (Collection $records): void { foreach ($records as $record) { try { Artisan::call("queue:retry {$record->uuid}"); } catch (\Exception $e) { Notification::make() ->title($e->getMessage()) ->warning() ->send(); } } Notification::make() ->title("{$records->count()} jobs have been pushed back onto the queue.") ->success() ->send(); }), BulkAction::make('mark_resolved') ->label('Mark as Resolved') ->requiresConfirmation() ->color('danger') ->icon('heroicon-o-check-circle') ->deselectRecordsAfterCompletion() ->action(function (Collection $records): void { $count = $records->count(); foreach ($records as $record) { $record->delete(); } Notification::make() ->title("{$count} failed jobs have been marked as resolved.") ->success() ->send(); }), ]) ->defaultSort('failed_at', 'desc') ->filters([ ]); } public static function canCreate(): bool { return false; } public static function getPages(): array { return [ 'index' => Pages\ListFailedJobs::route('/'), ]; } }