From 6e66ec481b07b21fed672af514bd76939c7cc556 Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sat, 28 Dec 2024 14:27:01 +0100 Subject: [PATCH 01/11] Update i18n.js --- app/javascript/template_builder/i18n.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/javascript/template_builder/i18n.js b/app/javascript/template_builder/i18n.js index 34a9604a..f9a7ba5a 100644 --- a/app/javascript/template_builder/i18n.js +++ b/app/javascript/template_builder/i18n.js @@ -154,7 +154,8 @@ const en = { some_fields_are_missing_in_the_formula: 'Some fields are missing in the formula.', learn_more: 'Learn more', and: 'and', - or: 'or' + or: 'or', + only_camera: 'Only with camera' } const es = { From e0a1199e46c01fb8742355ebfe3dca3d741d54c1 Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sat, 28 Dec 2024 14:31:49 +0100 Subject: [PATCH 02/11] Update field_settings.vue --- app/javascript/template_builder/field_settings.vue | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/javascript/template_builder/field_settings.vue b/app/javascript/template_builder/field_settings.vue index c5956a7d..c2039416 100644 --- a/app/javascript/template_builder/field_settings.vue +++ b/app/javascript/template_builder/field_settings.vue @@ -257,6 +257,20 @@ {{ t('with_logo') }} +
  • + +
  • Date: Sat, 28 Dec 2024 14:32:06 +0100 Subject: [PATCH 03/11] Update i18n.js --- app/javascript/template_builder/i18n.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/template_builder/i18n.js b/app/javascript/template_builder/i18n.js index f9a7ba5a..e24dfc4e 100644 --- a/app/javascript/template_builder/i18n.js +++ b/app/javascript/template_builder/i18n.js @@ -155,7 +155,7 @@ const en = { learn_more: 'Learn more', and: 'and', or: 'or', - only_camera: 'Only with camera' + only_with_camera: 'Only with camera' } const es = { From 1e8b1a4c809bcd4b7010ab31e58e7fd0b8718f16 Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sat, 28 Dec 2024 14:34:45 +0100 Subject: [PATCH 04/11] Update image_step.vue --- app/javascript/submission_form/image_step.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/submission_form/image_step.vue b/app/javascript/submission_form/image_step.vue index 4499eb83..c7104c1f 100644 --- a/app/javascript/submission_form/image_step.vue +++ b/app/javascript/submission_form/image_step.vue @@ -39,6 +39,7 @@ :submitter-slug="submitterSlug" :dry-run="dryRun" :accept="'image/*'" + :camera="field.preferences?.only_with_camera == true" @upload="onImageUpload" /> From ecbd2ccf653f2a3899b2457c0902d493c53a82b7 Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sat, 28 Dec 2024 14:46:28 +0100 Subject: [PATCH 05/11] Update dropzone.vue --- app/javascript/submission_form/dropzone.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/javascript/submission_form/dropzone.vue b/app/javascript/submission_form/dropzone.vue index 19285c4e..048ffd5e 100644 --- a/app/javascript/submission_form/dropzone.vue +++ b/app/javascript/submission_form/dropzone.vue @@ -39,6 +39,7 @@ ref="input" :multiple="multiple" :accept="accept" + :capture="onlyUseCamera == true ? `camera` : false" type="file" class="hidden" @change="onSelectFiles" @@ -71,6 +72,11 @@ export default { required: false, default: false }, + onlyUseCamera: { + type: Boolean, + required: false, + default: false + }, accept: { type: String, required: false, @@ -95,7 +101,9 @@ export default { }, methods: { onDropFiles (e) { - this.uploadFiles(e.dataTransfer.files) + if(!this.onlyUseCamera){ + this.uploadFiles(e.dataTransfer.files) + } }, onSelectFiles (e) { e.preventDefault() From c8047656381c2ceec1d899f8a1a89d29531cbb52 Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sat, 28 Dec 2024 14:47:18 +0100 Subject: [PATCH 06/11] Update image_step.vue --- app/javascript/submission_form/image_step.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/submission_form/image_step.vue b/app/javascript/submission_form/image_step.vue index c7104c1f..e07a47d2 100644 --- a/app/javascript/submission_form/image_step.vue +++ b/app/javascript/submission_form/image_step.vue @@ -39,7 +39,7 @@ :submitter-slug="submitterSlug" :dry-run="dryRun" :accept="'image/*'" - :camera="field.preferences?.only_with_camera == true" + :only-with-camera="field.preferences?.only_with_camera == true" @upload="onImageUpload" /> From f95f24de90647835683b501217a0a44ad325ac35 Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sat, 28 Dec 2024 14:47:43 +0100 Subject: [PATCH 07/11] Update dropzone.vue --- app/javascript/submission_form/dropzone.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/submission_form/dropzone.vue b/app/javascript/submission_form/dropzone.vue index 048ffd5e..d550d717 100644 --- a/app/javascript/submission_form/dropzone.vue +++ b/app/javascript/submission_form/dropzone.vue @@ -39,7 +39,7 @@ ref="input" :multiple="multiple" :accept="accept" - :capture="onlyUseCamera == true ? `camera` : false" + :capture="onlyWithCamera == true ? `camera` : false" type="file" class="hidden" @change="onSelectFiles" @@ -72,7 +72,7 @@ export default { required: false, default: false }, - onlyUseCamera: { + onlyWithCamera: { type: Boolean, required: false, default: false From a21328afd16b2a09aa19a992b3471c4e723fb66d Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sat, 28 Dec 2024 15:08:30 +0100 Subject: [PATCH 08/11] Update field_settings.vue --- app/javascript/template_builder/field_settings.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/template_builder/field_settings.vue b/app/javascript/template_builder/field_settings.vue index c2039416..1ab55f85 100644 --- a/app/javascript/template_builder/field_settings.vue +++ b/app/javascript/template_builder/field_settings.vue @@ -266,7 +266,7 @@ :checked="field.preferences?.only_with_camera != false" type="checkbox" class="toggle toggle-xs" - @change="[field.preferences ||= {}, field.preferences.only_with_camera = field.preferences.only_with_camera == true, save()]" + @change="[field.preferences ||= {}, field.preferences.only_with_camera = field.preferences.only_with_camera == false, save()]" > {{ t('only_with_camera') }} From 9f32484a6f9e424565016041535d1d3bbecdb3fd Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sun, 29 Dec 2024 11:06:01 +0100 Subject: [PATCH 09/11] Add support to use only camera on image field --- .../submit_form_take_photo_controller.rb | 21 + app/javascript/photo.js | 142 +++ app/javascript/submission_form/dropzone.vue | 29 +- app/javascript/submission_form/i18n.js | 12 +- app/javascript/submission_form/image_step.vue | 91 +- .../template_builder/field_settings.vue | 1098 +++++++++-------- app/views/icons/_camera.html.erb | 5 + .../submit_form_take_photo/show.html.erb | 67 + config/locales/i18n.yml | 1 + config/routes.rb | 2 + 10 files changed, 909 insertions(+), 559 deletions(-) create mode 100644 app/controllers/submit_form_take_photo_controller.rb create mode 100644 app/javascript/photo.js create mode 100644 app/views/icons/_camera.html.erb create mode 100644 app/views/submit_form_take_photo/show.html.erb diff --git a/app/controllers/submit_form_take_photo_controller.rb b/app/controllers/submit_form_take_photo_controller.rb new file mode 100644 index 00000000..0411f165 --- /dev/null +++ b/app/controllers/submit_form_take_photo_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class SubmitFormTakePhotoController < ApplicationController + layout false + + around_action :with_browser_locale, only: %i[show] + skip_before_action :authenticate_user! + skip_authorization_check + + def show + @submitter = Submitter.find_by!(slug: params[:slug]) + + return redirect_to submit_form_completed_path(@submitter.slug) if @submitter.completed_at? + + if @submitter.submission.template.archived_at? || @submitter.submission.archived_at? + return redirect_to submit_form_path(@submitter.slug) + end + + render :show + end +end diff --git a/app/javascript/photo.js b/app/javascript/photo.js new file mode 100644 index 00000000..cef7ab8b --- /dev/null +++ b/app/javascript/photo.js @@ -0,0 +1,142 @@ +window.customElements.define('file-photo', class extends HTMLElement { + connectedCallback () { + + this.clearButton.addEventListener('click', (e) => { + e.preventDefault() + this.valueInput.value = null + this.inputFile.click() + }) + + this.inputFile.addEventListener('change', (e) => { + e.preventDefault() + this.updateSubmitButtonVisibility() + this.uploadFiles(this.inputFile.files) + }) + + this.form.addEventListener('submit', (e) => { + e.preventDefault(); + this.submitButton.disabled = true + fetch(this.form.action, { + method: 'PUT', + body: new FormData(this.form) + }).then((response) => { + this.form.classList.add('hidden') + this.success.classList.remove('hidden') + return response + }).finally(() => { + this.submitButton.disabled = false + }) + }) + + } + + toggleLoading = (e) => { + this.updateSubmitButtonVisibility() + if (e && e.target && !e.target.contains(this)) { + return + } + this.loading.classList.toggle('hidden') + this.icon.classList.toggle('hidden') + this.classList.toggle('opacity-50') + } + + async uploadFiles (files) { + this.toggleLoading() + return await Promise.all( + Array.from(files).map(async (file) => { + const formData = new FormData() + if (file.type === 'image/bmp') { + file = await this.convertBmpToPng(file) + } + + formData.append('file', file) + formData.append('submitter_slug', this.dataset.slug) + formData.append('name', 'attachments') + + return fetch('/api/attachments', { + method: 'POST', + body: formData + }).then(resp => resp.json()).then((data) => { + return data + }) + })).then((result) => { + this.valueInput.value = result[0].uuid + return result[0] + }).finally(() => { + this.toggleLoading() + }) + } + + convertBmpToPng (bmpFile) { + return new Promise((resolve, reject) => { + const reader = new FileReader() + + reader.onload = function (event) { + const img = new Image() + + img.onload = function () { + const canvas = document.createElement('canvas') + const ctx = canvas.getContext('2d') + + canvas.width = img.width + canvas.height = img.height + ctx.drawImage(img, 0, 0) + canvas.toBlob(function (blob) { + const newFile = new File([blob], bmpFile.name.replace(/\.\w+$/, '.png'), { type: 'image/png' }) + resolve(newFile) + }, 'image/png') + } + + img.src = event.target.result + } + reader.onerror = reject + reader.readAsDataURL(bmpFile) + }) + } + + updateSubmitButtonVisibility () { + if (!this.valueInput.value) { + this.submitButton.style.display = 'none' + this.placeholderButton.style.display = 'block' + } else { + this.submitButton.style.display = 'block' + this.placeholderButton.style.display = 'none' + } + } + + get submitButton () { + return this.querySelector('button[type="submit"]') + } + + get clearButton () { + return this.querySelector('button[aria-label="Clear"]') + } + + get placeholderButton () { + return this.querySelector('button[disabled]') + } + + get valueInput () { + return this.querySelector('input[name^="values"]') + } + + get inputFile () { + return this.querySelector('input[id="file"]') + } + + get icon () { + return this.querySelector('#file-photo-icon') + } + + get loading () { + return this.querySelector('#file-photo-loading') + } + + get form () { + return this.querySelector('form') + } + + get success () { + return this.querySelector('#success') + } +}) diff --git a/app/javascript/submission_form/dropzone.vue b/app/javascript/submission_form/dropzone.vue index d550d717..adc6bb48 100644 --- a/app/javascript/submission_form/dropzone.vue +++ b/app/javascript/submission_form/dropzone.vue @@ -1,7 +1,8 @@ diff --git a/app/javascript/template_builder/field_settings.vue b/app/javascript/template_builder/field_settings.vue index 1ab55f85..7b621c62 100644 --- a/app/javascript/template_builder/field_settings.vue +++ b/app/javascript/template_builder/field_settings.vue @@ -1,597 +1,607 @@ diff --git a/app/views/icons/_camera.html.erb b/app/views/icons/_camera.html.erb new file mode 100644 index 00000000..403797eb --- /dev/null +++ b/app/views/icons/_camera.html.erb @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/views/submit_form_take_photo/show.html.erb b/app/views/submit_form_take_photo/show.html.erb new file mode 100644 index 00000000..9e1caba0 --- /dev/null +++ b/app/views/submit_form_take_photo/show.html.erb @@ -0,0 +1,67 @@ + + + + <%= render 'layouts/head_tags' %> + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + <% if ENV['ROLLBAR_CLIENT_TOKEN'] %> + + <%= javascript_pack_tag 'rollbar', 'photo', defer: true %> + <% else %> + <%= javascript_pack_tag 'photo', defer: true %> + <% end %> + <%= stylesheet_pack_tag 'form', media: 'all' %> + <%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %> + + + <% field = (@submitter.submission.template_fields || @submitter.template.fields).find { |f| f['type'] == 'image' && f['uuid'].starts_with?(params[:f]) } %> + + <%= form_for '', url: submit_form_path(params[:slug]), html: { style: 'max-width: 900px; width: 100%; margin-bottom: 120px' }, method: :put do |f| %> + + <% if field['description'] %> +
    + <%= field['description'] %> +
    + <% end %> + +
    + + <%= f.button button_title(title: t('submit')), class: 'base-button w-full', style: 'display: none' %> +
    + <% end %> + +
    + + diff --git a/config/locales/i18n.yml b/config/locales/i18n.yml index 92ee1d8e..b6114300 100644 --- a/config/locales/i18n.yml +++ b/config/locales/i18n.yml @@ -391,6 +391,7 @@ en: &en draw_signature: Draw Signature clear: Clear signature_uploaded: Signature Uploaded + photo_uploaded: Photo Uploaded submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'Submission deletion is irreversible and will permanently remove all associated signed documents with it. Are you sure?' return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Return back to your desktop device to complete the form or continue on mobile' template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: Template deletion is irreversible and will permanently remove all associated signed documents with it. Are you sure? diff --git a/config/routes.rb b/config/routes.rb index dd568316..eba58222 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -139,6 +139,8 @@ Rails.application.routes.draw do resources :submit_form_draw_signature, only: %i[show], path: 'p', param: 'slug' + resources :submit_form_take_photo, only: %i[show], path: 't', param: 'slug' + resources :submissions_preview, only: %i[show], path: 'e', param: 'slug' do get :completed end From 712a509c35e326bf9574588b51301ed636dc7443 Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Sun, 29 Dec 2024 11:39:31 +0100 Subject: [PATCH 10/11] add i18n --- app/javascript/submission_form/i18n.js | 40 +++++++++++++++++++++++-- app/javascript/template_builder/i18n.js | 15 ++++++---- config/locales/i18n.yml | 5 ++++ 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/app/javascript/submission_form/i18n.js b/app/javascript/submission_form/i18n.js index 4f7a025e..2808fe0c 100644 --- a/app/javascript/submission_form/i18n.js +++ b/app/javascript/submission_form/i18n.js @@ -196,6 +196,10 @@ const es = { upload: 'Subir', files: 'Archivos', signature_is_too_small_please_redraw: 'La firma es demasiado pequeña. Por favor, dibújala de nuevo.', + foto: 'Foto', + tomar: 'Tomar', + retomar: 'Retomar', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Escanea el código QR con la aplicación de cámara de tu móvil para abrir el formulario y tomar una foto', wait_countdown_seconds: 'Espera {countdown} segundos' } @@ -294,6 +298,10 @@ const it = { upload: 'Carica', files: 'File', signature_is_too_small_please_redraw: 'La firma è troppo piccola. Ridisegnala per favore.', + foto: 'Foto', + prendere: 'Prendere', + riprendere: 'Riprendere', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: "Scansiona il codice QR con l'app della fotocamera del tuo cellulare per aprire il modulo e scattare una foto", wait_countdown_seconds: 'Attendi {countdown} secondi' } @@ -392,6 +400,10 @@ const de = { upload: 'Hochladen', files: 'Dateien', signature_is_too_small_please_redraw: 'Die Unterschrift ist zu klein. Bitte erneut zeichnen.', + Foto: 'Foto', + take: 'Nimm', + Wiederholung: 'Wiederholen', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Scannen Sie den QR-Code mit Ihrer mobilen Kamera-App, um das Formular zu öffnen und ein Foto aufzunehmen', wait_countdown_seconds: 'Warte {countdown} Sekunden' } @@ -494,7 +506,7 @@ const fr = { photo: 'Photo', take: 'Prendre', retake: 'Reprendre', - scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Scannez le code QR avec l\'application de l\'appareil photo pour ouvrir le formulaire et prendre une photo', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Scannez le code QR avec l\'application photo de votre mobile pour ouvrir le formulaire et prendre une photo', } const pl = { @@ -591,7 +603,11 @@ const pl = { reupload: 'Ponowne przesłanie', upload: 'Przesyłanie', files: 'Pliki', - signature_is_too_small_please_redraw: 'Podpis jest zbyt mały. Proszę narysować go ponownie.' + signature_is_too_small_please_redraw: 'Podpis jest zbyt mały. Proszę narysować go ponownie.', + photo: 'Zdjęcie', + take: 'Weź', + retake: 'Odtwórz ponownie', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Zeskanuj kod QR za pomocą aplikacji aparatu mobilnego, aby otworzyć formularz i zrobić zdjęcie', } const uk = { @@ -689,6 +705,10 @@ const uk = { upload: 'Завантажити', files: 'Файли', signature_is_too_small_please_redraw: 'Підпис занадто малий. Будь ласка, перемалюйте його.', + photo: 'Фото', + take: 'Взяти', + retake: 'Перезняти', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Відскануйте QR-код за допомогою мобільної програми камери, щоб відкрити форму та зробити фото', wait_countdown_seconds: 'Зачекайте {countdown} секунд' } @@ -787,6 +807,10 @@ const cs = { upload: 'Nahrát', files: 'Soubory', signature_is_too_small_please_redraw: 'Podpis je příliš malý. Prosím, překreslete ho.', + photo: 'Fotografie', + take: 'Vezmi', + retake: 'Znovu získat', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Naskenujte QR kód pomocí mobilní aplikace pro fotoaparát, otevřete formulář a vyfotografujte', wait_countdown_seconds: 'Počkejte {countdown} sekund' } @@ -885,6 +909,10 @@ const pt = { upload: 'Carregar', files: 'Arquivos', signature_is_too_small_please_redraw: 'A assinatura é muito pequena. Por favor, redesenhe-a.', + photo: 'Foto', + take: 'Pegar', + retake: 'Retomar', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Escaneie o código QR com seu aplicativo de câmera móvel para abrir o formulário e tirar uma foto', wait_countdown_seconds: 'Aguarde {countdown} segundos' } @@ -1083,6 +1111,10 @@ const nl = { upload: 'Uploaden', files: 'Bestanden', signature_is_too_small_please_redraw: 'De handtekening is te klein. Teken deze opnieuw, alstublieft.', + photo: 'Foto', + take: 'Neem', + retake: 'Opnieuw nemen', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: 'Scan de QR-code met uw mobiele camera-app om het formulier te openen en een foto te maken', wait_countdown_seconds: 'Wacht {countdown} seconden' } @@ -1278,6 +1310,10 @@ const ko = { upload: '업로드', files: '파일', signature_is_too_small_please_redraw: '서명이 너무 작습니다. 다시 그려주세요.', + photo: '사진', + take: '가져가다', + retake: '재응시', + scan_the_qr_code_with_your_mobile_camera_app_to_open_the_form_and_take_a_photo: '모바일 카메라 앱으로 QR 코드를 스캔하여 양식을 열고 사진을 찍으세요.', wait_countdown_seconds: '{countdown}초 기다리세요' } diff --git a/app/javascript/template_builder/i18n.js b/app/javascript/template_builder/i18n.js index e24dfc4e..2ac526b2 100644 --- a/app/javascript/template_builder/i18n.js +++ b/app/javascript/template_builder/i18n.js @@ -314,7 +314,8 @@ const es = { some_fields_are_missing_in_the_formula: 'Faltan algunos campos en la fórmula.', learn_more: 'Aprende más', and: 'y', - or: 'o' + or: 'o', + only_with_camera: 'Sólo con cámara' } const it = { @@ -473,7 +474,8 @@ const it = { some_fields_are_missing_in_the_formula: 'Alcuni campi mancano nella formula.', learn_more: 'Scopri di più', and: 'e', - or: 'o' + or: 'o', + only_with_camera: 'Solo con fotocamera' } const pt = { @@ -632,7 +634,8 @@ const pt = { some_fields_are_missing_in_the_formula: 'Faltam alguns campos na fórmula.', learn_more: 'Saiba mais', and: 'e', - or: 'ou' + or: 'ou', + only_with_camera: 'Somente com câmera' } const fr = { @@ -791,7 +794,8 @@ const fr = { some_fields_are_missing_in_the_formula: 'Certains champs manquent dans la formule.', learn_more: 'En savoir plus', and: 'et', - or: 'ou' + or: 'ou', + only_with_camera: 'Uniquement avec la caméra' } const de = { @@ -950,7 +954,8 @@ const de = { some_fields_are_missing_in_the_formula: 'Einige Felder fehlen in der Formel.', learn_more: 'Erfahren Sie mehr', and: 'und', - or: 'oder' + or: 'oder', + only_with_camera: 'Nur mit Kamera' } export { en, es, it, pt, fr, de } diff --git a/config/locales/i18n.yml b/config/locales/i18n.yml index b6114300..28374e46 100644 --- a/config/locales/i18n.yml +++ b/config/locales/i18n.yml @@ -1075,6 +1075,7 @@ es: &es draw_signature: Dibujar firma clear: Limpiar signature_uploaded: Firma subida + photo_uploaded: Foto subida submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'La eliminación del envío es irreversible y eliminará permanentemente todos los documentos firmados asociados. ¿Estás seguro?' return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Vuelve a tu dispositivo de escritorio para completar el formulario o continúa en móvil' template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: La eliminación de la plantilla es irreversible y eliminará permanentemente todos los documentos firmados asociados. ¿Estás seguro? @@ -1757,6 +1758,7 @@ it: &it draw_signature: Disegna firma clear: Cancella signature_uploaded: Firma caricata + photo_uploaded: Foto caricata submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: "La cancellazione dell'invio è irreversibile e rimuoverà permanentemente tutti i documenti firmati associati. Sei sicuro?" return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Torna al tuo dispositivo desktop per completare il modulo o continua su mobile' template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: La cancellazione del modello è irreversibile e rimuoverà permanentemente tutti i documenti firmati associati. Sei sicuro? @@ -2441,6 +2443,7 @@ fr: &fr draw_signature: Dessiner la signature clear: Effacer signature_uploaded: Signature téléchargée + photo_uploaded: Photo téléchargée submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'La suppression de la soumission est irréversible et supprimera définitivement tous les documents signés associés. Êtes-vous sûr?' return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Retournez à votre appareil de bureau pour compléter le formulaire ou continuez sur mobile' template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: La suppression du modèle est irréversible et supprimera définitivement tous les documents signés associés. Êtes-vous sûr? @@ -3124,6 +3127,7 @@ pt: &pt draw_signature: Desenhar assinatura clear: Limpar signature_uploaded: Assinatura enviada + photo_uploaded: Foto enviada submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'A exclusão da submissão é irreversível e removerá permanentemente todos os documentos assinados associados a ela. Tem certeza?' return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Volte para seu dispositivo desktop para concluir o formulário ou continue no celular' template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: A exclusão do modelo é irreversível e removerá permanentemente todos os documentos assinados associados a ele. Tem certeza? @@ -3807,6 +3811,7 @@ de: &de draw_signature: Unterschrift zeichnen clear: Löschen signature_uploaded: Unterschrift hochgeladen + photo_uploaded: Foto hochgeladen submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'Das Löschen der Einreichung ist unwiderruflich und wird alle zugehörigen signierten Dokumente dauerhaft entfernen. Bist du sicher?' return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Gehe zurück zu deinem Desktop-Gerät, um das Formular abzuschließen, oder fahre auf dem Handy fort' template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: Die Vorlagenlöschung ist unwiderruflich und wird alle zugehörigen signierten Dokumente dauerhaft entfernen. Bist du sicher? From 4d8779a9a26c20008af79a60947a0a8efa423072 Mon Sep 17 00:00:00 2001 From: Vincent Barrier Date: Fri, 21 Feb 2025 20:54:45 +0100 Subject: [PATCH 11/11] Add only with camera --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 5f01e718..63ca72d8 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,8 @@ yarn-debug.log* /docuseal /ee dump.rdb +/custom/ +/docuseal.iml +/.idea/misc.xml +/.idea/modules.xml +/.idea/vcs.xml