bytexr/filament-queueable-bulk-actions
Installation:
composer require bytexr/filament-queueable-bulk-actions
Choose the correct version (^5.0, ^4.0, or ^3.0) based on your Filament version.
Publish Assets: Run migrations and publish config/views:
php artisan vendor:publish --tag="queueable-bulk-actions-migrations"
php artisan vendor:publish --tag="queueable-bulk-actions-config"
php artisan vendor:publish --tag="queueable-bulk-actions-views" # Optional
php artisan migrate
Register Plugin:
Add to app/Providers/Filament/PluginServiceProvider.php:
public function register(): void
{
Filament::plugin(QueueableBulkActionsPlugin::make());
}
Define a Queueable Action in your Filament resource:
use Bytexr\FilamentQueueableBulkActions\Actions\QueueableAction;
public static function getBulkActions(): array
{
return [
QueueableAction::make('delete')
->action(function (Collection $records) {
foreach ($records as $record) {
$record->delete();
}
})
->queueable()
->successNotificationTitle('Records deleted')
->successNotificationDescription('{count} records were deleted successfully.')
];
}
Trigger the Action:
Define Queueable Actions:
Use QueueableAction for any bulk operation (e.g., updates, exports, API calls):
QueueableAction::make('export')
->action(function (Collection $records) {
Export::queue(new RecordsExport($records));
})
->queueable()
->queueableOptions(['chunks' => 50]) // Process in chunks
->successNotificationTitle('Export queued')
Real-Time Feedback: Leverage Livewire for progress updates:
QueueableAction::make('update-status')
->action(function (Collection $records) {
foreach ($records as $record) {
UpdateStatusJob::dispatch($record);
}
})
->queueable()
->livewire() // Enables Livewire progress tracking
Custom Job Handling:
Extend QueueableBulkAction for complex logic:
class CustomQueueableAction extends QueueableAction
{
protected static string $view = 'filament-queueable-bulk-actions::actions.custom';
public function mount(): void
{
$this->fillForm([
'custom_option' => 'default_value',
]);
}
}
Queue Configuration:
Configure config/queueable-bulk-actions.php to customize:
default).batch_size).notifications).Queue Monitoring: Use the built-in Queue Jobs widget or integrate with Laravel Horizon:
Filament::serving(function () {
Filament::registerWidget(
\Bytexr\FilamentQueueableBulkActions\Widgets\QueueJobsWidget::class
);
});
Custom Views: Override default views by publishing and modifying:
php artisan vendor:publish --tag="queueable-bulk-actions-views"
Queue Connection Mismatch:
queue:work) is running on the same connection specified in config/queueable-bulk-actions.php.php artisan queue:failed-table
php artisan queue:work --queue=your_queue_name
Livewire Conflicts:
->livewire() called.filament-queueable-bulk-actions.js).Batch Size Limits:
queueableOptions(['chunks' => N]) or use database transactions:
QueueableAction::make('process')
->action(function (Collection $records) {
DB::transaction(function () use ($records) {
foreach ($records->chunk(100) as $chunk) {
ProcessJob::dispatch($chunk);
}
});
})
Log Queueable Actions: Enable debug mode in config:
'debug' => env('QUEUEABLE_BULK_ACTIONS_DEBUG', false),
Check logs at storage/logs/laravel.log.
Failed Jobs: Retry failed jobs manually:
php artisan queue:retry all
Custom Job Classes:
Extend QueueableBulkActionJob for reusable logic:
class MyCustomJob extends QueueableBulkActionJob
{
public function handle()
{
// Custom logic here
$this->updateProgress(50);
}
}
Notification Overrides: Override default notifications by binding events:
event(new QueueableBulkActionCompleted($action, $records));
API Integration: Trigger queueable actions via API:
Route::post('/bulk-queue', function (Request $request) {
$action = app(YourResource::class)
->getBulkActions()['queueable-action-key'];
return $action->queue($request->selected_records);
});
Soft Deletes:
Combine with SoftDeletes for safer bulk operations:
QueueableAction::make('soft-delete')
->action(function (Collection $records) {
foreach ($records as $record) {
$record->delete(); // Uses softDelete if enabled
}
})
->queueable()
Rate Limiting:
Use Laravel’s throttle to prevent queue overload:
QueueableAction::make('rate-limited')
->action(function (Collection $records) {
foreach ($records as $record) {
RateLimitedJob::dispatch($record)->throttle(10);
}
})
How can I help you explore Laravel packages today?