lib/ecoportal/api/v2/page/sections.rb in ecoportal-api-v2-0.8.8 vs lib/ecoportal/api/v2/page/sections.rb in ecoportal-api-v2-0.8.9

- old
+ new

@@ -5,28 +5,86 @@ class Sections < Common::Content::CollectionModel class_resolver :section_class, "Ecoportal::API::V2::Page::Section" self.klass = :section_class + # Creates a new `section` def add(name: nil, split: false, pos: NOT_USED, before: NOT_USED, after: NOT_USED) sec_doc = section_class.new_doc(split: split) - upsert!(sec_doc, pos: pos, before: before, after: after) do |section| + upsert!(sec_doc) do |section| #, pos: pos, before: before, after: after) do |section| section.heading = name - if prev = previous_section(section) - section.weight = prev.weight + if weight = scope_weight(pos: pos, before: before, after: after) + section.weight = weight end + fix_weights! yield(section) if block_given? - #fix_weights! # a server bug prevents to set the weight of existing sections end end + def get_by_type(type) + ordered.select do |sec| + sec.type == type + end + end + + def get_by_heading(heading) + ordered.select do |sec| + value = heading == :unnamed ? nil : heading + same_string?(sec.heading, value) + end + end + + # Gets all the sections between `sec1` and `sec2` + def between(sec1, sec2, included: false) + sorted_secs = ordered + pos1 = (sec1 = to_section(sec1)) && sorted_secs.index(sec1) + pos2 = (sec2 = to_section(sec2)) && sorted_secs.index(sec2) + if included + pos1 = pos1 ? pos1 : 0 + pos2 = pos2 ? pos2 : -1 + else + pos1 = pos1 ? (pos1 + 1) : 0 + pos2 = pos2 ? (pos2 - 1) : -1 + end + sorted_secs[pos1..pos2] + end + + # Gets the sections ordered by `weight` (as they appear in the page) def ordered - each_with_index.sort_by do |section, index| + self.sort_by.with_index do |section, index| (section.weight >= 9999) ? [index, index] : [section.weight, index] - end.map(&:first) + end end private + + def scope_weight(pos: NOT_USED, before: NOT_USED, after: NOT_USED) + case + when used_param?(pos) + if pos = to_section(pos) + pos.weight - 1 + end + when used_param?(before) + if before = to_section(before) + before.weight - 1 + end + when used_param?(after) + if after = to_section(after) + after.weight + end + end + end + + def to_section(value) + case value + when Ecoportal::API::V2::Page::Section + value + when Numeric + ordered[value] + else + get_by_heading(value).first + end + end def fix_weights! ordered.each_with_index do |section, index| section.weight = index end