diff --git a/app/helpers/reports_helper.rb b/app/helpers/reports_helper.rb index f004dc6d7..7f643b285 100644 --- a/app/helpers/reports_helper.rb +++ b/app/helpers/reports_helper.rb @@ -121,4 +121,19 @@ module ReportsHelper def custom_templates(templates) templates.any? { |template, _| template != :scinote_template } end + + def report_form_response_content(form_response) + form_field_values = form_response.form_field_values + + form_response.form.form_fields&.map do |form_field| + form_field_value = form_field_values.find_by(form_field_id: form_field.id, latest: true) + + { + name: form_field.name, + value: form_field_value&.not_applicable ? I18n.t('forms.export.values.not_applicable') : form_field_value&.formatted.to_s, + submitted_at: form_field_value&.submitted_at&.utc.to_s, + submitted_by: form_field_value&.submitted_by&.full_name.to_s + } + end + end end diff --git a/app/models/report.rb b/app/models/report.rb index 87d159e6a..ca2cccb72 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -55,6 +55,7 @@ class Report < ApplicationRecord step_files: true, step_tables: true, step_comments: true, + step_forms: true, step_well_plates: true }, file_results: true, diff --git a/app/services/reports/docx/draw_step.rb b/app/services/reports/docx/draw_step.rb index a3f4272c1..b657b2fe3 100644 --- a/app/services/reports/docx/draw_step.rb +++ b/app/services/reports/docx/draw_step.rb @@ -40,6 +40,8 @@ module Reports::Docx::DrawStep handle_checklist(element.orderable) when 'StepText' handle_step_text(element) + when 'FormResponse' + handle_step_forms(element) end end if @settings.dig('task', 'protocol', 'step_files') @@ -73,4 +75,8 @@ module Reports::Docx::DrawStep def handle_step_text(element) draw_step_text(element) if @settings.dig('task', 'protocol', 'step_texts') end + + def handle_step_forms(element) + draw_step_forms(element) if @settings.dig('task', 'protocol', 'step_forms') + end end diff --git a/app/services/reports/docx/draw_step_form.rb b/app/services/reports/docx/draw_step_form.rb new file mode 100644 index 000000000..2e6960104 --- /dev/null +++ b/app/services/reports/docx/draw_step_form.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module Reports + class Docx + module DrawStepForm + def draw_step_forms(element) + return unless @settings.dig('task', 'protocol', 'step_forms') + + form_response = element.orderable + color = @color + form_fields = form_response.form.form_fields + form_field_values = form_response.form_field_values + + table = [[ + I18n.t('projects.reports.elements.step_forms.field'), + I18n.t('projects.reports.elements.step_forms.answer'), + I18n.t('projects.reports.elements.step_forms.submitted_at'), + I18n.t('projects.reports.elements.step_forms.submitted_by') + ]] + + form_fields&.each do |form_field| + form_field_value = form_field_values.find_by(form_field_id: form_field.id, latest: true) + table << [ + form_field.name, + form_field_value&.not_applicable ? I18n.t('forms.export.values.not_applicable') : form_field_value&.formatted.to_s, + form_field_value&.submitted_at&.utc.to_s, + form_field_value&.submitted_by&.full_name.to_s + ] + end + + @docx.p + @docx.table table, border_size: Constants::REPORT_DOCX_TABLE_BORDER_SIZE do + cell_style rows[0], bold: true, background: color[:concrete] + end + + @docx.p do + text I18n.t('projects.reports.elements.step_forms.table_name', name: form_response.form.name), italic: true + text ' ' + + if form_response.submitted? + text I18n.t('projects.reports.elements.step_forms.user_time', user: form_response.submitted_by&.full_name, + timestamp: I18n.l(form_response.submitted_at, format: :full)), color: color[:gray] + else + text I18n.t('projects.reports.elements.step_forms.not_submitted'), color: color[:gray] + end + end + end + end + end +end diff --git a/app/views/reports/elements/_my_module_step_element.html.erb b/app/views/reports/elements/_my_module_step_element.html.erb index fa330886d..ef5e6ac98 100644 --- a/app/views/reports/elements/_my_module_step_element.html.erb +++ b/app/views/reports/elements/_my_module_step_element.html.erb @@ -37,6 +37,9 @@ <% if e.orderable_type == 'StepText' && @settings.dig('task', 'protocol', 'step_texts') %> <%= render partial: 'reports/elements/step_text_element', locals: { step_text: e.orderable, export_all: export_all } %> <% end %> + <% if e.orderable_type == 'FormResponse' && @settings.dig('task', 'protocol', 'step_forms') %> + <%= render partial: 'reports/elements/step_form_element', locals: { form_response: e.orderable } %> + <% end %> <% end %> <% if @settings.dig('task', 'protocol', 'step_files') %> <% assets.each do |asset| %> diff --git a/app/views/reports/elements/_step_form_element.html.erb b/app/views/reports/elements/_step_form_element.html.erb new file mode 100644 index 000000000..a06551ef8 --- /dev/null +++ b/app/views/reports/elements/_step_form_element.html.erb @@ -0,0 +1,50 @@ +<% form_fields = report_form_response_content(form_response) %> +
+
+
+ + <%= truncate(form_response.form.name, length: Constants::FILENAME_TRUNCATION_LENGTH) %> + +
+
+ <% if form_response.submitted? %> + <%= t("projects.reports.elements.step_forms.user_time", user: form_response.submitted_by&.full_name, + timestamp: l(form_response.submitted_at, format: :full)) %> + <% else %> + <%= t('projects.reports.elements.step_forms.not_submitted') %> + <% end %> +
+
+ +
+
+
+ + + + + + + + + + <% form_fields.each do |form_field| %> + + + + + + + <% end %> + +
<%= t('projects.reports.elements.step_forms.field') %><%= t('projects.reports.elements.step_forms.answer') %><%= t('projects.reports.elements.step_forms.submitted_at') %><%= t('projects.reports.elements.step_forms.submitted_by') %>
<%= form_field[:name] %><%= form_field[:value] %><%= form_field[:submitted_at] %><%= form_field[:submitted_by] %>
+
+
+
+ + <% if defined?(children) %> +
+ <%= children %> +
+ <% end %> +
diff --git a/app/views/reports/wizard/_third_step.html.erb b/app/views/reports/wizard/_third_step.html.erb index a1f8216f7..f5ce15391 100644 --- a/app/views/reports/wizard/_third_step.html.erb +++ b/app/views/reports/wizard/_third_step.html.erb @@ -33,7 +33,7 @@ <%= t("projects.reports.wizard.third_step.protocol_step") %>