field conditions
This commit is contained in:
@@ -177,7 +177,7 @@ export default {
|
||||
fields () {
|
||||
if (this.item.submitter_uuid) {
|
||||
return this.template.fields.reduce((acc, f) => {
|
||||
if (f !== this.item && f.submitter_uuid === this.item.submitter_uuid) {
|
||||
if (f !== this.item) {
|
||||
acc.push(f)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<% 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]) %>
|
||||
<% data_fields = (submitter.submission.template_fields || submitter.submission.template.fields).select { |f| f['submitter_uuid'] == submitter.uuid }.to_json %>
|
||||
<% data_fields = Submissions.filtered_conditions_fields(submitter).to_json %>
|
||||
<% 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 %>
|
||||
<% 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 %>
|
||||
<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>
|
||||
|
||||
+37
-11
@@ -142,31 +142,57 @@ module Submissions
|
||||
|
||||
values ||= submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
|
||||
|
||||
next unless check_document_conditions(item, values, fields_uuid_index, include_submitter_uuid:)
|
||||
next unless check_item_conditions(item, values, fields_uuid_index, include_submitter_uuid:)
|
||||
end
|
||||
|
||||
item
|
||||
end
|
||||
end
|
||||
|
||||
def check_document_conditions(item, values, fields_index, include_submitter_uuid: nil)
|
||||
def filtered_conditions_fields(submitter, only_submitter_fields: true)
|
||||
fields = submitter.submission.template_fields || submitter.submission.template.fields
|
||||
|
||||
fields_uuid_index = nil
|
||||
values = nil
|
||||
|
||||
fields.filter_map do |field|
|
||||
next if field['submitter_uuid'] != submitter.uuid && only_submitter_fields
|
||||
|
||||
if field['conditions'].present?
|
||||
fields_uuid_index ||= fields.index_by { |f| f['uuid'] }
|
||||
values ||= submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
|
||||
|
||||
submitter_conditions = []
|
||||
|
||||
next unless check_item_conditions(field, values, fields_uuid_index,
|
||||
include_submitter_uuid: submitter.uuid,
|
||||
submitter_conditions_acc: submitter_conditions)
|
||||
|
||||
field = field.merge('conditions' => submitter_conditions) if submitter_conditions != field['conditions']
|
||||
end
|
||||
|
||||
field
|
||||
end
|
||||
end
|
||||
|
||||
def check_item_conditions(item, values, fields_index, include_submitter_uuid: nil, submitter_conditions_acc: nil)
|
||||
return true if item['conditions'].blank?
|
||||
|
||||
item['conditions'].all? do |condition|
|
||||
item['conditions'].each_with_object([]) do |condition, acc|
|
||||
result =
|
||||
if fields_index[condition['field_uuid']]['submitter_uuid'] == include_submitter_uuid
|
||||
submitter_conditions_acc << condition if submitter_conditions_acc
|
||||
|
||||
true
|
||||
else
|
||||
Submitters::SubmitValues.check_field_condition(condition, values, fields_index)
|
||||
end
|
||||
|
||||
item['conditions'].each_with_object([]) do |c, acc|
|
||||
if c['operation'] == 'or'
|
||||
acc.push(acc.pop || result)
|
||||
else
|
||||
acc.push(result)
|
||||
end
|
||||
end.exclude?(false)
|
||||
end
|
||||
if condition['operation'] == 'or'
|
||||
acc.push(acc.pop || result)
|
||||
else
|
||||
acc.push(result)
|
||||
end
|
||||
end.exclude?(false)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -186,10 +186,21 @@ module Submitters
|
||||
attachments_index =
|
||||
Submissions.filtered_conditions_schema(submitter.submission).index_by { |i| i['attachment_uuid'] }
|
||||
|
||||
submitter_values = nil
|
||||
is_other_submitter_conditions = submitter.submission.template_submitters.size > 1
|
||||
|
||||
submitter.submission.template_fields.each do |field|
|
||||
next if field['submitter_uuid'] != submitter.uuid
|
||||
|
||||
submitter.values.delete(field['uuid']) unless check_field_conditions(submitter, field, fields_uuid_index)
|
||||
submitter_values ||= submitter.values
|
||||
|
||||
is_other_submitter_conditions &&= field_conditions_other_submitter?(submitter, field, fields_uuid_index)
|
||||
|
||||
if is_other_submitter_conditions
|
||||
submitter_values = submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
|
||||
end
|
||||
|
||||
submitter.values.delete(field['uuid']) unless check_field_conditions(submitter_values, field, fields_uuid_index)
|
||||
|
||||
if field['areas'].present? && field['areas'].none? { |area| attachments_index[area['attachment_uuid']] }
|
||||
submitter.values.delete(field['uuid'])
|
||||
@@ -199,10 +210,14 @@ module Submitters
|
||||
submitter.values
|
||||
end
|
||||
|
||||
def check_field_conditions(submitter, field, fields_uuid_index)
|
||||
return true if field['conditions'].blank?
|
||||
def field_conditions_other_submitter?(submitter, field, fields_uuid_index)
|
||||
field['conditions'].to_a.any? do |c|
|
||||
fields_uuid_index.dig(c['field_uuid'], 'submitter_uuid') != submitter.uuid
|
||||
end
|
||||
end
|
||||
|
||||
submitter_values = submitter.values
|
||||
def check_field_conditions(submitter_values, field, fields_uuid_index)
|
||||
return true if field['conditions'].blank?
|
||||
|
||||
field['conditions'].each_with_object([]) do |c, acc|
|
||||
if c['operation'] == 'or'
|
||||
|
||||
Reference in New Issue
Block a user