From b94dbc75b76f505af343429559ee2aa6ed63f726 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Fri, 29 Dec 2023 18:54:48 +0200 Subject: [PATCH] preserve default values on resubmit --- app/controllers/api/submitters_controller.rb | 4 +++- app/controllers/start_form_controller.rb | 14 ++++++++++++- app/views/start_form/completed.html.erb | 2 +- app/views/submit_form/completed.html.erb | 2 +- lib/submissions/create_from_submitters.rb | 21 +++++++++++++++++++- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/submitters_controller.rb b/app/controllers/api/submitters_controller.rb index 179a1aac..df8857e9 100644 --- a/app/controllers/api/submitters_controller.rb +++ b/app/controllers/api/submitters_controller.rb @@ -80,7 +80,7 @@ module Api def assign_submitter_attrs(submitter, attrs) submitter.email = Submissions.normalize_email(attrs[:email]) if attrs.key?(:email) submitter.phone = attrs[:phone].to_s.gsub(/[^0-9+]/, '') if attrs.key?(:phone) - submitter.values = submitter.values.merge(attrs[:values].to_unsafe_h) if attrs[:values] + submitter.values = submitter.values.merge(attrs[:values].to_unsafe_h) if attrs[:values].present? submitter.completed_at = attrs[:completed] ? Time.current : submitter.completed_at submitter.application_key = attrs[:application_key] if attrs.key?(:application_key) @@ -98,6 +98,8 @@ module Api def assign_preferences(submitter, attrs) submitter_preferences = Submitters.normalize_preferences(submitter.account, current_user, attrs) + submitter.preferences['default_values'] = attrs[:values].to_unsafe_h if attrs[:values].present? + if submitter_preferences.key?('send_email') submitter.preferences['send_email'] = submitter_preferences['send_email'] end diff --git a/app/controllers/start_form_controller.rb b/app/controllers/start_form_controller.rb index 938ca2ab..0586d7da 100644 --- a/app/controllers/start_form_controller.rb +++ b/app/controllers/start_form_controller.rb @@ -46,13 +46,25 @@ class StartFormController < ApplicationController private def assign_submission_attributes(submitter, template) + resubmit_submitter = + if params[:resubmit].present? + Submitter.where(submission: @template.submissions).find_by(slug: params[:resubmit]) + end + submitter.assign_attributes( uuid: template.submitters.first['uuid'], ip: request.remote_ip, ua: request.user_agent, - preferences: { 'send_email' => true } + values: resubmit_submitter&.preferences&.fetch('default_values', nil) || {}, + preferences: resubmit_submitter&.preferences.presence || { 'send_email' => true } ) + if submitter.values.present? + resubmit_submitter.attachments.each do |attachment| + submitter.attachments << attachment.dup if submitter.values.value?(attachment.uuid) + end + end + submitter.submission ||= Submission.new(template:, template_submitters: template.submitters, source: :link) diff --git a/app/views/start_form/completed.html.erb b/app/views/start_form/completed.html.erb index 7259521c..145f2ba1 100644 --- a/app/views/start_form/completed.html.erb +++ b/app/views/start_form/completed.html.erb @@ -26,7 +26,7 @@ <% end %> <% if @template.submitters.to_a.size == 1 %>
- <%= button_to button_title(title: 'Resubmit', disabled_with: 'Resubmit', icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@template.slug), params: { submitter: { email: params[:email] }, resubmit: true }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %> + <%= button_to button_title(title: 'Resubmit', disabled_with: 'Resubmit', icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@template.slug), params: { submitter: { email: params[:email] }, resubmit: @submitter.slug }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %>
<% end %> diff --git a/app/views/submit_form/completed.html.erb b/app/views/submit_form/completed.html.erb index 229ffcb9..3dc8ce2c 100644 --- a/app/views/submit_form/completed.html.erb +++ b/app/views/submit_form/completed.html.erb @@ -39,7 +39,7 @@ <% if @submitter.submission.template.submitters.size == 1 %>
OR
- <%= button_to button_title(title: 'Resubmit', disabled_with: 'Resubmit', icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@submitter.submission.template.slug), params: { submitter: { email: @submitter.email, phone: @submitter.phone, name: @submitter.name }, resubmit: true }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %> + <%= button_to button_title(title: 'Resubmit', disabled_with: 'Resubmit', icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@submitter.submission.template.slug), params: { submitter: { email: @submitter.email, phone: @submitter.phone, name: @submitter.name }, resubmit: @submitter.slug }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %>
<% end %> diff --git a/lib/submissions/create_from_submitters.rb b/lib/submissions/create_from_submitters.rb index 6863f35d..5e166f65 100644 --- a/lib/submissions/create_from_submitters.rb +++ b/lib/submissions/create_from_submitters.rb @@ -46,6 +46,7 @@ module Submissions submitter_uuid ||= find_submitter_uuid(submission.template, submitter_attrs, index) process_readonly_fields_param(submitter_attrs[:readonly_fields], template_fields, submitter_uuid) + process_field_values_param(submitter_attrs[:values], template_fields, submitter_uuid) process_fields_param(submitter_attrs[:fields], template_fields, submitter_uuid) end @@ -70,6 +71,21 @@ module Submissions end end + def process_field_values_param(values, template_fields, submitter_uuid) + return if values.blank? + + template_fields.each do |f| + next if f['type'].in?(%w[signature image initials file]) + next if f['submitter_uuid'] != submitter_uuid + + value = values[f['uuid']] + + next if value.blank? + + f['default_value'] = value + end + end + def process_fields_param(fields, template_fields, submitter_uuid) return if fields.blank? @@ -83,6 +99,8 @@ module Submissions next if field_configs.blank? f['readonly'] = field_configs['readonly'] if field_configs['readonly'].present? + f['default_value'] = field_configs['default_value'] if field_configs['default_value'].present? && + !f['type'].in?(%w[signature image initials file]) next if field_configs['validation_pattern'].blank? @@ -111,7 +129,8 @@ module Submissions completed_at: attrs[:completed] ? Time.current : nil, sent_at: mark_as_sent && email.present? && is_order_sent ? Time.current : nil, values: attrs[:values] || {}, - preferences: preferences.merge(submitter_preferences), + preferences: preferences.merge(submitter_preferences) + .merge({ default_values: attrs[:values] }.compact_blank), uuid: ) end