# frozen_string_literal: true class Element < ApplicationRecord has_rich_text :description belongs_to :page, touch: true has_many :success_criteria, -> { order(:position) }, dependent: :destroy delegate :report, to: :page before_validation :set_position before_update :update_positions, if: :position_changed? # Calculate actual conformity level: # - if a success_criterion has result :failed -> the confirmity_level # of that success_criterion is not reached. # - the resulting level is the highest readched level # abeying rule above. def level return nil return nil unless success_criteria.all(&:result) element min_failed = success_criteria.select(&:failed?).map(&:level).min possible_levels = success_criteria.select(&:passed?).map(&:level).uniq return nil if possible_levels.empty? Rails.logger.debug possible_levels.inspect Rails.logger.debug min_failed possible_levels[possible_levels.find_index(min_failed) - 1] end def max_level @max_level ||= success_criteria.reject(&:not_applicable?).max(&:level) end def number "#{page.position}.#{position}" end private def set_position Rails.logger.debug("element: position #{position}") self.position ||= (page.elements.pluck(:position).max || 0) + 1 end def update_positions if position_was page.elements.where("position > ?", position_was).update_all("position = position - 1") end page.elements.where(position: position..).update_all("position = position + 1") end end