stimulus_plumbers 0.2.7 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +59 -0
  3. data/README.md +60 -41
  4. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +760 -237
  5. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
  6. data/lib/stimulus_plumbers/components/action_list/item.rb +27 -0
  7. data/lib/stimulus_plumbers/components/action_list/section.rb +21 -0
  8. data/lib/stimulus_plumbers/components/action_list.rb +23 -0
  9. data/lib/stimulus_plumbers/components/avatar.rb +72 -0
  10. data/lib/stimulus_plumbers/components/button/group.rb +17 -0
  11. data/lib/stimulus_plumbers/components/button.rb +27 -0
  12. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_month.rb +2 -2
  13. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +2 -2
  14. data/lib/stimulus_plumbers/components/calendar/month/turbo.rb +55 -0
  15. data/lib/stimulus_plumbers/components/calendar.rb +33 -0
  16. data/lib/stimulus_plumbers/components/card/section.rb +25 -0
  17. data/lib/stimulus_plumbers/components/card.rb +27 -0
  18. data/lib/stimulus_plumbers/components/combobox/autocomplete.rb +53 -0
  19. data/lib/stimulus_plumbers/components/combobox/date.rb +50 -0
  20. data/lib/stimulus_plumbers/components/combobox/dropdown.rb +38 -0
  21. data/lib/stimulus_plumbers/components/combobox/options/option.rb +34 -0
  22. data/lib/stimulus_plumbers/components/combobox/options/option_group.rb +29 -0
  23. data/lib/stimulus_plumbers/components/combobox/options.rb +59 -0
  24. data/lib/stimulus_plumbers/components/combobox/popover.rb +20 -0
  25. data/lib/stimulus_plumbers/components/combobox/time/drum.rb +37 -0
  26. data/lib/stimulus_plumbers/components/combobox/time.rb +120 -0
  27. data/lib/stimulus_plumbers/components/combobox/trigger.rb +38 -0
  28. data/lib/stimulus_plumbers/components/combobox.rb +59 -0
  29. data/lib/stimulus_plumbers/components/date_picker/navigation.rb +1 -1
  30. data/lib/stimulus_plumbers/components/date_picker/navigator.rb +1 -1
  31. data/lib/stimulus_plumbers/components/icon.rb +49 -0
  32. data/lib/stimulus_plumbers/components/popover/builder.rb +25 -0
  33. data/lib/stimulus_plumbers/components/popover.rb +26 -0
  34. data/lib/stimulus_plumbers/form/builder.rb +64 -17
  35. data/lib/stimulus_plumbers/form/{field_component.rb → field.rb} +13 -11
  36. data/lib/stimulus_plumbers/form/fields/combobox.rb +41 -0
  37. data/lib/stimulus_plumbers/form/fields/error.rb +14 -0
  38. data/lib/stimulus_plumbers/form/fields/group.rb +14 -0
  39. data/lib/stimulus_plumbers/form/fields/hint.rb +14 -0
  40. data/lib/stimulus_plumbers/form/fields/label.rb +21 -0
  41. data/lib/stimulus_plumbers/form/fields/password.rb +55 -0
  42. data/lib/stimulus_plumbers/form/fields/renderer.rb +16 -21
  43. data/lib/stimulus_plumbers/form/fields/search.rb +54 -0
  44. data/lib/stimulus_plumbers/form/fields/select.rb +8 -2
  45. data/lib/stimulus_plumbers/form/fields/submit.rb +23 -0
  46. data/lib/stimulus_plumbers/form/fields/text.rb +12 -4
  47. data/lib/stimulus_plumbers/helpers/action_list_helper.rb +2 -2
  48. data/lib/stimulus_plumbers/helpers/avatar_helper.rb +2 -2
  49. data/lib/stimulus_plumbers/helpers/button_helper.rb +2 -2
  50. data/lib/stimulus_plumbers/helpers/calendar_helper.rb +1 -1
  51. data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +1 -1
  52. data/lib/stimulus_plumbers/helpers/card_helper.rb +2 -2
  53. data/lib/stimulus_plumbers/helpers/combobox_helper.rb +74 -0
  54. data/lib/stimulus_plumbers/helpers/popover_helper.rb +2 -2
  55. data/lib/stimulus_plumbers/helpers.rb +2 -2
  56. data/lib/stimulus_plumbers/plumber/base.rb +20 -0
  57. data/lib/stimulus_plumbers/plumber/dispatcher.rb +111 -0
  58. data/lib/stimulus_plumbers/plumber/html_options.rb +51 -0
  59. data/lib/stimulus_plumbers/plumber/renderer.rb +89 -0
  60. data/lib/stimulus_plumbers/themes/base.rb +9 -15
  61. data/lib/stimulus_plumbers/themes/schema/ranges.rb +5 -5
  62. data/lib/stimulus_plumbers/themes/schema.rb +97 -0
  63. data/lib/stimulus_plumbers/themes/tailwind/calendar.rb +48 -2
  64. data/lib/stimulus_plumbers/themes/tailwind/combobox.rb +75 -0
  65. data/lib/stimulus_plumbers/themes/tailwind/form.rb +10 -6
  66. data/lib/stimulus_plumbers/themes/tailwind_theme.rb +2 -0
  67. data/lib/stimulus_plumbers/version.rb +1 -1
  68. data/lib/stimulus_plumbers.rb +41 -14
  69. metadata +42 -23
  70. data/lib/stimulus_plumbers/components/action_list/renderer.rb +0 -47
  71. data/lib/stimulus_plumbers/components/avatar/renderer.rb +0 -74
  72. data/lib/stimulus_plumbers/components/button/renderer.rb +0 -33
  73. data/lib/stimulus_plumbers/components/calendar/month/turbo/renderer.rb +0 -57
  74. data/lib/stimulus_plumbers/components/calendar/renderer.rb +0 -35
  75. data/lib/stimulus_plumbers/components/card/renderer.rb +0 -41
  76. data/lib/stimulus_plumbers/components/date_picker/renderer.rb +0 -82
  77. data/lib/stimulus_plumbers/components/icon/renderer.rb +0 -51
  78. data/lib/stimulus_plumbers/components/plumber/base.rb +0 -22
  79. data/lib/stimulus_plumbers/components/plumber/dispatcher.rb +0 -113
  80. data/lib/stimulus_plumbers/components/plumber/html_options.rb +0 -34
  81. data/lib/stimulus_plumbers/components/plumber/renderer.rb +0 -91
  82. data/lib/stimulus_plumbers/components/popover/renderer.rb +0 -46
  83. data/lib/stimulus_plumbers/helpers/date_picker_helper.rb +0 -17
  84. data/lib/stimulus_plumbers/themes/action_list.rb +0 -14
  85. data/lib/stimulus_plumbers/themes/avatar.rb +0 -14
  86. data/lib/stimulus_plumbers/themes/button.rb +0 -18
  87. data/lib/stimulus_plumbers/themes/calendar.rb +0 -15
  88. data/lib/stimulus_plumbers/themes/card.rb +0 -12
  89. data/lib/stimulus_plumbers/themes/form.rb +0 -30
  90. data/lib/stimulus_plumbers/themes/layout.rb +0 -12
