diff --git a/app/Http/Resources/FormResource.php b/app/Http/Resources/FormResource.php index 60dfcf6..c359c33 100644 --- a/app/Http/Resources/FormResource.php +++ b/app/Http/Resources/FormResource.php @@ -58,7 +58,8 @@ class FormResource extends JsonResource 'is_closed' => $this->is_closed, 'is_password_protected' => false, 'has_password' => $this->has_password, - 'max_number_of_submissions_reached' => $this->max_number_of_submissions_reached + 'max_number_of_submissions_reached' => $this->max_number_of_submissions_reached, + 'form_pending_submission_key' => $this->form_pending_submission_key ]); } diff --git a/app/Models/Forms/Form.php b/app/Models/Forms/Form.php index 11b61c9..2d8195b 100644 --- a/app/Models/Forms/Form.php +++ b/app/Models/Forms/Form.php @@ -166,6 +166,14 @@ class Form extends Model return ($this->closes_at && now()->gt($this->closes_at)); } + public function getFormPendingSubmissionKeyAttribute() + { + if ($this->updated_at?->timestamp) { + return "openform-" . $this->id . "-pending-submission-" . substr($this->updated_at?->timestamp, -6); + } + return null; + } + public function getMaxNumberOfSubmissionsReachedAttribute() { return ($this->max_submissions_count && $this->max_submissions_count <= $this->submissions_count); diff --git a/app/Service/Storage/StorageFileNameParser.php b/app/Service/Storage/StorageFileNameParser.php index aa17d5b..6907533 100644 --- a/app/Service/Storage/StorageFileNameParser.php +++ b/app/Service/Storage/StorageFileNameParser.php @@ -29,7 +29,8 @@ class StorageFileNameParser public function getMovedFileName(): ?string { if ($this->fileName && $this->extension) { - return substr($this->fileName,0,50).'_'.$this->uuid.'.'.$this->extension; + $fileName = substr($this->fileName, 0, 50).'_'.$this->uuid.'.'.$this->extension; + return mb_convert_encoding($fileName, 'UTF-8', 'UTF-8'); } return $this->uuid; } diff --git a/resources/js/components/open/forms/OpenCompleteForm.vue b/resources/js/components/open/forms/OpenCompleteForm.vue index 33e9d38..878fdd2 100644 --- a/resources/js/components/open/forms/OpenCompleteForm.vue +++ b/resources/js/components/open/forms/OpenCompleteForm.vue @@ -191,6 +191,9 @@ export default { workspace_id: this.form.workspace_id, form_id: this.form.id }) + + window.localStorage.removeItem(this.form.form_pending_submission_Key) + if (response.data.redirect && response.data.redirect_url) { window.location.href = response.data.redirect_url } diff --git a/resources/js/components/open/forms/OpenForm.vue b/resources/js/components/open/forms/OpenForm.vue index 9481e92..212a54d 100644 --- a/resources/js/components/open/forms/OpenForm.vue +++ b/resources/js/components/open/forms/OpenForm.vue @@ -217,7 +217,15 @@ export default { handler () { this.formVersionId++ } - } + }, + dataForm: { + deep: true, + handler () { + if(this.isPublicFormPage && this.form && this.dataFormValue){ + window.localStorage.setItem(this.form.form_pending_submission_Key, JSON.stringify(this.dataFormValue)) + } + } + }, }, mounted () { @@ -266,6 +274,14 @@ export default { } }, initForm () { + if (this.isPublicFormPage) { + const pendingData = window.localStorage.getItem(this.form.form_pending_submission_Key) + if(pendingData !== null && pendingData){ + this.dataForm = new Form(JSON.parse(pendingData)) + return + } + } + const formData = clonedeep(this.dataForm ? this.dataForm.data() : {}) let urlPrefill = null if (this.isPublicFormPage && this.form.is_pro) { diff --git a/tests/Unit/Service/Storage/StorageFileNameParserTest.php b/tests/Unit/Service/Storage/StorageFileNameParserTest.php index 6909e06..d609669 100644 --- a/tests/Unit/Service/Storage/StorageFileNameParserTest.php +++ b/tests/Unit/Service/Storage/StorageFileNameParserTest.php @@ -25,3 +25,12 @@ it('can parse filenames', function () { expect($parsedFilename->getMovedFileName())->toBeNull(); }); + +it('can handles non-utf characters', function () { + $fileName = 'Образец_для_заполнения_85e16d7b-58ed-43bc-8dce-7d3ff7d69f41.png'; + $parsedFilename = \App\Service\Storage\StorageFileNameParser::parse($fileName); + expect($parsedFilename->fileName)->toBe('Образец_для_заполнения'); + expect($parsedFilename->uuid)->toBe('85e16d7b-58ed-43bc-8dce-7d3ff7d69f41'); + expect($parsedFilename->extension)->toBe('png'); + expect($parsedFilename->getMovedFileName())->toBe($fileName); +});