diff --git a/src/Exports/SurveysExport.php b/src/Exports/SurveysExport.php index 803e802..7450f84 100644 --- a/src/Exports/SurveysExport.php +++ b/src/Exports/SurveysExport.php @@ -3,24 +3,36 @@ 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 @@ -28,7 +40,21 @@ public function collection() 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 diff --git a/src/Jobs/SendExportSurveys.php b/src/Jobs/SendExportSurveys.php index 7894799..766eeb0 100644 --- a/src/Jobs/SendExportSurveys.php +++ b/src/Jobs/SendExportSurveys.php @@ -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 { @@ -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; } /** @@ -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)); } diff --git a/src/Resources/SurveyResource.php b/src/Resources/SurveyResource.php index edcc421..858ad4f 100644 --- a/src/Resources/SurveyResource.php +++ b/src/Resources/SurveyResource.php @@ -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 { @@ -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 [