lib/ecoportal/api/v2/page/component/selection_field.rb in ecoportal-api-v2-0.8.26 vs lib/ecoportal/api/v2/page/component/selection_field.rb in ecoportal-api-v2-0.8.27

- old
+ new

@@ -8,33 +8,64 @@ passthrough :other_desc passthrough :data_type embeds_many :options, klass: "Ecoportal::API::V2::Page::Component::SelectionOption", order_key: :weight + def numeric? + self.data_type == "num" + end + + def text? + self.data_type == "txt" + end + def numeric!(&block) ordered_options.each {|opt| opt.numeric!(&block)} self.data_type = "num" end def text!(&block) ordered_options.each {|opt| opt.text!(&block)} self.data_type = "str" end - def select(value) - opt = options.find {|opt| opt.value == value} + def switch_type!(&block) + numeric? ? text!(&block) : numeric!(&block) + end + + def select(value_name, by_name: false) + opt = find_option(value_name, by_name: by_name) sel = selected return true if !multiple && opt == sel sel.selected = false if !multiple && sel opt.selected = true unless !opt end - def selected - if multiple - options.select {|opt| opt.selected} + def deselect(value_name, by_name: false) + if opt = find_option(value_name, by_name: by_name) + opt.selected = false + end + end + + def selected(by_name: false, by_value: false, value: false, name: false) + case + when by_value + elems = [selected].flatten.compact + options_hash(elems) do |option| + name ? option.name : option + end + when by_name + elems = [selected].flatten.compact + options_hash(elems, by_name: true) do |option| + value ? option.value : option + end else - options.find {|opt| opt.selected} + if multiple + ordered_options.select {|opt| opt.selected} + else + options.find {|opt| opt.selected} + end end end def value if multiple @@ -42,10 +73,26 @@ else selected&.value end end + def values + [value].flatten.compact + end + + def name + if multiple + selected.map {|opt| opt.name} + else + selected&.name + end + end + + def names + [name].flatten.compact + end + def add_option(value:, name: nil, pos: NOT_USED, before: NOT_USED, after: NOT_USED) opt_doc = options.items_class.new_doc options.upsert!(opt_doc, pos: pos, before: before, after: after) do |option| option.name = name option.value = value @@ -61,10 +108,30 @@ options.sort_by.with_index do |option, index| [option.weight, index] end end + # @param name [Boolean] whether or not the values of the `Hash` should be the `names` + # @return [Hash] of **key** _value_ and **value**: + # 1. _option_ if `name` is `false` + # 2. _name_ if `name` is `true` + def options_by_value(name: false) + options_hash do |option| + name ? option.name : option + end + end + + # @param value [Boolean] whether or not the values of the `Hash` should be the `values` + # @return [Hash] of **key** _name_ and **value**: + # 1. _option_ if `value` is `false` + # 2. _value_ if `value` is `true` + def options_by_name(value: false) + options_hash(by_name: true) do |option| + value ? option.value : option + end + end + def to_s(name: true, delimiter: "\n") [selected].flatten.compact.map do |opt| name ? opt.name : opt.value end.join(delimiter) end @@ -73,11 +140,11 @@ # @param conf [Symbol, Array<Symbol>] # - `:flat` to display in flat mode # - `:multiple` to allow multiple selection # - `:single` to set to singular selection # - `:other` to enable `other` button - # - `:options` to add options (`Hash<value, name>`) + # - `:options` to add options (`Hash<value, name>`) or update option names # - `:type` to define the type # - `:num` # - `:str` def configure(*conf) conf.each_with_object([]) do |cnf, unused| @@ -120,12 +187,17 @@ end private def configure_options(opts) + hopts = self.options_by_value opts.each do |val, nm| - add_option(value: val, name: nm) + if option = hopts[val] + option.name = nm + else + add_option(value: val, name: nm) + end end end def fix_option_weights! ordered_options.each_with_index do |option, index| @@ -138,10 +210,23 @@ pos = opts.index(value) - 1 return if pos < 0 opts[pos] end + def find_option(value_name, by_name: false) + if by_name + opt = options.find {|opt| same_string?(opt.name, value_name)} + else + opt = options.find {|opt| opt.value == value_name} + end + end + def options_hash(elems = ordered_options, by_name: false) + elems.each_with_object({}) do |option, hash| + key = by_name ? option.name : option.value + hash[key] = block_given?? yield(option) : option + end + end end end end end end