Module: AdvancedSelect::Helper

Defined in:
lib/advanced_select/helper.rb

Instance Method Summary collapse

Instance Method Details

#advanced_select_add_option?(options, selected_options, add_mode, query) ⇒ Boolean

Returns:

  • (Boolean)


122
123
124
125
126
127
128
129
# File 'lib/advanced_select/helper.rb', line 122

def advanced_select_add_option?(options, selected_options, add_mode, query)
  return false unless add_mode && query.present?

  query_label = advanced_select_normalized_label(query)
  advanced_select_matched_labels(options, selected_options).none? do |label|
    advanced_select_normalized_label(label) == query_label
  end
end

#advanced_select_array(value) ⇒ Object



177
178
179
180
181
182
183
184
185
186
# File 'lib/advanced_select/helper.rb', line 177

def advanced_select_array(value)
  case value
  when nil
    []
  when Array
    value.compact
  else
    [value]
  end
end

#advanced_select_class(class_map, *keys) ⇒ Object



43
44
45
# File 'lib/advanced_select/helper.rb', line 43

def advanced_select_class(class_map, *keys)
  class_map.class_name(*keys)
end

#advanced_select_class_map(classes, append_classes = {}) ⇒ Object



209
210
211
212
213
214
215
# File 'lib/advanced_select/helper.rb', line 209

def advanced_select_class_map(classes, append_classes = {})
  if classes.is_a?(AdvancedSelect::ClassMap)
    classes
  else
    AdvancedSelect::ClassMap.new(classes, append_classes)
  end
end

#advanced_select_default_option_content_tag(option, class_map) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/advanced_select/helper.rb', line 104

def (option, class_map)
  description = advanced_select_option_description(option)
  content = [tag.span(advanced_select_option_label(option))]

  if description.present?
    content << tag.span(
      description,
      class: advanced_select_class(class_map, :option_description)
    )
  end

  tag.span(safe_join(content), class: advanced_select_class(class_map, :option_content))
end

#advanced_select_display_label(label) ⇒ Object



173
174
175
# File 'lib/advanced_select/helper.rb', line 173

def advanced_select_display_label(label)
  label.to_s.split(" > ").last
end

#advanced_select_flat_options(options) ⇒ Object



205
206
207
# File 'lib/advanced_select/helper.rb', line 205

def advanced_select_flat_options(options)
  options.flat_map { |option| option.key?(:options) ? option.fetch(:options) : option }
end

#advanced_select_matched_labels(options, selected_options) ⇒ Object



188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/advanced_select/helper.rb', line 188

def advanced_select_matched_labels(options, selected_options)
  option_labels = advanced_select_flat_options(options).flat_map do |option|
    label = advanced_select_option_label(option)
    [label, advanced_select_option_display_label(option)]
  end

  selected_labels = selected_options.flat_map do |option|
    [advanced_select_option_label(option), advanced_select_option_display_label(option)]
  end

  option_labels + selected_labels
end

#advanced_select_normalized_label(label) ⇒ Object



201
202
203
# File 'lib/advanced_select/helper.rb', line 201

def advanced_select_normalized_label(label)
  I18n.transliterate(label.to_s.squish).downcase
end

#advanced_select_option_content_tag(option, option_content_partial, class_map) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/advanced_select/helper.rb', line 96

def (option, option_content_partial, class_map)
  if option_content_partial.present?
    render partial: option_content_partial, locals: { option: option }
  else
    (option, class_map)
  end
end

#advanced_select_option_description(option) ⇒ Object



169
170
171
# File 'lib/advanced_select/helper.rb', line 169

def advanced_select_option_description(option)
  option[:description].to_s
end

#advanced_select_option_display_label(option) ⇒ Object



165
166
167
# File 'lib/advanced_select/helper.rb', line 165

def advanced_select_option_display_label(option)
  option.fetch(:display_label, advanced_select_display_label(advanced_select_option_label(option))).to_s
end

#advanced_select_option_groups(options) ⇒ Object



131
132
133
134
135
136
137
138
139
# File 'lib/advanced_select/helper.rb', line 131

def advanced_select_option_groups(options)
  options.map do |option|
    if option.key?(:options)
      { label: option.fetch(:label), options: option.fetch(:options) }
    else
      { label: nil, options: [option] }
    end
  end
end

#advanced_select_option_label(option) ⇒ Object



157
158
159
# File 'lib/advanced_select/helper.rb', line 157

def advanced_select_option_label(option)
  option.fetch(:label, option.fetch(:display_label, option.fetch(:value, option.fetch(:id)))).to_s
end

#advanced_select_option_selected?(option, selected_options, selected_option_ids = nil) ⇒ Boolean

Returns:

  • (Boolean)


147
148
149
150
151
# File 'lib/advanced_select/helper.rb', line 147

def advanced_select_option_selected?(option, selected_options, selected_option_ids = nil)
  return selected_option_ids.key?(option.fetch(:id).to_s) if selected_option_ids

  selected_options.any? { |selected_option| selected_option.fetch(:id).to_s == option.fetch(:id).to_s }
end

#advanced_select_option_tag(option, selected_options, option_content_partial, class_map, selected_option_ids: nil) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/advanced_select/helper.rb', line 68

