add combine pdf toggle

pull/354/head
Pete Matsyburka 1 year ago
parent 66c44f8ff5
commit b6f307690d

@ -15,6 +15,7 @@ class AccountConfigsController < ApplicationController
AccountConfig::FORCE_SSO_AUTH_KEY, AccountConfig::FORCE_SSO_AUTH_KEY,
AccountConfig::FLATTEN_RESULT_PDF_KEY, AccountConfig::FLATTEN_RESULT_PDF_KEY,
AccountConfig::WITH_SIGNATURE_ID, AccountConfig::WITH_SIGNATURE_ID,
AccountConfig::COMBINE_PDF_RESULT_KEY,
AccountConfig::REQUIRE_SIGNING_REASON_KEY AccountConfig::REQUIRE_SIGNING_REASON_KEY
].freeze ].freeze

@ -11,7 +11,8 @@ module Api
params[:before] = Time.zone.at(params[:before].to_i) if params[:before].present? params[:before] = Time.zone.at(params[:before].to_i) if params[:before].present?
submitters = paginate( submitters = paginate(
submitters.preload(template: :folder, submission: [:submitters, { audit_trail_attachment: :blob }], submitters.preload(template: :folder, submission: [:submitters, { audit_trail_attachment: :blob,
combined_document_attachment: :blob }],
documents_attachments: :blob, attachments_attachments: :blob), documents_attachments: :blob, attachments_attachments: :blob),
field: :completed_at field: :completed_at
) )

