* Implement partial form submissions feature * Add status filtering for form submissions * Add Partial Submission in Analytics * improve partial submission * fix lint * Add type checking for submission ID in form submission job * on form stats Partial Submissions only if enable * Partial Submissions is PRO Feature * Partial Submissions is PRO Feature * improvement migration * Update form submission status labels to 'Submitted' and 'In Progress' * start partial sync when dataFormValue update * badge size xs * Refactor partial submission hash management * Refactor partial form submission handling in PublicFormController * fix submissiona * Refactor form submission ID handling and metadata processing - Improve submission ID extraction and decoding across controllers - Add robust handling for submission hash and ID conversion - Enhance metadata processing in StoreFormSubmissionJob - Simplify submission storage logic with clearer metadata extraction - Minor UI improvements in FormSubmissions and OpenTable components * Enhance form submission settings UI with advanced partial submission options - Restructure partial submissions toggle with more descriptive label - Add advanced submission options section with Pro tag - Improve help text for partial submissions feature - Update ProTag with more detailed upgrade modal description * Refactor partial form submission sync mechanism - Improve partial submission synchronization in usePartialSubmission composable - Replace interval-based sync with Vue's reactive watch - Add robust handling for different form data input patterns - Implement onBeforeUnmount hook for final sync attempt - Enhance data synchronization reliability and performance * Improve partial form submission validation and synchronization * fix lint * Refactor submission identifier processing in PublicFormController - Updated the docblock for the method responsible for processing submission identifiers to clarify its functionality. The method now explicitly states that it converts a submission hash or string ID into a numeric submission_id, ensuring consistent internal storage format. These changes aim to improve code documentation and enhance understanding of the method's purpose and behavior. * Enhance Form Logic Condition Checker to Exclude Partial Submissions - Updated the query in FormLogicConditionChecker to exclude submissions with a status of 'partial', ensuring that only complete submissions are processed. - Minor formatting adjustment in the docblock of PublicFormController for improved clarity. These changes aim to refine submission handling and enhance the accuracy of form logic evaluations. * Partial Submission Test * Refactor FormSubmissionController and PartialSubmissionTest for Consistency - Updated the `FormSubmissionController` to improve code consistency by adjusting the formatting of anonymous functions in the `filter` and `first` methods. - Modified `PartialSubmissionTest` to simplify the `Storage::fake()` method call, removing the unnecessary 'local' parameter for better clarity. These changes aim to enhance code readability and maintainability across the form submission handling and testing components. * Enhance FormSubmissionController and EditSubmissionTest for Clarity - Added validation to the `FormSubmissionController` by introducing `$submissionData = $request->validated();` to ensure that only validated data is processed for form submissions. - Improved code readability in the `FormSubmissionController` by adjusting the formatting of anonymous functions in the `filter` and `first` methods. - Removed unnecessary blank lines in the `EditSubmissionTest` to streamline the test setup. These changes aim to enhance data integrity during form submissions and improve overall code clarity and maintainability. --------- Co-authored-by: Julien Nahum <julien@nahum.net>
80 lines
2.3 KiB
PHP
80 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Resources;
|
|
|
|
use Illuminate\Http\Resources\Json\JsonResource;
|
|
|
|
class FormSubmissionResource extends JsonResource
|
|
{
|
|
public bool $publiclyAccessed = false;
|
|
|
|
/**
|
|
* Transform the resource into an array.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
|
|
*/
|
|
public function toArray($request)
|
|
{
|
|
$this->generateFileLinks();
|
|
|
|
if (!$this->publiclyAccessed) {
|
|
$this->addExtraData();
|
|
}
|
|
|
|
return array_merge([
|
|
'data' => $this->data,
|
|
'completion_time' => $this->completion_time,
|
|
], ($this->publiclyAccessed) ? [] : [
|
|
'form_id' => $this->form_id,
|
|
'id' => $this->id
|
|
]);
|
|
}
|
|
|
|
public function publiclyAccessed($publiclyAccessed = true)
|
|
{
|
|
$this->publiclyAccessed = $publiclyAccessed;
|
|
return $this;
|
|
}
|
|
|
|
private function addExtraData()
|
|
{
|
|
$this->data = array_merge($this->data, [
|
|
'status' => $this->status,
|
|
'created_at' => $this->created_at->toDateTimeString(),
|
|
'id' => $this->id,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Link to the file (generating signed s3 URL)
|
|
*
|
|
* @return void
|
|
*/
|
|
private function generateFileLinks()
|
|
{
|
|
$data = $this->data;
|
|
$formFields = collect($this->form->properties)->concat(collect($this->form->removed_properties));
|
|
$fileFields = $formFields->filter(function ($field) {
|
|
return in_array($field['type'], ['files', 'signature']);
|
|
});
|
|
foreach ($fileFields as $field) {
|
|
if (isset($data[$field['id']]) && !empty($data[$field['id']])) {
|
|
$data[$field['id']] = collect($data[$field['id']])->filter(function ($file) {
|
|
return $file !== null && $file;
|
|
})->map(function ($file) {
|
|
return [
|
|
'file_url' => \URL::signedRoute(
|
|
'open.forms.submissions.file',
|
|
[$this->form_id, $file],
|
|
now()->addMinutes(10)
|
|
),
|
|
'file_name' => $file,
|
|
];
|
|
});
|
|
}
|
|
}
|
|
$this->data = $data;
|
|
}
|
|
}
|