From 43db15b350ab7d7d1e20224cfe8ea6bb035aa468 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Wed, 24 Jul 2024 20:55:35 +0300 Subject: [PATCH] add signature id --- app/controllers/account_configs_controller.rb | 3 +- app/controllers/api/attachments_controller.rb | 2 +- .../submit_form_values_controller.rb | 2 +- app/javascript/form.js | 1 + app/javascript/submission_form/area.vue | 41 +++++++++- app/javascript/submission_form/areas.vue | 11 +++ app/javascript/submission_form/form.vue | 7 ++ app/javascript/submission_form/i18n.js | 26 ++++++ app/models/account_config.rb | 1 + app/views/accounts/show.html.erb | 12 +++ app/views/submissions/_value.html.erb | 24 +++++- app/views/submissions/show.html.erb | 4 +- .../submit_form/_submission_form.html.erb | 4 +- app/views/submit_form/show.html.erb | 2 +- config/locales/en.yml | 13 +++ lib/submissions/generate_audit_trail.rb | 4 + .../generate_result_attachments.rb | 82 +++++++++++++++++++ lib/submitters/form_configs.rb | 11 ++- 18 files changed, 237 insertions(+), 13 deletions(-) diff --git a/app/controllers/account_configs_controller.rb b/app/controllers/account_configs_controller.rb index 6f96a934..de3e1826 100644 --- a/app/controllers/account_configs_controller.rb +++ b/app/controllers/account_configs_controller.rb @@ -13,7 +13,8 @@ class AccountConfigsController < ApplicationController AccountConfig::FORM_WITH_CONFETTI_KEY, AccountConfig::DOWNLOAD_LINKS_AUTH_KEY, AccountConfig::FORCE_SSO_AUTH_KEY, - AccountConfig::FLATTEN_RESULT_PDF_KEY + AccountConfig::FLATTEN_RESULT_PDF_KEY, + AccountConfig::WITH_SIGNATURE_ID ].freeze InvalidKey = Class.new(StandardError) diff --git a/app/controllers/api/attachments_controller.rb b/app/controllers/api/attachments_controller.rb index 49a7b06d..eacabbd6 100644 --- a/app/controllers/api/attachments_controller.rb +++ b/app/controllers/api/attachments_controller.rb @@ -16,7 +16,7 @@ module Api cookies.encrypted[:signature_uuids] = build_new_cookie_signatures_json(submitter, attachment) end - render json: attachment.as_json(only: %i[uuid], methods: %i[url filename content_type]) + render json: attachment.as_json(only: %i[uuid created_at], methods: %i[url filename content_type]) end def build_new_cookie_signatures_json(submitter, attachment) diff --git a/app/controllers/submit_form_values_controller.rb b/app/controllers/submit_form_values_controller.rb index ecc21817..e46cf2f6 100644 --- a/app/controllers/submit_form_values_controller.rb +++ b/app/controllers/submit_form_values_controller.rb @@ -15,7 +15,7 @@ class SubmitFormValuesController < ApplicationController render json: { value:, - attachment: attachment&.as_json(only: %i[uuid], methods: %i[url filename content_type]) + attachment: attachment&.as_json(only: %i[uuid created_at], methods: %i[url filename content_type]) }, head: :ok end end diff --git a/app/javascript/form.js b/app/javascript/form.js index be9cc256..bc8d5e7e 100644 --- a/app/javascript/form.js +++ b/app/javascript/form.js @@ -22,6 +22,7 @@ safeRegisterElement('submission-form', class extends HTMLElement { scrollPadding: this.dataset.scrollPadding || '-80px', dryRun: this.dataset.dryRun === 'true', expand: ['true', 'false'].includes(this.dataset.expand) ? this.dataset.expand === 'true' : null, + withSignatureId: this.dataset.withSignatureId === 'true', withConfetti: this.dataset.withConfetti !== 'false', withDisclosure: this.dataset.withDisclosure === 'true', withTypedSignature: this.dataset.withTypedSignature !== 'false', diff --git a/app/javascript/submission_form/area.vue b/app/javascript/submission_form/area.vue index aabda8bf..19f79a81 100644 --- a/app/javascript/submission_form/area.vue +++ b/app/javascript/submission_form/area.vue @@ -54,11 +54,37 @@ class="object-contain mx-auto" :src="stamp.url" > - +
+ +
+
+
+ ID: {{ signature.uuid }} +
+
+ {{ t('reason') }}: {{ t('digitally_signed_by') }} {{ submitter.name }} + +
+
+ {{ new Date(signature.created_at).toLocaleString(undefined, { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', timeZoneName: 'short' }) }} +
+
+ [] }, + withSignatureId: { + type: Boolean, + required: false, + default: false + }, + submitter: { + type: Object, + required: true + }, values: { type: Object, required: false, diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue index bc11a963..7dd3b86a 100644 --- a/app/javascript/submission_form/form.vue +++ b/app/javascript/submission_form/form.vue @@ -4,7 +4,9 @@ :steps="stepFields" :values="values" :with-field-placeholder="withFieldPlaceholder" + :submitter="submitter" :scroll-el="scrollEl" + :with-signature-id="withSignatureId" :attachments-index="attachmentsIndex" :with-label="!isAnonymousChecboxes && showFieldNames" :current-step="currentStepFields" @@ -535,6 +537,11 @@ export default { type: Object, required: true }, + withSignatureId: { + type: Boolean, + required: false, + default: false + }, scrollPadding: { type: String, required: false, diff --git a/app/javascript/submission_form/i18n.js b/app/javascript/submission_form/i18n.js index ba4b10d9..53fc3ec0 100644 --- a/app/javascript/submission_form/i18n.js +++ b/app/javascript/submission_form/i18n.js @@ -15,6 +15,8 @@ const en = { take_photo: 'Take photo', number_phone_is_invalid: '{number} phone is invalid', file: 'File', + digitally_signed_by: 'Digitally signed by', + reason: 'Reason', select: 'Select', checkbox: 'Checkbox', multiple: 'Multiple', @@ -83,6 +85,8 @@ const es = { text: 'Texto', signature: 'Firma', pay: 'Pagar', + digitally_signed_by: 'Firmado digitalmente por', + reason: 'Razón', initials: 'Iniciales', date: 'Fecha', number: 'Número', @@ -155,6 +159,8 @@ const it = { already_paid: 'Pagato', text: 'Testo', signature: 'Firma', + digitally_signed_by: 'Firmato digitalmente da', + reason: 'Motivo', initials: 'Iniziali', date: 'Data', number: 'Numero', @@ -228,6 +234,8 @@ const de = { minimize: 'Minimieren', text: 'Text', signature: 'Unterschrift', + digitally_signed_by: 'Digital unterschrieben von', + reason: 'Grund', initials: 'Initialen', date: 'Datum', number: 'Nummer', @@ -302,6 +310,8 @@ const fr = { already_paid: 'Déjà payé', signature: 'Signature', initials: 'Initiales', + digitally_signed_by: 'Signé numériquement par', + reason: 'Raison', pay: 'Payer', date: 'Date', number: 'Numéro', @@ -373,6 +383,8 @@ const pl = { minimize: 'Zminimalizuj', text: 'Tekst', already_paid: 'Już zapłacono', + digitally_signed_by: 'Podpisano cyfrowo przez', + reason: 'Powód', signature: 'Podpis', initials: 'Inicjały', date: 'Data', @@ -447,6 +459,8 @@ const uk = { text: 'Текст', already_paid: 'Вже оплачено', signature: 'Підпис', + digitally_signed_by: 'Підписано в електронному вигляді', + reason: 'Причина', initials: 'Ініціали', date: 'Дата', number: 'Число', @@ -523,6 +537,8 @@ const cs = { initials: 'Iniciály', date: 'Datum', number: 'Číslo', + digitally_signed_by: 'Digitálně podepsáno', + reason: 'Důvod', image: 'Obrázek', pay: 'Zaplatit', file: 'Soubor', @@ -594,6 +610,8 @@ const pt = { text: 'Texto', signature: 'Assinatura', initials: 'Iniciais', + digitally_signed_by: 'Assinado digitalmente por', + reason: 'Razão', date: 'Data', number: 'Número', image: 'Imagem', @@ -668,6 +686,8 @@ const he = { signature: 'חתימה', initials: 'ראשי תיבות', date: 'תאריך', + digitally_signed_by: 'חתום דיגיטלית על ידי', + reason: 'סיבה', number: 'מספר', image: 'תמונה', file: 'קובץ', @@ -740,6 +760,8 @@ const nl = { text: 'Tekst', already_paid: 'Al betaald', signature: 'Handtekening', + digitally_signed_by: 'Digitaal ondertekend door', + reason: 'Reden', initials: 'Initialen', date: 'Datum', number: 'Nummer', @@ -815,6 +837,8 @@ const ar = { initials: 'الاختصارات', date: 'تاريخ', number: 'رقم', + digitally_signed_by: 'تم التوقيع رقميًا بواسطة', + reason: 'السبب', image: 'صورة', take_photo: 'التقاط صورة', pay: 'دفع', @@ -888,6 +912,8 @@ const ko = { signature: '서명', initials: '이니셜', date: '날짜', + digitally_signed_by: '디지털 서명이 완료되었습니다', + reason: '이유', number: '숫자', pay: '급여', image: '이미지', diff --git a/app/models/account_config.rb b/app/models/account_config.rb index 4e345170..fb154902 100644 --- a/app/models/account_config.rb +++ b/app/models/account_config.rb @@ -38,6 +38,7 @@ class AccountConfig < ApplicationRecord DOWNLOAD_LINKS_AUTH_KEY = 'download_links_auth' FORCE_SSO_AUTH_KEY = 'force_sso_auth' FLATTEN_RESULT_PDF_KEY = 'flatten_result_pdf' + WITH_SIGNATURE_ID = 'with_signature_id' DEFAULT_VALUES = { SUBMITTER_INVITATION_EMAIL_KEY => { diff --git a/app/views/accounts/show.html.erb b/app/views/accounts/show.html.erb index 9e27a4c9..0dc79e36 100644 --- a/app/views/accounts/show.html.erb +++ b/app/views/accounts/show.html.erb @@ -51,6 +51,18 @@ <% end %> <% end %> + <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::WITH_SIGNATURE_ID) %> + <% if can?(:manage, account_config) %> + <%= form_for account_config, url: account_configs_path, method: :post do |f| %> + <%= f.hidden_field :key %> +
+ + Add signature ID to the documents + + <%= f.check_box :value, class: 'toggle', checked: account_config.value, onchange: 'this.form.requestSubmit()' %> +
+ <% end %> + <% end %> <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::ALLOW_TYPED_SIGNATURE) %> <% if can?(:manage, account_config) %> <%= form_for account_config, url: account_configs_path, method: :post do |f| %> diff --git a/app/views/submissions/_value.html.erb b/app/views/submissions/_value.html.erb index 183984db..ea178391 100644 --- a/app/views/submissions/_value.html.erb +++ b/app/views/submissions/_value.html.erb @@ -1,6 +1,28 @@ <% align = field.dig('preferences', 'align') %> "> - <% if field['type'].in?(['signature', 'image', 'initials', 'stamp']) %> + <% if field['type'] == 'signature' %> +
+
+ +
+ <% if local_assigns[:with_signature_id] && attachment = attachments_index[value] %> +
+
+ ID: <%= attachment.uuid %> +
+
+ <%= t('reason') %>: <%= t('digitally_signed_by') %> <%= submitter.name %> + <% if submitter.email %> + <<%= submitter.email %>> + <% end %> +
+
+ <%= l(attachment.created_at.in_time_zone(local_assigns[:timezone]), format: :long, locale: local_assigns[:locale]) %> <%= TimeUtils.timezone_abbr(local_assigns[:timezone], attachment.created_at) %> +
+
+ <% end %> +
+ <% elsif field['type'].in?(['image', 'initials', 'stamp']) %> <% elsif field['type'].in?(['file', 'payment']) %> diff --git a/app/views/submissions/show.html.erb b/app/views/submissions/show.html.erb index e746da26..4fe01ca2 100644 --- a/app/views/submissions/show.html.erb +++ b/app/views/submissions/show.html.erb @@ -1,6 +1,7 @@ <% if params[:controller] == 'submissions_preview' %> <%= render 'submissions/preview_tags' %> <% end %> +<% with_signature_id = @submission.account.account_configs.exists?(key: AccountConfig::WITH_SIGNATURE_ID, value: true) %>
@@ -73,6 +74,7 @@
<% fields_index = Templates.build_field_areas_index(@submission.template_fields || @submission.template.fields) %> + <% submitters_index = @submission.submitters.index_by(&:uuid) %> <% values = @submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) } %> <% attachments_index = ActiveStorage::Attachment.where(record: @submission.submitters, name: :attachments).preload(:blob).index_by(&:uuid) %> <% page_blob_struct = Struct.new(:url, :metadata, keyword_init: true) %> @@ -92,7 +94,7 @@ <% fields_index.dig(document.uuid, index)&.each do |(area, field)| %> <% value = values[field['uuid']] %> <% next if value.blank? %> - <%= render 'submissions/value', area:, field:, attachments_index:, value:, locale: @submission.account.locale, timezone: @submission.account.timezone %> + <%= render 'submissions/value', area:, field:, attachments_index:, value:, locale: @submission.account.locale, timezone: @submission.account.timezone, submitter: submitters_index[field['submitter_uuid']], with_signature_id: %> <% end %>
diff --git a/app/views/submit_form/_submission_form.html.erb b/app/views/submit_form/_submission_form.html.erb index 2af279f8..7fbd6ccd 100644 --- a/app/views/submit_form/_submission_form.html.erb +++ b/app/views/submit_form/_submission_form.html.erb @@ -1,3 +1,3 @@ -<% data_attachments = attachments_index.values.select { |e| e.record_id == submitter.id }.to_json(only: %i[uuid], methods: %i[url filename content_type]) %> +<% data_attachments = attachments_index.values.select { |e| e.record_id == submitter.id }.to_json(only: %i[uuid created_at], methods: %i[url filename content_type]) %> <% data_fields = (submitter.submission.template_fields || submitter.submission.template.fields).select { |f| f['submitter_uuid'] == submitter.uuid }.to_json %> - + diff --git a/app/views/submit_form/show.html.erb b/app/views/submit_form/show.html.erb index d7d4c19e..898c615b 100644 --- a/app/views/submit_form/show.html.erb +++ b/app/views/submit_form/show.html.erb @@ -28,7 +28,7 @@ <% next if field['redacted'] && field['submitter_uuid'] != @submitter.uuid %> <% next if value == '{{date}}' && field['submitter_uuid'] != @submitter.uuid %> <% next if field.dig('preferences', 'formula').present? && field['submitter_uuid'] == @submitter.uuid %> - <%= render 'submissions/value', area:, field:, attachments_index: @attachments_index, value:, locale: @submitter.account.locale, timezone: @submitter.account.timezone %> + <%= render 'submissions/value', area:, field:, attachments_index: @attachments_index, value:, locale: @submitter.account.locale, timezone: @submitter.account.timezone, submitter: @submitter, with_signature_id: @form_configs[:with_signature_id] %> <% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index bcf4e2f7..94f818ad 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -22,6 +22,7 @@ en: &en verification_code_code: 'Verification code: %{code}' digitally_signed_by: Digitally signed by role: Role + reason: Reason provide_your_email_to_start: Provide your email to start start: Start starting: Starting @@ -64,6 +65,7 @@ en: &en es: &es role: Rol + reason: Razón verification_code_code: 'Código de verificación: %{code}' email: Correo electrónico digitally_signed_by: Firmado digitalmente por @@ -106,6 +108,7 @@ es: &es it: &it role: Rôle + reason: Ragione verification_code_code: 'Codice di verifica: %{code}' email: Email digitally_signed_by: Firmato digitalmente da @@ -149,6 +152,7 @@ fr: &fr email: Email verification_code_code: 'Code de vérification: %{code}' digitally_signed_by: Signé numériquement par + reason: Raison role: Rôle provide_your_email_to_start: Entrez votre adresse email pour commencer start: Démarrer @@ -189,6 +193,7 @@ fr: &fr pt: &pt role: Função email: Email + reason: Razão verification_code_code: 'Código de verificação: %{code}' digitally_signed_by: Assinado digitalmente por role: Função @@ -230,6 +235,7 @@ pt: &pt de: &de role: Rolle verification_code_code: 'Verifizierungscode: %{code}' + reason: Grund email: E-Mail digitally_signed_by: Digital signiert von role: Rolle @@ -275,6 +281,7 @@ pl: role: Rola provide_your_email_to_start: Podaj swój adres email, aby rozpocząć start: Rozpocznij + reason: Powód starting: Rozpoczynanie form_has_been_deleted_by_html: 'Formularz został usunięty przez %{name}.' invited_by_html: 'Zaproszony przez %{name}' @@ -315,6 +322,7 @@ uk: role: Роль provide_your_email_to_start: Введіть свій email, щоб почати start: Почати + reason: Причина starting: Початок form_has_been_deleted_by_html: 'Форму було видалено користувачем %{name}.' invited_by_html: 'Запрошений користувачем %{name}' @@ -354,6 +362,7 @@ cs: verification_code_code: 'Ověřovací kód: %{code}' role: Role provide_your_email_to_start: Zadejte svůj email pro zahájení + reason: Důvod start: Zahájit starting: Zahajování form_has_been_deleted_by_html: 'Formulář byl smazán uživatelem %{name}.' @@ -392,6 +401,7 @@ he: email: דוא"ל digitally_signed_by: חתום דיגיטלית על ידי role: תפקיד + reason: סיבה verification_code_code: 'קוד אימות: %{code}' provide_your_email_to_start: ספק את כתובת הדוא"ל שלך כדי להתחיל start: התחל @@ -435,6 +445,7 @@ nl: verification_code_code: 'Verificatiecode: %{code}' provide_your_email_to_start: Geef uw e-mailadres om te beginnen start: Start + reason: Reden starting: Starten form_has_been_deleted_by_html: 'Formulier is verwijderd door %{name}.' invited_by_html: 'Uitgenodigd door %{name}' @@ -478,6 +489,7 @@ ar: starting: بداية verification_code_code: 'رمز التحقق: %{code}' form_has_been_deleted_by_html: 'تم حذف الاستمارة بواسطة %{name}.' + reason: سبب invited_by_html: 'تمت الدعوة بواسطة %{name}' you_have_been_invited_to_submit_a_form: تمت دعوتك لتقديم استمارة signed_on_time: 'تم التوقيع في %{time}' @@ -516,6 +528,7 @@ ko: role: 역할 provide_your_email_to_start: 시작하려면 이메일을 제공하세요 start: 시작 + reason: 이유 starting: 시작 중 form_has_been_deleted_by_html: '%{name}에 의해 양식이 삭제되었습니다.' invited_by_html: '%{name}에 의해 초대되었습니다.' diff --git a/lib/submissions/generate_audit_trail.rb b/lib/submissions/generate_audit_trail.rb index c66cdbef..3ab663ca 100644 --- a/lib/submissions/generate_audit_trail.rb +++ b/lib/submissions/generate_audit_trail.rb @@ -102,6 +102,8 @@ module Submissions .rectangle(0, 0, box.width, 20) .rectangle(0, box.height - 20, box.width, 20) .fill + + maybe_add_background(canvas, submission, page_size) end style.frame = style.create_frame(canvas.context, 50) end @@ -336,6 +338,8 @@ module Submissions 'Signed with DocuSeal.co' end + def maybe_add_background(_canvas, _submission, _page_size); end + def add_logo(column, _submission = nil) column.image(PdfIcons.logo_io, width: 40, height: 40, position: :float) diff --git a/lib/submissions/generate_result_attachments.rb b/lib/submissions/generate_result_attachments.rb index 5a6a0c6e..35cbd085 100644 --- a/lib/submissions/generate_result_attachments.rb +++ b/lib/submissions/generate_result_attachments.rb @@ -88,6 +88,9 @@ module Submissions def generate_pdfs(submitter) cell_layouter = HexaPDF::Layout::TextLayouter.new(text_valign: :center, text_align: :center) + with_signature_id = submitter.account.account_configs + .exists?(key: AccountConfig::WITH_SIGNATURE_ID, value: true) + is_flatten = submitter.account.account_configs .find_or_initialize_by(key: AccountConfig::FLATTEN_RESULT_PDF_KEY).value != false @@ -97,6 +100,22 @@ module Submissions pdfs_index = build_pdfs_index(submitter, flatten: is_flatten) + if with_signature_id + pdfs_index.each_value do |pdf| + next if pdf.trailer.info[:DocumentID].present? + + pdf.trailer.info[:DocumentID] = Digest::MD5.hexdigest(submitter.submission.slug).upcase + pdf.pages.each do |page| + font_size = (([page.box.width, page.box.height].min / A4_SIZE[0].to_f) * 9).to_i + cnv = page.canvas(type: :overlay) + + cnv.font(FONT_NAME, size: font_size) + cnv.text("Document ID: #{Digest::MD5.hexdigest(submitter.submission.slug).upcase}", + at: [2, 4]) + end + end + end + submitter.submission.template_fields.each do |field| next if field['submitter_uuid'] != submitter.uuid @@ -150,6 +169,69 @@ module Submissions canvas.font(FONT_NAME, size: font_size) case field['type'] + when ->(type) { type == 'signature' && with_signature_id } + attachment = submitter.attachments.find { |a| a.uuid == value } + + attachments_data_cache[attachment.uuid] ||= attachment.download + + image = Vips::Image.new_from_buffer(attachments_data_cache[attachment.uuid], '').autorot + + id_string = "ID: #{attachment.uuid}".upcase + + while true + text = HexaPDF::Layout::TextFragment.create(id_string, + font:, + font_size: (font_size / 1.8).to_i) + + result = layouter.fit([text], area['w'] * width, (font_size / 1.8) / 0.65) + + break if result.status == :success + + id_string = "#{id_string.delete_suffix('...')[0..-2]}..." + + break if id_string.length < 8 + end + + reason_string = + "#{I18n.t('reason')}: #{I18n.t('digitally_signed_by')} " \ + "#{submitter.name}#{submitter.email.present? ? " <#{submitter.email}>" : ''}\n" \ + "#{I18n.l(attachment.created_at.in_time_zone(submitter.account.timezone), + format: :long, locale: submitter.account.locale)} " \ + "#{TimeUtils.timezone_abbr(submitter.account.timezone, attachment.created_at)}" + + reason_text = HexaPDF::Layout::TextFragment.create(reason_string, + font:, + font_size: (font_size / 1.8).to_i) + + reason_result = layouter.fit([reason_text], area['w'] * width, height) + + text_height = result.lines.sum(&:height) + reason_result.lines.sum(&:height) + + image_height = (area['h'] * height) - text_height + image_height = (area['h'] * height) / 2 if image_height < (area['h'] * height) / 2 + + scale = [(area['w'] * width) / image.width, image_height / image.height].min + + io = StringIO.new(image.resize([scale * 4, 1].select(&:positive?).min).write_to_buffer('.png')) + + layouter.fit([text], area['w'] * width, (font_size / 1.8) / 0.65) + .draw(canvas, (area['x'] * width) + TEXT_LEFT_MARGIN, + height - (area['y'] * height) - TEXT_TOP_MARGIN - image_height) + + layouter.fit([reason_text], area['w'] * width, reason_result.lines.sum(&:height)) + .draw(canvas, (area['x'] * width) + TEXT_LEFT_MARGIN, + height - (area['y'] * height) - TEXT_TOP_MARGIN - + result.lines.sum(&:height) - image_height) + + canvas.image( + io, + at: [ + (area['x'] * width) + (area['w'] * width / 2) - ((image.width * scale) / 2), + height - (area['y'] * height) - (image.height * scale / 2) - (image_height / 2) + ], + width: image.width * scale, + height: image.height * scale + ) when 'image', 'signature', 'initials', 'stamp' attachment = submitter.attachments.find { |a| a.uuid == value } diff --git a/lib/submitters/form_configs.rb b/lib/submitters/form_configs.rb index 000be8a1..19cf9dc9 100644 --- a/lib/submitters/form_configs.rb +++ b/lib/submitters/form_configs.rb @@ -6,6 +6,7 @@ module Submitters AccountConfig::FORM_COMPLETED_MESSAGE_KEY, AccountConfig::FORM_WITH_CONFETTI_KEY, AccountConfig::FORM_PREFILL_SIGNATURE_KEY, + AccountConfig::WITH_SIGNATURE_ID, AccountConfig::ALLOW_TYPED_SIGNATURE].freeze module_function @@ -18,8 +19,14 @@ module Submitters with_typed_signature = find_safe_value(configs, AccountConfig::ALLOW_TYPED_SIGNATURE) != false with_confetti = find_safe_value(configs, AccountConfig::FORM_WITH_CONFETTI_KEY) != false prefill_signature = find_safe_value(configs, AccountConfig::FORM_PREFILL_SIGNATURE_KEY) != false - - attrs = { completed_button:, with_typed_signature:, with_confetti:, completed_message:, prefill_signature: } + with_signature_id = find_safe_value(configs, AccountConfig::WITH_SIGNATURE_ID) == true + + attrs = { completed_button:, + with_typed_signature:, + with_confetti:, + completed_message:, + prefill_signature:, + with_signature_id: } keys.each do |key| attrs[key.to_sym] = configs.find { |e| e.key == key.to_s }&.value