From dddffc11cd737df18669bf9da79a7140097b14ac Mon Sep 17 00:00:00 2001 From: Andrej Date: Wed, 28 Aug 2024 11:57:41 +0200 Subject: [PATCH] Improve report wizards [SCI-10989] --- app/assets/javascripts/reports/new.js | 13 ++++++-- app/controllers/reports_controller.rb | 32 ++++++++++++++++++- app/helpers/reports_helper.rb | 4 +++ app/services/reports/docx.rb | 2 +- .../reports/template_values_editor.html.erb | 6 +++- .../wizard/_no_template_values.html.erb | 6 +++- .../_project_template_selector.html.erb | 4 ++- config/locales/en.yml | 6 ++-- 8 files changed, 63 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/reports/new.js b/app/assets/javascripts/reports/new.js index 519bae098..168aab5de 100644 --- a/app/assets/javascripts/reports/new.js +++ b/app/assets/javascripts/reports/new.js @@ -1258,7 +1258,8 @@ function reportHandsonTableConverter() { function reCheckContinueButton() { if (dropdownSelector.getValues('#projectSelector').length > 0 && dropdownSelector.getValues('#templateSelector').length > 0 - && dropdownSelector.getValues('#docxTemplateSelector').length > 0) { + && (dropdownSelector.getValues('#docxTemplateSelector').length > 0 + || $('#docxTemplateSelector').closest('.hidden').length > 0)) { $('.continue-button').attr('disabled', false); } else { $('.continue-button').attr('disabled', true); @@ -1281,6 +1282,12 @@ function reportHandsonTableConverter() { if (dropdownSelector.getValues('#projectSelector').length > 0) { dropdownSelector.enableSelector('#templateSelector'); dropdownSelector.enableSelector('#docxTemplateSelector'); + if ($('#templateSelector').data('defaultTemplate')) { + dropdownSelector.selectValues('#templateSelector', $('#templateSelector').data('defaultTemplate')); + } + if ($('#docxTemplateSelector').data('defaultTemplate')) { + dropdownSelector.selectValues('#docxTemplateSelector', $('#docxTemplateSelector').data('defaultTemplate')); + } } else { dropdownSelector.selectValues('#templateSelector', ''); dropdownSelector.disableSelector('#templateSelector'); @@ -1354,7 +1361,7 @@ function reportHandsonTableConverter() { } function loadTemplate() { - let template = $('#templateSelector').val(); + const template = dropdownSelector.getValues('#templateSelector'); let params = { project_id: dropdownSelector.getValues('#projectSelector'), template: template @@ -1384,7 +1391,7 @@ function reportHandsonTableConverter() { } function loadDocxTemplate() { - let template = $('#docxTemplateSelector').val(); + const template = dropdownSelector.getValues('#docxTemplateSelector'); let params = { project_id: dropdownSelector.getValues('#projectSelector'), template: template diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index bb13046b4..7bb30bfe8 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -18,7 +18,8 @@ class ReportsController < ApplicationController before_action :check_create_permissions, only: %i(new create) before_action :check_manage_permissions, only: %i(edit update generate_pdf generate_docx) before_action :switch_team_with_param, only: :index - after_action :generate_pdf_report, only: %i(create update generate_pdf) + after_action :generate_pdf_report, only: %i(generate_pdf) + after_action :generate_report, only: %i(create update) # Index showing all reports of a single project def index @@ -44,6 +45,8 @@ class ReportsController < ApplicationController def new_template_values if Extends::REPORT_TEMPLATES.key?(params[:template]&.to_sym) template = params[:template] + @type = :pdf + @template_name = Extends::REPORT_TEMPLATES[params[:template].to_sym] else return render_404 end @@ -69,6 +72,7 @@ class ReportsController < ApplicationController else render json: { html: render_to_string(partial: 'reports/wizard/no_template_values', + locals: { type: @type, template: @template_name }, formats: :html) } end @@ -77,6 +81,8 @@ class ReportsController < ApplicationController def new_docx_template_values if Extends::DOCX_REPORT_TEMPLATES.key?(params[:template]&.to_sym) template = params[:template] + @type = :docx + @template_name = Extends::DOCX_REPORT_TEMPLATES[params[:template].to_sym] else return render_404 end @@ -102,6 +108,7 @@ class ReportsController < ApplicationController else render json: { html: render_to_string(partial: 'reports/wizard/no_template_values', + locals: { type: @type, template: @template_name }, formats: :html) } end @@ -363,6 +370,9 @@ class ReportsController < ApplicationController .merge(MyModule.active) .group(:id) .select(:id, :name) + @default_template = Extends::REPORT_TEMPLATES.keys.first.to_s if Extends::REPORT_TEMPLATES.one? + + @default_docx_template = Extends::DOCX_REPORT_TEMPLATES.keys.first.to_s if Extends::DOCX_REPORT_TEMPLATES.one? && custom_templates(Extends::DOCX_REPORT_TEMPLATES) end def check_project_read_permissions @@ -430,6 +440,26 @@ class ReportsController < ApplicationController Rails.logger.error e.message end + def generate_docx_report + return unless @report.persisted? + + @report.docx_processing! + log_activity(:generate_docx_report) + + ensure_report_template! + Reports::DocxJob.perform_later(@report.id, user_id: current_user.id, root_url: root_url) + rescue ActiveRecord::ActiveRecordError => e + Rails.logger.error e.message + end + + def generate_report + return unless @report.persisted? + + generate_pdf_report + + generate_docx_report if @report.settings['docx_template'].present? && custom_templates(Extends::DOCX_REPORT_TEMPLATES) + end + def ensure_report_template! return if @report.settings['template'].present? diff --git a/app/helpers/reports_helper.rb b/app/helpers/reports_helper.rb index 7dcc85929..5a05d13e2 100644 --- a/app/helpers/reports_helper.rb +++ b/app/helpers/reports_helper.rb @@ -106,4 +106,8 @@ module ReportsHelper experiment_element.experiment.description end end + + def custom_templates(templates) + templates.any? { |template, _| template != :scinote_template } + end end diff --git a/app/services/reports/docx.rb b/app/services/reports/docx.rb index 46445f338..72e6ce339 100644 --- a/app/services/reports/docx.rb +++ b/app/services/reports/docx.rb @@ -30,7 +30,7 @@ class Reports::Docx @link_style = {} @color = {} @scinote_url = options[:scinote_url][0..-2] - @template = @settings[:docx_template] || 'scinote_template' + @template = @settings[:docx_template].presence || 'scinote_template' extend "#{@template.camelize}Docx".constantize end diff --git a/app/views/layouts/reports/template_values_editor.html.erb b/app/views/layouts/reports/template_values_editor.html.erb index 225c32a4a..841b024ef 100644 --- a/app/views/layouts/reports/template_values_editor.html.erb +++ b/app/views/layouts/reports/template_values_editor.html.erb @@ -1,6 +1,10 @@

- <%= t('projects.reports.wizard.first_step.values_editor.title') %> + <% if @type == :pdf %> + <%= t('projects.reports.wizard.first_step.values_editor.title_pdf', template: @template_name) %> + <% else %> + <%= t('projects.reports.wizard.first_step.values_editor.title_docx', template: @template_name) %> + <% end %>

-
+
<%= label_tag :docxTemplateSelector, t('projects.reports.wizard.first_step.select_docx_template') %> <%= select_tag :docxTemplateSelector, options_for_select(@docx_templates.invert, @active_docx_template), @@ -32,6 +33,7 @@ disable_on_load: report.settings[:docx_template].blank? && report.new_record?, placeholder: t('projects.reports.wizard.first_step.select_docx_template'), selected_template: report.settings[:docx_template], + default_template: @default_docx_template, values_editor_path: reports_new_docx_template_values_path(report_id: report.id) } %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index 55582e52c..3e481c9a8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -803,13 +803,15 @@ en: report_description: "Report description (optional)" report_description_placeholder: "In this report you can see..." values_editor: - title: "Enter template data" + title_pdf: "PDF %{template}" + title_docx: "DOCX %{template}" description: "This template requires you to fill out additional information about this project. This is the only place you will be able to do so." header: "Header" cover: "Title page" footer: "Footer" toc: "Table of contents" - no_values_title: "No additional data required" + no_values_title_pdf: "PDF %{template}: No additional data required" + no_values_title_docx: "DOCX %{template}: No additional data required" no_values_description: "SciNote template doesn’t need any additional input for it to be successfully generated." second_step: select_project_content: "Select and reorder experiments and tasks"