diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb index 14abd825..d70ade71 100644 --- a/app/controllers/api/submissions_controller.rb +++ b/app/controllers/api/submissions_controller.rb @@ -106,7 +106,8 @@ module Api def submissions_params params.permit(submission: [{ - submitters: [[:uuid, :name, :email, :role, :completed, :phone, { values: {} }]] + submitters: [[:uuid, :name, :email, :role, :completed, :phone, + { values: {}, readonly_fields: [] }]] }]) end diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue index ed47c14e..eea283fe 100644 --- a/app/javascript/submission_form/form.vue +++ b/app/javascript/submission_form/form.vue @@ -484,7 +484,7 @@ export default { return this.currentStepFields[0] }, stepFields () { - return this.fields.reduce((acc, f) => { + return this.fields.filter((f) => !f.readonly).reduce((acc, f) => { const prevStep = acc[acc.length - 1] if (f.type === 'checkbox' && Array.isArray(prevStep) && prevStep[0].type === 'checkbox') { diff --git a/app/views/submit_form/show.html.erb b/app/views/submit_form/show.html.erb index 7813e0c4..ab659e2d 100644 --- a/app/views/submit_form/show.html.erb +++ b/app/views/submit_form/show.html.erb @@ -1,5 +1,5 @@ <% fields_index = Templates.build_field_areas_index(@submitter.submission.template_fields || @submitter.submission.template.fields) %> -<% values = @submitter.submission.submitters.where.not(id: @submitter.id).reduce({}) { |acc, sub| acc.merge(sub.values) } %> +<% values = @submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) } %> <% attachments_index = ActiveStorage::Attachment.where(record: @submitter.submission.submitters, name: :attachments).preload(:blob).index_by(&:uuid) %>
@@ -20,6 +20,7 @@ <% fields_index.dig(document.uuid, index)&.each do |(area, field)| %> <% value = values[field['uuid']] %> <% next if value.blank? %> + <% next if !field['readonly'] && field['submitter_uuid'] == @submitter.uuid %> <%= render 'submissions/value', area:, field:, attachments_index:, value:, locale: @submitter.submission.template.account.locale %> <% end %>
diff --git a/lib/submissions/create_from_submitters.rb b/lib/submissions/create_from_submitters.rb index 60a0b43c..c571d6a3 100644 --- a/lib/submissions/create_from_submitters.rb +++ b/lib/submissions/create_from_submitters.rb @@ -9,11 +9,10 @@ module Submissions submission = template.submissions.new(created_by_user: user, source:, template_submitters: template.submitters, submitters_order:) + maybe_set_template_fields(submission, attrs[:submitters]) + attrs[:submitters].each_with_index do |submitter_attrs, index| - uuid = - submitter_attrs[:uuid].presence || - template.submitters.find { |e| e['name'] == submitter_attrs[:role] }&.dig('uuid') || - template.submitters[index]&.dig('uuid') + uuid = find_submitter_uuid(template, submitter_attrs, index) next if uuid.blank? @@ -26,6 +25,37 @@ module Submissions end end + def maybe_set_template_fields(submission, submitters_attrs) + template_fields = submission.template.fields.deep_dup + + submitters_attrs.each_with_index do |submitter_attrs, index| + next if submitter_attrs[:readonly_fields].blank? + + uuid = find_submitter_uuid(submission.template, submitter_attrs, index) + + template_fields.each do |f| + next if f['submitter_uuid'] != uuid || + (!f['name'].in?(submitter_attrs[:readonly_fields]) && + !f['name'].parameterize.underscore.in?(submitter_attrs[:readonly_fields])) + + f['readonly'] = true + end + end + + if template_fields != submission.template.fields + submission.template_fields = template_fields + submission.template_schema = submission.template.schema + end + + submission + end + + def find_submitter_uuid(template, attrs, index) + attrs[:uuid].presence || + template.submitters.find { |e| e['name'] == attrs[:role] }&.dig('uuid') || + template.submitters[index]&.dig('uuid') + end + def build_submitter(submission:, attrs:, uuid:, is_order_sent:, mark_as_sent:) email = Submissions.normalize_email(attrs[:email])