Editable submission File input support (#120)

This commit is contained in:
Chirag Chhatrala 2023-04-26 20:35:02 +05:30 committed by GitHub
parent 3f2fe352e8
commit e165242e57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 4 deletions

View File

@ -168,7 +168,7 @@ class AnswerFormRequest extends FormRequest
return ['boolean']; return ['boolean'];
case 'url': case 'url':
if (isset($property['file_upload']) && $property['file_upload']) { if (isset($property['file_upload']) && $property['file_upload']) {
$this->requestRules[$property['id'].'.*'] = [new StorageFile($this->maxFileSize)]; $this->requestRules[$property['id'].'.*'] = [new StorageFile($this->maxFileSize, [], $this->form)];
return ['array']; return ['array'];
} }
return ['url']; return ['url'];
@ -177,7 +177,7 @@ class AnswerFormRequest extends FormRequest
if($this->form->is_pro && !empty($property['allowed_file_types'])){ if($this->form->is_pro && !empty($property['allowed_file_types'])){
$allowedFileTypes = explode(",", $property['allowed_file_types']); $allowedFileTypes = explode(",", $property['allowed_file_types']);
} }
$this->requestRules[$property['id'].'.*'] = [new StorageFile($this->maxFileSize, $allowedFileTypes)]; $this->requestRules[$property['id'].'.*'] = [new StorageFile($this->maxFileSize, $allowedFileTypes, $this->form)];
return ['array']; return ['array'];
case 'email': case 'email':
return ['email:filter']; return ['email:filter'];

View File

@ -136,6 +136,13 @@ class StoreFormSubmissionJob implements ShouldQueue
return $finalData; return $finalData;
} }
// This is use when updating a record, and file uploads aren't changed.
private function isSkipForUpload($value)
{
$newPath = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $this->form->id);
return Storage::disk('s3')->exists($newPath.'/'.$value);
}
/** /**
* Custom Back-end Value formatting. Use case: * Custom Back-end Value formatting. Use case:
* - File uploads (move file from tmp storage to persistent) * - File uploads (move file from tmp storage to persistent)
@ -150,6 +157,10 @@ class StoreFormSubmissionJob implements ShouldQueue
return null; return null;
} }
if($this->isSkipForUpload($value)) {
return $value;
}
$fileNameParser = StorageFileNameParser::parse($value); $fileNameParser = StorageFileNameParser::parse($value);
// Make sure we retrieve the file in tmp storage, move it to persistent // Make sure we retrieve the file in tmp storage, move it to persistent

View File

@ -7,6 +7,7 @@ use App\Service\Storage\StorageFileNameParser;
use Illuminate\Contracts\Validation\Rule; use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use App\Models\Forms\Form;
class StorageFile implements Rule class StorageFile implements Rule
{ {
@ -21,7 +22,7 @@ class StorageFile implements Rule
* @param int $maxSize * @param int $maxSize
* @param string[] $fileTypes * @param string[] $fileTypes
*/ */
public function __construct(int $maxSize, array $fileTypes = []) public function __construct(int $maxSize, array $fileTypes = [], public ?Form $form = null)
{ {
$this->maxSize = $maxSize; $this->maxSize = $maxSize;
@ -39,6 +40,14 @@ class StorageFile implements Rule
*/ */
public function passes($attribute, $value): bool public function passes($attribute, $value): bool
{ {
// This is use when updating a record, and file uploads aren't changed.
if($this->form){
$newPath = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $this->form->id);
if(Storage::disk('s3')->exists($newPath.'/'.$value)){
return true;
}
}
$fileNameParser = StorageFileNameParser::parse($value); $fileNameParser = StorageFileNameParser::parse($value);
if (!$uuid = $fileNameParser->uuid) { if (!$uuid = $fileNameParser->uuid) {
return false; return false;

View File

@ -208,7 +208,19 @@ export default {
} }
}, },
created () { async created () {
if(this.compVal && this.compVal.length > 0) {
let tmpFiles = []
for (let i = 0; i < this.compVal.length; i++) {
await this.getFileFromUrl(this.compVal[i]).then((fileObj) => {
tmpFiles.push({
file: fileObj,
url: this.compVal[i]
})
})
}
this.files = tmpFiles
}
}, },
methods: { methods: {
@ -262,6 +274,14 @@ export default {
this.showUploadModal = false this.showUploadModal = false
this.loading = false this.loading = false
}) })
},
async getFileFromUrl(url, defaultType='image/jpeg'){
const response = await fetch(url)
const data = await response.blob()
const name = url.replace(/^.*(\\|\/|\:)/, '')
return new File([data], name, {
type: data.type || defaultType,
})
} }
} }
} }