diff --git a/app/javascript/template_builder/conditions_modal.vue b/app/javascript/template_builder/conditions_modal.vue index 5bcc0129..458aa374 100644 --- a/app/javascript/template_builder/conditions_modal.vue +++ b/app/javascript/template_builder/conditions_modal.vue @@ -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) } diff --git a/app/views/submit_form/_submission_form.html.erb b/app/views/submit_form/_submission_form.html.erb index 9ddb02c6..8b7af020 100644 --- a/app/views/submit_form/_submission_form.html.erb +++ b/app/views/submit_form/_submission_form.html.erb @@ -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 %> diff --git a/lib/submissions.rb b/lib/submissions.rb index fc1f6810..8a89aaa6 100644 --- a/lib/submissions.rb +++ b/lib/submissions.rb @@ -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 diff --git a/lib/submitters/submit_values.rb b/lib/submitters/submit_values.rb index a68ce73f..b23e7005 100644 --- a/lib/submitters/submit_values.rb +++ b/lib/submitters/submit_values.rb @@ -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'