def advanced_select_option_tag(option, selected_options, option_content_partial, class_map, selected_option_ids: nil)
  selected = advanced_select_option_selected?(option, selected_options, selected_option_ids)

  tag.button(
    type: "button",
    class: advanced_select_class(class_map, :option, (:option_selected if selected)),
    role: "option",
    aria: { selected: selected },
    data: {
      advanced_select_option: "",
      action: "mouseenter->advanced-select#activateOption mousedown->advanced-select#choose",
      advanced_select_value_param: option.fetch(:id),
      advanced_select_submit_value_param: advanced_select_option_value(option),
      advanced_select_label_param: advanced_select_option_label(option),
      advanced_select_display_label_param: advanced_select_option_display_label(option)
    }
  ) do
    safe_join([
      tag.span(
        (selected ? "\u2713" : ""),
        class: advanced_select_class(class_map, :option_check),
        data: { advanced_select_option_check: "" }
      ),
      (option, option_content_partial, class_map)
    ])
  end
end

#advanced_select_option_value(option) ⇒ Object



161
162
163
# File 'lib/advanced_select/helper.rb', line 161

def advanced_select_option_value(option)
  option.fetch(:value, option.fetch(:id)).to_s
end

#advanced_select_options_empty?(options) ⇒ Boolean

Returns:

  • (Boolean)


153
154
155
# File 'lib/advanced_select/helper.rb', line 153

def advanced_select_options_empty?(options)
  advanced_select_flat_options(options).empty?
end

#advanced_select_options_for_render(options, selected_options, searchable) ⇒ Object



118
119
120
# File 'lib/advanced_select/helper.rb', line 118

def advanced_select_options_for_render(options, selected_options, searchable)
  searchable ? selected_options.presence || options : options
end

#advanced_select_options_tag(target_id:, selected:, options:, multiple: false, add_mode: false, query: nil, option_content_partial: nil, classes: {}, append_classes: {}) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/advanced_select/helper.rb', line 30

def advanced_select_options_tag(target_id:, selected:, options:, multiple: false, add_mode: false, query: nil, option_content_partial: nil, classes: {}, append_classes: {})
  render partial: "advanced_select/options", locals: {
    target_id: target_id,
    selected_options: advanced_select_selected_options(selected),
    options: options,
    multiple: multiple,
    add_mode: add_mode,
    query: query,
    option_content_partial: option_content_partial,
    class_map: advanced_select_class_map(classes, append_classes)
  }
end

#advanced_select_selected_option_ids(selected_options) ⇒ Object



141
142
143
144
145
# File 'lib/advanced_select/helper.rb', line 141

def advanced_select_selected_option_ids(selected_options)
  selected_options.each_with_object({}) do |selected_option, selected_option_ids|
    selected_option_ids[selected_option.fetch(:id).to_s] = true
  end
end

#advanced_select_selected_options(selected) ⇒ Object



51
52
53
54
55
56
57
58
59
60
# File 'lib/advanced_select/helper.rb', line 51

def advanced_select_selected_options(selected)
  advanced_select_array(selected).map do |option|
    {
      id: option.fetch(:id).to_s,
      value: advanced_select_option_value(option),
      label: advanced_select_option_label(option),
      display_label: advanced_select_option_display_label(option)
    }
  end
end

#advanced_select_selected_value(selected_options) ⇒ Object



62
63
64
65
66
# File 'lib/advanced_select/helper.rb', line 62

def advanced_select_selected_value(selected_options)
  selected_options.map do |option|
    option.merge(displayLabel: option.fetch(:display_label))
  end.to_json
end

#advanced_select_state_class(class_map, key) ⇒ Object



47
48
49
# File 'lib/advanced_select/helper.rb', line 47

def advanced_select_state_class(class_map, key)
  class_map.state_class(key)
end

#advanced_select_tag(name, id:, selected:, options:, placeholder:, options_url: nil, multiple: false, searchable: true, add_mode: false, dependent_fields: {}, include_hidden: true, auto_select_single: true, eager: true, summary_mode: :tokens, tooltip: false, tooltip_partial: nil, option_content_partial: nil, classes: {}, append_classes: {}) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/advanced_select/helper.rb', line 3

def advanced_select_tag(name, id:, selected:, options:, placeholder:, options_url: nil, multiple: false, searchable: true, add_mode: false, dependent_fields: {}, include_hidden: true, auto_select_single: true, eager: true, summary_mode: :tokens, tooltip: false, tooltip_partial: nil, option_content_partial: nil, classes: {}, append_classes: {})
  selected_options = advanced_select_selected_options(selected)
  class_map = advanced_select_class_map(classes, append_classes)

  render partial: "advanced_select/select", locals: {
    name: name,
    id: id,
    options_url: options_url,
    selected_options: selected_options,
    options: options,
    placeholder: placeholder,
    multiple: multiple,
    searchable: searchable,
    add_mode: add_mode,
    dependent_fields: dependent_fields,
    include_hidden: include_hidden,
    auto_select_single: auto_select_single,
    eager: eager,
    summary_mode: summary_mode,
    tooltip: tooltip,
    tooltip_partial: tooltip_partial,
    target_id: "#{id}_options",
    option_content_partial: option_content_partial,
    class_map: class_map
  }
end