Enhance Form Submission Export Functionality (#657)

* Enhance Form Submission Export Functionality

* Validate new param 'columns'

* Form submission export request as seprate class with validation

* Test case for export

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
This commit is contained in:
Chirag Chhatrala
2025-01-07 19:34:02 +05:30
committed by GitHub
parent b0311257ac
commit cc62f614e4
5 changed files with 164 additions and 14 deletions

View File

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Forms;
use App\Exports\FormSubmissionExport;
use App\Http\Controllers\Controller;
use App\Http\Requests\AnswerFormRequest;
use App\Http\Requests\FormSubmissionExportRequest;
use App\Http\Resources\FormSubmissionResource;
use App\Jobs\Form\StoreFormSubmissionJob;
use App\Models\Forms\Form;
@@ -46,12 +47,13 @@ class FormSubmissionController extends Controller
]);
}
public function export(string $id)
public function export(FormSubmissionExportRequest $request, string $id)
{
$form = Form::findOrFail((int) $id);
$form = $request->form;
$this->authorize('view', $form);
$allRows = [];
$displayColumns = collect($request->columns)->filter(fn ($value, $key) => $value === true)->toArray();
foreach ($form->submissions->toArray() as $row) {
$formatter = (new FormSubmissionFormatter($form, $row['data']))
->outputStringsOnly()
@@ -59,25 +61,32 @@ class FormSubmissionController extends Controller
->showRemovedFields()
->showHiddenFields()
->useSignedUrlForFiles();
$allRows[] = [
'id' => Hashids::encode($row['id']),
'created_at' => date('Y-m-d H:i', strtotime($row['created_at'])),
...$formatter->getCleanKeyValue(),
];
$formattedData = $formatter->getCleanKeyValue();
$filteredData = ['id' => Hashids::encode($row['id'])];
foreach ($displayColumns as $column => $value) {
$key = collect($formattedData)->keys()->first(fn ($key) => str_contains($key, $column));
if ($key) {
$filteredData[$key] = $formattedData[$key];
}
}
if (isset($displayColumns['created_at'])) {
$filteredData['created_at'] = date('Y-m-d H:i', strtotime($row['created_at']));
}
$allRows[] = $filteredData;
}
$csvExport = (new FormSubmissionExport($allRows));
return Excel::download(
$csvExport,
$form->slug.'-submission-data.csv',
$form->slug . '-submission-data.csv',
\Maatwebsite\Excel\Excel::CSV
);
}
public function submissionFile($id, $fileName)
{
$fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id).'/'
.urldecode($fileName);
$fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id) . '/'
. urldecode($fileName);
if (! Storage::exists($fileName)) {
return $this->error([