diff --git a/app/controllers/account_configs_controller.rb b/app/controllers/account_configs_controller.rb
index de3e1826..0b67f714 100644
--- a/app/controllers/account_configs_controller.rb
+++ b/app/controllers/account_configs_controller.rb
@@ -14,7 +14,8 @@ class AccountConfigsController < ApplicationController
AccountConfig::DOWNLOAD_LINKS_AUTH_KEY,
AccountConfig::FORCE_SSO_AUTH_KEY,
AccountConfig::FLATTEN_RESULT_PDF_KEY,
- AccountConfig::WITH_SIGNATURE_ID
+ AccountConfig::WITH_SIGNATURE_ID,
+ AccountConfig::REQUIRE_SIGNING_REASON_KEY
].freeze
InvalidKey = Class.new(StandardError)
diff --git a/app/javascript/form.js b/app/javascript/form.js
index bc8d5e7e..3ee6f373 100644
--- a/app/javascript/form.js
+++ b/app/javascript/form.js
@@ -23,6 +23,7 @@ safeRegisterElement('submission-form', class extends HTMLElement {
dryRun: this.dataset.dryRun === 'true',
expand: ['true', 'false'].includes(this.dataset.expand) ? this.dataset.expand === 'true' : null,
withSignatureId: this.dataset.withSignatureId === 'true',
+ requireSigningReason: this.dataset.requireSigningReason === '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 814eb949..e7596862 100644
--- a/app/javascript/submission_form/area.vue
+++ b/app/javascript/submission_form/area.vue
@@ -75,7 +75,7 @@
ID: {{ signature.uuid }}
- {{ t('reason') }}: {{ t('digitally_signed_by') }} {{ submitter.name }}
+ {{ t('reason') }}: {{ values[field.preferences?.reason_field_uuid] || t('digitally_signed_by') }} {{ submitter.name }}
<{{ submitter.email }}>
@@ -258,6 +258,11 @@ export default {
required: false,
default: ''
},
+ values: {
+ type: Object,
+ required: false,
+ default: () => ({})
+ },
isActive: {
type: Boolean,
required: false,
diff --git a/app/javascript/submission_form/areas.vue b/app/javascript/submission_form/areas.vue
index 6e68efd0..8c8cbcd3 100644
--- a/app/javascript/submission_form/areas.vue
+++ b/app/javascript/submission_form/areas.vue
@@ -18,6 +18,7 @@
+
+
+
{
if (this.$refs.canvas) {
diff --git a/app/models/account_config.rb b/app/models/account_config.rb
index fb154902..affb7cc6 100644
--- a/app/models/account_config.rb
+++ b/app/models/account_config.rb
@@ -39,6 +39,7 @@ class AccountConfig < ApplicationRecord
FORCE_SSO_AUTH_KEY = 'force_sso_auth'
FLATTEN_RESULT_PDF_KEY = 'flatten_result_pdf'
WITH_SIGNATURE_ID = 'with_signature_id'
+ REQUIRE_SIGNING_REASON_KEY = 'require_signing_reason'
DEFAULT_VALUES = {
SUBMITTER_INVITATION_EMAIL_KEY => {
diff --git a/app/views/accounts/show.html.erb b/app/views/accounts/show.html.erb
index 0dc79e36..446c1993 100644
--- a/app/views/accounts/show.html.erb
+++ b/app/views/accounts/show.html.erb
@@ -63,6 +63,18 @@
<% end %>
<% end %>
+ <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::REQUIRE_SIGNING_REASON_KEY) %>
+ <% if can?(:manage, account_config) %>
+ <%= form_for account_config, url: account_configs_path, method: :post do |f| %>
+ <%= f.hidden_field :key %>
+
+
+ Require signing reason
+
+ <%= 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 b8cb6517..2c70ae19 100644
--- a/app/views/submissions/_value.html.erb
+++ b/app/views/submissions/_value.html.erb
@@ -11,7 +11,7 @@
ID: <%= attachment.uuid %>
- <%= t('reason') %>: <%= t('digitally_signed_by') %> <%= submitter.name %>
+ <%= t('reason') %>: <%= submitter.values[field.dig('preferences', 'reason_field_uuid')].presence || t('digitally_signed_by') %> <%= submitter.name %>
<% if submitter.email %>
<<%= submitter.email %>>
<% end %>
diff --git a/app/views/submit_form/_submission_form.html.erb b/app/views/submit_form/_submission_form.html.erb
index 7fbd6ccd..9a9012b6 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 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 898c615b..cb70e844 100644
--- a/app/views/submit_form/show.html.erb
+++ b/app/views/submit_form/show.html.erb
@@ -2,6 +2,7 @@
<% content_for(:html_description, "#{@submitter.account.name} has invited you to fill and sign documents online effortlessly with a secure, fast, and user-friendly digital document signing solution.") %>
<% fields_index = Templates.build_field_areas_index(@submitter.submission.template_fields || @submitter.submission.template.fields) %>
<% values = @submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) } %>
+<% submitters_index = @submitter.submission.submitters.index_by(&:uuid) %>
<% page_blob_struct = Struct.new(:url, :metadata, keyword_init: true) %>
@@ -28,7 +29,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, submitter: @submitter, with_signature_id: @form_configs[:with_signature_id] %>
+ <%= render 'submissions/value', area:, field:, attachments_index: @attachments_index, value:, locale: @submitter.account.locale, timezone: @submitter.account.timezone, submitter: submitters_index[field['submitter_uuid']], with_signature_id: @form_configs[:with_signature_id] %>
<% end %>
diff --git a/lib/submissions/generate_result_attachments.rb b/lib/submissions/generate_result_attachments.rb
index eae717a1..dcce2608 100644
--- a/lib/submissions/generate_result_attachments.rb
+++ b/lib/submissions/generate_result_attachments.rb
@@ -184,7 +184,7 @@ module Submissions
canvas.font(FONT_NAME, size: font_size)
case field['type']
- when ->(type) { type == 'signature' && with_signature_id }
+ when ->(type) { type == 'signature' && (with_signature_id || field.dig('preferences', 'reason_field_uuid')) }
attachment = submitter.attachments.find { |a| a.uuid == value }
attachments_data_cache[attachment.uuid] ||= attachment.download
@@ -207,8 +207,10 @@ module Submissions
break if id_string.length < 8
end
+ reason_value = submitter.values[field.dig('preferences', 'reason_field_uuid')].presence
+
reason_string =
- "#{I18n.t('reason')}: #{I18n.t('digitally_signed_by')} " \
+ "#{I18n.t('reason')}: #{reason_value || 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)} " \
diff --git a/lib/submitters/form_configs.rb b/lib/submitters/form_configs.rb
index 19cf9dc9..6459e02d 100644
--- a/lib/submitters/form_configs.rb
+++ b/lib/submitters/form_configs.rb
@@ -7,6 +7,7 @@ module Submitters
AccountConfig::FORM_WITH_CONFETTI_KEY,
AccountConfig::FORM_PREFILL_SIGNATURE_KEY,
AccountConfig::WITH_SIGNATURE_ID,
+ AccountConfig::REQUIRE_SIGNING_REASON_KEY,
AccountConfig::ALLOW_TYPED_SIGNATURE].freeze
module_function
@@ -20,11 +21,13 @@ module Submitters
with_confetti = find_safe_value(configs, AccountConfig::FORM_WITH_CONFETTI_KEY) != false
prefill_signature = find_safe_value(configs, AccountConfig::FORM_PREFILL_SIGNATURE_KEY) != false
with_signature_id = find_safe_value(configs, AccountConfig::WITH_SIGNATURE_ID) == true
+ require_signing_reason = find_safe_value(configs, AccountConfig::REQUIRE_SIGNING_REASON_KEY) == true
attrs = { completed_button:,
with_typed_signature:,
with_confetti:,
completed_message:,
+ require_signing_reason:,
prefill_signature:,
with_signature_id: }
diff --git a/lib/submitters/submit_values.rb b/lib/submitters/submit_values.rb
index 1392ba81..19c3bd3b 100644
--- a/lib/submitters/submit_values.rb
+++ b/lib/submitters/submit_values.rb
@@ -35,6 +35,7 @@ module Submitters
assign_completed_attributes(submitter, request) if params[:completed] == 'true'
ApplicationRecord.transaction do
+ maybe_set_signature_reason!(values, submitter, params)
validate_values!(values, submitter, params, request)
SubmissionEvents.create_with_tracking_data(submitter, 'complete_form', request) if params[:completed] == 'true'
@@ -59,6 +60,31 @@ module Submitters
submitter
end
+ def maybe_set_signature_reason!(values, submitter, params)
+ return if params[:with_reason].blank?
+
+ reason_field_uuid = params[:with_reason]
+ signature_field_uuid = values.except(reason_field_uuid).keys.first
+
+ signature_field = submitter.submission.template_fields.find { |e| e['uuid'] == signature_field_uuid }
+
+ signature_field['preferences'] ||= {}
+ signature_field['preferences']['reason_field_uuid'] = reason_field_uuid
+
+ unless submitter.submission.template_fields.find { |e| e['uuid'] == reason_field_uuid }
+ reason_field = { 'type' => 'text',
+ 'uuid' => reason_field_uuid,
+ 'name' => I18n.t(:reason),
+ 'readonly' => true,
+ 'submitter_uuid' => submitter.uuid }
+
+ submitter.submission.template_fields.insert(submitter.submission.template_fields.index(signature_field) + 1,
+ reason_field)
+ end
+
+ submitter.submission.save!
+ end
+
def normalized_values(params)
params.fetch(:values, {}).to_unsafe_h.transform_values do |v|
if params[:cast_boolean] == 'true'