From 37de5e0d0dacc26c32444801ce862b1896a40ff8 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Sat, 25 Jan 2025 19:37:15 +0200 Subject: [PATCH] add resubmit from dashboard --- .../submitters_resubmit_controller.rb | 58 +++++++++++++++++++ app/views/submissions/show.html.erb | 5 ++ app/views/submit_form/completed.html.erb | 3 +- config/routes.rb | 1 + 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 app/controllers/submitters_resubmit_controller.rb diff --git a/app/controllers/submitters_resubmit_controller.rb b/app/controllers/submitters_resubmit_controller.rb new file mode 100644 index 00000000..fb893d98 --- /dev/null +++ b/app/controllers/submitters_resubmit_controller.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +class SubmittersResubmitController < ApplicationController + load_and_authorize_resource :submitter, parent: false + + def update + return redirect_to submit_form_path(slug: @submitter.slug) if @submitter.email != current_user.email + + submission = @submitter.template.submissions.new(created_by_user: current_user, + submitters_order: :preserved, + **@submitter.submission.slice(:template_fields, + :account_id, + :template_schema, + :template_submitters, + :preferences)) + + @submitter.submission.submitters.each do |submitter| + new_submitter = submission.submitters.new(submitter.slice(:uuid, :email, :phone, :name, + :preferences, :metadata, :account_id)) + + next unless submitter.uuid == @submitter.uuid + + assign_submitter_values(new_submitter, submitter) + + @new_submitter ||= new_submitter + end + + submission.save! + + redirect_to submit_form_path(slug: @new_submitter.slug) + end + + private + + def assign_submitter_values(new_submitter, submitter) + attachments_index = submitter.attachments.index_by(&:uuid) + + submitter.submission.template_fields.each do |field| + next if field['submitter_uuid'] != submitter.uuid + next if field['default_value'] == '{{date}}' + next if field['type'] == 'stamp' + next if field['type'] == 'signature' + next if field.dig('preferences', 'formula').present? + + value = submitter.values[field['uuid']] + + next if value.blank? + + if field['type'].in?(%w[image file initials]) + Array.wrap(value).each do |attachment_uuid| + new_submitter.attachments << attachments_index[attachment_uuid].dup + end + end + + new_submitter.values[field['uuid']] = value + end + end +end diff --git a/app/views/submissions/show.html.erb b/app/views/submissions/show.html.erb index 71568920..09d57646 100644 --- a/app/views/submissions/show.html.erb +++ b/app/views/submissions/show.html.erb @@ -190,6 +190,11 @@ <% end %> + <% if signed_in? && submitter && submitter.completed_at? && submitter.email == current_user.email && submitter.completed_at > 1.month.ago && can?(:update, @submission) %> +
+ <%= button_to t('resubmit'), submitters_resubmit_path(submitter), method: :put, class: 'btn btn-sm btn-primary w-full', form: { target: '_blank' }, data: { turbo: false } %> +
+ <% end %>
diff --git a/app/views/submit_form/completed.html.erb b/app/views/submit_form/completed.html.erb index 85c5a129..92114274 100644 --- a/app/views/submit_form/completed.html.erb +++ b/app/views/submit_form/completed.html.erb @@ -42,7 +42,8 @@ <% end %>
- <% if Templates.filter_undefined_submitters(@submitter.submission.template).size == 1 && %w[api embed].exclude?(@submitter.submission.source) && @submitter.account.account_configs.find_or_initialize_by(key: AccountConfig::ALLOW_TO_RESUBMIT).value != false && !@submitter.template.archived_at? %> + <% undefined_submitters = Templates.filter_undefined_submitters(@submitter.submission.template) %> + <% if undefined_submitters.size == 1 && undefined_submitters.first['uuid'] == @submitter.uuid && %w[api embed].exclude?(@submitter.submission.source) && @submitter.account.account_configs.find_or_initialize_by(key: AccountConfig::ALLOW_TO_RESUBMIT).value != false && !@submitter.template.archived_at? %>
<%= t('or') %>
<%= button_to button_title(title: t('resubmit'), disabled_with: t('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, class: 'white-button w-full' %> diff --git a/config/routes.rb b/config/routes.rb index dd568316..b2f84549 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -79,6 +79,7 @@ Rails.application.routes.draw do resource :testing_account, only: %i[show destroy] resources :testing_api_settings, only: %i[index] resources :submitters_autocomplete, only: %i[index] + resources :submitters_resubmit, only: %i[update] resources :template_folders_autocomplete, only: %i[index] resources :webhook_secret, only: %i[show update] resources :webhook_preferences, only: %i[update]