@ -19,6 +19,7 @@ module Api
submissions = paginate(submissions.preload(:created_by_user, :submitters, submissions = paginate(submissions.preload(:created_by_user, :submitters,
template: :folder, template: :folder,
combined_document_attachment: :blob,
audit_trail_attachment: :blob)) audit_trail_attachment: :blob))
render json: { render json: {

@ -33,7 +33,7 @@ class SubmissionsDownloadController < ApplicationController
return head :not_found return head :not_found
end end
if params[:combined] if params[:combined] == 'true'
url = build_combined_url(submitter) url = build_combined_url(submitter)
if url if url

@ -15,6 +15,10 @@ class ProcessSubmitterCompletionJob
Submissions::EnsureResultGenerated.call(submitter) Submissions::EnsureResultGenerated.call(submitter)
if is_all_completed && submitter.completed_at == submitter.submission.submitters.maximum(:completed_at) if is_all_completed && submitter.completed_at == submitter.submission.submitters.maximum(:completed_at)
if submitter.submission.account.account_configs.exists?(key: AccountConfig::COMBINE_PDF_RESULT_KEY, value: true)
Submissions::GenerateCombinedAttachment.call(submitter)
end
Submissions::GenerateAuditTrail.call(submitter.submission) Submissions::GenerateAuditTrail.call(submitter.submission)
enqueue_completed_emails(submitter) enqueue_completed_emails(submitter)

@ -157,7 +157,7 @@ class SubmitterMailer < ApplicationMailer
total_size = 0 total_size = 0
audit_trail_data = nil audit_trail_data = nil
if with_audit_log && submitter.submission.audit_trail.present? if with_audit_log && submitter.submission.audit_trail.present? && documents.first&.name != 'combined_document'
audit_trail_data = submitter.submission.audit_trail.download audit_trail_data = submitter.submission.audit_trail.download
total_size = audit_trail_data.size total_size = audit_trail_data.size

@ -40,6 +40,7 @@ class AccountConfig < ApplicationRecord
FLATTEN_RESULT_PDF_KEY = 'flatten_result_pdf' FLATTEN_RESULT_PDF_KEY = 'flatten_result_pdf'
WITH_SIGNATURE_ID = 'with_signature_id' WITH_SIGNATURE_ID = 'with_signature_id'
REQUIRE_SIGNING_REASON_KEY = 'require_signing_reason' REQUIRE_SIGNING_REASON_KEY = 'require_signing_reason'
COMBINE_PDF_RESULT_KEY = 'combine_pdf_result_key'
DEFAULT_VALUES = { DEFAULT_VALUES = {
SUBMITTER_INVITATION_EMAIL_KEY => { SUBMITTER_INVITATION_EMAIL_KEY => {

@ -86,4 +86,10 @@ class Submission < ApplicationRecord
ActiveStorage::Blob.proxy_url(audit_trail.blob) ActiveStorage::Blob.proxy_url(audit_trail.blob)
end end
alias audit_log_url audit_trail_url alias audit_log_url audit_trail_url
def combined_document_url
return if combined_document.blank?
ActiveStorage::Blob.proxy_url(combined_document.blob)
end
end end

@ -123,6 +123,18 @@
</div> </div>
<% end %> <% end %>
<% end %> <% end %>
<% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::COMBINE_PDF_RESULT_KEY) %>
<% if can?(:manage, account_config) %>
<%= form_for account_config, url: account_configs_path, method: :post do |f| %>
<%= f.hidden_field :key %>
<div class="flex items-center justify-between py-2.5">
<span>
Combine completed documents and Audit Log
</span>
<%= f.check_box :value, class: 'toggle', checked: account_config.value, onchange: 'this.form.requestSubmit()' %>
</div>
<% end %>
<% end %>
</div> </div>
<% end %> <% end %>
<%= render 'integrations' %> <%= render 'integrations' %>

@ -1,7 +1,7 @@
<% if params[:controller] == 'submissions_preview' %> <% if params[:controller] == 'submissions_preview' %>
<%= render 'submissions/preview_tags' %> <%= render 'submissions/preview_tags' %>
<% end %> <% end %>
<% with_signature_id = @submission.account.account_configs.exists?(key: AccountConfig::WITH_SIGNATURE_ID, value: true) %> <% with_signature_id, is_combined_enabled = AccountConfig.where(account_id: @submission.account_id, key: [AccountConfig::COMBINE_PDF_RESULT_KEY, AccountConfig::WITH_SIGNATURE_ID], value: true).then { |configs| [configs.any? { |e| e.key == AccountConfig::WITH_SIGNATURE_ID }, configs.any? { |e| e.key == AccountConfig::COMBINE_PDF_RESULT_KEY }] } %>
<div style="max-width: 1600px" class="mx-auto pl-4"> <div style="max-width: 1600px" class="mx-auto pl-4">
<div class="flex justify-between py-1.5 items-center pr-4 sticky top-0 md:relative z-10 bg-base-100"> <div class="flex justify-between py-1.5 items-center pr-4 sticky top-0 md:relative z-10 bg-base-100">
<a href="<%= signed_in? && @submission.account_id == current_account&.id ? template_path(@submission.template) : '/' %>" class="flex items-center space-x-3 py-1"> <a href="<%= signed_in? && @submission.account_id == current_account&.id ? template_path(@submission.template) : '/' %>" class="flex items-center space-x-3 py-1">
@ -20,7 +20,7 @@
<% if last_submitter = @submission.submitters.to_a.select(&:completed_at?).max_by(&:completed_at) %> <% if last_submitter = @submission.submitters.to_a.select(&:completed_at?).max_by(&:completed_at) %>
<% is_all_completed = @submission.submitters.to_a.all?(&:completed_at?) %> <% is_all_completed = @submission.submitters.to_a.all?(&:completed_at?) %>
<div class="join relative"> <div class="join relative">
<download-button data-src="<%= submitter_download_index_path(last_submitter.slug, { sig: params[:sig] }.compact) %>" class="base-button <%= '!rounded-r-none !pr-2' if is_all_completed %>"> <download-button data-src="<%= submitter_download_index_path(last_submitter.slug, { sig: params[:sig], combined: is_combined_enabled }.compact) %>" class="base-button <%= '!rounded-r-none !pr-2' if is_all_completed && !is_combined_enabled %>">
<span class="flex items-center justify-center space-x-2" data-target="download-button.defaultButton"> <span class="flex items-center justify-center space-x-2" data-target="download-button.defaultButton">
<%= svg_icon('download', class: 'w-6 h-6') %> <%= svg_icon('download', class: 'w-6 h-6') %>
<span class="hidden md:inline">Download</span> <span class="hidden md:inline">Download</span>
@ -30,7 +30,7 @@
<span class="hidden md:inline">Downloading</span> <span class="hidden md:inline">Downloading</span>
</span> </span>
</download-button> </download-button>
<% if is_all_completed %> <% if is_all_completed && !is_combined_enabled %>
<div class="dropdown dropdown-end"> <div class="dropdown dropdown-end">
<label tabindex="0" class="base-button !rounded-l-none !pl-1 !pr-2 !border-l-neutral-500"> <label tabindex="0" class="base-button !rounded-l-none !pl-1 !pr-2 !border-l-neutral-500">
<span class="text-sm align-text-top"> <span class="text-sm align-text-top">

@ -4,7 +4,7 @@ module Submissions
module SerializeForApi module SerializeForApi
SERIALIZE_PARAMS = { SERIALIZE_PARAMS = {
only: %i[id slug source submitters_order expire_at created_at updated_at archived_at], only: %i[id slug source submitters_order expire_at created_at updated_at archived_at],
methods: %i[audit_log_url], methods: %i[audit_log_url combined_document_url],
include: { include: {
submitters: { only: %i[id slug uuid name email phone submitters: { only: %i[id slug uuid name email phone
completed_at opened_at sent_at declined_at completed_at opened_at sent_at declined_at
@ -26,14 +26,11 @@ module Submissions
json = submission.as_json(SERIALIZE_PARAMS) json = submission.as_json(SERIALIZE_PARAMS)
json['submission_events'] = Submitters::SerializeForApi.serialize_events(submission.submission_events) json['submission_events'] = Submitters::SerializeForApi.serialize_events(submission.submission_events)
json['combined_document_url'] ||= maybe_build_combined_url(submitters, submission, params)
if submitters.all?(&:completed_at?) if submitters.all?(&:completed_at?)
last_submitter = submitters.max_by(&:completed_at) last_submitter = submitters.max_by(&:completed_at)
if params[:include].to_s.include?('combined_document_url')
json[:combined_document_url] = build_combined_url(submitters.max_by(&:completed_at), submission)
end
json[:documents] = serialized_submitters.find { |e| e['id'] == last_submitter.id }['documents'] json[:documents] = serialized_submitters.find { |e| e['id'] == last_submitter.id }['documents']
json[:status] = 'completed' json[:status] = 'completed'
json[:completed_at] = last_submitter.completed_at json[:completed_at] = last_submitter.completed_at
@ -52,13 +49,18 @@ module Submissions
json json
end end
def build_combined_url(submitter, submission) def maybe_build_combined_url(submitters, submission, params)
return unless submitter.completed_at? return unless submitters.all?(&:completed_at?)
attachment = submission.combined_document_attachment attachment = submission.combined_document_attachment
attachment ||= Submissions::GenerateCombinedAttachment.call(submitter)
ActiveStorage::Blob.proxy_url(attachment.blob) if !attachment && params[:include].to_s.include?('combined_document_url')
submitter = submitters.max_by(&:completed_at)
attachment = Submissions::GenerateCombinedAttachment.call(submitter)
end
ActiveStorage::Blob.proxy_url(attachment.blob) if attachment
end end
end end
end end

@ -21,6 +21,12 @@ module Submitters
end end
def select_attachments_for_download(submitter) def select_attachments_for_download(submitter)
if AccountConfig.exists?(account_id: submitter.submission.account_id,
key: AccountConfig::COMBINE_PDF_RESULT_KEY,
value: true) && submitter.submission.combined_document_attachment
return [submitter.submission.combined_document_attachment]
end
original_documents = submitter.submission.template.documents.preload(:blob) original_documents = submitter.submission.template.documents.preload(:blob)
is_more_than_two_images = original_documents.count(&:image?) > 1 is_more_than_two_images = original_documents.count(&:image?) > 1

@ -33,7 +33,7 @@ module Submitters
'template' => submitter.template.as_json(only: %i[id name external_id created_at updated_at], 'template' => submitter.template.as_json(only: %i[id name external_id created_at updated_at],
methods: %i[folder_name]), methods: %i[folder_name]),
'submission' => { 'submission' => {
**submitter.submission.slice(:id, :audit_log_url, :created_at), **submitter.submission.slice(:id, :audit_log_url, :combined_document_url, :created_at),
status: build_submission_status(submitter.submission), status: build_submission_status(submitter.submission),
url: r.submissions_preview_url(submitter.submission.slug, **Docuseal.default_url_options) url: r.submissions_preview_url(submitter.submission.slug, **Docuseal.default_url_options)
}) })

Loading…
Cancel
Save