yajra / laravel-datatables-export

Laravel DataTables Export plugin that uses queue, spout and livewire for bulk data export.
MIT License
30 stars 19 forks source link

Are you planning to add a non-livewire version for this? #55

Open OzanKurt opened 8 months ago

OzanKurt commented 8 months ago

This would be extremely useful for me, in case you can implement it partially I could also continue.

yajra commented 8 months ago

No plans but open for a PR if you can. Thanks!

OzanKurt commented 8 months ago

So...

I've been playing around with the export package and actually found out that integrating it with buttons is extremely simple.

I added this custom button which sends an ajax request to the server side and it gets handled by the exportQueue method from WithExportQueue.

    DataTable.ext.buttons.exportQueue = {
        className: 'buttons-export-queue',
        text: function (dt) {
            return '<i class="far fa-fw fa-file-excel"></i>';
        },
        action: function (e, dt, button, config) {
            var url = _buildUrl(dt, 'exportQueue');

            $.ajax({
                url: url,
                type: 'GET',
                data: {},
                complete: window.ajax_complete_handler,
            });
        }
    };

There are a couple of ideas I've had:

1- We need to add a customizable callback function to the exportQueue() method so that I could return a custom JSON response instead of just the $batch->id

    public function exportQueue(): string
    {
        $job = new DataTableExportJob(
            [self::class, $this->attributes],
            request()->all(),
            Auth::id() ?? 0,
            $this->sheetName(),
        );

        $batch = Bus::batch([$job])->name('datatables-export')->dispatch();

        return $batch->id;
    }

2- I had to implement a getUser() method inside the DataTableExportJob to get the User instance from the id:

    public function getUser(): ?User
    {
        return $this->user ? User::find($this->user) : null;
    }

3- We need to be able to handle the errors that might occur during the Job:

4- I think the mail should be separated from the Job

Maybe something like this:

    public function afterExport(array $paths): bool
    {
        // The `$paths` can contain multiple paths of the file like:
        // ['local' => 'localpath', 's3' => 's3path', 'otherDisk' => 'otherpath']

        // do some stuff with the exported file, maybe save it to an archive inside the media-library.
        // return `true` to continue with the email
        // return `false` to skip email, and maybe send the file to every user in a team
    }

5- I don't think we need a job_batch for this since it's only 1 job, we should be able to dispatch the single job alone. (I don't have much exp. with batches, so no judgement 😞)

6- Ability to add multiple destination disks

7- Ability to send the job to multiple users (this can be done manually if we implement "step 4")

9- Customizable mail_subject

10- A nicer Email Template from Laravels defaults 😄

Let me know what you think about these ideas.

I also believe that this package could be integrated inside the buttons package directly, only the livewire parts will only be registered if livewire is installed.

So, inside the ExportServiceProvider we can add something like this:

if (class_exists('Livewire\\Livewire')) {
    // Do livewire related inits
}
yajra commented 7 months ago

Good points provided @OzanKurt. Will also try to implement it if I can.

5: the batch job is needed to check the status for real-time response.

10: agree, we haven't used this feature so no enhancements were done yet

The package idea came from Laravel Daily

Seb33300 commented 3 months ago

A non-livewire version would be much appreciated.