Class: Ecoportal::API::V2::Page::Component::SelectionField

Inherits:
Ecoportal::API::V2::Page::Component show all
Defined in:
lib/ecoportal/api/v2/page/component/selection_field.rb

Constant Summary

Constants included from Common::Content::StringDigest

Common::Content::StringDigest::MAX_HASH_LABEL

Constants inherited from Common::Content::DoubleModel

Common::Content::DoubleModel::NOT_USED

Constants included from Common::Content::ClassHelpers

Common::Content::ClassHelpers::NOT_USED

Instance Attribute Summary

Attributes inherited from Common::Content::DoubleModel

#_key, #_parent

Instance Method Summary collapse

Methods inherited from Ecoportal::API::V2::Page::Component

#attached?, #bindings, #bindings?, #delete!, #forces, get_class, #indexable_label, #move, #multi_section?, new_doc, #ooze, #ref, #ref_backend, #section, #unattach!

Methods included from Common::Content::StringDigest

#hash_label, #indexable_label

Methods inherited from Common::Content::DoubleModel

#_doc_key, #as_json, #as_update, #consolidate!, #dirty?, #doc, embeds_many, embeds_one, enforce!, #initialize, #key, #key=, key?, new_uuid, #original_doc, pass_reader, pass_writer, passarray, passboolean, passdate, passforced, passkey, passthrough, #print_pretty, #replace_doc, #reset!, #root, #to_json

Methods included from Common::Content::ClassHelpers

#inheritable_attrs, #inheritable_class_vars, #inherited, #instance_variable_name, #new_class, #resolve_class, #to_constant, #to_time, #uid, #used_param?

Constructor Details

This class inherits a constructor from Ecoportal::API::Common::Content::DoubleModel

Instance Method Details

#add_option(**kargs, &block) ⇒ Object

See Also:

  • Component::SelectionOptions#add


94
95
96
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 94

def add_option(**kargs, &block)
  options.add(**kargs, &block)
end

#configure(*conf) ⇒ Object

Quick config helper

Parameters:

  • 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>) or update option names
    • :type to define the type
      • :num
      • :str


128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 128

def configure(*conf)
  conf.each_with_object([]) do |cnf, unused|
    case cnf
    when :flat
      self.flat  = true
    when :multiple
      self.multiple = true
    when :single
      self.multiple = false
    when :other
      self.other = true
    when Hash
      supported = [:flat, :options, :type]
      unless (rest = hash_except(cnf.dup, *supported)).empty?
        unused.push(rest)
      end

      if cnf.key?(:flat) then self.flat = cnf[:flat] end
      if cnf.key?(:options)
        if opts = cnf[:options]
          configure_options opts
        end
      end
      if cnf.key?(:type)
        if cnf[:type] == :str
          self.text!
        elsif cnf[:type] == :num
          self.numeric!
        else
          # Unknown type
        end
      end
    else
      unused.push(cnf)
    end
  end.yield_self do |unused|
    super(*unused)
  end
end

#deselect(value_name, by_name: false) ⇒ Object



42
43
44
45
46
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 42

def deselect(value_name, by_name: false)
  if opt = options.find_option(value_name, by_name: by_name)
    opt.selected = false
  end
end

#nameObject



81
82
83
84
85
86
87
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 81

def name
  if multiple
    selected.map {|opt| opt.name}
  else
    selected&.name
  end
end

#namesObject



89
90
91
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 89

def names
  [name].flatten.compact
end

#numeric!(&block) ⇒ Object



20
21
22
23
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 20

def numeric!(&block)
  options.ordered.each {|opt| opt.numeric!(&block)}
  self.data_type = "num"
end

#numeric?Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 12

def numeric?
  self.data_type == "num"
end

#options_by_name(value: false) ⇒ Object

See Also:

  • Component::SelectionOptions#by_name


108
109
110
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 108

def options_by_name(value: false)
  options.by_name(value: value)
end

#options_by_value(name: false) ⇒ Object

See Also:

  • Component::SelectionOptions#by_value


103
104
105
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 103

def options_by_value(name: false)
  options.by_value(name: name)
end

#ordered_optionsObject



98
99
100
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 98

def ordered_options
  options.ordered
end

#select(value_name, by_name: false) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 34

def select(value_name, by_name: false)
  opt = options.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

#selected(by_name: false, by_value: false, value: false, name: false) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 48

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
    if multiple
      options.ordered.select {|opt| opt.selected}
    else
      options.find {|opt| opt.selected}
    end
  end
end

#switch_type!(&block) ⇒ Object



30
31
32
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 30

def switch_type!(&block)
  numeric? ? text!(&block) : numeric!(&block)
end

#text!(&block) ⇒ Object



25
26
27
28
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 25

def text!(&block)
  options.ordered.each {|opt| opt.text!(&block)}
  self.data_type = "str"
end

#text?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 16

def text?
  self.data_type == "txt"
end

#to_s(value: true, delimiter: "\n") ⇒ Object



112
113
114
115
116
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 112

def to_s(value: true, delimiter: "\n")
  [selected].flatten.compact.map do |opt|
    value ? opt.value : opt.name
  end.join(delimiter)
end

#valueObject



69
70
71
72
73
74
75
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 69

def value
  if multiple
    selected.map {|opt| opt.value}
  else
    selected&.value
  end
end

#valuesObject



77
78
79
# File 'lib/ecoportal/api/v2/page/component/selection_field.rb', line 77

def values
  [value].flatten.compact
end