Skip to content

Commit 5442655

Browse files
committed
field conditions
1 parent fa74ee1 commit 5442655

File tree

4 files changed

+58
-17
lines changed

4 files changed

+58
-17
lines changed

app/javascript/template_builder/conditions_modal.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ export default {
177177
fields () {
178178
if (this.item.submitter_uuid) {
179179
return this.template.fields.reduce((acc, f) => {
180-
if (f !== this.item && f.submitter_uuid === this.item.submitter_uuid) {
180+
if (f !== this.item) {
181181
acc.push(f)
182182
}
183183
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<% data_attachments = attachments_index.values.select { |e| e.record_id == submitter.id }.to_json(only: %i[uuid created_at], methods: %i[url filename content_type]) %>
2-
<% data_fields = (submitter.submission.template_fields || submitter.submission.template.fields).select { |f| f['submitter_uuid'] == submitter.uuid }.to_json %>
2+
<% data_fields = Submissions.filtered_conditions_fields(submitter).to_json %>
33
<% invite_submitters = (submitter.submission.template_submitters || submitter.submission.template.submitters).select { |s| s['invite_by_uuid'] == submitter.uuid && submitter.submission.submitters.none? { |e| e.uuid == s['uuid'] } }.to_json %>
44
<% optional_invite_submitters = (submitter.submission.template_submitters || submitter.submission.template.submitters).select { |s| s['optional_invite_by_uuid'] == submitter.uuid && submitter.submission.submitters.none? { |e| e.uuid == s['uuid'] } }.to_json %>
55
<submission-form data-is-demo="<%= Docuseal.demo? %>" data-schema="<%= schema.to_json %>" data-reuse-signature="<%= configs[:reuse_signature] %>" data-require-signing-reason="<%= configs[:require_signing_reason] %>" data-with-signature-id="<%= configs[:with_signature_id] %>" data-with-confetti="<%= configs[:with_confetti] %>" data-completed-redirect-url="<%= submitter.preferences['completed_redirect_url'].presence || submitter.submission.template.preferences['completed_redirect_url'] %>" data-completed-message="<%= (configs[:completed_message]&.compact_blank.presence || submitter.submission.template.preferences['completed_message'] || {}).to_json %>" data-completed-button="<%= configs[:completed_button].to_json %>" data-go-to-last="<%= submitter.preferences.key?('go_to_last') ? submitter.preferences['go_to_last'] : submitter.opened_at? %>" data-submitter="<%= submitter.to_json(only: %i[uuid slug name phone email]) %>" data-can-send-email="<%= Accounts.can_send_emails?(submitter.submission.account) %>" data-optional-invite-submitters="<%= optional_invite_submitters %>" data-invite-submitters="<%= invite_submitters %>" data-attachments="<%= data_attachments %>" data-fields="<%= data_fields %>" data-values="<%= submitter.values.to_json %>" data-with-typed-signature="<%= configs[:with_typed_signature] %>" data-previous-signature-value="<%= local_assigns[:signature_attachment]&.uuid %>" data-remember-signature="<%= configs[:prefill_signature] %>" data-dry-run="<%= local_assigns[:dry_run] %>" data-expand="<%= local_assigns[:expand] %>" data-scroll-padding="<%= local_assigns[:scroll_padding] %>" data-language="<%= I18n.locale.to_s.split('-').first %>"></submission-form>

lib/submissions.rb

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -142,31 +142,57 @@ def filtered_conditions_schema(submission, values: nil, include_submitter_uuid:
142142

143143
values ||= submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
144144

145-
next unless check_document_conditions(item, values, fields_uuid_index, include_submitter_uuid:)
145+
next unless check_item_conditions(item, values, fields_uuid_index, include_submitter_uuid:)
146146
end
147147

148148
item
149149
end
150150
end
151151

152-
def check_document_conditions(item, values, fields_index, include_submitter_uuid: nil)
152+
def filtered_conditions_fields(submitter, only_submitter_fields: true)
153+
fields = submitter.submission.template_fields || submitter.submission.template.fields
154+
155+
fields_uuid_index = nil
156+
values = nil
157+
158+
fields.filter_map do |field|
159+
next if field['submitter_uuid'] != submitter.uuid && only_submitter_fields
160+
161+
if field['conditions'].present?
162+
fields_uuid_index ||= fields.index_by { |f| f['uuid'] }
163+
values ||= submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
164+
165+
submitter_conditions = []
166+
167+
next unless check_item_conditions(field, values, fields_uuid_index,
168+
include_submitter_uuid: submitter.uuid,
169+
submitter_conditions_acc: submitter_conditions)
170+
171+
field = field.merge('conditions' => submitter_conditions) if submitter_conditions != field['conditions']
172+
end
173+
174+
field
175+
end
176+
end
177+
178+
def check_item_conditions(item, values, fields_index, include_submitter_uuid: nil, submitter_conditions_acc: nil)
153179
return true if item['conditions'].blank?
154180

155-
item['conditions'].all? do |condition|
181+
item['conditions'].each_with_object([]) do |condition, acc|
156182
result =
157183
if fields_index[condition['field_uuid']]['submitter_uuid'] == include_submitter_uuid
184+
submitter_conditions_acc << condition if submitter_conditions_acc
185+
158186
true
159187
else
160188
Submitters::SubmitValues.check_field_condition(condition, values, fields_index)
161189
end
162190

163-
item['conditions'].each_with_object([]) do |c, acc|
164-
if c['operation'] == 'or'
165-
acc.push(acc.pop || result)
166-
else
167-
acc.push(result)
168-
end
169-
end.exclude?(false)
170-
end
191+
if condition['operation'] == 'or'
192+
acc.push(acc.pop || result)
193+
else
194+
acc.push(result)
195+
end
196+
end.exclude?(false)
171197
end
172198
end

lib/submitters/submit_values.rb

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,21 @@ def maybe_remove_condition_values(submitter)
186186
attachments_index =
187187
Submissions.filtered_conditions_schema(submitter.submission).index_by { |i| i['attachment_uuid'] }
188188

189+
submitter_values = nil
190+
is_other_submitter_conditions = submitter.submission.template_submitters.size > 1
191+
189192
submitter.submission.template_fields.each do |field|
190193
next if field['submitter_uuid'] != submitter.uuid
191194

192-
submitter.values.delete(field['uuid']) unless check_field_conditions(submitter, field, fields_uuid_index)
195+
submitter_values ||= submitter.values
196+
197+
is_other_submitter_conditions &&= field_conditions_other_submitter?(submitter, field, fields_uuid_index)
198+
199+
if is_other_submitter_conditions
200+
submitter_values = submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
201+
end
202+
203+
submitter.values.delete(field['uuid']) unless check_field_conditions(submitter_values, field, fields_uuid_index)
193204

194205
if field['areas'].present? && field['areas'].none? { |area| attachments_index[area['attachment_uuid']] }
195206
submitter.values.delete(field['uuid'])
@@ -199,10 +210,14 @@ def maybe_remove_condition_values(submitter)
199210
submitter.values
200211
end
201212

202-
def check_field_conditions(submitter, field, fields_uuid_index)
203-
return true if field['conditions'].blank?
213+
def field_conditions_other_submitter?(submitter, field, fields_uuid_index)
214+
field['conditions'].to_a.any? do |c|
215+
fields_uuid_index.dig(c['field_uuid'], 'submitter_uuid') != submitter.uuid
216+
end
217+
end
204218

205-
submitter_values = submitter.values
219+
def check_field_conditions(submitter_values, field, fields_uuid_index)
220+
return true if field['conditions'].blank?
206221

207222
field['conditions'].each_with_object([]) do |c, acc|
208223
if c['operation'] == 'or'

0 commit comments

Comments
 (0)