From 94d5ab4ace08dd4826e78da389aa3d2c9e51f2c8 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Tue, 6 Aug 2024 00:19:33 +0300 Subject: [PATCH] add reason --- app/controllers/account_configs_controller.rb | 3 +- app/javascript/form.js | 1 + app/javascript/submission_form/area.vue | 7 +- app/javascript/submission_form/areas.vue | 1 + app/javascript/submission_form/form.vue | 8 ++ app/javascript/submission_form/i18n.js | 104 ++++++++++++++++++ .../submission_form/signature_step.vue | 70 +++++++++++- app/models/account_config.rb | 1 + app/views/accounts/show.html.erb | 12 ++ app/views/submissions/_value.html.erb | 2 +- .../submit_form/_submission_form.html.erb | 2 +- app/views/submit_form/show.html.erb | 3 +- .../generate_result_attachments.rb | 6 +- lib/submitters/form_configs.rb | 3 + lib/submitters/submit_values.rb | 26 +++++ 15 files changed, 241 insertions(+), 8 deletions(-) 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 }} @@ -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'