@@ -26,7 +27,7 @@
<% end %>
- <%= render 'detailed_form', template: @template, require_phone_2fa:, require_email_2fa:, prefillable_fields: %>
+ <%= render 'detailed_form', template: @template, require_phone_2fa:, require_email_2fa:, prefillable_fields:, recipient_form_fields: %>
<%= render 'list_form', template: @template %>
diff --git a/lib/accounts.rb b/lib/accounts.rb
index 5127d2c7..fbbf688c 100644
--- a/lib/accounts.rb
+++ b/lib/accounts.rb
@@ -101,6 +101,10 @@ module Accounts
new_template
end
+ def load_recipient_form_fields(_account)
+ []
+ end
+
def load_signing_pkcs(account)
cert_data =
if Docuseal.multitenant?
diff --git a/lib/submissions.rb b/lib/submissions.rb
index c76d284d..aaf18ea4 100644
--- a/lib/submissions.rb
+++ b/lib/submissions.rb
@@ -133,9 +133,9 @@ module Submissions
end
def create_from_submitters(template:, user:, submissions_attrs:, source:, with_template: true,
- submitters_order: DEFAULT_SUBMITTERS_ORDER, params: {})
+ submitters_order: DEFAULT_SUBMITTERS_ORDER, params: {}, new_fields: nil)
Submissions::CreateFromSubmitters.call(
- template:, user:, submissions_attrs:, source:, submitters_order:, params:, with_template:
+ template:, user:, submissions_attrs:, source:, submitters_order:, params:, with_template:, new_fields:
)
end
diff --git a/lib/submissions/create_from_submitters.rb b/lib/submissions/create_from_submitters.rb
index 0a7e2705..9442a9c8 100644
--- a/lib/submissions/create_from_submitters.rb
+++ b/lib/submissions/create_from_submitters.rb
@@ -7,7 +7,8 @@ module Submissions
module_function
# rubocop:disable Metrics
- def call(template:, user:, submissions_attrs:, source:, submitters_order:, params: {}, with_template: true)
+ def call(template:, user:, submissions_attrs:, source:, submitters_order:, params: {}, with_template: true,
+ new_fields: nil)
preferences = Submitters.normalize_preferences(user.account, user, params)
submissions = Array.wrap(submissions_attrs).filter_map do |attrs|
@@ -67,7 +68,7 @@ module Submissions
preferences: preferences.merge(submission_preferences))
end
- maybe_set_template_fields(submission, attrs[:submitters], with_template:)
+ maybe_set_template_fields(submission, attrs[:submitters], with_template:, new_fields:)
if submission.submitters.size > template.submitters.size
raise BaseError, 'Defined more signing parties than in template'
@@ -92,7 +93,6 @@ module Submissions
submissions
end
- # rubocop:enable Metrics
def maybe_enqueue_expire_at(submissions)
submissions.each do |submission|
@@ -135,7 +135,8 @@ module Submissions
}.compact_blank
end
- def maybe_set_template_fields(submission, submitters_attrs, default_submitter_uuid: nil, with_template: true)
+ def maybe_set_template_fields(submission, submitters_attrs, default_submitter_uuid: nil, with_template: true,
+ new_fields: nil)
template_fields = (submission.template_fields || submission.template.fields).deep_dup
submitters = submission.template_submitters || submission.template.submitters
@@ -149,9 +150,9 @@ module Submissions
process_fields_param(submitter_attrs[:fields], template_fields, submitter_uuid)
end
- if template_fields != (submission.template_fields || submission.template.fields) ||
+ if template_fields != (submission.template_fields || submission.template.fields) || new_fields.present? ||
submitters_attrs.any? { |e| e[:completed].present? } || !with_template || submission.variables.present?
- submission.template_fields = template_fields
+ submission.template_fields = new_fields ? new_fields + template_fields : template_fields
submission.template_schema = submission.template.schema if submission.template_schema.blank?
submission.variables_schema = submission.template.variables_schema if submission.template &&
submission.variables_schema.blank?
@@ -159,6 +160,7 @@ module Submissions
submission
end
+ # rubocop:enable Metrics
def merge_submitters_and_fields(submitter_attrs, template_submitters, template_fields)
selected_submitters = submitter_attrs[:roles].map do |role|
diff --git a/lib/submissions/normalize_param_utils.rb b/lib/submissions/normalize_param_utils.rb
index 6ad4da23..eedb4cc4 100644
--- a/lib/submissions/normalize_param_utils.rb
+++ b/lib/submissions/normalize_param_utils.rb
@@ -4,21 +4,23 @@ module Submissions
module NormalizeParamUtils
module_function
- def normalize_submissions_params!(submissions_params, template)
+ def normalize_submissions_params!(submissions_params, template, add_fields: false)
attachments = []
+ fields = []
Array.wrap(submissions_params).each do |submission|
submission[:submitters].each_with_index do |submitter, index|
- _, new_attachments = normalize_submitter_params!(submitter, template, index)
+ _, new_attachments, new_fields = normalize_submitter_params!(submitter, template, index, add_fields:)
attachments.push(*new_attachments)
+ fields.push(*new_fields)
end
end
- [submissions_params, attachments]
+ [submissions_params, attachments, fields]
end
- def normalize_submitter_params!(submitter_params, template, index = nil, for_submitter: nil)
+ def normalize_submitter_params!(submitter_params, template, index = nil, for_submitter: nil, add_fields: false)
with_values = submitter_params[:values].present?
default_values = with_values ? submitter_params[:values] : {}
@@ -30,18 +32,19 @@ module Submissions
return submitter_params if default_values.blank?
- values, new_attachments =
+ values, new_attachments, new_fields =
Submitters::NormalizeValues.call(template,
default_values,
submitter_name: submitter_params[:role] ||
template.submitters.dig(index, 'name'),
role_names: submitter_params[:roles],
for_submitter:,
+ add_fields:,
throw_errors: !with_values)
submitter_params[:values] = values
- [submitter_params, new_attachments]
+ [submitter_params, new_attachments, new_fields]
end
def save_default_value_attachments!(attachments, submitters)
diff --git a/lib/submitters/normalize_values.rb b/lib/submitters/normalize_values.rb
index 0c2ee8f2..51f6e72d 100644
--- a/lib/submitters/normalize_values.rb
+++ b/lib/submitters/normalize_values.rb
@@ -17,7 +17,9 @@ module Submitters
module_function
- def call(template, values, submitter_name: nil, role_names: nil, for_submitter: nil, throw_errors: false)
+ # rubocop:disable Metrics
+ def call(template, values, submitter_name: nil, role_names: nil, for_submitter: nil, throw_errors: false,
+ add_fields: false)
fields =
if role_names.present?
fetch_roles_fields(template, roles: role_names)
@@ -29,6 +31,8 @@ module Submitters
fields_name_index = build_fields_index(fields)
attachments = []
+ new_fields = []
+ recipient_form_fields = nil
normalized_values = values.to_h.each_with_object({}) do |(key, value), acc|
next if key.blank?
@@ -40,7 +44,22 @@ module Submitters
if value_fields.blank?
value_fields = fields_name_index[key].presence || fields_name_index[key.to_s.downcase]
- raise(UnknownFieldName, "Unknown field: #{key}") if value_fields.blank? && throw_errors
+ if value_fields.blank?
+ if add_fields && (recipient_form_fields ||= Accounts.load_recipient_form_fields(template.account))
+ new_field = recipient_form_fields.to_a.find { |e| e['name'] == key }.deep_dup
+
+ if new_field && fields.present?
+ new_field = new_field.merge('uuid' => SecureRandom.uuid,
+ 'readonly' => true,
+ 'submitter_uuid' => fields.first['submitter_uuid'])
+
+ new_fields.push(new_field)
+ value_fields = [new_field]
+ end
+ elsif throw_errors
+ raise(UnknownFieldName, "Unknown field: #{key}")
+ end
+ end
end
next if value_fields.blank?
@@ -59,8 +78,9 @@ module Submitters
end
end
- [normalized_values, attachments]
+ [normalized_values, attachments, new_fields]
end
+ # rubocop:enable Metrics
def normalize_value(field, value)
if field['type'] == 'checkbox'