felt 0.1.0 → 0.1.1
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/lib/felt/version.rb +1 -1
- data/lib/felt.rb +3 -0
- data/lib/help/help.html.erb +1 -0
- data/lib/help.rb +65 -0
- data/lib/hint/hint.html.erb +1 -0
- data/lib/hint.rb +65 -0
- data/lib/input_group/base.rb +15 -7
- data/lib/input_group/checkbox_field/checkbox_field.html.erb +1 -1
- data/lib/input_group/checkbox_field.rb +2 -4
- data/lib/input_group/email_field/email_field.html.erb +1 -7
- data/lib/input_group/email_field.rb +2 -4
- data/lib/input_group/password_field/password_field.html.erb +1 -1
- data/lib/input_group/password_field.rb +2 -4
- data/lib/input_group/text_field/text_field.html.erb +1 -7
- data/lib/input_group/text_field.rb +2 -4
- data/lib/input_group/wrapper/wrapper.html.erb +9 -0
- data/lib/input_group/wrapper.rb +22 -0
- metadata +7 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4cee8afd69693c7c4ab5b113587fa54c63994ceb7e31b662d5c42d2205db328
|
4
|
+
data.tar.gz: 8dbefac39a252bc8ff50c24c3175309de8157d0184b82b4ef880f8263486c2a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7ebb4ad07dc4df0d0b1091af1066cb15e83fbf26dc3ced14a7331c59c1ad5198b679f912b6bf48dfb42782a8b23fb41fbe50e2065f3a9833c573734832b2491
|
7
|
+
data.tar.gz: c1956e71f6bbdda2716cf712fc1e80661b6a66cfb7e1586532febb767e9bc17db25a7724240c8a47ceaf6f52cdbae737d4b262c7212d61cb0b2552687ec7990f
|
data/lib/felt/version.rb
CHANGED
data/lib/felt.rb
CHANGED
@@ -7,6 +7,9 @@ require_relative "input_group/checkbox_field"
|
|
7
7
|
require_relative "input_group/email_field"
|
8
8
|
require_relative "input_group/password_field"
|
9
9
|
require_relative "input_group/text_field"
|
10
|
+
require_relative "input_group/wrapper"
|
11
|
+
require_relative "help"
|
12
|
+
require_relative "hint"
|
10
13
|
require_relative "label"
|
11
14
|
|
12
15
|
module Felt
|
@@ -0,0 +1 @@
|
|
1
|
+
<div class="<%= classes %>"><%= text %></div>
|
data/lib/help.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "view_component"
|
4
|
+
|
5
|
+
module Felt
|
6
|
+
# Renders a help element for a form input.
|
7
|
+
class Help < ViewComponent::Base
|
8
|
+
attr_reader :attribute, :form, :options
|
9
|
+
|
10
|
+
# Returns the classes to use for the help element
|
11
|
+
def classes
|
12
|
+
@classes ||
|
13
|
+
Felt.configuration.classes.dig(:help, :default, :default)
|
14
|
+
end
|
15
|
+
|
16
|
+
# - classes: Classes to add to the help element.
|
17
|
+
#
|
18
|
+
# - text: The help text to show. If not provided, the text will be looked up
|
19
|
+
# in the `forms.<object_name>.<attribute>` translation. See #help for more
|
20
|
+
# details. To disable the help, pass an empty string.
|
21
|
+
#
|
22
|
+
# All remaining keyword arguments are passed to the help element. See
|
23
|
+
# ActionView::Helpers::FormBuilder#help for details.
|
24
|
+
def initialize(attribute:, form:, classes: nil, text: nil, **options)
|
25
|
+
@attribute = attribute
|
26
|
+
@classes = classes
|
27
|
+
@form = form
|
28
|
+
@text = text
|
29
|
+
@options = options
|
30
|
+
end
|
31
|
+
|
32
|
+
def render?
|
33
|
+
text.present?
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the text to render in the help. If no text is configured, returns
|
37
|
+
# nil.
|
38
|
+
#
|
39
|
+
# Help texts are looked up in the following order:
|
40
|
+
#
|
41
|
+
# 1. The text argument passed to the component.
|
42
|
+
# 2. The `help` key in the `forms.<object_name>.<attribute>` translation.
|
43
|
+
# 3. The translation value found under
|
44
|
+
# `helpers.help.<modelname>.<attribute>` (like with
|
45
|
+
# ActionView::Helpers::FormBuilder#help).
|
46
|
+
def text
|
47
|
+
@text ||= translate("help")
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns true if the input group has a help text configured
|
51
|
+
def text?
|
52
|
+
text.present?
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def translate(key)
|
58
|
+
I18n.translate(key, default: nil, scope: translation_scope)
|
59
|
+
end
|
60
|
+
|
61
|
+
def translation_scope
|
62
|
+
[:forms, form.object_name, attribute].join(".")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<div class="<%= classes %>"><%= text %></div>
|
data/lib/hint.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "view_component"
|
4
|
+
|
5
|
+
module Felt
|
6
|
+
# Renders a hint element for a form input.
|
7
|
+
class Hint < ViewComponent::Base
|
8
|
+
attr_reader :attribute, :form, :options
|
9
|
+
|
10
|
+
# Returns the classes to use for the hint element
|
11
|
+
def classes
|
12
|
+
@classes ||
|
13
|
+
Felt.configuration.classes.dig(:hint, :default, :default)
|
14
|
+
end
|
15
|
+
|
16
|
+
# - classes: Classes to add to the hint element.
|
17
|
+
#
|
18
|
+
# - text: The hint text to show. If not provided, the text will be
|
19
|
+
# looked up in the `forms.<object_name>.<attribute>` translation. See
|
20
|
+
# #hint for more details. To disable the hint, pass an empty string.
|
21
|
+
#
|
22
|
+
# All remaining keyword arguments are passed to the hint element. See
|
23
|
+
# ActionView::Helpers::FormBuilder#hint for details.
|
24
|
+
def initialize(attribute:, form:, classes: nil, text: nil, **options)
|
25
|
+
@attribute = attribute
|
26
|
+
@classes = classes
|
27
|
+
@form = form
|
28
|
+
@text = text
|
29
|
+
@options = options
|
30
|
+
end
|
31
|
+
|
32
|
+
def render?
|
33
|
+
text.present?
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the text to render in the hint. If no text is configured, returns
|
37
|
+
# nil.
|
38
|
+
#
|
39
|
+
# Hint texts are looked up in the following order:
|
40
|
+
#
|
41
|
+
# 1. The text argument passed to the component.
|
42
|
+
# 2. The `hint` key in the `forms.<object_name>.<attribute>` translation.
|
43
|
+
# 3. The translation value found under
|
44
|
+
# `helpers.hint.<modelname>.<attribute>` (like with
|
45
|
+
# ActionView::Helpers::FormBuilder#hint).
|
46
|
+
def text
|
47
|
+
@text ||= translate("hint")
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns true if the input group has a hint text configured
|
51
|
+
def text?
|
52
|
+
text.present?
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def translate(key)
|
58
|
+
I18n.translate(key, default: nil, scope: translation_scope)
|
59
|
+
end
|
60
|
+
|
61
|
+
def translation_scope
|
62
|
+
[:forms, form.object_name, attribute].join(".")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/input_group/base.rb
CHANGED
@@ -11,7 +11,12 @@ module Felt
|
|
11
11
|
|
12
12
|
# Returns the classes to use for the root element of the input.
|
13
13
|
def classes
|
14
|
-
|
14
|
+
@classes ||
|
15
|
+
classes_from_configuration(:input_group, config_key)
|
16
|
+
end
|
17
|
+
|
18
|
+
def config_key
|
19
|
+
raise "Must be implemented in a subclass"
|
15
20
|
end
|
16
21
|
|
17
22
|
# Returns the error messages to output in the input group. Returns [] if no
|
@@ -32,7 +37,7 @@ module Felt
|
|
32
37
|
|
33
38
|
# Returns the classes to use for the help text.
|
34
39
|
def error_classes
|
35
|
-
classes_from_configuration(:error,
|
40
|
+
classes_from_configuration(:error, config_key, state_key) ||
|
36
41
|
classes_from_configuration(:error, :default, state_key)
|
37
42
|
end
|
38
43
|
|
@@ -55,7 +60,7 @@ module Felt
|
|
55
60
|
|
56
61
|
# Returns the classes to use for the help text.
|
57
62
|
def help_classes
|
58
|
-
classes_from_configuration(:help,
|
63
|
+
classes_from_configuration(:help, config_key, state_key) ||
|
59
64
|
classes_from_configuration(:help, :default, state_key)
|
60
65
|
end
|
61
66
|
|
@@ -77,10 +82,12 @@ module Felt
|
|
77
82
|
|
78
83
|
# Returns the classes to use for the hint text.
|
79
84
|
def hint_classes
|
80
|
-
classes_from_configuration(:hint,
|
85
|
+
classes_from_configuration(:hint, config_key, state_key) ||
|
81
86
|
classes_from_configuration(:hint, :default, state_key)
|
82
87
|
end
|
83
88
|
|
89
|
+
# - classes: CSS classes to add to the wrapping input group element.
|
90
|
+
#
|
84
91
|
# - hint: The hint for the input group. If not provided, the hint will be
|
85
92
|
# looked up in the `forms.<object_name>.<attribute>` translation. See
|
86
93
|
# #hint for more details. To disable the hint, pass an empty string.
|
@@ -100,8 +107,9 @@ module Felt
|
|
100
107
|
# All remaining keyword arguments are passed to the wrapping div element
|
101
108
|
# of the input group. See ActionView::Helpers::TagHelper#content_tag for
|
102
109
|
# details.
|
103
|
-
def initialize(attribute:, form:, help: nil, hint: nil, input_options: {}, label: nil, placeholder: nil, **options)
|
110
|
+
def initialize(attribute:, form:, classes: nil, help: nil, hint: nil, input_options: {}, label: nil, placeholder: nil, **options)
|
104
111
|
@attribute = attribute
|
112
|
+
@classes = classes
|
105
113
|
@form = form
|
106
114
|
@help = help
|
107
115
|
@hint = hint
|
@@ -113,13 +121,13 @@ module Felt
|
|
113
121
|
|
114
122
|
# Returns the classes to use for the input field.
|
115
123
|
def input_classes
|
116
|
-
classes_from_configuration(:input,
|
124
|
+
classes_from_configuration(:input, config_key, state_key) ||
|
117
125
|
classes_from_configuration(:input, :default, state_key)
|
118
126
|
end
|
119
127
|
|
120
128
|
# Returns the classes to use for the label field.
|
121
129
|
def label_classes
|
122
|
-
classes_from_configuration(:label,
|
130
|
+
classes_from_configuration(:label, config_key, state_key) ||
|
123
131
|
classes_from_configuration(:label, :default, state_key)
|
124
132
|
end
|
125
133
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= content_tag(:div, :class => classes, **options) do %>
|
2
|
-
|
2
|
+
<%= render(Felt::Hint.new(:form => form, :attribute => attribute, :classes => hint_classes, :text => hint)) %>
|
3
3
|
<div class="flex">
|
4
4
|
<div class="flex items-center h-5">
|
5
5
|
<%= form.check_box(attribute, :class => input_classes, :placeholder => placeholder, **input_options) %>
|
@@ -1,9 +1,3 @@
|
|
1
|
-
<%=
|
2
|
-
<%= render(Felt::Label.new(:form => form, :attribute => attribute, :classes => label_classes, :text => label)) %>
|
3
|
-
<% if hint? %><div class="<%= hint_classes %>"><%= hint %></div><% end %>
|
1
|
+
<%= render(Felt::InputGroup::Wrapper.new(attribute: attribute, classes: classes, config_key: config_key, form: form, help: help, hint: hint, input_options: input_options, label: label, placeholder: placeholder, **options)) do %>
|
4
2
|
<%= form.email_field(attribute, :class => input_classes, :placeholder => placeholder, **input_options) %>
|
5
|
-
<% if help? %><div class="<%= help_classes %>"><%= help %></div><% end %>
|
6
|
-
<% errors.each do |error| %>
|
7
|
-
<p class="<%= error_classes %>"><%= error %></p>
|
8
|
-
<% end %>
|
9
3
|
<% end %>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= content_tag(:div, :class => classes, **options) do %>
|
2
2
|
<%= render(Felt::Label.new(:form => form, :attribute => attribute, :classes => label_classes, :text => label)) %>
|
3
|
-
|
3
|
+
<%= render(Felt::Hint.new(:form => form, :attribute => attribute, :classes => hint_classes, :text => hint)) %>
|
4
4
|
<%= form.password_field(attribute, :class => input_classes, :placeholder => placeholder, **input_options) %>
|
5
5
|
<% if help? %><div class="<%= help_classes %>"><%= help %></div><% end %>
|
6
6
|
<% errors.each do |error| %>
|
@@ -8,10 +8,8 @@ module Felt
|
|
8
8
|
# field is blank by default; pass in a value via options if this is not
|
9
9
|
# desired.
|
10
10
|
class PasswordField < InputGroup::Base
|
11
|
-
|
12
|
-
|
13
|
-
:password_field
|
14
|
-
end
|
11
|
+
def config_key
|
12
|
+
:password_field
|
15
13
|
end
|
16
14
|
end
|
17
15
|
end
|
@@ -1,9 +1,3 @@
|
|
1
|
-
<%=
|
2
|
-
<%= render(Felt::Label.new(:form => form, :attribute => attribute, :classes => label_classes, :text => label)) %>
|
3
|
-
<% if hint? %><div class="<%= hint_classes %>"><%= hint %></div><% end %>
|
1
|
+
<%= render(Felt::InputGroup::Wrapper.new(attribute: attribute, classes: classes, config_key: config_key, form: form, help: help, hint: hint, input_options: input_options, label: label, placeholder: placeholder, **options)) do %>
|
4
2
|
<%= form.text_field(attribute, :class => input_classes, :placeholder => placeholder, **input_options) %>
|
5
|
-
<% if help? %><div class="<%= help_classes %>"><%= help %></div><% end %>
|
6
|
-
<% errors.each do |error| %>
|
7
|
-
<p class="<%= error_classes %>"><%= error %></p>
|
8
|
-
<% end %>
|
9
3
|
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= content_tag(:div, :class => classes, **options) do %>
|
2
|
+
<%= render(Felt::Label.new(:form => form, :attribute => attribute, :classes => label_classes, :text => label)) %>
|
3
|
+
<%= render(Felt::Hint.new(:form => form, :attribute => attribute, :classes => hint_classes, :text => hint)) %>
|
4
|
+
<%= content %>
|
5
|
+
<%= render(Felt::Help.new(:form => form, :attribute => attribute, :classes => help_classes, :text => help)) %>
|
6
|
+
<% errors.each do |error| %>
|
7
|
+
<p class="<%= error_classes %>"><%= error %></p>
|
8
|
+
<% end %>
|
9
|
+
<% end %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "input_group/base"
|
4
|
+
|
5
|
+
module Felt
|
6
|
+
module InputGroup
|
7
|
+
# Encapsulates the common functionality of all input groups.
|
8
|
+
#
|
9
|
+
# Renders a wrapping div containing a label, a hint, an input field, a help
|
10
|
+
# element, and a list of errors.
|
11
|
+
#
|
12
|
+
# Pass the input field as a block to the constructor.
|
13
|
+
class Wrapper < Base
|
14
|
+
attr_reader :config_key
|
15
|
+
|
16
|
+
def initialize(config_key: nil, **args)
|
17
|
+
@config_key = config_key
|
18
|
+
super(**args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: felt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jakob Skjerning
|
@@ -51,6 +51,10 @@ files:
|
|
51
51
|
- lib/felt.rb
|
52
52
|
- lib/felt/configuration.rb
|
53
53
|
- lib/felt/version.rb
|
54
|
+
- lib/help.rb
|
55
|
+
- lib/help/help.html.erb
|
56
|
+
- lib/hint.rb
|
57
|
+
- lib/hint/hint.html.erb
|
54
58
|
- lib/input_group/base.rb
|
55
59
|
- lib/input_group/checkbox_field.rb
|
56
60
|
- lib/input_group/checkbox_field/checkbox_field.html.erb
|
@@ -60,6 +64,8 @@ files:
|
|
60
64
|
- lib/input_group/password_field/password_field.html.erb
|
61
65
|
- lib/input_group/text_field.rb
|
62
66
|
- lib/input_group/text_field/text_field.html.erb
|
67
|
+
- lib/input_group/wrapper.rb
|
68
|
+
- lib/input_group/wrapper/wrapper.html.erb
|
63
69
|
- lib/label.rb
|
64
70
|
- lib/label/label.html.erb
|
65
71
|
homepage: https://github.com/substancelab/felt
|