diff --git a/app/assets/javascripts/reports/new.js.erb b/app/assets/javascripts/reports/new.js.erb index bf0c05158..80a4b162d 100644 --- a/app/assets/javascripts/reports/new.js.erb +++ b/app/assets/javascripts/reports/new.js.erb @@ -217,9 +217,7 @@ function initializeNewElement(newEl) { url: url, type: "GET", dataType: "json", - data: { - id: parentElementId - }, + data: parentElementId, success: function(data, status, jqxhr) { // Open modal, set its title, and display module contents addContentsModal.find(".modal-title").text(modalTitle); @@ -500,11 +498,11 @@ function initializeUnsavedWorkDialog() { */ function getSidebarEl(reportEl) { var type = reportEl.data("type"); - var id = reportEl.data("id"); + var scrollId = reportEl.data("scroll-id"); return $(SIDEBAR_PARENT_TREE).find( "li" + "[data-type='" + type + "']" + - "[data-id='" + id + "']" + "[data-scroll-id='" + scrollId + "']" ); } @@ -516,11 +514,11 @@ function getSidebarEl(reportEl) { */ function getReportEl(sidebarEl) { var type = sidebarEl.data("type"); - var id = sidebarEl.data("id"); + var scrollId = sidebarEl.data("scroll-id"); return $(REPORT_CONTENT).find( "div.report-element" + "[data-type='" + type + "']" + - "[data-id='" + id + "']" + "[data-scroll-id='" + scrollId + "']" ); } @@ -565,14 +563,14 @@ function initSidebarElement(reportEl) { var elChildrenContainer = reportEl.children(".report-element-children"); var type = reportEl.data("type"); var name = reportEl.data("name"); - var id = reportEl.data("id"); + var scrollId = reportEl.data("scroll-id"); var iconClass = "glyphicon " + reportEl.data("icon-class"); // Generate list element var newLi = $(document.createElement("li")); newLi .attr("data-type", type) - .attr("data-id", id); + .attr("data-scroll-id", scrollId); var newSpan = $(document.createElement("span")); newSpan.appendTo(newLi); @@ -1025,7 +1023,7 @@ function addElement(jsonEl, prevEl) { .find( ".report-element" + "[data-type='" + el.attr("data-type") + "']" + - "[data-id='" + el.attr("data-id") + "']" + "[data-scroll-id='" + el.attr("data-scroll-id") + "']" ); if (existing.length && existing.length > 0) { // TODO Remove event listeners on existing element diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index 5aca8e35d..524123e90 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -233,7 +233,7 @@ class ReportsController < ApplicationController # Experiment for adding contents into experiment element def experiment_contents_modal - experiment = Experiment.find_by_id(params[:id]) + experiment = Experiment.find_by_id(params[:experiment_id]) respond_to do |format| if experiment.blank? @@ -255,7 +255,7 @@ class ReportsController < ApplicationController # Modal for adding contents into module element def module_contents_modal - my_module = MyModule.find_by_id(params[:id]) + my_module = MyModule.find_by_id(params[:my_module_id]) respond_to do |format| if my_module.blank? @@ -277,7 +277,7 @@ class ReportsController < ApplicationController # Modal for adding contents into step element def step_contents_modal - step = Step.find_by_id(params[:id]) + step = Step.find_by_id(params[:step_id]) respond_to do |format| if step.blank? @@ -299,7 +299,7 @@ class ReportsController < ApplicationController # Modal for adding contents into result element def result_contents_modal - result = Result.find_by_id(params[:id]) + result = Result.find_by_id(params[:result_id]) respond_to do |format| if result.blank? diff --git a/app/helpers/reports_helper.rb b/app/helpers/reports_helper.rb index 374aae60b..5fa20a09e 100644 --- a/app/helpers/reports_helper.rb +++ b/app/helpers/reports_helper.rb @@ -45,13 +45,9 @@ module ReportsHelper ReportElement.type_ofs.keys.each do |type| next unless element.public_send("#{type}?") - local_sym = type.split('_').last.to_sym - local_sym = type - .split('_') - .first - .to_sym if type.in? ReportExtends::FIRST_PART_ELEMENTS - local_sym = :my_module if type.in? ReportExtends::MY_MODULE_ELEMENTS - locals[local_sym] = element.element_reference + element.element_references.each do |el_ref| + locals[el_ref.class.name.underscore.to_sym] = el_ref + end locals[:order] = element .sort_order if type.in? ReportExtends::SORTED_ELEMENTS end diff --git a/app/models/report.rb b/app/models/report.rb index 9c862fbd8..651ccc486 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -95,7 +95,7 @@ class Report < ActiveRecord::Base el.parent = parent el.type_of = json_element['type_of'] el.sort_order = json_element['sort_order'] - el.set_element_reference(json_element['id']) + el.set_element_references(json_element['id']) el.save! if json_element['children'].present? diff --git a/app/models/report_element.rb b/app/models/report_element.rb index 398a69883..623ba3fe6 100644 --- a/app/models/report_element.rb +++ b/app/models/report_element.rb @@ -31,6 +31,7 @@ class ReportElement < ActiveRecord::Base belongs_to :checklist, inverse_of: :report_elements belongs_to :asset, inverse_of: :report_elements belongs_to :table, inverse_of: :report_elements + belongs_to :repository, inverse_of: :report_elements def has_children? children.length > 0 @@ -44,19 +45,21 @@ class ReportElement < ActiveRecord::Base step_comments? or result_comments? end - # Get the referenced element (previously, element's type_of must be set) - def element_reference + # Get the referenced elements (previously, element's type_of must be set) + def element_references ReportExtends::ELEMENT_REFERENCES.each do |el_ref| - return eval(el_ref.element.gsub('_id', '')) if el_ref.check(self) + return el_ref.elements.map { |el| eval(el.gsub('_id', '')) } if el_ref.check(self) end end - # Set the element reference (previously, element's type_of must be set) - def set_element_reference(ref_id) + # Set the element references (previously, element's type_of must be set) + def set_element_references(ref_ids) ReportExtends::SET_ELEMENT_REFERENCES_LIST.each do |el_ref| check = el_ref.check(self) next unless check - public_send("#{el_ref.element}=", ref_id) + el_ref.elements.each do |element| + public_send("#{element}=", ref_ids[element]) + end break end end @@ -64,7 +67,7 @@ class ReportElement < ActiveRecord::Base # removes element that are archived or deleted def clean_removed_or_archived_elements parent_model = '' - %w(project experiment my_module step result checklist asset table) + %w(project experiment my_module step result checklist asset table repository) .each do |el| parent_model = el if send el end @@ -81,17 +84,12 @@ class ReportElement < ActiveRecord::Base private def has_one_of_referenced_elements - num_of_refs = [project, - experiment, - my_module, - step, - result, - checklist, - asset, - table].count { |r| r.present? } - if num_of_refs != 1 - errors.add(:base, - 'Report element must have exactly one element reference.') + element_references.each do |el| + if el.nil? + errors.add(:base, + 'Report element doesn\'t have correct element references.') + break + end end end end diff --git a/app/models/repository.rb b/app/models/repository.rb index 43977d3cf..841ff4d9b 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -5,6 +5,7 @@ class Repository < ActiveRecord::Base has_many :repository_rows has_many :repository_table_states, inverse_of: :repository, dependent: :destroy + has_many :report_elements, inverse_of: :repository, dependent: :destroy auto_strip_attributes :name, nullify: false validates :name, diff --git a/app/views/reports/elements/_experiment_element.html.erb b/app/views/reports/elements/_experiment_element.html.erb index a2aff7b80..d8cbe17a6 100644 --- a/app/views/reports/elements/_experiment_element.html.erb +++ b/app/views/reports/elements/_experiment_element.html.erb @@ -3,7 +3,8 @@