stimulus_plumbers 0.2.8 → 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 +21 -0
- data/README.md +3 -0
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +339 -302
- 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 +30 -34
- data/lib/stimulus_plumbers/components/combobox/date.rb +16 -18
- data/lib/stimulus_plumbers/components/combobox/dropdown.rb +13 -16
- 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 +32 -15
- 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/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 +7 -5
- data/lib/stimulus_plumbers/form/{field_component.rb → field.rb} +1 -1
- data/lib/stimulus_plumbers/form/fields/combobox.rb +1 -1
- 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/renderer.rb +16 -20
- data/lib/stimulus_plumbers/form/fields/search.rb +23 -9
- data/lib/stimulus_plumbers/form/fields/submit.rb +23 -0
- 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 +5 -5
- data/lib/stimulus_plumbers/helpers/popover_helper.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_theme.rb +2 -0
- data/lib/stimulus_plumbers/version.rb +1 -1
- data/lib/stimulus_plumbers.rb +29 -19
- metadata +33 -25
- 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/combobox/option.rb +0 -27
- data/lib/stimulus_plumbers/components/combobox/option_group.rb +0 -52
- data/lib/stimulus_plumbers/components/combobox/renderer.rb +0 -78
- 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 -53
- data/lib/stimulus_plumbers/components/plumber/renderer.rb +0 -91
- data/lib/stimulus_plumbers/components/popover/renderer.rb +0 -46
- data/lib/stimulus_plumbers/components/time_picker/renderer.rb +0 -38
- data/lib/stimulus_plumbers/themes/base/action_list.rb +0 -14
- data/lib/stimulus_plumbers/themes/base/avatar.rb +0 -14
- data/lib/stimulus_plumbers/themes/base/button.rb +0 -18
- data/lib/stimulus_plumbers/themes/base/calendar.rb +0 -15
- data/lib/stimulus_plumbers/themes/base/card.rb +0 -12
- data/lib/stimulus_plumbers/themes/base/form.rb +0 -34
- data/lib/stimulus_plumbers/themes/base/layout.rb +0 -12
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "active_support/concern"
|
|
4
|
-
|
|
5
|
-
module StimulusPlumbers
|
|
6
|
-
module Components
|
|
7
|
-
module Plumber
|
|
8
|
-
module Renderer
|
|
9
|
-
extend ActiveSupport::Concern
|
|
10
|
-
|
|
11
|
-
included do
|
|
12
|
-
class_attribute :renderers, instance_writer: false, default: {}
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
module ClassMethods
|
|
16
|
-
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
17
|
-
def renders(method_name, with: nil, &block)
|
|
18
|
-
raise ArgumentError, "method_name must be Symbol" unless method_name.is_a?(Symbol)
|
|
19
|
-
raise ArgumentError, "provide either with: or a block" if !with.nil? && block_given?
|
|
20
|
-
|
|
21
|
-
with = block if block_given?
|
|
22
|
-
|
|
23
|
-
with_proc_or_symbol = with.is_a?(Proc) || with.is_a?(Symbol)
|
|
24
|
-
with_klazz = with.is_a?(Module) || with.is_a?(String)
|
|
25
|
-
raise ArgumentError, "with: must be a Symbol/Proc/Class" unless with_proc_or_symbol || with_klazz
|
|
26
|
-
|
|
27
|
-
self.renderers = renderers.merge(method_name => with)
|
|
28
|
-
ActiveSupport.version >= "7.2" ? generate_renderer_method(method_name) : eval_renderer_method(method_name)
|
|
29
|
-
end
|
|
30
|
-
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
31
|
-
|
|
32
|
-
private
|
|
33
|
-
|
|
34
|
-
def generated_renderer_methods
|
|
35
|
-
@generated_renderer_methods ||= Module.new.tap { |mod| prepend mod }
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def eval_renderer_method(method_name)
|
|
39
|
-
generated_renderer_methods.module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
|
40
|
-
# def method_name(*args, **kwargs)
|
|
41
|
-
# renderer = renderers.fetch(:method_name, {})
|
|
42
|
-
#
|
|
43
|
-
# unless renderer.present?
|
|
44
|
-
# raise ArgumentError, "#method_name not found in renderer" unless defined?(super)
|
|
45
|
-
# super
|
|
46
|
-
# end
|
|
47
|
-
#
|
|
48
|
-
# dispatcher = StimulusPlumbers::Components::Plumber::Dispatcher.build(
|
|
49
|
-
# renderer, *args, method_name: :#{method_name}, init_args: [template], **kwargs
|
|
50
|
-
# )
|
|
51
|
-
# raise ArgumentError, "invalid renderer, got: \#{renderer.inspect}" unless dispatcher
|
|
52
|
-
#
|
|
53
|
-
# dispatcher.call(self)
|
|
54
|
-
# end
|
|
55
|
-
#{renderer_method_template(method_name)}
|
|
56
|
-
RUBY
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def generate_renderer_method(method_name)
|
|
60
|
-
require "active_support/code_generator"
|
|
61
|
-
ActiveSupport::CodeGenerator.batch(generated_renderer_methods, __FILE__, __LINE__) do |owner|
|
|
62
|
-
owner.define_cached_method(method_name, namespace: :plumber_renderers) do |batch|
|
|
63
|
-
batch << renderer_method_template(method_name)
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def renderer_method_template(method_name)
|
|
69
|
-
<<-RUBY
|
|
70
|
-
def #{method_name}(*args, **kwargs)
|
|
71
|
-
renderer = renderers.fetch(:#{method_name}, {})
|
|
72
|
-
|
|
73
|
-
unless renderer.present?
|
|
74
|
-
raise ArgumentError, "##{method_name} not found in renderer" unless defined?(super)
|
|
75
|
-
super
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
dispatcher = StimulusPlumbers::Components::Plumber::Dispatcher.build(
|
|
79
|
-
renderer, *args, method_name: :#{method_name}, init_args: [template], **kwargs
|
|
80
|
-
)
|
|
81
|
-
raise ArgumentError, "invalid renderer, got: \#{renderer.inspect}" unless dispatcher
|
|
82
|
-
|
|
83
|
-
dispatcher.call(self)
|
|
84
|
-
end
|
|
85
|
-
RUBY
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StimulusPlumbers
|
|
4
|
-
module Components
|
|
5
|
-
module Popover
|
|
6
|
-
class Builder
|
|
7
|
-
attr_reader :activator_html, :content_html
|
|
8
|
-
|
|
9
|
-
def initialize(template)
|
|
10
|
-
@template = template
|
|
11
|
-
@activator_html = "".html_safe
|
|
12
|
-
@content_html = "".html_safe
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def activator(&block)
|
|
16
|
-
@activator_html = @template.capture(&block)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def content(&block)
|
|
20
|
-
@content_html = @template.capture(&block)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
class Renderer < Plumber::Base
|
|
25
|
-
def popover(interactive: true, **kwargs, &block)
|
|
26
|
-
html_options = merge_html_options(
|
|
27
|
-
{ classes: theme.resolve(:popover).fetch(:classes, "") },
|
|
28
|
-
kwargs
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
builder = Builder.new(template)
|
|
32
|
-
template.capture(builder, &block)
|
|
33
|
-
|
|
34
|
-
template.content_tag(:div, **html_options) do
|
|
35
|
-
wrapped_content = if interactive
|
|
36
|
-
template.content_tag(:template, builder.content_html)
|
|
37
|
-
else
|
|
38
|
-
builder.content_html
|
|
39
|
-
end
|
|
40
|
-
template.safe_join([builder.activator_html, wrapped_content])
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StimulusPlumbers
|
|
4
|
-
module Components
|
|
5
|
-
module TimePicker
|
|
6
|
-
# Renders a single scrollable drum column (hour, minute, or period) as a listbox.
|
|
7
|
-
class Renderer < Plumber::Base
|
|
8
|
-
CONTROLLER = "combobox-time"
|
|
9
|
-
|
|
10
|
-
def render(items:, label:, target:, selected: nil)
|
|
11
|
-
template.content_tag(
|
|
12
|
-
:ul,
|
|
13
|
-
role: "listbox",
|
|
14
|
-
aria: { label: label },
|
|
15
|
-
data: {
|
|
16
|
-
"#{CONTROLLER}_target": target,
|
|
17
|
-
action: "click->#{CONTROLLER}#select keydown->#{CONTROLLER}#navigate"
|
|
18
|
-
}
|
|
19
|
-
) do
|
|
20
|
-
template.safe_join(items.map { |text, value| render_item(text, value, selected) })
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def render_item(text, value, selected)
|
|
27
|
-
template.content_tag(
|
|
28
|
-
:li,
|
|
29
|
-
text,
|
|
30
|
-
role: "option",
|
|
31
|
-
aria: { selected: value.to_s == selected.to_s ? "true" : "false" },
|
|
32
|
-
data: { value: value }
|
|
33
|
-
)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StimulusPlumbers
|
|
4
|
-
module Themes
|
|
5
|
-
module ActionList
|
|
6
|
-
SCHEMA = {
|
|
7
|
-
action_list_item: {
|
|
8
|
-
active: { default: false, range: Schema::Ranges::BOOL_RANGE }
|
|
9
|
-
}.freeze,
|
|
10
|
-
action_list: {}.freeze
|
|
11
|
-
}.freeze
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StimulusPlumbers
|
|
4
|
-
module Themes
|
|
5
|
-
module Avatar
|
|
6
|
-
SCHEMA = {
|
|
7
|
-
avatar: {
|
|
8
|
-
size: { default: :md, range: Schema::Ranges::SIZE_RANGE },
|
|
9
|
-
color: { default: nil, range: :avatar_color_range }
|
|
10
|
-
}.freeze
|
|
11
|
-
}.freeze
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StimulusPlumbers
|
|
4
|
-
module Themes
|
|
5
|
-
module Button
|
|
6
|
-
SCHEMA = {
|
|
7
|
-
button: {
|
|
8
|
-
variant: { default: :primary, range: %i[primary secondary outline destructive ghost link].freeze },
|
|
9
|
-
size: { default: :md, range: Schema::Ranges::SIZE_RANGE }
|
|
10
|
-
}.freeze,
|
|
11
|
-
button_group: {
|
|
12
|
-
alignment: { default: :left, range: Schema::Ranges::ALIGN_RANGE },
|
|
13
|
-
direction: { default: :row, range: Schema::Ranges::DIR_RANGE }
|
|
14
|
-
}.freeze
|
|
15
|
-
}.freeze
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StimulusPlumbers
|
|
4
|
-
module Themes
|
|
5
|
-
module Calendar
|
|
6
|
-
SCHEMA = {
|
|
7
|
-
calendar_day: {
|
|
8
|
-
today: { default: false, range: Schema::Ranges::BOOL_RANGE },
|
|
9
|
-
selected: { default: false, range: Schema::Ranges::BOOL_RANGE },
|
|
10
|
-
outside: { default: false, range: Schema::Ranges::BOOL_RANGE }
|
|
11
|
-
}.freeze
|
|
12
|
-
}.freeze
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StimulusPlumbers
|
|
4
|
-
module Themes
|
|
5
|
-
module Form
|
|
6
|
-
SCHEMA = {
|
|
7
|
-
form_group: {
|
|
8
|
-
layout: { default: :stacked, range: Schema::Ranges::LAYOUT_RANGE },
|
|
9
|
-
error: { default: false, range: Schema::Ranges::BOOL_RANGE }
|
|
10
|
-
}.freeze,
|
|
11
|
-
form_label: {
|
|
12
|
-
required: { default: false, range: Schema::Ranges::BOOL_RANGE },
|
|
13
|
-
hidden: { default: false, range: Schema::Ranges::BOOL_RANGE }
|
|
14
|
-
}.freeze,
|
|
15
|
-
form_required_mark: {}.freeze,
|
|
16
|
-
form_details: {}.freeze,
|
|
17
|
-
form_error: {}.freeze,
|
|
18
|
-
form_input: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
|
|
19
|
-
form_textarea: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
|
|
20
|
-
form_file: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
|
|
21
|
-
form_select: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
|
|
22
|
-
form_checkbox: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
|
|
23
|
-
form_radio: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
|
|
24
|
-
form_input_group: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
|
|
25
|
-
form_combobox: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
|
|
26
|
-
form_input_reveal: {}.freeze,
|
|
27
|
-
form_button_reveal: {}.freeze,
|
|
28
|
-
form_submit: {
|
|
29
|
-
variant: { default: :default, range: %i[default button].freeze }
|
|
30
|
-
}.freeze
|
|
31
|
-
}.freeze
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|