To install through composer, run the following command from terminal:
composer require "nova-kit/nova-queued-export-as-csv"
You can replace Laravel\Nova\Actions\ExportAsCsv
with NovaKit\NovaQueuedExportAsCsv\Actions\QueuedExportAsCsv
:
use Laravel\Nova\Actions\ExportAsCsv;
use Laravel\Nova\Http\Requests\NovaRequest;
use NovaKit\NovaQueuedExportAsCsv\Actions\QueuedExportAsCsv;
// ...
/**
* Get the actions available for the resource.
*
* @return array<int, \Laravel\Nova\Actions\Action>
*/
public function actions(NovaRequest $request): array
{
return [
QueuedExportAsCsv::make(),
];
}
If you would like to change the storage disk to store the CSV file that is available for download, you may invoke the withStorageDisk()
method when registering the action:
use NovaKit\NovaQueuedExportAsCsv\Actions\QueuedExportAsCsv;
// ...
return [
QueuedExportAsCsv::make()->withStorageDisk('s3'),
];
You can also customise the response message by using the following code:
use Laravel\Nova\Actions\Action;
use NovaKit\NovaQueuedExportAsCsv\Actions\QueuedExportAsCsv;
// ...
return [
QueuedExportAsCsv::make()->then(function () {
return response()->json(Action::message('Action has been queued!'));
}),
];
In order to handle the stored CSV, you need to listen to NovaKit\NovaQueuedExportAsCsv\Events\QueuedCsvExported
event, as an example you can broadcast to Nova's Notification using the following listener class:
<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Storage;
use Laravel\Nova\Notifications\NovaNotification;
use Laravel\Nova\URL;
use NovaKit\NovaQueuedExportAsCsv\Events\QueuedCsvExported;
class NotifyCsvExported
{
/**
* Handle the event.
*
* @param \NovaKit\NovaQueuedExportAsCsv\Events\QueuedCsvExported $event
* @return void
*/
public function handle(QueuedCsvExported $event)
{
$event->user->notify(
NovaNotification::make()
->message('Your CSV is ready to download.')
->action('Download', URL::remote(Storage::disk($event->storageDisk)->url($event->filename)))
->icon('download')
->type('info')
);
}
}