Skip to content

Commit

Permalink
restore export functionality and allow indivdual survey exports
Browse files Browse the repository at this point in the history
  • Loading branch information
John Wesely committed Mar 27, 2024
1 parent d306ece commit f0a064a
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 19 deletions.
36 changes: 31 additions & 5 deletions src/Exports/SurveysExport.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,58 @@
namespace Tapp\FilamentSurvey\Exports;

use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Illuminate\Database\Eloquent\Collection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\FromCollection;
use MattDaneshvar\Survey\Models\Survey;


class SurveysExport implements FromCollection, WithHeadings, WithMapping
{
public ?Collection $surveys;
public ?Survey $survey;

public function __construct(?Collection $surveys = null, Survey $survey = null)
{
$this->surveys = $surveys;
$this->survey = $survey;
}

/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return collect(DB::select(DB::raw("
$rawExpression = "
SELECT
users.name as user_name,
users.email as user_email,
JSON_EXTRACT(surveys.name, '$.en') as survey_name,
JSON_EXTRACT(questions.content, '$.en') as question_content,
JSON_EXTRACT(answers.value, '$.en') as answer_value,
answers.value as answer_value,
entries.created_at as entry_created_at
FROM
answers
JOIN questions ON questions.id = answers.question_id
JOIN entries ON entries.id = answers.entry_id
JOIN surveys ON surveys.id = entries.survey_id
JOIN users ON users.id = entries.participant_id
")));
";

if ($this->survey) {
$rawExpression = $rawExpression.' where surveys.id = '.$this->survey->id;
}

if ($this->surveys) {
$surveyIdsString = implode(', ', $this->surveys->pluck('id')->toArray());
$rawExpression = $rawExpression.' where surveys.id In ('.$surveyIdsString.')';
}

$expression = DB::raw($rawExpression)
->getValue(DB::connection()->getQueryGrammar());

return collect(DB::select($expression));
}

public function map($survey): array
Expand Down
31 changes: 23 additions & 8 deletions src/Jobs/SendExportSurveys.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
namespace Tapp\FilamentSurvey\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
use Maatwebsite\Excel\Facades\Excel;
use Tapp\FilamentSurvey\Exports\SurveysExport;
use Tapp\FilamentSurvey\Mail\Export;
use Illuminate\Queue\SerializesModels;
use MattDaneshvar\Survey\Models\Survey;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Database\Eloquent\Collection;
use Tapp\FilamentSurvey\Exports\SurveysExport;

class SendExportSurveys implements ShouldQueue
{
Expand All @@ -21,14 +23,19 @@ class SendExportSurveys implements ShouldQueue

public $user;

public ?Collection $surveys;
public ?Survey $survey;

/**
* Create a new job instance.
*
* @return void
*/
public function __construct($user)
public function __construct($user, $survey = null, $surveys = null)
{
$this->user = $user;
$this->survey = $survey;
$this->surveys = $surveys;
}

/**
Expand All @@ -39,9 +46,17 @@ public function __construct($user)
public function handle()
{
$filename = now()->format('Y-m-d_his').'-surveys.xlsx';
$subject = __('Export ready:').' '.$filename;

$export = Excel::download(new SurveysExport(), $filename)->getFile();
if ($this->survey) {
$filename = now()->format('Y-m-d_his').'-'.urlencode($this->survey->name).'.xlsx';
$export = Excel::download(new SurveysExport(survey: $this->survey), $filename)->getFile();
} elseif ($this->surveys) {
$export = Excel::download(new SurveysExport(surveys: $this->surveys), $filename)->getFile();
} else {
$export = Excel::download(new SurveysExport(), $filename)->getFile();
}

$subject = __('Export ready:').' '.$filename;

Mail::to($this->user->email)->send(new Export($export, $filename, $subject));
}
Expand Down
59 changes: 53 additions & 6 deletions src/Resources/SurveyResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,22 @@
namespace Tapp\FilamentSurvey\Resources;

use Filament\Forms;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Resources\Concerns\Translatable;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\DeleteAction;
use Filament\Forms\Get;
use Filament\Forms\Form;
use Filament\Tables\Table;
use Filament\Resources\Resource;
use Filament\Tables\Actions\Action;
use Filament\Tables\Actions\BulkAction;
use MattDaneshvar\Survey\Models\Survey;
use Filament\Notifications\Notification;
use Filament\Tables\Actions\DeleteAction;
use Illuminate\Database\Eloquent\Collection;
use Filament\Resources\Concerns\Translatable;
use Tapp\FilamentSurvey\Jobs\SendExportSurveys;
use Tapp\FilamentSurvey\Resources\SurveyResource\Pages;
use Tapp\FilamentSurvey\Resources\SurveyResource\RelationManagers\QuestionsRelationManager;
use Tapp\FilamentSurvey\Resources\SurveyResource\RelationManagers\SectionsRelationManager;
use Tapp\FilamentSurvey\Resources\SurveyResource\RelationManagers\QuestionsRelationManager;

class SurveyResource extends Resource
{
Expand Down Expand Up @@ -90,12 +95,54 @@ public static function table(Table $table): Table
])
->actions([
DeleteAction::make(),
Action::make(__('Export Answers'))
->icon(config('filament-survey.actions.survey.export.icon'))
->action(function (Survey $record) {
SendExportSurveys::dispatch(user: request()->user(), survey: $record);

Notification::make()
->title(__('You will receive your export via email'))
->success()
->send();
}),
])
->bulkActions([
BulkAction::make('Export Answers')
->icon(config('filament-survey.actions.survey.export.icon'))
->action(function (Collection $records) {
SendExportSurveys::dispatch(user: request()->user(), surveys: $records);

Notification::make()
->title(__('You will receive your export via email'))
->success()
->send();
}),
])
->filters([
//
]);
}

public function export(Survey $survey)
{
SendExportSurveys::dispatch(user: request()->user(), survey: $survey);

Notification::make()
->title(__('You will receive your export via email'))
->success()
->send();
}

public function exportBulk(Collection $surveys)
{
SendExportSurveys::dispatch(user: request()->user(), surveys: $surveys);

Notification::make()
->title(__('You will receive your export via email'))
->success()
->send();
}

public static function getRelations(): array
{
return [
Expand Down

0 comments on commit f0a064a

Please sign in to comment.