Skip to content

Commit 24884dd

Browse files
committed
Merge branch 'master' into build
2 parents a37c8da + b6bb4d2 commit 24884dd

File tree

9 files changed

+77
-31
lines changed

9 files changed

+77
-31
lines changed

Gemfile.lock

+6-6
Original file line numberDiff line numberDiff line change
@@ -337,18 +337,18 @@ GEM
337337
net-smtp (0.5.0)
338338
net-protocol
339339
nio4r (2.7.4)
340-
nokogiri (1.18.2)
340+
nokogiri (1.18.3)
341341
mini_portile2 (~> 2.8.2)
342342
racc (~> 1.4)
343-
nokogiri (1.18.2-aarch64-linux-gnu)
343+
nokogiri (1.18.3-aarch64-linux-gnu)
344344
racc (~> 1.4)
345-
nokogiri (1.18.2-aarch64-linux-musl)
345+
nokogiri (1.18.3-aarch64-linux-musl)
346346
racc (~> 1.4)
347-
nokogiri (1.18.2-arm64-darwin)
347+
nokogiri (1.18.3-arm64-darwin)
348348
racc (~> 1.4)
349-
nokogiri (1.18.2-x86_64-linux-gnu)
349+
nokogiri (1.18.3-x86_64-linux-gnu)
350350
racc (~> 1.4)
351-
nokogiri (1.18.2-x86_64-linux-musl)
351+
nokogiri (1.18.3-x86_64-linux-musl)
352352
racc (~> 1.4)
353353
oj (3.16.8)
354354
bigdecimal (>= 3.0)

app/controllers/api/submitters_controller.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,15 @@ def maybe_assign_completed_attributes(submitter, attrs)
146146

147147
if attrs[:completed]
148148
submitter.values = Submitters::SubmitValues.merge_default_values(submitter)
149-
submitter.values = Submitters::SubmitValues.merge_formula_values(submitter)
150149
submitter.values = Submitters::SubmitValues.maybe_remove_condition_values(submitter)
151150

151+
formula_values = Submitters::SubmitValues.build_formula_values(submitter)
152+
153+
if formula_values.present?
154+
submitter.values = submitter.values.merge(formula_values)
155+
submitter.values = Submitters::SubmitValues.maybe_remove_condition_values(submitter)
156+
end
157+
152158
submitter.values = submitter.values.transform_values do |v|
153159
v == '{{date}}' ? Time.current.in_time_zone(submitter.account.timezone).to_date.to_s : v
154160
end