@@ -2,8 +2,8 @@
2
2
 
3
3
  module StimulusPlumbers
4
4
  module Form
5
- class FieldComponent
6
- OPTIONS = %i[label details error required label_visibility layout].freeze
5
+ class Field
6
+ OPTIONS = %i[label details error required label_visibility layout reveal clearable].freeze
7
7
 
8
8
  attr_reader :object,
9
9
  :attribute,
@@ -14,15 +14,17 @@ module StimulusPlumbers
14
14
  :label_visibility,
15
15
  :layout
16
16
 
17
- def initialize(object:,
18
- attribute:,
19
- input_id:,
20
- label: nil,
21
- details: nil,
22
- error: nil,
23
- required: false,
24
- label_visibility: :visible,
25
- layout: :stacked)
17
+ def initialize(
18
+ object:,
19
+ attribute:,
20
+ input_id:,
21
+ label: nil,
22
+ details: nil,
23
+ error: nil,
24
+ required: false,
25
+ label_visibility: :visible,
26
+ layout: :stacked
27
+ )
26
28
  @object = object
27
29
  @attribute = attribute
28
30
  @input_id = input_id
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Form
5
+ module Fields
6
+ module Combobox
7
+ COMPONENT_CLASS = {
8
+ autocomplete: Components::Combobox::Autocomplete,
9
+ date: Components::Combobox::Date,
10
+ dropdown: Components::Combobox::Dropdown,
11
+ time: Components::Combobox::Time
12
+ }.freeze
13
+
14
+ def combobox_field(attribute, type:, options: [], **html_options)
15
+ klass = COMPONENT_CLASS.fetch(type) do
16
+ raise ArgumentError,
17
+ "unsupported combobox type #{type.inspect}. Must be one of: #{COMPONENT_CLASS.keys.join(", ")}"
18
+ end
19
+
20
+ rails_opts, field_opts = extract_options(html_options)
21
+ field = build_field(attribute, field_opts)
22
+ base_id = field_id(attribute)
23
+ current_value = object&.public_send(attribute)
24
+
25
+ popover = klass.new(@template).render(options: options, value: current_value, **rails_opts)
26
+ opts = klass.default_opts.deep_merge(
27
+ input: { name: field_name(attribute), value: current_value },
28
+ popover: { content: popover }
29
+ )
30
+ wrapper = Components::Combobox.new(@template).render(
31
+ base_id: base_id,
32
+ options: opts,
33
+ **field_theme(:form_combobox, error: field.error?),
34
+ **field.html_opts
35
+ )
36
+ render_field(field, wrapper)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Form
5
+ module Fields
6
+ class Error < Plumber::Base
7
+ def render(message:, id:)
8
+ klass = theme.resolve(:form_error).fetch(:classes, "")
9
+ template.content_tag(:p, message, id: id, class: klass.presence, role: "alert")
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Form
5
+ module Fields
6
+ class Group < Plumber::Base
7
+ def render(layout: :stacked, error: false, &block)
8
+ klass = theme.resolve(:form_group, layout: layout, error: error).fetch(:classes, "")
9
+ template.content_tag(:div, class: klass.presence, &block)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Form
5
+ module Fields
6
+ class Hint < Plumber::Base
7
+ def render(text:, id:)
8
+ klass = theme.resolve(:form_details).fetch(:classes, "")
9
+ template.content_tag(:p, text, id: id, class: klass.presence)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Form
5
+ module Fields
6
+ class Label < Plumber::Base
7
+ def render(text:, for_id:, required: false, hidden: false)
8
+ klass = theme.resolve(:form_label, required: required, hidden: hidden).fetch(:classes, "")
9
+
10
+ inner = text.dup.html_safe
11
+ if required
12
+ mark_klass = theme.resolve(:form_required_mark).fetch(:classes, "")
13
+ inner += template.content_tag(:span, "*", "aria-hidden": "true", class: mark_klass.presence)
14
+ end
15
+
16
+ template.content_tag(:label, inner, for: for_id, class: klass.presence)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Form
5
+ module Fields
6
+ module Password
7
+ def password_field(attribute, options = {})
8
+ rails_opts, form_field_opts = extract_options(options)
9
+ reveal = form_field_opts.delete(:reveal) { false }
10
+ field = build_field(attribute, form_field_opts)
11
+
12
+ input_html = if reveal
13
+ input_opts = merge_html_options(
14
+ rails_opts,
15
+ field_theme(:form_input_reveal),
16
+ field.html_opts,
17
+ { "data-input-format-target": "input" }
18
+ )
19
+ build_input_group(
20
+ super(attribute, input_opts),
21
+ field,
22
+ trailing: reveal_button,
23
+ "data-controller": "input-format",
24
+ "data-input-format-type-value": "password"
25
+ )
26
+ else
27
+ html_opts = merge_html_options(
28
+ rails_opts,
29
+ field_theme(:form_input, error: field.error?),
30
+ field.html_opts
31
+ )
32
+ super(attribute, html_opts)
33
+ end
34
+
35
+ render_field(field, input_html)
36
+ end
37
+
38
+ private
39
+
40
+ def reveal_button
41
+ @template.content_tag(
42
+ :button,
43
+ "",
44
+ type: "button",
45
+ class: field_theme(:form_button_reveal)[:class],
46
+ "aria-label": "Show password",
47
+ "aria-pressed": "false",
48
+ "data-input-format-target": "toggle",
49
+ "data-action": "click->input-format#toggle"
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -13,42 +13,37 @@ module StimulusPlumbers
13
13
  end
14
14
 
15
15
  def call(input_html)
16
- field_klass = theme.resolve(:form_group, layout: field.layout, error: field.error?).fetch(:classes, "")
17
-
18
- template.content_tag(:div, class: field_klass) do
19
- label_html + input_html.html_safe + hint_html + errors_html
16
+ Group.new(template).render(layout: field.layout, error: field.error?) do
17
+ (field_label + input_html.html_safe + field_hint + field_errors).html_safe
20
18
  end
21
19
  end
22
20
 
23
21
  private
24
22
 
25
- def label_html
26
- klass = theme.resolve(:form_label, required: field.required).fetch(:classes, "")
27
- klass = "#{klass} sr-only".strip if field.label_hidden?
28
-
29
- inner = field.label_text.dup.html_safe
30
- if field.required
31
- mark_klass = theme.resolve(:form_required_mark).fetch(:classes, "")
32
- inner += template.content_tag(:span, "*", "aria-hidden": "true", class: mark_klass)
33
- end
34
-
35
- template.content_tag(:label, inner, for: field.input_id, class: klass)
23
+ def field_label
24
+ Label.new(template).render(
25
+ text: field.label_text,
26
+ for_id: field.input_id,
27
+ required: field.required,
28
+ hidden: field.label_hidden?
29
+ )
36
30
  end
37
31
 
38
- def hint_html
32
+ def field_hint
39
33
  return "".html_safe unless field.details.present?
40
34
 
41
- klass = theme.resolve(:form_details).fetch(:classes, "")
42
- template.content_tag(:p, field.details, id: field.hint_id, class: klass)
35
+ Hint.new(template).render(
36
+ text: field.details,
37
+ id: field.hint_id
38
+ )
43
39
  end
44
40
 
45
- def errors_html
41
+ def field_errors
46
42
  return "".html_safe if field.errors.none?
47
43
 
48
- klass = theme.resolve(:form_error).fetch(:classes, "")
49
44
  field.errors.map.with_index(1) do |message, i|
50
45
  id = field.errors.one? ? field.error_id : "#{field.error_id}_#{i}"
51
- template.content_tag(:p, message, id: id, class: klass, role: "alert")
46
+ Error.new(template).render(message: message, id: id)
52
47
  end.join.html_safe
53
48
  end
54
49
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Form
5
+ module Fields
6
+ module Search
7
+ def search_field(attribute, options = {})
8
+ rails_opts, form_field_opts = extract_options(options)
9
+ clearable = form_field_opts.delete(:clearable) { false }
10
+ field = build_field(attribute, form_field_opts)
11
+
12
+ input_html = if clearable
13
+ input_opts = merge_html_options(
14
+ rails_opts,
15
+ field_theme(:form_input, error: field.error?),
16
+ field.html_opts,
17
+ { "data-input-search-target": "input", inputmode: "search" }
18
+ )
19
+ build_input_group(
20
+ super(attribute, input_opts),
21
+ field,
22
+ trailing: clear_button,
23
+ "data-controller": "input-search",
24
+ role: "search"
25
+ )
26
+ else
27
+ html_opts = merge_html_options(
28
+ rails_opts,
29
+ field_theme(:form_input, error: field.error?),
30
+ field.html_opts
31
+ )
32
+ super(attribute, html_opts)
33
+ end
34
+
35
+ render_field(field, input_html)
36
+ end
37
+
38
+ private
39
+
40
+ def clear_button
41
+ @template.content_tag(
42
+ :button,
43
+ "",
44
+ type: "button",
45
+ class: field_theme(:form_button_reveal)[:class],
46
+ "aria-label": "Clear search",
47
+ "data-input-search-target": "clear",
48
+ "data-action": "click->input-search#clear"
49
+ )
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -11,8 +11,14 @@ module StimulusPlumbers
11
11
  render_field(field, super(attribute, choices, rails_opts, html_opts))
12
12
  end
13
13
 
14
- def collection_select(attribute, collection, value_method, text_method,
15
- options = {}, html_options = {})
14
+ def collection_select(
15
+ attribute,
16
+ collection,
17
+ value_method,
18
+ text_method,
19
+ options = {},
20
+ html_options = {}
21
+ )
16
22
  rails_opts, form_field_opts = extract_options(options)
17
23
  field = build_field(attribute, form_field_opts)
18
24
  html_opts = merge_html_options(html_options, field_theme(:form_select, error: field.error?), field.html_opts)
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Form
5
+ module Fields
6
+ module Submit
7
+ def submit(value = nil, options = {})
8
+ if value.is_a?(Hash)
9
+ options = value
10
+ value = nil
11
+ end
12
+ value ||= submit_default_value
13
+ variant = options.delete(:variant) { :default }
14
+ @template.tag.input(
15
+ type: "submit",
16
+ value: value,
17
+ **merge_html_options(field_theme(:form_submit, variant: variant), options)
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -5,10 +5,18 @@ module StimulusPlumbers
5
5
  module Fields
6
6
  module Text
7
7
  FIELD_TYPES = %i[
8
- text_field email_field url_field telephone_field search_field
9
- number_field color_field date_field datetime_local_field
10
- time_field month_field week_field range_field
11
- password_field
8
+ color_field
9
+ date_field
10
+ datetime_local_field
11
+ email_field
12
+ month_field
13
+ number_field
14
+ range_field
15
+ telephone_field
16
+ text_field
17
+ time_field
18
+ url_field
19
+ week_field
12
20
  ].freeze
13
21
 
14
22
  FIELD_TYPES.each do |method_name|
@@ -4,7 +4,7 @@ module StimulusPlumbers
4
4
  module Helpers
5
5
  module ActionListHelper
6
6
  def sp_action_list(**html_options, &block)
7
- action_list_renderer.list(**html_options, &block)
7
+ action_list_renderer.render(**html_options, &block)
8
8
  end
9
9
 
10
10
  def sp_action_list_section(title: nil, **html_options, &block)
@@ -18,7 +18,7 @@ module StimulusPlumbers
18
18
  private
19
19
 
20
20
  def action_list_renderer
21
- Components::ActionList::Renderer.new(self)
21
+ Components::ActionList.new(self)
22
22
  end
23
23
  end
24
24
  end
@@ -4,13 +4,13 @@ module StimulusPlumbers
4
4
  module Helpers
5
5
  module AvatarHelper
6
6
  def sp_avatar(name: nil, initials: nil, url: nil, color: nil, size: :md, **html_options, &block)
7
- avatar_renderer.avatar(name: name, initials: initials, url: url, color: color, size: size, **html_options, &block)
7
+ avatar_renderer.render(name: name, initials: initials, url: url, color: color, size: size, **html_options, &block)
8
8
  end
9
9
 
10
10
  private
11
11
 
12
12
  def avatar_renderer
13
- Components::Avatar::Renderer.new(self)
13
+ Components::Avatar.new(self)
14
14
  end
15
15
  end
16
16
  end
@@ -4,7 +4,7 @@ module StimulusPlumbers
4
4
  module Helpers
5
5
  module ButtonHelper
6
6
  def sp_button(content = nil, url: nil, external: false, variant: :primary, size: :md, **html_options, &block)
7
- button_renderer.button(
7
+ button_renderer.render(
8
8
  content,
9
9
  url: url, external: external, variant: variant, size: size, **html_options,
10
10
  &block
@@ -18,7 +18,7 @@ module StimulusPlumbers
18
18
  private
19
19
 
20
20
  def button_renderer
21
- Components::Button::Renderer.new(self)
21
+ Components::Button.new(self)
22
22
  end
23
23
  end
24
24
  end
@@ -19,7 +19,7 @@ module StimulusPlumbers
19
19
  private
20
20
 
21
21
  def calendar_renderer
22
- Components::Calendar::Renderer.new(self)
22
+ Components::Calendar.new(self)
23
23
  end
24
24
  end
25
25
  end
@@ -24,7 +24,7 @@ module StimulusPlumbers
24
24
  private
25
25
 
26
26
  def calendar_month_turbo_renderer
27
- Components::Calendar::Month::Turbo::Renderer.new(self)
27
+ Components::Calendar::Month::Turbo.new(self)
28
28
  end
29
29
  end
30
30
  end
@@ -4,7 +4,7 @@ module StimulusPlumbers
4
4
  module Helpers
5
5
  module CardHelper
6
6
  def sp_card(title: nil, **html_options, &block)
7
- card_renderer.card(title: title, **html_options, &block)
7
+ card_renderer.render(title: title, **html_options, &block)
8
8
  end
9
9
 
10
10
  def sp_card_section(title: nil, **html_options, &block)
@@ -14,7 +14,7 @@ module StimulusPlumbers
14
14
  private
15
15
 
16
16
  def card_renderer
17
- Components::Card::Renderer.new(self)
17
+ Components::Card.new(self)
18
18
  end
19
19
  end
20
20
  end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Helpers
5
+ module ComboboxHelper
6
+ def sp_combobox_date(label: nil, value: nil, **html_options)
7
+ opts = Components::Combobox::Date.default_opts.deep_merge(
8
+ input: { value: value },
9
+ popover: { content: Components::Combobox::Date.new(self).render(value: value) }
10
+ )
11
+ opts = opts.deep_merge(trigger: { aria_label: label }) if label
12
+ Components::Combobox.new(self).render(
13
+ base_id: sp_dom_id,
14
+ options: opts,
15
+ data: { input_format_type_value: "date" },
16
+ **html_options
17
+ )
18
+ end
19
+
20
+ def sp_combobox_dropdown(label: nil, options: [], value: nil, **html_options)
21
+ opts = Components::Combobox::Dropdown.default_opts.deep_merge(
22
+ input: { value: value },
23
+ popover: { content: Components::Combobox::Dropdown.new(self).render(options: options, value: value, label: label) }
24
+ )
25
+ opts = opts.deep_merge(trigger: { aria_label: label }) if label
26
+ Components::Combobox.new(self).render(
27
+ base_id: sp_dom_id,
28
+ options: opts,
29
+ **html_options
30
+ )
31
+ end
32
+
33
+ def sp_combobox_autocomplete(label: nil, options: [], value: nil, url: nil, **html_options)
34
+ id = sp_dom_id
35
+ popover_id = "#{id}_popover"
36
+ opts = Components::Combobox::Autocomplete.default_opts.deep_merge(
37
+ input: { value: value },
38
+ popover: {
39
+ content: Components::Combobox::Autocomplete.new(self).render(
40
+ options: options,
41
+ value: value,
42
+ label: label
43
+ ),
44
+ data: url ? { combobox_dropdown_url_value: url } : {}
45
+ }
46
+ )
47
+ opts = opts.deep_merge(trigger: { aria_label: label }) if label
48
+ Components::Combobox.new(self).render(
49
+ base_id: id,
50
+ options: opts,
51
+ data: {
52
+ input_combobox_combobox_dropdown_outlet: "##{popover_id}",
53
+ action: "input->input-combobox#onInput"
54
+ },
55
+ **html_options
56
+ )
57
+ end
58
+
59
+ def sp_combobox_time(format: :h12, label: nil, step: 1, value: nil, **html_options)
60
+ opts = Components::Combobox::Time.default_opts.deep_merge(
61
+ input: { value: value },
62
+ popover: { content: Components::Combobox::Time.new(self).render(format: format, step: step, value: value) }
63
+ )
64
+ opts = opts.deep_merge(trigger: { aria_label: label }) if label
65
+ Components::Combobox.new(self).render(
66
+ base_id: sp_dom_id,
67
+ options: opts,
68
+ data: { input_format_type_value: "time", input_format_options_value: { format: format }.to_json },
69
+ **html_options
70
+ )
71
+ end
72
+ end
73
+ end
74
+ end
@@ -4,13 +4,13 @@ module StimulusPlumbers
4
4
  module Helpers
5
5
  module PopoverHelper
6
6
  def sp_popover(interactive: true, **html_options, &block)
7
- popover_renderer.popover(interactive: interactive, **html_options, &block)
7
+ popover_renderer.render(interactive: interactive, **html_options, &block)
8
8
  end
9
9
 
10
10
  private
11
11
 
12
12
  def popover_renderer
13
- Components::Popover::Renderer.new(self)
13
+ Components::Popover.new(self)
14
14
  end
15
15
  end
16
16
  end
@@ -7,7 +7,7 @@ require_relative "helpers/button_helper"
7
7
  require_relative "helpers/calendar_helper"
8
8
  require_relative "helpers/calendar_turbo_helper"
9
9
  require_relative "helpers/card_helper"
10
- require_relative "helpers/date_picker_helper"
10
+ require_relative "helpers/combobox_helper"
11
11
  require_relative "helpers/popover_helper"
12
12
 
13
13
  module StimulusPlumbers
@@ -19,7 +19,7 @@ module StimulusPlumbers
19
19
  include CalendarHelper
20
20
  include CalendarTurboHelper
21
21
  include CardHelper
22
- include DatePickerHelper
22
+ include ComboboxHelper
23
23
  include PopoverHelper
24
24
  end
25
25
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Plumber
5
+ class Base
6
+ include HtmlOptions
7
+ include Renderer
8
+
9
+ attr_reader :template
10
+
11
+ def initialize(template)
12
+ @template = template
13
+ end
14
+
15
+ def theme
16
+ StimulusPlumbers.config.theme
17
+ end
18
+ end
19
+ end
20
+ end