From 2ad5f8a316f8552ee7ccfbf83eabe817ba29c309 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Tue, 5 Sep 2023 20:33:40 +0300 Subject: [PATCH] handle unsupported file types --- app/javascript/application.js | 1 + app/javascript/template_builder/builder.vue | 8 ++++++++ app/javascript/template_builder/dropzone.vue | 13 ++++++++++--- app/javascript/template_builder/preview.vue | 6 ++++++ app/javascript/template_builder/replace.vue | 7 ++++++- app/javascript/template_builder/upload.vue | 7 ++++++- lib/templates/create_attachments.rb | 13 +++++++++++-- 7 files changed, 48 insertions(+), 7 deletions(-) diff --git a/app/javascript/application.js b/app/javascript/application.js index cc924ece..8860eb7f 100644 --- a/app/javascript/application.js +++ b/app/javascript/application.js @@ -76,6 +76,7 @@ window.customElements.define('template-builder', class extends HTMLElement { template: reactive(JSON.parse(this.dataset.template)), backgroundColor: '#faf7f5', withPhone: this.dataset.withPhone === 'true', + acceptFileTypes: this.dataset.acceptFileTypes, isDirectUpload: this.dataset.isDirectUpload === 'true' }) diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index 66b617a5..35cdf264 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -75,6 +75,7 @@ :with-arrows="template.schema.length > 1" :item="item" :document="sortedDocuments[index]" + :accept-file-types="acceptFileTypes" :template="template" :is-direct-upload="isDirectUpload" @scroll-to="scrollIntoDocument(item)" @@ -90,6 +91,7 @@ > @@ -256,6 +259,11 @@ export default { required: false, default: '' }, + acceptFileTypes: { + type: String, + required: false, + default: 'image/*, application/pdf' + }, baseUrl: { type: String, required: false, diff --git a/app/javascript/template_builder/dropzone.vue b/app/javascript/template_builder/dropzone.vue index fcfad6ed..a7a17fcc 100644 --- a/app/javascript/template_builder/dropzone.vue +++ b/app/javascript/template_builder/dropzone.vue @@ -42,7 +42,7 @@ ref="input" type="file" name="files[]" - accept="image/*, application/pdf" + :accept="acceptFileTypes" multiple @change="upload" > @@ -67,6 +67,11 @@ export default { type: [Number, String], required: true }, + acceptFileTypes: { + type: String, + required: false, + default: 'image/*, application/pdf' + }, isDirectUpload: { type: Boolean, required: true, @@ -89,8 +94,10 @@ export default { return 'Uploading...' } else if (this.isProcessing) { return 'Processing...' - } else { + } else if (this.acceptFileTypes === 'image/*, application/pdf') { return 'Add PDF documents or images' + } else { + return 'Add documents or images' } } }, @@ -102,7 +109,7 @@ export default { methods: { upload: Upload.methods.upload, onDropFiles (e) { - if ([...e.dataTransfer.files].every((f) => f.type.match(/(?:image\/)|(?:application\/pdf)/))) { + if (this.acceptFileTypes !== 'image/*, application/pdf' || [...e.dataTransfer.files].every((f) => f.type.match(/(?:image\/)|(?:application\/pdf)/))) { this.$refs.input.files = e.dataTransfer.files this.upload() diff --git a/app/javascript/template_builder/preview.vue b/app/javascript/template_builder/preview.vue index 16dc1889..1fe268e5 100644 --- a/app/javascript/template_builder/preview.vue +++ b/app/javascript/template_builder/preview.vue @@ -18,6 +18,7 @@ @@ -32,6 +32,11 @@ export default { type: [Number, String], required: true }, + acceptFileTypes: { + type: String, + required: false, + default: 'image/*, application/pdf' + }, isDirectUpload: { type: Boolean, required: true, diff --git a/app/javascript/template_builder/upload.vue b/app/javascript/template_builder/upload.vue index 57022c8b..f34f1049 100644 --- a/app/javascript/template_builder/upload.vue +++ b/app/javascript/template_builder/upload.vue @@ -33,7 +33,7 @@ ref="input" name="files[]" type="file" - accept="image/*, application/pdf" + :accept="acceptFileTypes" multiple @change="upload" > @@ -56,6 +56,11 @@ export default { type: [Number, String], required: true }, + acceptFileTypes: { + type: String, + required: false, + default: 'image/*, application/pdf' + }, isDirectUpload: { type: Boolean, required: true, diff --git a/lib/templates/create_attachments.rb b/lib/templates/create_attachments.rb index 1364940e..74e0da2d 100644 --- a/lib/templates/create_attachments.rb +++ b/lib/templates/create_attachments.rb @@ -3,15 +3,20 @@ module Templates module CreateAttachments PDF_CONTENT_TYPE = 'application/pdf' + InvalidFileType = Class.new(StandardError) module_function def call(template, params) find_or_create_blobs(params).map do |blob| - document = template.documents.create!(blob:) - document_data = blob.download + if !blob.image? && blob.content_type != PDF_CONTENT_TYPE + blob, document_data = handle_file_types(blob, document_data) + end + + document = template.documents.create!(blob:) + if blob.content_type == PDF_CONTENT_TYPE && blob.metadata['pdf'].nil? blob.metadata['pdf'] = { 'annotations' => Templates::BuildAnnotations.call(document_data) } end @@ -43,5 +48,9 @@ module Templates ) end end + + def handle_file_types(_document_data, blob) + raise InvalidFileType, blob.content_type + end end end