app/javascript/submission_form/form.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ export default {
10371037
}, [])
10381038
},
10391039
formulaFields () {
1040-
return this.fields.filter((f) => f.preferences?.formula && f.type !== 'payment')
1040+
return this.fields.filter((f) => f.preferences?.formula && f.type !== 'payment' && this.checkFieldConditions(f) && this.checkFieldDocumentsConditions(f))
10411041
},
10421042
attachmentsIndex () {
10431043
return this.attachments.reduce((acc, a) => {

app/views/templates_preferences/show.html.erb

+2-2
Original file line numberDiff line numberDiff line change
@@ -285,12 +285,12 @@
285285
<div class="form-control">
286286
<%= ff.text_field :name, class: 'w-full outline-none border-transparent focus:border-transparent focus:ring-0 bg-base-100 px-1 peer mb-2', autocomplete: 'off', placeholder: "#{index + 1}#{(index + 1).ordinal} Party", required: true %>
287287
<% if @template.submitters.size == 2 %>
288-
<%= ff.email_field :email, class: 'base-input', autocomplete: 'off', placeholder: t('default_email'), disabled: ff.object.is_requester || ff.object.invite_by_uuid.present? || ff.object.optional_invite_by_uuid.present?, id: field_uuid = SecureRandom.uuid %>
288+
<%= tag.input name: ff.field_name(:email), value: ff.object.email, type: :email, class: 'base-input', multiple: true, autocomplete: 'off', placeholder: t('default_email'), disabled: ff.object.is_requester || ff.object.invite_by_uuid.present? || ff.object.optional_invite_by_uuid.present?, id: field_uuid = SecureRandom.uuid %>
289289
<% else %>
290290
<toggle-attribute data-target-id="<%= email_field_uuid = SecureRandom.uuid %>" data-class-name="hidden" data-value="email">
291291
<%= ff.select :option, [[t('not_specified'), 'not_set'], [t('submission_requester'), 'is_requester'], [t('specified_email'), 'email'], *(@template.submitters - [submitter]).flat_map { |e| [[t('invite_by_name', name: e['name']), "invite_by_#{e['uuid']}"], [t('invite_by_name', name: e['name']) + " (#{t(:optional).capitalize})", "optional_invite_by_#{e['uuid']}"]] }, *(@template.submitters - [submitter]).map { |e| [t('same_as_name', name: e['name']), "linked_to_#{e['uuid']}"] }], {}, class: 'base-select mb-3' %>
292292
</toggle-attribute>
293-
<%= ff.email_field :email, class: "base-input #{'hidden' if item.option != 'email'}", autocomplete: 'off', placeholder: t('default_email'), id: email_field_uuid %>
293+
<%= tag.input name: ff.field_name(:email), type: :email, value: ff.object.email, multiple: true, class: "base-input #{'hidden' if item.option != 'email'}", autocomplete: 'off', placeholder: t('default_email'), id: email_field_uuid %>
294294
<% end %>
295295
</div>
296296
<% if @template.submitters.size == 2 %>

lib/download_utils.rb

+9-8
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,20 @@ module DownloadUtils
88
module_function
99

1010
def call(url)
11-
uri = Addressable::URI.parse(url)
11+
uri = begin
12+
URI(url)
13+
rescue URI::Error
14+
Addressable::URI.parse(url).normalize
15+
end
1216

1317
if Docuseal.multitenant?
14-
raise UnableToDownload, "Error loading: #{uri.display_uri}. Only HTTPS is allowed." if uri.scheme != 'https'
15-
16-
if uri.host.in?(LOCALHOSTS)
17-
raise UnableToDownload, "Error loading: #{uri.display_uri}. Can't download from localhost."
18-
end
18+
raise UnableToDownload, "Error loading: #{uri}. Only HTTPS is allowed." if uri.scheme != 'https'
19+
raise UnableToDownload, "Error loading: #{uri}. Can't download from localhost." if uri.host.in?(LOCALHOSTS)
1920
end
2021

21-
resp = conn.get(uri.display_uri.to_s)
22+
resp = conn.get(uri)
2223

23-
raise UnableToDownload, "Error loading: #{uri.display_uri}" if resp.status >= 400
24+
raise UnableToDownload, "Error loading: #{uri}" if resp.status >= 400
2425

2526
resp
2627
end

lib/replace_email_variables.rb

+25-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ module ReplaceEmailVariables
1515
SUBMITTER_SLUG = /\{+submitter\.slug\}+/i
1616
SUBMISSION_LINK = /\{+submission\.link\}+/i
1717
SUBMISSION_ID = /\{+submission\.id\}+/i
18-
SUBMISSION_SUBMITTERS = /\{+submission\.submitters\}+/i
18+
SUBMITTERS = /\{+(?:submission\.)?submitters\}+/i
19+
SUBMITTERS_N_EMAIL = /\{+submitters\[(?<index>\d+)\]\.email\}+/i
20+
SUBMITTERS_N_NAME = /\{+submitters\[(?<index>\d+)\]\.name\}+/i
21+
SUBMITTERS_N_FIRST_NAME = /\{+submitters\[(?<index>\d+)\]\.first_name\}+/i
1922
DOCUMENTS_LINKS = /\{+documents\.links\}+/i
2023
DOCUMENTS_LINK = /\{+documents\.link\}+/i
2124

@@ -37,13 +40,25 @@ def call(text, submitter:, tracking_event_type: 'click_email', html_escape: fals
3740
text = replace(text, SUBMISSION_LINK, html_escape:) do
3841
submitter.submission ? build_submission_link(submitter.submission) : ''
3942
end
40-
text = replace(text, SUBMISSION_SUBMITTERS, html_escape:) { build_submission_submitters(submitter.submission) }
43+
text = replace(text, SUBMITTERS, html_escape:) { build_submission_submitters(submitter.submission) }
4144
text = replace(text, DOCUMENTS_LINKS, html_escape:) { build_documents_links_text(submitter, sig) }
4245
text = replace(text, DOCUMENTS_LINK, html_escape:) { build_documents_links_text(submitter, sig) }
4346
text = replace(text, ACCOUNT_NAME, html_escape:) { submitter.submission.account.name }
4447
text = replace(text, SENDER_NAME, html_escape:) { submitter.submission.created_by_user&.full_name }
4548
text = replace(text, SENDER_FIRST_NAME, html_escape:) { submitter.submission.created_by_user&.first_name }
4649

50+
text = replace(text, SUBMITTERS_N_NAME, html_escape:) do |match|
51+
build_submitters_n_field(submitter.submission, match[:index].to_i - 1, :name)
52+
end
53+
54+
text = replace(text, SUBMITTERS_N_EMAIL, html_escape:) do |match|
55+
build_submitters_n_field(submitter.submission, match[:index].to_i - 1, :email)
56+
end
57+
58+
text = replace(text, SUBMITTERS_N_FIRST_NAME, html_escape:) do |match|
59+
build_submitters_n_field(submitter.submission, match[:index].to_i - 1, :first_name)
60+
end
61+
4762
replace(text, SENDER_EMAIL, html_escape:) { submitter.submission.created_by_user&.email.to_s.sub(/\+\w+@/, '@') }
4863
end
4964
# rubocop:enable Metrics
@@ -54,12 +69,18 @@ def build_documents_links_text(submitter, sig = nil)
5469
)
5570
end
5671

72+
def build_submitters_n_field(submission, index, field_name)
73+
uuid = (submission.template_submitters || submission.template.submitters).dig(index, 'uuid')
74+
75+
submission.submitters.find { |s| s.uuid == uuid }.try(field_name)
76+
end
77+
5778
def replace(text, var, html_escape: false)
5879
text.gsub(var) do
5980
if html_escape
60-
ERB::Util.html_escape(yield)
81+
ERB::Util.html_escape(yield(Regexp.last_match))
6182
else
62-
yield
83+
yield(Regexp.last_match)
6384
end
6485
end
6586
end

lib/submissions/create_from_submitters.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,15 @@ def find_phone_field(submission, values)
225225

226226
def assign_completed_attributes(submitter)
227227
submitter.values = Submitters::SubmitValues.merge_default_values(submitter)
228-
submitter.values = Submitters::SubmitValues.merge_formula_values(submitter)
229228
submitter.values = Submitters::SubmitValues.maybe_remove_condition_values(submitter)
230229

230+
formula_values = Submitters::SubmitValues.build_formula_values(submitter)
231+
232+
if formula_values.present?
233+
submitter.values = submitter.values.merge(formula_values)
234+
submitter.values = Submitters::SubmitValues.maybe_remove_condition_values(submitter)
235+
end
236+
231237
submitter.values = submitter.values.transform_values do |v|
232238
v == '{{date}}' ? Time.current.in_time_zone(submitter.submission.account.timezone).to_date.to_s : v
233239
end

lib/submitters/submit_values.rb

+11-3
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,17 @@ def assign_completed_attributes(submitter, request)
5353
submitter.completed_at = Time.current
5454
submitter.ip = request.remote_ip
5555
submitter.ua = request.user_agent
56+
5657
submitter.values = merge_default_values(submitter)
5758
submitter.values = maybe_remove_condition_values(submitter)
58-
submitter.values = merge_formula_values(submitter)
59+
60+
formula_values = build_formula_values(submitter)
61+
62+
if formula_values.present?
63+
submitter.values = submitter.values.merge(formula_values)
64+
submitter.values = maybe_remove_condition_values(submitter)
65+
end
66+
5967
submitter.values = submitter.values.transform_values do |v|
6068
v == '{{date}}' ? Time.current.in_time_zone(submitter.account.timezone).to_date.to_s : v
6169
end
@@ -149,7 +157,7 @@ def merge_default_values(submitter)
149157
default_values.compact_blank.merge(submitter.values)
150158
end
151159

152-
def merge_formula_values(submitter)
160+
def build_formula_values(submitter)
153161
computed_values = submitter.submission.template_fields.each_with_object({}) do |field, acc|
154162
next if field['submitter_uuid'] != submitter.uuid
155163
next if field['type'] == 'payment'
@@ -161,7 +169,7 @@ def merge_formula_values(submitter)
161169
acc[field['uuid']] = calculate_formula_value(formula, submitter.values.merge(acc.compact_blank))
162170
end
163171

164-
submitter.values.merge(computed_values.compact_blank)
172+
computed_values.compact_blank
165173
end
166174

167175
def calculate_formula_value(_formula, _values)

lib/templates/clone.rb

+9-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ def call(original_template, author:, external_id: nil, name: nil, folder_name: n
99

1010
template.external_id = external_id
1111
template.author = author
12-
template.preferences = original_template.preferences.deep_dup
1312
template.name = name.presence || "#{original_template.name} (#{I18n.t('clone')})"
1413

1514
if folder_name.present?
@@ -18,10 +17,11 @@ def call(original_template, author:, external_id: nil, name: nil, folder_name: n
1817
template.folder_id = original_template.folder_id
1918
end
2019

21-
template.submitters, template.fields, template.schema =
20+
template.submitters, template.fields, template.schema, template.preferences =
2221
update_submitters_and_fields_and_schema(original_template.submitters.deep_dup,
2322
original_template.fields.deep_dup,
24-
original_template.schema.deep_dup)
23+
original_template.schema.deep_dup,
24+
original_template.preferences.deep_dup)
2525

2626
if name.present? && template.schema.size == 1 &&
2727
original_template.schema.first['name'] == original_template.name &&
@@ -33,7 +33,7 @@ def call(original_template, author:, external_id: nil, name: nil, folder_name: n
3333
end
3434

3535
# rubocop:disable Metrics, Style/CombinableLoops
36-
def update_submitters_and_fields_and_schema(cloned_submitters, cloned_fields, cloned_schema)
36+
def update_submitters_and_fields_and_schema(cloned_submitters, cloned_fields, cloned_schema, cloned_preferences)
3737
submitter_uuids_replacements = {}
3838
field_uuids_replacements = {}
3939

@@ -58,6 +58,10 @@ def update_submitters_and_fields_and_schema(cloned_submitters, cloned_fields, cl
5858
end
5959
end
6060

61+
cloned_preferences['submitters'].to_a.each do |submitter|
62+
submitter['uuid'] = submitter_uuids_replacements[submitter['uuid']]
63+
end
64+
6165
cloned_fields.each do |field|
6266
new_field_uuid = SecureRandom.uuid
6367

@@ -88,7 +92,7 @@ def update_submitters_and_fields_and_schema(cloned_submitters, cloned_fields, cl
8892
end
8993
end
9094

91-
[cloned_submitters, cloned_fields, cloned_schema]
95+
[cloned_submitters, cloned_fields, cloned_schema, cloned_preferences]
9296
end
9397
# rubocop:enable Metrics, Style/CombinableLoops
9498
end

0 commit comments

Comments
 (0)