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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +59 -0
- data/README.md +60 -41
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +760 -237
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
- data/lib/stimulus_plumbers/components/action_list/item.rb +27 -0
- data/lib/stimulus_plumbers/components/action_list/section.rb +21 -0
- data/lib/stimulus_plumbers/components/action_list.rb +23 -0
- data/lib/stimulus_plumbers/components/avatar.rb +72 -0
- data/lib/stimulus_plumbers/components/button/group.rb +17 -0
- data/lib/stimulus_plumbers/components/button.rb +27 -0
- data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_month.rb +2 -2
- data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +2 -2
- data/lib/stimulus_plumbers/components/calendar/month/turbo.rb +55 -0
- data/lib/stimulus_plumbers/components/calendar.rb +33 -0
- data/lib/stimulus_plumbers/components/card/section.rb +25 -0
- data/lib/stimulus_plumbers/components/card.rb +27 -0
- data/lib/stimulus_plumbers/components/combobox/autocomplete.rb +53 -0
- data/lib/stimulus_plumbers/components/combobox/date.rb +50 -0
- data/lib/stimulus_plumbers/components/combobox/dropdown.rb +38 -0
- data/lib/stimulus_plumbers/components/combobox/options/option.rb +34 -0
- data/lib/stimulus_plumbers/components/combobox/options/option_group.rb +29 -0
- data/lib/stimulus_plumbers/components/combobox/options.rb +59 -0
- data/lib/stimulus_plumbers/components/combobox/popover.rb +20 -0
- data/lib/stimulus_plumbers/components/combobox/time/drum.rb +37 -0
- data/lib/stimulus_plumbers/components/combobox/time.rb +120 -0
- data/lib/stimulus_plumbers/components/combobox/trigger.rb +38 -0
- data/lib/stimulus_plumbers/components/combobox.rb +59 -0
- data/lib/stimulus_plumbers/components/date_picker/navigation.rb +1 -1
- data/lib/stimulus_plumbers/components/date_picker/navigator.rb +1 -1
- data/lib/stimulus_plumbers/components/icon.rb +49 -0
- data/lib/stimulus_plumbers/components/popover/builder.rb +25 -0
- data/lib/stimulus_plumbers/components/popover.rb +26 -0
- data/lib/stimulus_plumbers/form/builder.rb +64 -17
- data/lib/stimulus_plumbers/form/{field_component.rb → field.rb} +13 -11
- data/lib/stimulus_plumbers/form/fields/combobox.rb +41 -0
- data/lib/stimulus_plumbers/form/fields/error.rb +14 -0
- data/lib/stimulus_plumbers/form/fields/group.rb +14 -0
- data/lib/stimulus_plumbers/form/fields/hint.rb +14 -0
- data/lib/stimulus_plumbers/form/fields/label.rb +21 -0
- data/lib/stimulus_plumbers/form/fields/password.rb +55 -0
- data/lib/stimulus_plumbers/form/fields/renderer.rb +16 -21
- data/lib/stimulus_plumbers/form/fields/search.rb +54 -0
- data/lib/stimulus_plumbers/form/fields/select.rb +8 -2
- data/lib/stimulus_plumbers/form/fields/submit.rb +23 -0
- data/lib/stimulus_plumbers/form/fields/text.rb +12 -4
- data/lib/stimulus_plumbers/helpers/action_list_helper.rb +2 -2
- data/lib/stimulus_plumbers/helpers/avatar_helper.rb +2 -2
- data/lib/stimulus_plumbers/helpers/button_helper.rb +2 -2
- data/lib/stimulus_plumbers/helpers/calendar_helper.rb +1 -1
- data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +1 -1
- data/lib/stimulus_plumbers/helpers/card_helper.rb +2 -2
- data/lib/stimulus_plumbers/helpers/combobox_helper.rb +74 -0
- data/lib/stimulus_plumbers/helpers/popover_helper.rb +2 -2
- data/lib/stimulus_plumbers/helpers.rb +2 -2
- data/lib/stimulus_plumbers/plumber/base.rb +20 -0
- data/lib/stimulus_plumbers/plumber/dispatcher.rb +111 -0
- data/lib/stimulus_plumbers/plumber/html_options.rb +51 -0
- data/lib/stimulus_plumbers/plumber/renderer.rb +89 -0
- data/lib/stimulus_plumbers/themes/base.rb +9 -15
- data/lib/stimulus_plumbers/themes/schema/ranges.rb +5 -5
- data/lib/stimulus_plumbers/themes/schema.rb +97 -0
- data/lib/stimulus_plumbers/themes/tailwind/calendar.rb +48 -2
- data/lib/stimulus_plumbers/themes/tailwind/combobox.rb +75 -0
- data/lib/stimulus_plumbers/themes/tailwind/form.rb +10 -6
- data/lib/stimulus_plumbers/themes/tailwind_theme.rb +2 -0
- data/lib/stimulus_plumbers/version.rb +1 -1
- data/lib/stimulus_plumbers.rb +41 -14
- metadata +42 -23
- data/lib/stimulus_plumbers/components/action_list/renderer.rb +0 -47
- data/lib/stimulus_plumbers/components/avatar/renderer.rb +0 -74
- data/lib/stimulus_plumbers/components/button/renderer.rb +0 -33
- data/lib/stimulus_plumbers/components/calendar/month/turbo/renderer.rb +0 -57
- data/lib/stimulus_plumbers/components/calendar/renderer.rb +0 -35
- data/lib/stimulus_plumbers/components/card/renderer.rb +0 -41
- data/lib/stimulus_plumbers/components/date_picker/renderer.rb +0 -82
- data/lib/stimulus_plumbers/components/icon/renderer.rb +0 -51
- data/lib/stimulus_plumbers/components/plumber/base.rb +0 -22
- data/lib/stimulus_plumbers/components/plumber/dispatcher.rb +0 -113
- data/lib/stimulus_plumbers/components/plumber/html_options.rb +0 -34
- data/lib/stimulus_plumbers/components/plumber/renderer.rb +0 -91
- data/lib/stimulus_plumbers/components/popover/renderer.rb +0 -46
- data/lib/stimulus_plumbers/helpers/date_picker_helper.rb +0 -17
- data/lib/stimulus_plumbers/themes/action_list.rb +0 -14
- data/lib/stimulus_plumbers/themes/avatar.rb +0 -14
- data/lib/stimulus_plumbers/themes/button.rb +0 -18
- data/lib/stimulus_plumbers/themes/calendar.rb +0 -15
- data/lib/stimulus_plumbers/themes/card.rb +0 -12
- data/lib/stimulus_plumbers/themes/form.rb +0 -30
- 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
|
|
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(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
32
|
+
def field_hint
|
|
39
33
|
return "".html_safe unless field.details.present?
|
|
40
34
|
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
Hint.new(template).render(
|
|
36
|
+
text: field.details,
|
|
37
|
+
id: field.hint_id
|
|
38
|
+
)
|
|
43
39
|
end
|
|
44
40
|
|
|
45
|
-
def
|
|
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.
|
|
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(
|
|
15
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
21
|
+
Components::Button.new(self)
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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/
|
|
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
|
|
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
|