shoelace-rails 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -6
- data/app/helpers/shoelace/form_helper.rb +27 -14
- data/lib/shoelace/rails/version.rb +1 -1
- data/test/helpers/form_helper_test.rb +1 -1
- data/test/helpers/translation_test.rb +160 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 206ca8361dedd910c96e3c13469e9bad996af7d2a91a0ca0af2cb8e1a7430808
|
4
|
+
data.tar.gz: 64df314d89557bd02dbf791bddcc49185017f5cb1d22c5046a23f1767df5bf18
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 284ca5c08643f593de6554d02bb8e4857d141c8a4ddc02def92e573a273a3b45694e2ce14783779fbafe83eea1b9cbc85fd80ba52f36dc235e11d5cec6e9f6b1
|
7
|
+
data.tar.gz: 22ca68a850b08eebb0ad6d8fd48a8a7b65a3a4647acd34171f04cac20eca635475147804194957efe75fb4aeef68741b4b65fc3f10edc214165b3eb51addefcb
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,19 @@
|
|
1
|
-
## v0.
|
1
|
+
## v0.6.0
|
2
2
|
|
3
|
-
|
3
|
+
#### ⭐️ Features
|
4
|
+
|
5
|
+
- Add the ability to use translations with form helpers
|
6
|
+
|
7
|
+
## [v0.5.0](https://github.com/yuki24/shoelace-rails/tree/v0.5.0)
|
8
|
+
|
9
|
+
_<sup>released at 2024-03-09 08:54:30 UTC</sup>_
|
4
10
|
|
5
11
|
#### ⭐️ Features
|
6
12
|
|
7
|
-
- Add support for Ruby 3.3 (
|
8
|
-
- Add support for Rails 7.1 (#4)
|
9
|
-
- Add `#grouped_collection_select` (
|
10
|
-
- Make the `<sl-radio>` form helpers compatible with Shoelace [2.0.0-beta.80](https://shoelace.style/resources/changelog#id_2_0_0-beta_80) and above (
|
13
|
+
- Add support for Ruby 3.3 ([<tt>399f255</tt>](https://github.com/yuki24/shoelace-rails/commit/399f25567f964d0ea2e250eba6db28a2bcd038a3))
|
14
|
+
- Add support for Rails 7.1 ([#4](https://github.com/yuki24/shoelace-rails/pull/4))
|
15
|
+
- Add `#grouped_collection_select` ([<tt>2b91023</tt>](https://github.com/yuki24/shoelace-rails/commit/2b91023d51e1d0a218f2102232241afa82aaf872))
|
16
|
+
- Make the `<sl-radio>` form helpers compatible with Shoelace [2.0.0-beta.80](https://shoelace.style/resources/changelog#id_2_0_0-beta_80) and above ([<tt>ef9a834</tt>](https://github.com/yuki24/shoelace-rails/commit/ef9a8345f2c5c921847aef15e19cf64a471d6473))
|
11
17
|
|
12
18
|
## [v0.4.1](https://github.com/yuki24/shoelace-rails/tree/v0.4.1)
|
13
19
|
|
@@ -57,8 +57,9 @@ module Shoelace
|
|
57
57
|
options = @options.stringify_keys
|
58
58
|
options["value"] = options.fetch("value") { value_before_type_cast }
|
59
59
|
add_default_name_and_id(options)
|
60
|
+
label = options.delete('label').presence || @method_name.humanize
|
60
61
|
|
61
|
-
@template_object.content_tag('sl-switch',
|
62
|
+
@template_object.content_tag('sl-switch', label, options, &block)
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
@@ -123,6 +124,7 @@ module Shoelace
|
|
123
124
|
options = @options.stringify_keys
|
124
125
|
options["value"] = @checked_value
|
125
126
|
options["checked"] = true if input_checked?(options)
|
127
|
+
label = options.delete("label") || @method_name.humanize
|
126
128
|
|
127
129
|
if options["multiple"]
|
128
130
|
add_default_name_and_id_for_value(@checked_value, options)
|
@@ -136,7 +138,7 @@ module Shoelace
|
|
136
138
|
sl_checkbox_tag = if block_given?
|
137
139
|
@template_object.content_tag('sl-checkbox', '', options, &block)
|
138
140
|
else
|
139
|
-
@template_object.content_tag('sl-checkbox', @method_name.to_s.humanize, options)
|
141
|
+
@template_object.content_tag('sl-checkbox', label || @method_name.to_s.humanize, options)
|
140
142
|
end
|
141
143
|
|
142
144
|
if include_hidden
|
@@ -181,8 +183,9 @@ module Shoelace
|
|
181
183
|
html_options = @html_options.stringify_keys
|
182
184
|
html_options["value"] = value
|
183
185
|
add_default_name_and_id(html_options)
|
186
|
+
html_options["label"] = @options[:label].presence || @method_name.humanize
|
184
187
|
|
185
|
-
@template_object.content_tag('sl-radio-group', html_options
|
188
|
+
@template_object.content_tag('sl-radio-group', html_options) { super(&block) }
|
186
189
|
end
|
187
190
|
|
188
191
|
def hidden_field
|
@@ -206,52 +209,56 @@ module Shoelace
|
|
206
209
|
url: :url
|
207
210
|
}.each do |field_type, field_class|
|
208
211
|
# def email_field(method, **options, &block)
|
209
|
-
# ShoelaceInputField.new(:email, object_name, method, @template, options.with_defaults(label: method
|
212
|
+
# ShoelaceInputField.new(:email, object_name, method, @template, options.with_defaults(label: label_text(method))).render(&block)
|
210
213
|
# end
|
211
214
|
eval <<-RUBY, nil, __FILE__, __LINE__ + 1
|
212
215
|
def #{field_type}_field(method, **options, &block)
|
213
|
-
ShoelaceInputField.new(:#{field_class}, object_name, method, @template, options.with_defaults(object: @object, label: method
|
216
|
+
ShoelaceInputField.new(:#{field_class}, object_name, method, @template, options.with_defaults(object: @object, label: label_text(method))).render(&block)
|
214
217
|
end
|
215
218
|
RUBY
|
216
219
|
end
|
217
220
|
|
218
221
|
def color_field(method, **options)
|
219
|
-
ShoelaceColorPicker.new(object_name, method, @template, options.with_defaults(object: @object)).render
|
222
|
+
ShoelaceColorPicker.new(object_name, method, @template, options.with_defaults(object: @object, label: label_text(method))).render
|
220
223
|
end
|
221
224
|
alias color_picker color_field
|
222
225
|
|
223
226
|
def range_field(method, **options)
|
224
|
-
ShoelaceRange.new(object_name, method, @template, options.with_defaults(object: @object, label: method
|
227
|
+
ShoelaceRange.new(object_name, method, @template, options.with_defaults(object: @object, label: label_text(method))).render
|
225
228
|
end
|
226
229
|
alias range range_field
|
227
230
|
|
228
231
|
def switch_field(method, **options, &block)
|
229
|
-
|
232
|
+
if block_given?
|
233
|
+
ShoelaceSwitch.new(object_name, method, @template, options.with_defaults(object: @object)).render(&block)
|
234
|
+
else
|
235
|
+
ShoelaceSwitch.new(object_name, method, @template, options.with_defaults(object: @object, label: label_text(method))).render(&block)
|
236
|
+
end
|
230
237
|
end
|
231
238
|
alias switch switch_field
|
232
239
|
|
233
240
|
def text_area(method, **options, &block)
|
234
|
-
ShoelaceTextArea.new(object_name, method, @template, options.with_defaults(object: @object, label: method
|
241
|
+
ShoelaceTextArea.new(object_name, method, @template, options.with_defaults(object: @object, label: label_text(method), resize: 'auto')).render(&block)
|
235
242
|
end
|
236
243
|
|
237
244
|
def check_box(method, options = {}, checked_value = "1", unchecked_value = "0", &block)
|
238
|
-
ShoelaceCheckBox.new(object_name, method, @template, checked_value, unchecked_value, options.merge(object: @object)).render(&block)
|
245
|
+
ShoelaceCheckBox.new(object_name, method, @template, checked_value, unchecked_value, options.with_defaults(label: label_text(method)).merge(object: @object)).render(&block)
|
239
246
|
end
|
240
247
|
|
241
248
|
def select(method, choices = nil, options = {}, html_options = {}, &block)
|
242
|
-
ShoelaceSelect.new(object_name, method, @template, choices, options.with_defaults(object: @object), html_options.with_defaults(label: method
|
249
|
+
ShoelaceSelect.new(object_name, method, @template, choices, options.with_defaults(object: @object), html_options.with_defaults(label: label_text(method)), &block).render
|
243
250
|
end
|
244
251
|
|
245
252
|
def collection_select(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
|
246
|
-
ShoelaceCollectionSelect.new(object_name, method, @template, collection, value_method, text_method, options.with_defaults(object: @object), html_options.with_defaults(label: method
|
253
|
+
ShoelaceCollectionSelect.new(object_name, method, @template, collection, value_method, text_method, options.with_defaults(object: @object), html_options.with_defaults(label: label_text(method)), &block).render
|
247
254
|
end
|
248
255
|
|
249
256
|
def grouped_collection_select(method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
|
250
|
-
ShoelaceGroupedCollectionSelect.new(object_name, method, @template, collection, group_method, group_label_method, option_key_method, option_value_method, options.with_defaults(object: @object), html_options.with_defaults(label: method
|
257
|
+
ShoelaceGroupedCollectionSelect.new(object_name, method, @template, collection, group_method, group_label_method, option_key_method, option_value_method, options.with_defaults(object: @object), html_options.with_defaults(label: label_text(method))).render
|
251
258
|
end
|
252
259
|
|
253
260
|
def collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
|
254
|
-
ShoelaceCollectionRadioButtons.new(object_name, method, @template, collection, value_method, text_method, options.with_defaults(object: @object), html_options).render(&block)
|
261
|
+
ShoelaceCollectionRadioButtons.new(object_name, method, @template, collection, value_method, text_method, options.with_defaults(object: @object, label: label_text(method)), html_options).render(&block)
|
255
262
|
end
|
256
263
|
|
257
264
|
def submit(value = nil, options = {})
|
@@ -259,6 +266,12 @@ module Shoelace
|
|
259
266
|
|
260
267
|
@template.sl_submit_tag(value || submit_default_value, **options)
|
261
268
|
end
|
269
|
+
|
270
|
+
private
|
271
|
+
|
272
|
+
def label_text(method, tag_value = nil)
|
273
|
+
::ActionView::Helpers::Tags::Label::LabelBuilder.new(@template, object_name, method, object, tag_value).translation
|
274
|
+
end
|
262
275
|
end
|
263
276
|
|
264
277
|
DEFAULT_FORM_PARAMETERS = { builder: ShoelaceFormBuilder }
|
@@ -149,7 +149,7 @@ class FormHelperTest < ActionView::TestCase
|
|
149
149
|
test "#color_field" do
|
150
150
|
sl_form_for(User.new, url: "/") do |form|
|
151
151
|
assert_dom_equal <<~HTML, form.color_field(:name)
|
152
|
-
<sl-color-picker name="user[name]" id="user_name"></sl-color-picker>
|
152
|
+
<sl-color-picker name="user[name]" id="user_name" label="Name"></sl-color-picker>
|
153
153
|
HTML
|
154
154
|
end
|
155
155
|
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
require_relative '../../app/helpers/shoelace/form_helper'
|
5
|
+
|
6
|
+
class TranslationTest < ActionView::TestCase
|
7
|
+
include ActionView::Helpers::TranslationHelper
|
8
|
+
include Shoelace::FormHelper
|
9
|
+
|
10
|
+
AUTOCOMPLETE_ATTRIBUTE = ActionView::VERSION::STRING >= '6.1.0' ? 'autocomplete="off"' : ''
|
11
|
+
|
12
|
+
setup do
|
13
|
+
I18n.backend.store_translations :en,
|
14
|
+
helpers: {
|
15
|
+
label: {
|
16
|
+
user: { name: "Full Name" }
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
view_paths = ActionController::Base.view_paths
|
21
|
+
view_paths.each(&:clear_cache)
|
22
|
+
@view = ::ActionView::Base.with_empty_template_cache.with_view_paths(view_paths, {})
|
23
|
+
end
|
24
|
+
|
25
|
+
teardown do
|
26
|
+
I18n.backend.reload!
|
27
|
+
end
|
28
|
+
|
29
|
+
test "Form helpers should respect label translations" do
|
30
|
+
sl_form_for(User.new, url: "/") do |form|
|
31
|
+
assert_dom_equal <<~HTML, form.text_field(:name)
|
32
|
+
<sl-input label="Full Name" type="text" name="user[name]" id="user_name"></sl-input>
|
33
|
+
HTML
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
test "#color_field should respect label translations" do
|
38
|
+
sl_form_for(User.new, url: "/") do |form|
|
39
|
+
assert_dom_equal <<~HTML, form.color_field(:name)
|
40
|
+
<sl-color-picker name="user[name]" id="user_name" label="Full Name"></sl-color-picker>
|
41
|
+
HTML
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
test "#range_field should respect label translations" do
|
46
|
+
sl_form_for(User.new, url: "/") do |form|
|
47
|
+
assert_dom_equal <<~HTML, form.range_field(:name)
|
48
|
+
<sl-range label="Full Name" name="user[name]" id="user_name"></sl-range>
|
49
|
+
HTML
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
test "#switch_field should respect label translations" do
|
54
|
+
sl_form_for(User.new, url: "/") do |form|
|
55
|
+
assert_dom_equal <<~HTML, form.switch_field(:name)
|
56
|
+
<sl-switch name="user[name]" id="user_name">Full Name</sl-switch>
|
57
|
+
HTML
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
test "#text_area should respect label translations" do
|
62
|
+
sl_form_for(User.new, url: "/") do |form|
|
63
|
+
assert_dom_equal <<~HTML, form.text_area(:name)
|
64
|
+
<sl-textarea label="Full Name" resize="auto" name="user[name]" id="user_name"></sl-textarea>
|
65
|
+
HTML
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
test "#check_box should respect label translations" do
|
70
|
+
sl_form_for(User.new, url: "/") do |form|
|
71
|
+
assert_dom_equal <<~HTML, form.check_box(:name)
|
72
|
+
<input name="user[name]" type="hidden" value="0" #{AUTOCOMPLETE_ATTRIBUTE} />
|
73
|
+
<sl-checkbox value="1" name="user[name]" id="user_name">Full Name</sl-checkbox>
|
74
|
+
HTML
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
test "#selec should respect label translationst" do
|
79
|
+
users = {
|
80
|
+
"Yuki Nishijima" => 1,
|
81
|
+
"Matz" => 2,
|
82
|
+
"Koichi Sasada" => 3
|
83
|
+
}
|
84
|
+
|
85
|
+
sl_form_for(User.new, url: "/") do |form|
|
86
|
+
assert_dom_equal <<~HTML, form.select(:name, users)
|
87
|
+
<sl-select label="Full Name" name="user[name]" id="user_name">
|
88
|
+
<sl-option value="1">Yuki Nishijima</sl-option>
|
89
|
+
<sl-option value="2">Matz</sl-option>
|
90
|
+
<sl-option value="3">Koichi Sasada</sl-option>
|
91
|
+
</sl-select>
|
92
|
+
HTML
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
test "#collection_select should respect label translations" do
|
97
|
+
users = {
|
98
|
+
1 => "Yuki Nishijima",
|
99
|
+
2 => "Matz",
|
100
|
+
3 => "Koichi Sasada",
|
101
|
+
}
|
102
|
+
|
103
|
+
sl_form_for(User.new, url: "/") do |form|
|
104
|
+
assert_dom_equal <<~HTML, form.collection_select(:name, users, :first, :last)
|
105
|
+
<sl-select label="Full Name" name="user[name]" id="user_name">
|
106
|
+
<sl-option value="1">Yuki Nishijima</sl-option>
|
107
|
+
<sl-option value="2">Matz</sl-option>
|
108
|
+
<sl-option value="3">Koichi Sasada</sl-option>
|
109
|
+
</sl-select>
|
110
|
+
HTML
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
test "#grouped_collection_select should respect label translations" do
|
115
|
+
users = [
|
116
|
+
OpenStruct.new(
|
117
|
+
group_name: "Main maintainers",
|
118
|
+
members: [
|
119
|
+
OpenStruct.new(id: 1, name: "Matz"),
|
120
|
+
OpenStruct.new(id: 2, name: "Koichi Sasada"),
|
121
|
+
]
|
122
|
+
),
|
123
|
+
OpenStruct.new(
|
124
|
+
group_name: "Default gem maintainers",
|
125
|
+
members: [OpenStruct.new(id: 3, name: "Yuki Nishijima")]
|
126
|
+
),
|
127
|
+
]
|
128
|
+
|
129
|
+
sl_form_for(User.new(name: "2"), url: "/") do |form|
|
130
|
+
assert_dom_equal <<~HTML, form.grouped_collection_select(:name, users, :members, :group_name, :id, :name)
|
131
|
+
<sl-select label="Full Name" name="user[name]" id="user_name" value="2">
|
132
|
+
<small>Main maintainers</small>
|
133
|
+
<sl-option value="1">Matz</sl-option>
|
134
|
+
<sl-option value="2" checked="checked">Koichi Sasada</sl-option>
|
135
|
+
<sl-divider></sl-divider>
|
136
|
+
<small>Default gem maintainers</small>
|
137
|
+
<sl-option value="3">Yuki Nishijima</sl-option>
|
138
|
+
</sl-select>
|
139
|
+
HTML
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
test "#collection_radio_buttons should respect label translations" do
|
144
|
+
users = {
|
145
|
+
1 => "Yuki Nishijima",
|
146
|
+
2 => "Matz",
|
147
|
+
3 => "Koichi Sasada",
|
148
|
+
}
|
149
|
+
|
150
|
+
sl_form_for(User.new, url: "/") do |form|
|
151
|
+
assert_dom_equal <<~HTML, form.collection_radio_buttons(:name, users, :first, :last)
|
152
|
+
<sl-radio-group label="Full Name" name="user[name]" id="user_name">
|
153
|
+
<sl-radio value="1" id="user_name_1">Yuki Nishijima</sl-radio>
|
154
|
+
<sl-radio value="2" id="user_name_2">Matz</sl-radio>
|
155
|
+
<sl-radio value="3" id="user_name_3">Koichi Sasada</sl-radio>
|
156
|
+
</sl-radio-group>
|
157
|
+
HTML
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shoelace-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuki Nishijima
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionview
|
@@ -118,6 +118,7 @@ files:
|
|
118
118
|
- shoelace-rails.gemspec
|
119
119
|
- test/helpers/form_helper_test.rb
|
120
120
|
- test/helpers/tag_helper_test.rb
|
121
|
+
- test/helpers/translation_test.rb
|
121
122
|
- test/test_helper.rb
|
122
123
|
homepage: https://github.com/yuki24/shoelace-rails
|
123
124
|
licenses:
|