shoelace-rails 0.2.0 → 0.3.0
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/.github/workflows/main.yml +16 -14
- data/Appraisals +1 -1
- data/CHANGELOG.md +29 -1
- data/README.md +80 -5
- data/app/helpers/shoelace/form_helper.rb +33 -122
- data/app/helpers/shoelace/tag_helper.rb +27 -0
- data/gemfiles/rails_edge.gemfile +1 -1
- data/lib/shoelace/rails/version.rb +1 -1
- data/lib/shoelace/railtie.rb +17 -3
- data/lib/tasks/{assets.rake → shoelace.rake} +3 -0
- data/test/dummy_app/app/views/hotwire_forms/form.html.erb +1 -1
- data/test/dummy_app/app/views/layouts/application.html.erb +2 -2
- data/test/dummy_app/test/system/hotwire_form_test.rb +0 -2
- data/test/dummy_app/test/system/turbolinks_form_test.rb +0 -1
- data/test/helpers/form_helper_test.rb +125 -49
- data/test/helpers/tag_helper_test.rb +58 -0
- metadata +6 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6bf02de3fbe6ef35ad4c464e666bd7ace7bf0c2e673b0767afea4d6b87522749
|
|
4
|
+
data.tar.gz: 73abb906c86ffc3f4a945f73f3a97e3cd335c1cb4245b82362cf53c3587619d5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1e7a5bca7b14951f97b54c9de1be69698ceebb63a421be912cc8f692ebec8ed075ebdf58a4fbc9d9200c296e3150ae63f41f6a6a40f62fc368c1a54044905a9b
|
|
7
|
+
data.tar.gz: 5d09b9294065025cb30762a152c3b037739790a8b16ff5e2178bcb98afc0592756447ba0273967450783e11fbfd9863be5e11027a61074ed622e35d380a95dc5
|
data/.github/workflows/main.yml
CHANGED
|
@@ -9,22 +9,24 @@ jobs:
|
|
|
9
9
|
strategy:
|
|
10
10
|
matrix:
|
|
11
11
|
ruby_version:
|
|
12
|
+
- '3.2'
|
|
12
13
|
- '3.1'
|
|
13
14
|
- '3.0'
|
|
14
15
|
- '2.7'
|
|
15
|
-
- 'jruby-9.3
|
|
16
|
+
- 'jruby-9.3'
|
|
17
|
+
- 'jruby-9.4'
|
|
16
18
|
gemfile:
|
|
17
19
|
- gemfiles/rails_70.gemfile
|
|
18
20
|
- gemfiles/rails_61.gemfile
|
|
19
21
|
- gemfiles/rails_60.gemfile
|
|
20
22
|
exclude:
|
|
21
|
-
- ruby_version: 'jruby-9.3
|
|
23
|
+
- ruby_version: 'jruby-9.3'
|
|
22
24
|
gemfile: gemfiles/rails_70.gemfile
|
|
23
|
-
runs-on: ubuntu-
|
|
25
|
+
runs-on: ubuntu-22.04
|
|
24
26
|
env:
|
|
25
27
|
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
|
26
28
|
steps:
|
|
27
|
-
- uses: actions/checkout@
|
|
29
|
+
- uses: actions/checkout@v3
|
|
28
30
|
- name: Set up Ruby
|
|
29
31
|
uses: ruby/setup-ruby@v1
|
|
30
32
|
with:
|
|
@@ -34,13 +36,13 @@ jobs:
|
|
|
34
36
|
|
|
35
37
|
system:
|
|
36
38
|
needs: unit
|
|
37
|
-
runs-on: ubuntu-
|
|
39
|
+
runs-on: ubuntu-22.04
|
|
38
40
|
steps:
|
|
39
|
-
- uses: actions/checkout@
|
|
41
|
+
- uses: actions/checkout@v3
|
|
40
42
|
- name: Set up Ruby
|
|
41
43
|
uses: ruby/setup-ruby@v1
|
|
42
44
|
with:
|
|
43
|
-
ruby-version: 3.
|
|
45
|
+
ruby-version: 3.2.0
|
|
44
46
|
bundler-cache: true
|
|
45
47
|
- name: Install dependencies
|
|
46
48
|
run: |
|
|
@@ -53,11 +55,11 @@ jobs:
|
|
|
53
55
|
|
|
54
56
|
rails_edge:
|
|
55
57
|
needs: system
|
|
56
|
-
runs-on: ubuntu-
|
|
58
|
+
runs-on: ubuntu-22.04
|
|
57
59
|
env:
|
|
58
60
|
BUNDLE_GEMFILE: gemfiles/rails_edge.gemfile
|
|
59
61
|
steps:
|
|
60
|
-
- uses: actions/checkout@
|
|
62
|
+
- uses: actions/checkout@v3
|
|
61
63
|
- name: Set up Ruby
|
|
62
64
|
uses: ruby/setup-ruby@v1
|
|
63
65
|
with:
|
|
@@ -72,11 +74,11 @@ jobs:
|
|
|
72
74
|
gemfile:
|
|
73
75
|
- gemfiles/rails_edge.gemfile
|
|
74
76
|
- gemfiles/rails_70.gemfile
|
|
75
|
-
runs-on: ubuntu-
|
|
77
|
+
runs-on: ubuntu-22.04
|
|
76
78
|
env:
|
|
77
79
|
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
|
78
80
|
steps:
|
|
79
|
-
- uses: actions/checkout@
|
|
81
|
+
- uses: actions/checkout@v3
|
|
80
82
|
- name: Set up Ruby
|
|
81
83
|
uses: ruby/setup-ruby@v1
|
|
82
84
|
with:
|
|
@@ -85,13 +87,13 @@ jobs:
|
|
|
85
87
|
- run: bundle exec rake || echo "Ruby edge test is done."
|
|
86
88
|
|
|
87
89
|
# browser_tests:
|
|
88
|
-
# runs-on: ubuntu-
|
|
90
|
+
# runs-on: ubuntu-22.04
|
|
89
91
|
# steps:
|
|
90
|
-
# - uses: actions/checkout@
|
|
92
|
+
# - uses: actions/checkout@v3
|
|
91
93
|
# - name: Set up Ruby
|
|
92
94
|
# uses: ruby/setup-ruby@v1
|
|
93
95
|
# with:
|
|
94
|
-
# ruby-version: 3.
|
|
96
|
+
# ruby-version: 3.2.0
|
|
95
97
|
# bundler-cache: true
|
|
96
98
|
# - name: Install dependencies
|
|
97
99
|
# run: |
|
data/Appraisals
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,32 @@
|
|
|
1
|
-
## v0.
|
|
1
|
+
## v0.3.0
|
|
2
|
+
|
|
3
|
+
_<sup>released at 2023-01-05 08:47:12 UTC</sup>_
|
|
4
|
+
|
|
5
|
+
#### Features
|
|
6
|
+
|
|
7
|
+
- No longer requires the `sl-form` component (`4fdbfa15`)
|
|
8
|
+
- The `#text_area` method now accepts a block (`5092dc1c`)
|
|
9
|
+
- Allow overriding the value attribute for `<sl-select>` (`1f38be73`)
|
|
10
|
+
- Auto-display labels whenever possible (`c1e3a950`)
|
|
11
|
+
- `<sl-select>` now always has a label by default (`f9fb5f0c`)
|
|
12
|
+
- Support Ruby 3.2 (`b286cbc1`)
|
|
13
|
+
- Add `#sl_button_to` (`e1bdedba`)
|
|
14
|
+
- Add `#sl_icon_tag` (`8a2187a2`)
|
|
15
|
+
- Add `#sl_avatar_tag` (`77dccdb2`)
|
|
16
|
+
- Allow using the `Shoelace::FormBuilder` in a cleaner way (`43dea330`)
|
|
17
|
+
|
|
18
|
+
#### Bug Fixes
|
|
19
|
+
|
|
20
|
+
- Fixes a bug where the gem rake tasks are not loaded (`115bfb3d`)
|
|
21
|
+
- Fixes a bug where values are not properly passed in to `<sl-textarea>` (`3d163845`)
|
|
22
|
+
- Make sure yarn install is always executed before copying shoelace assets (`98018a27`)
|
|
23
|
+
- Fixes a bug where the `@object` needs to respond to `#errors` (`bb981ed0`)
|
|
24
|
+
- Fixes a bug where the `size` attr is ignored by the `#text_area` method (`8bc4c378`)
|
|
25
|
+
- Fixes a bug where unchecked checkbox values are not captured (`dc658bea`)
|
|
26
|
+
|
|
27
|
+
## [v0.2.0](https://github.com/yuki24/shoelace-rails/tree/v0.2.0)
|
|
28
|
+
|
|
29
|
+
_<sup>released at 2022-06-24 05:14:01 UTC</sup>_
|
|
2
30
|
|
|
3
31
|
#### Features
|
|
4
32
|
|
data/README.md
CHANGED
|
@@ -4,10 +4,6 @@ The `shoelace-rails` gem adds useful helper methods for [Shoelace.style](https:/
|
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
-
This document assumes that you use the [`webpacker`](https://github.com/rails/webpacker) or
|
|
8
|
-
the [`jsbundling-rails`](https://github.com/rails/jsbundling-rails) gem. You may have to tweak the examples here if
|
|
9
|
-
you do not use it. However, the principle here should be the same regardless of the JS bundler you use.
|
|
10
|
-
|
|
11
7
|
Add this line to your application's Gemfile:
|
|
12
8
|
|
|
13
9
|
```ruby
|
|
@@ -70,7 +66,11 @@ Shoelace icons are automatically set up to load properly, so you don't need to a
|
|
|
70
66
|
|
|
71
67
|
## View Helpers
|
|
72
68
|
|
|
73
|
-
As explained above, this gem provides drop-in replacements to
|
|
69
|
+
As explained above, this gem provides drop-in replacements to Rails view helpers.
|
|
70
|
+
|
|
71
|
+
### Form Helpers
|
|
72
|
+
|
|
73
|
+
The `sl_form_with` or `sl_form_for` method could be used to generate a form with the Shoelace components:
|
|
74
74
|
|
|
75
75
|
```erb
|
|
76
76
|
<%= sl_form_for @user do |form| %>
|
|
@@ -115,6 +115,81 @@ And this code will produce:
|
|
|
115
115
|
</form>
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
+
#### Using The `sl-select` component with `multiple`
|
|
119
|
+
|
|
120
|
+
TDB
|
|
121
|
+
|
|
122
|
+
#### Using the Shoelace FormBuilder with other gems
|
|
123
|
+
|
|
124
|
+
Sometimes you want to use the Shoelace FormBuilder with other gems, such as [ransack](https://github.com/activerecord-hackery/ransack).
|
|
125
|
+
In this case, you can not use the `sl_form_for` or `sl_form_with` methods in tandem with `ransack`, but you can use
|
|
126
|
+
the `Shoelace::FormBuilder` with e.g. [the `search_form_for` method](https://activerecord-hackery.github.io/ransack/getting-started/simple-mode/#form-helper):
|
|
127
|
+
|
|
128
|
+
```erb
|
|
129
|
+
<%= search_form_for @q, builder: Shoelace::FormBuilder do |form| %>
|
|
130
|
+
...
|
|
131
|
+
<% end %>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Tag Helpers
|
|
135
|
+
|
|
136
|
+
#### `#sl_avatar_tag`
|
|
137
|
+
|
|
138
|
+
The `@sl_avatar_tag` method behaves just like the `image_tag` method.
|
|
139
|
+
|
|
140
|
+
```erb
|
|
141
|
+
<%= sl_avatar_tag "/path/to/image.jpg" %>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Will produce:
|
|
145
|
+
|
|
146
|
+
```html
|
|
147
|
+
<sl-avatar image="/path/to/image.jpg"></sl-avatar>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
#### `#sl_button_to`
|
|
151
|
+
|
|
152
|
+
The `sl_button_to` method behaves just like the `link_to` method. Note that this is slightly different from the
|
|
153
|
+
built-in `button_to` method.
|
|
154
|
+
|
|
155
|
+
Without a block:
|
|
156
|
+
|
|
157
|
+
```erb
|
|
158
|
+
<%= sl_button_to "Next Page", "/components?page=2" %>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```html
|
|
162
|
+
<sl-button href="/components?page=2">
|
|
163
|
+
Next Page
|
|
164
|
+
</sl-button>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
With a block:
|
|
168
|
+
|
|
169
|
+
```erb
|
|
170
|
+
<%= sl_button_to "/components?page=2" do %>
|
|
171
|
+
Next Page
|
|
172
|
+
<% end %>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
```html
|
|
176
|
+
<sl-button href="/components?page=2">
|
|
177
|
+
Next Page
|
|
178
|
+
</sl-button>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
#### `#sl_icon_tag`
|
|
182
|
+
|
|
183
|
+
The `sl_icon_tag` method takes the `name` attribute value as the first argument:
|
|
184
|
+
|
|
185
|
+
```erb
|
|
186
|
+
<%= sl_icon_tag "apple" %>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```html
|
|
190
|
+
<sl-icon name="apple"></sl-icon>
|
|
191
|
+
```
|
|
192
|
+
|
|
118
193
|
## Development
|
|
119
194
|
|
|
120
195
|
1. Run `bundle install`
|
|
@@ -2,11 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
module Shoelace
|
|
4
4
|
module FormHelper
|
|
5
|
-
mattr_accessor :
|
|
6
|
-
self.
|
|
7
|
-
|
|
8
|
-
mattr_accessor :remote_form
|
|
9
|
-
self.remote_form = false
|
|
5
|
+
mattr_accessor :invalid_input_class_name
|
|
6
|
+
self.invalid_input_class_name = nil
|
|
10
7
|
|
|
11
8
|
class ShoelaceInputField < ActionView::Helpers::Tags::TextField #:nodoc:
|
|
12
9
|
attr_reader :field_type
|
|
@@ -24,7 +21,8 @@ module Shoelace
|
|
|
24
21
|
|
|
25
22
|
options["size"] = options["maxlength"] unless options.key?("size")
|
|
26
23
|
options["type"] ||= field_type
|
|
27
|
-
options["
|
|
24
|
+
options["class"] ||= [options["class"], Shoelace::FormHelper.invalid_input_class_name].compact.join(" ") if @object.respond_to?(:errors) && @object.errors[@method_name].present?
|
|
25
|
+
|
|
28
26
|
add_default_name_and_id(options)
|
|
29
27
|
|
|
30
28
|
@template_object.content_tag('sl-input', '', options, &block)
|
|
@@ -68,10 +66,12 @@ module Shoelace
|
|
|
68
66
|
end
|
|
69
67
|
|
|
70
68
|
class ShoelaceTextArea < ActionView::Helpers::Tags::TextArea #:nodoc:
|
|
71
|
-
def
|
|
72
|
-
options
|
|
69
|
+
def render(&block)
|
|
70
|
+
options = @options.stringify_keys
|
|
71
|
+
options["value"] = options.fetch("value") { value_before_type_cast }
|
|
72
|
+
add_default_name_and_id(options)
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
@template_object.content_tag("sl-textarea", '', options, &block)
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
|
|
@@ -86,7 +86,7 @@ module Shoelace
|
|
|
86
86
|
|
|
87
87
|
def select_content_tag(option_tags, _options, html_options)
|
|
88
88
|
html_options = html_options.stringify_keys
|
|
89
|
-
html_options['value']
|
|
89
|
+
html_options['value'] ||= value
|
|
90
90
|
add_default_name_and_id(html_options)
|
|
91
91
|
|
|
92
92
|
@template_object.content_tag("sl-select", option_tags, html_options)
|
|
@@ -100,7 +100,7 @@ module Shoelace
|
|
|
100
100
|
|
|
101
101
|
def select_content_tag(option_tags, _options, html_options)
|
|
102
102
|
html_options = html_options.stringify_keys
|
|
103
|
-
html_options['value']
|
|
103
|
+
html_options['value'] ||= value
|
|
104
104
|
add_default_name_and_id(html_options)
|
|
105
105
|
|
|
106
106
|
@template_object.content_tag("sl-select", option_tags, html_options)
|
|
@@ -120,10 +120,18 @@ module Shoelace
|
|
|
120
120
|
add_default_name_and_id(options)
|
|
121
121
|
end
|
|
122
122
|
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
include_hidden = options.delete("include_hidden") { true }
|
|
124
|
+
|
|
125
|
+
sl_checkbox_tag = if block_given?
|
|
126
|
+
@template_object.content_tag('sl-checkbox', '', options, &block)
|
|
127
|
+
else
|
|
128
|
+
@template_object.content_tag('sl-checkbox', @method_name.to_s.humanize, options)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
if include_hidden
|
|
132
|
+
hidden_field_for_checkbox(options) + sl_checkbox_tag
|
|
125
133
|
else
|
|
126
|
-
|
|
134
|
+
sl_checkbox_tag
|
|
127
135
|
end
|
|
128
136
|
end
|
|
129
137
|
end
|
|
@@ -198,7 +206,7 @@ module Shoelace
|
|
|
198
206
|
alias color_picker color_field
|
|
199
207
|
|
|
200
208
|
def range_field(method, **options)
|
|
201
|
-
ShoelaceRange.new(object_name, method, @template, options.with_defaults(object: @object)).render
|
|
209
|
+
ShoelaceRange.new(object_name, method, @template, options.with_defaults(object: @object, label: method.to_s.humanize)).render
|
|
202
210
|
end
|
|
203
211
|
alias range range_field
|
|
204
212
|
|
|
@@ -207,8 +215,8 @@ module Shoelace
|
|
|
207
215
|
end
|
|
208
216
|
alias switch switch_field
|
|
209
217
|
|
|
210
|
-
def text_area(method, **options)
|
|
211
|
-
ShoelaceTextArea.new(object_name, method, @template, options.with_defaults(object: @object, resize: 'auto')).render
|
|
218
|
+
def text_area(method, **options, &block)
|
|
219
|
+
ShoelaceTextArea.new(object_name, method, @template, options.with_defaults(object: @object, label: method.to_s.humanize, resize: 'auto')).render(&block)
|
|
212
220
|
end
|
|
213
221
|
|
|
214
222
|
def check_box(method, options = {}, checked_value = "1", unchecked_value = "0", &block)
|
|
@@ -216,11 +224,11 @@ module Shoelace
|
|
|
216
224
|
end
|
|
217
225
|
|
|
218
226
|
def select(method, choices = nil, options = {}, html_options = {}, &block)
|
|
219
|
-
ShoelaceSelect.new(object_name, method, @template, choices, options.with_defaults(object: @object), html_options, &block).render
|
|
227
|
+
ShoelaceSelect.new(object_name, method, @template, choices, options.with_defaults(object: @object), html_options.with_defaults(label: method.to_s.humanize), &block).render
|
|
220
228
|
end
|
|
221
229
|
|
|
222
230
|
def collection_select(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
|
|
223
|
-
ShoelaceCollectionSelect.new(object_name, method, @template, collection, value_method, text_method, options.with_defaults(object: @object), html_options, &block).render
|
|
231
|
+
ShoelaceCollectionSelect.new(object_name, method, @template, collection, value_method, text_method, options.with_defaults(object: @object), html_options.with_defaults(label: method.to_s.humanize), &block).render
|
|
224
232
|
end
|
|
225
233
|
|
|
226
234
|
def collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
|
|
@@ -234,118 +242,19 @@ module Shoelace
|
|
|
234
242
|
end
|
|
235
243
|
end
|
|
236
244
|
|
|
237
|
-
DEFAULT_FORM_PARAMETERS = {
|
|
238
|
-
builder: ShoelaceFormBuilder,
|
|
239
|
-
data: {
|
|
240
|
-
remote: true,
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
DEFAULT_TURBO_FORM_PARAMETERS = {
|
|
245
|
-
builder: ShoelaceFormBuilder,
|
|
246
|
-
}
|
|
247
|
-
|
|
245
|
+
DEFAULT_FORM_PARAMETERS = { builder: ShoelaceFormBuilder }
|
|
248
246
|
DIVIDER_TAG = "<sl-divider></sl-divider>".html_safe
|
|
249
|
-
OPENING_SL_FORM_TAG = '<sl-form'.html_safe
|
|
250
|
-
CLOSING_SL_FORM_TAG = '</sl-form>'.html_safe
|
|
251
|
-
OPENING_SL_TURBO_FORM_TAG = '<sl-turbo-form'.html_safe
|
|
252
|
-
CLOSING_SL_TURBO_FORM_TAG = '</sl-turbo-form>'.html_safe
|
|
253
247
|
|
|
254
|
-
private_constant :DEFAULT_FORM_PARAMETERS, :DIVIDER_TAG
|
|
248
|
+
private_constant :DEFAULT_FORM_PARAMETERS, :DIVIDER_TAG
|
|
255
249
|
|
|
256
250
|
def sl_form_for(*args, **options, &block)
|
|
257
|
-
|
|
258
|
-
DEFAULT_FORM_PARAMETERS.deep_merge(options)
|
|
259
|
-
else
|
|
260
|
-
DEFAULT_FORM_PARAMETERS.without(:data).merge(options)
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
content = form_for(*args, **form_params, &block)
|
|
264
|
-
|
|
265
|
-
if ::Shoelace::FormHelper.use_sl_form_tag
|
|
266
|
-
content[0, 5] = OPENING_SL_FORM_TAG
|
|
267
|
-
content[-7, 7] = CLOSING_SL_FORM_TAG
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
content
|
|
251
|
+
form_for(*args, **DEFAULT_FORM_PARAMETERS, **options, &block)
|
|
271
252
|
end
|
|
272
253
|
|
|
273
254
|
def sl_form_with(**args, &block)
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
if ::Shoelace::FormHelper.use_sl_form_tag
|
|
277
|
-
content[0, 5] = OPENING_SL_FORM_TAG
|
|
278
|
-
content[-7, 7] = CLOSING_SL_FORM_TAG
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
content
|
|
255
|
+
form_with(**args, **DEFAULT_FORM_PARAMETERS, &block)
|
|
282
256
|
end
|
|
283
257
|
|
|
284
|
-
def sl_form_tag(url_for_options = {}, options = {}, &block)
|
|
285
|
-
content = form_tag(url_for_options, options.with_defaults(DEFAULT_FORM_PARAMETERS.except(:builder)), &block)
|
|
286
|
-
|
|
287
|
-
if ::Shoelace::FormHelper.use_sl_form_tag
|
|
288
|
-
content[0, 5] = OPENING_SL_FORM_TAG
|
|
289
|
-
content[-7, 7] = CLOSING_SL_FORM_TAG
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
content
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
def sl_turbo_form_for(*args, **options, &block)
|
|
296
|
-
content = form_for(*args, **DEFAULT_TURBO_FORM_PARAMETERS.merge(options), &block)
|
|
297
|
-
|
|
298
|
-
if ::Shoelace::FormHelper.use_sl_form_tag
|
|
299
|
-
content[0, 5] = OPENING_SL_TURBO_FORM_TAG
|
|
300
|
-
content[-7, 7] = CLOSING_SL_TURBO_FORM_TAG
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
content
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
def sl_turbo_form_with(**args, &block)
|
|
307
|
-
content = form_with(**args, **DEFAULT_TURBO_FORM_PARAMETERS, &block)
|
|
308
|
-
|
|
309
|
-
if ::Shoelace::FormHelper.use_sl_form_tag
|
|
310
|
-
content[0, 5] = OPENING_SL_TURBO_FORM_TAG
|
|
311
|
-
content[-7, 7] = CLOSING_SL_TURBO_FORM_TAG
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
content
|
|
315
|
-
end
|
|
316
|
-
|
|
317
|
-
def sl_turbo_form_tag(url_for_options = {}, options = {}, &block)
|
|
318
|
-
content = form_tag(url_for_options, options.with_defaults(DEFAULT_TURBO_FORM_PARAMETERS.except(:builder)), &block)
|
|
319
|
-
|
|
320
|
-
if ::Shoelace::FormHelper.use_sl_form_tag
|
|
321
|
-
content[0, 5] = OPENING_SL_TURBO_FORM_TAG
|
|
322
|
-
content[-7, 7] = CLOSING_SL_TURBO_FORM_TAG
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
content
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
# Creates a generic +<sl-button>+ element.
|
|
329
|
-
def sl_button_tag(**attrs, &block)
|
|
330
|
-
content_tag("sl-button", **attrs, &block)
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
# Not providing this helper for now due to potentially untraceable HTML. E.g.
|
|
334
|
-
#
|
|
335
|
-
# <a href="...">
|
|
336
|
-
# <sl-button>...</sl-button>
|
|
337
|
-
# </a>
|
|
338
|
-
#
|
|
339
|
-
# may be trackable and traceable by search bots and scrapers, but:
|
|
340
|
-
#
|
|
341
|
-
# <sl-button href="...">...</sl-button>
|
|
342
|
-
#
|
|
343
|
-
# may not be. In the mean time, it is advisable to wrap a <sl-button> tag with an <a> tag.
|
|
344
|
-
#
|
|
345
|
-
# def sl_button_to(href, **attrs, &block)
|
|
346
|
-
# sl_button_tag(href: href, **attrs, &block)
|
|
347
|
-
# end
|
|
348
|
-
|
|
349
258
|
# Creates a submit button with the text value as the caption, with the +submit+ attribute.
|
|
350
259
|
def sl_submit_tag(value = 'Save changes', **options)
|
|
351
260
|
options = options.deep_stringify_keys
|
|
@@ -448,4 +357,6 @@ module Shoelace
|
|
|
448
357
|
RUBY
|
|
449
358
|
end
|
|
450
359
|
end
|
|
360
|
+
|
|
361
|
+
FormBuilder = FormHelper::ShoelaceFormBuilder
|
|
451
362
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shoelace
|
|
4
|
+
module TagHelper
|
|
5
|
+
# Creates a generic +<sl-button>+ element.
|
|
6
|
+
def sl_button_tag(**attrs, &block)
|
|
7
|
+
content_tag("sl-button", **attrs, &block)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Creates an <sl-button> tag with the href value as the caption.
|
|
11
|
+
def sl_button_to(body, href = nil, **attrs, &block)
|
|
12
|
+
if block_given?
|
|
13
|
+
sl_button_tag(href: body, **(href || {}), **attrs, &block)
|
|
14
|
+
else
|
|
15
|
+
sl_button_tag(href: href, **attrs) { body }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def sl_icon_tag(name, **attrs)
|
|
20
|
+
tag.sl_icon(name: name, **attrs)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def sl_avatar_tag(source, **attrs, &block)
|
|
24
|
+
tag.sl_avatar(image: source, **attrs, &block)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
data/gemfiles/rails_edge.gemfile
CHANGED
data/lib/shoelace/railtie.rb
CHANGED
|
@@ -23,18 +23,32 @@ module Shoelace
|
|
|
23
23
|
|
|
24
24
|
class Railtie < ::Rails::Railtie #:nodoc:
|
|
25
25
|
config.shoelace = ActiveSupport::OrderedOptions.new
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
|
|
27
|
+
# Path to the shoelace assets.
|
|
28
|
+
config.shoelace.dist_path = "node_modules/@shoelace-style/shoelace/dist"
|
|
29
|
+
|
|
30
|
+
# Class name that is added to a form input when the corresponding attribute has an `ActiveModel` error.
|
|
31
|
+
config.shoelace.invalid_input_class_name = nil
|
|
28
32
|
|
|
29
33
|
initializer "shoelace.use_rack_middleware" do |app|
|
|
30
34
|
icon_dir = File.join(app.paths["public"].first, "assets/icons")
|
|
31
35
|
|
|
32
36
|
if !Dir.exist?(icon_dir)
|
|
33
|
-
path = app.root.join(config.shoelace.dist_path).to_s
|
|
37
|
+
path = app.root.join(app.config.shoelace.dist_path).to_s
|
|
34
38
|
headers = app.config.public_file_server.headers || {}
|
|
35
39
|
|
|
36
40
|
app.config.middleware.insert_after ActionDispatch::Static, Shoelace::AssetProvider, path, index: "index.html", headers: headers
|
|
37
41
|
end
|
|
38
42
|
end
|
|
43
|
+
|
|
44
|
+
initializer "shoelace.form_helper" do |app|
|
|
45
|
+
ActiveSupport.on_load :action_view do
|
|
46
|
+
Shoelace::FormHelper.invalid_input_class_name = app.config.shoelace.invalid_input_class_name
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
rake_tasks do
|
|
51
|
+
load "tasks/shoelace.rake"
|
|
52
|
+
end
|
|
39
53
|
end
|
|
40
54
|
end
|
|
@@ -12,6 +12,9 @@ namespace :shoelace do
|
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
# Make sure `yarn install` is run before running `shoelace:icons:copy`.
|
|
16
|
+
Rake::Task["shoelace:icons:copy"].enhance(["javascript:build"])
|
|
17
|
+
|
|
15
18
|
if Rake::Task.task_defined?("assets:precompile")
|
|
16
19
|
Rake::Task["assets:precompile"].enhance(["shoelace:icons:copy"])
|
|
17
20
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<% locations = { tokyo: "Tokyo", new_york: "New York", london: "London" } %>
|
|
2
|
-
<%=
|
|
2
|
+
<%= sl_form_for(@user, url: hotwire_forms_path) do |form| %>
|
|
3
3
|
<div>
|
|
4
4
|
<%= form.text_field :name do %>
|
|
5
5
|
<span slot="help-text" style="color: rgb(var(--sl-color-danger-600));">
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
}
|
|
22
22
|
</style>
|
|
23
23
|
|
|
24
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.0.0-beta.
|
|
25
|
-
<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.0.0-beta.
|
|
24
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.0.0-beta.87/dist/themes/light.css">
|
|
25
|
+
<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.0.0-beta.87/dist/shoelace.js"></script>
|
|
26
26
|
|
|
27
27
|
<% if request.path.include?("hotwire") %>
|
|
28
28
|
<%= javascript_pack_tag 'hotwire' %>
|
|
@@ -22,7 +22,6 @@ class HotwireFormTest < ApplicationSystemTestCase
|
|
|
22
22
|
assert_current_path hotwire_form_path(1)
|
|
23
23
|
assert_text "Name: Yuki Nishijima"
|
|
24
24
|
assert_text "Description: I am a human."
|
|
25
|
-
assert_text "Color: #ffffff"
|
|
26
25
|
assert_text "Score: 50"
|
|
27
26
|
# assert_text "Current City:"
|
|
28
27
|
assert_text "Previous City: tokyo"
|
|
@@ -48,7 +47,6 @@ class HotwireFormTest < ApplicationSystemTestCase
|
|
|
48
47
|
assert_current_path hotwire_form_path(1)
|
|
49
48
|
assert_text "Name: Yuki Nishijima"
|
|
50
49
|
assert_text "Description: I am a human."
|
|
51
|
-
assert_text "Color: #ffffff"
|
|
52
50
|
assert_text "Score: 50"
|
|
53
51
|
# assert_text "Current City:"
|
|
54
52
|
assert_text "Previous City: tokyo"
|
|
@@ -22,7 +22,6 @@ class TurbolinksFormTest < ApplicationSystemTestCase
|
|
|
22
22
|
assert_current_path turbolinks_forms_path
|
|
23
23
|
assert_text "Name: Yuki Nishijima"
|
|
24
24
|
assert_text "Description: I am a human."
|
|
25
|
-
assert_text "Color: #ffffff"
|
|
26
25
|
assert_text "Score: 50"
|
|
27
26
|
# assert_text "Current City:"
|
|
28
27
|
assert_text "Previous City: tokyo"
|
|
@@ -44,26 +44,12 @@ class FormHelperTest < ActionView::TestCase
|
|
|
44
44
|
HTML
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
test "#sl_button_tag" do
|
|
48
|
-
assert_dom_equal(<<~HTML, sl_button_tag { "Submit" })
|
|
49
|
-
<sl-button>Submit</sl-button>
|
|
50
|
-
HTML
|
|
51
|
-
end
|
|
52
|
-
|
|
53
47
|
test "#sl_radio_button" do
|
|
54
48
|
assert_dom_equal(<<~HTML, sl_radio_button(:user, :name, 'userid-314', checked: true) { "Yuki Nishijima" })
|
|
55
49
|
<sl-radio value="userid-314" checked="checked" name="user[name]" id="user_name_userid-314">Yuki Nishijima</sl-radio>
|
|
56
50
|
HTML
|
|
57
51
|
end
|
|
58
52
|
|
|
59
|
-
test "#sl_form_tag" do
|
|
60
|
-
assert_dom_equal(<<~HTML, sl_form_tag("/posts") { })
|
|
61
|
-
<form data-remote="true" action="/posts" accept-charset="UTF-8" method="post">
|
|
62
|
-
<input name="utf8" type="hidden" value="✓" #{AUTOCOMPLETE_ATTRIBUTE} />
|
|
63
|
-
</sl-form>
|
|
64
|
-
HTML
|
|
65
|
-
end
|
|
66
|
-
|
|
67
53
|
test "#sl_form_with" do
|
|
68
54
|
assert_dom_equal(<<~HTML, sl_form_with(url: "/") {})
|
|
69
55
|
<form action="/" accept-charset="UTF-8" data-remote="true" method="post">
|
|
@@ -80,30 +66,6 @@ class FormHelperTest < ActionView::TestCase
|
|
|
80
66
|
HTML
|
|
81
67
|
end
|
|
82
68
|
|
|
83
|
-
test "#sl_turbo_form_tag" do
|
|
84
|
-
assert_dom_equal(<<~HTML, sl_turbo_form_tag("/posts") { })
|
|
85
|
-
<form action="/posts" accept-charset="UTF-8" method="post">
|
|
86
|
-
<input name="utf8" type="hidden" value="✓" #{AUTOCOMPLETE_ATTRIBUTE} />
|
|
87
|
-
</form>
|
|
88
|
-
HTML
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
test "#sl_turbo_form_with" do
|
|
92
|
-
assert_dom_equal(<<~HTML, sl_turbo_form_with(url: "/") {})
|
|
93
|
-
<form action="/" accept-charset="UTF-8" data-remote="true" method="post">
|
|
94
|
-
<input name="utf8" type="hidden" value="✓" #{AUTOCOMPLETE_ATTRIBUTE} />
|
|
95
|
-
</form>
|
|
96
|
-
HTML
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
test "#sl_turbo_form_for" do
|
|
100
|
-
assert_dom_equal(<<~HTML, sl_turbo_form_for(User.new, url: "/") { })
|
|
101
|
-
<form class="new_user" id="new_user" action="/" accept-charset="UTF-8" method="post">
|
|
102
|
-
<input name="utf8" type="hidden" value="✓" #{AUTOCOMPLETE_ATTRIBUTE} />
|
|
103
|
-
</form>
|
|
104
|
-
HTML
|
|
105
|
-
end
|
|
106
|
-
|
|
107
69
|
test "#text_field" do
|
|
108
70
|
sl_form_for(User.new, url: "/") do |form|
|
|
109
71
|
assert_dom_equal <<~HTML, form.text_field(:name)
|
|
@@ -195,6 +157,14 @@ class FormHelperTest < ActionView::TestCase
|
|
|
195
157
|
test "#range_field" do
|
|
196
158
|
sl_form_for(User.new, url: "/") do |form|
|
|
197
159
|
assert_dom_equal <<~HTML, form.range_field(:name)
|
|
160
|
+
<sl-range label="Name" name="user[name]" id="user_name"></sl-range>
|
|
161
|
+
HTML
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
test "#range_field without a label" do
|
|
166
|
+
sl_form_for(User.new, url: "/") do |form|
|
|
167
|
+
assert_dom_equal <<~HTML, form.range_field(:name, label: nil)
|
|
198
168
|
<sl-range name="user[name]" id="user_name"></sl-range>
|
|
199
169
|
HTML
|
|
200
170
|
end
|
|
@@ -211,22 +181,92 @@ class FormHelperTest < ActionView::TestCase
|
|
|
211
181
|
test "#text_area" do
|
|
212
182
|
sl_form_for(User.new, url: "/") do |form|
|
|
213
183
|
assert_dom_equal <<~HTML, form.text_area(:name)
|
|
184
|
+
<sl-textarea label="Name" resize="auto" name="user[name]" id="user_name"></sl-textarea>
|
|
185
|
+
HTML
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
test "#text_area with a value" do
|
|
190
|
+
sl_form_for(User.new(name: "Yuki Nishijima"), url: "/") do |form|
|
|
191
|
+
assert_dom_equal <<~HTML, form.text_area(:name)
|
|
192
|
+
<sl-textarea label="Name" resize="auto" value="Yuki Nishijima" name="user[name]" id="user_name"></sl-textarea>
|
|
193
|
+
HTML
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
test "#text_area with an one-off value" do
|
|
198
|
+
sl_form_for(User.new(name: "Yuki Nishijima"), url: "/") do |form|
|
|
199
|
+
assert_dom_equal <<~HTML, form.text_area(:name, value: "Yuki")
|
|
200
|
+
<sl-textarea label="Name" resize="auto" value="Yuki" name="user[name]" id="user_name"></sl-textarea>
|
|
201
|
+
HTML
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
test "#text_area without a label" do
|
|
206
|
+
sl_form_for(User.new, url: "/") do |form|
|
|
207
|
+
assert_dom_equal <<~HTML, form.text_area(:name, label: nil)
|
|
214
208
|
<sl-textarea resize="auto" name="user[name]" id="user_name"></sl-textarea>
|
|
215
209
|
HTML
|
|
216
210
|
end
|
|
217
211
|
end
|
|
218
212
|
|
|
219
|
-
test "#
|
|
213
|
+
test "#text_area with a size" do
|
|
214
|
+
sl_form_for(User.new, url: "/") do |form|
|
|
215
|
+
assert_dom_equal <<~HTML, form.text_area(:name, size: "small")
|
|
216
|
+
<sl-textarea label="Name" resize="auto" size="small" name="user[name]" id="user_name"></sl-textarea>
|
|
217
|
+
HTML
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
test "#text_area with a block" do
|
|
220
222
|
sl_form_for(User.new, url: "/") do |form|
|
|
221
|
-
|
|
222
|
-
<sl-
|
|
223
|
+
expected = <<~HTML
|
|
224
|
+
<sl-textarea label="Name" resize="auto" name="user[name]" id="user_name">
|
|
225
|
+
<div slot="help-text">Name can not be blank.</div>
|
|
226
|
+
</sl-textarea>
|
|
223
227
|
HTML
|
|
228
|
+
|
|
229
|
+
assert_dom_equal(expected, form.text_area(:name) {
|
|
230
|
+
content_tag(:div, "Name can not be blank.", slot: "help-text")
|
|
231
|
+
})
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
test "#check_box" do
|
|
236
|
+
sl_form_for(User.new, url: "/") do |form|
|
|
237
|
+
if ActionView::VERSION::STRING >= '6.1.0'
|
|
238
|
+
assert_dom_equal <<~HTML, form.check_box(:name)
|
|
239
|
+
<input name="user[name]" type="hidden" value="0" autocomplete="off" />
|
|
240
|
+
<sl-checkbox value="1" name="user[name]" id="user_name">Name</sl-checkbox>
|
|
241
|
+
HTML
|
|
242
|
+
else
|
|
243
|
+
assert_dom_equal <<~HTML, form.check_box(:name)
|
|
244
|
+
<input name="user[name]" type="hidden" value="0" />
|
|
245
|
+
<sl-checkbox value="1" name="user[name]" id="user_name">Name</sl-checkbox>
|
|
246
|
+
HTML
|
|
247
|
+
end
|
|
224
248
|
end
|
|
225
249
|
end
|
|
226
250
|
|
|
227
251
|
test "#check_box with a block" do
|
|
228
252
|
sl_form_for(User.new, url: "/") do |form|
|
|
229
|
-
|
|
253
|
+
if ActionView::VERSION::STRING >= '6.1.0'
|
|
254
|
+
assert_dom_equal <<~HTML, form.check_box(:name) { "Maintainer Name" }
|
|
255
|
+
<input name="user[name]" type="hidden" value="0" autocomplete="off" />
|
|
256
|
+
<sl-checkbox value="1" name="user[name]" id="user_name">Maintainer Name</sl-checkbox>
|
|
257
|
+
HTML
|
|
258
|
+
else
|
|
259
|
+
assert_dom_equal <<~HTML, form.check_box(:name) { "Maintainer Name" }
|
|
260
|
+
<input name="user[name]" type="hidden" value="0" />
|
|
261
|
+
<sl-checkbox value="1" name="user[name]" id="user_name">Maintainer Name</sl-checkbox>
|
|
262
|
+
HTML
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
test "#check_box without a hidden input" do
|
|
268
|
+
sl_form_for(User.new, url: "/") do |form|
|
|
269
|
+
assert_dom_equal <<~HTML, form.check_box(:name, include_hidden: false) { "Maintainer Name" }
|
|
230
270
|
<sl-checkbox value="1" name="user[name]" id="user_name">Maintainer Name</sl-checkbox>
|
|
231
271
|
HTML
|
|
232
272
|
end
|
|
@@ -241,7 +281,7 @@ class FormHelperTest < ActionView::TestCase
|
|
|
241
281
|
|
|
242
282
|
sl_form_for(User.new, url: "/") do |form|
|
|
243
283
|
assert_dom_equal <<~HTML, form.select(:name, users)
|
|
244
|
-
<sl-select name="user[name]" id="user_name">
|
|
284
|
+
<sl-select label="Name" name="user[name]" id="user_name">
|
|
245
285
|
<sl-menu-item value="1">Yuki Nishijima</sl-menu-item>
|
|
246
286
|
<sl-menu-item value="2">Matz</sl-menu-item>
|
|
247
287
|
<sl-menu-item value="3">Koichi Sasada</sl-menu-item>
|
|
@@ -250,6 +290,42 @@ class FormHelperTest < ActionView::TestCase
|
|
|
250
290
|
end
|
|
251
291
|
end
|
|
252
292
|
|
|
293
|
+
test "#select with a custom value" do
|
|
294
|
+
users = {
|
|
295
|
+
"Yuki Nishijima" => 1,
|
|
296
|
+
"Matz" => 2,
|
|
297
|
+
"Koichi Sasada" => 3
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
sl_form_for(User.new, url: "/") do |form|
|
|
301
|
+
assert_dom_equal <<~HTML, form.select(:name, users, {}, { value: 3 })
|
|
302
|
+
<sl-select label="Name" value="3" name="user[name]" id="user_name">
|
|
303
|
+
<sl-menu-item value="1">Yuki Nishijima</sl-menu-item>
|
|
304
|
+
<sl-menu-item value="2">Matz</sl-menu-item>
|
|
305
|
+
<sl-menu-item value="3">Koichi Sasada</sl-menu-item>
|
|
306
|
+
</sl-select>
|
|
307
|
+
HTML
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
test "#select with custom selected and disabled values" do
|
|
312
|
+
users = {
|
|
313
|
+
"Yuki Nishijima" => 1,
|
|
314
|
+
"Matz" => 2,
|
|
315
|
+
"Koichi Sasada" => 3
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
sl_form_for(User.new, url: "/") do |form|
|
|
319
|
+
assert_dom_equal <<~HTML, form.select(:name, users, selected: 3, disabled: 1)
|
|
320
|
+
<sl-select label="Name" name="user[name]" id="user_name">
|
|
321
|
+
<sl-menu-item value="1" disabled="disabled">Yuki Nishijima</sl-menu-item>
|
|
322
|
+
<sl-menu-item value="2">Matz</sl-menu-item>
|
|
323
|
+
<sl-menu-item value="3" checked="checked">Koichi Sasada</sl-menu-item>
|
|
324
|
+
</sl-select>
|
|
325
|
+
HTML
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
253
329
|
test "#select with multiple" do
|
|
254
330
|
users = {
|
|
255
331
|
"Yuki Nishijima" => 1,
|
|
@@ -259,7 +335,7 @@ class FormHelperTest < ActionView::TestCase
|
|
|
259
335
|
|
|
260
336
|
sl_form_for(User.new, url: "/") do |form|
|
|
261
337
|
assert_dom_equal <<~HTML, form.select(:name, users, {}, { multiple: true })
|
|
262
|
-
<sl-select name="user[name][]" id="user_name" multiple="multiple">
|
|
338
|
+
<sl-select label="Name" name="user[name][]" id="user_name" multiple="multiple">
|
|
263
339
|
<sl-menu-item value="1">Yuki Nishijima</sl-menu-item>
|
|
264
340
|
<sl-menu-item value="2">Matz</sl-menu-item>
|
|
265
341
|
<sl-menu-item value="3">Koichi Sasada</sl-menu-item>
|
|
@@ -281,7 +357,7 @@ class FormHelperTest < ActionView::TestCase
|
|
|
281
357
|
|
|
282
358
|
sl_form_for(User.new, url: "/") do |form|
|
|
283
359
|
assert_dom_equal <<~HTML, form.select(:name, users)
|
|
284
|
-
<sl-select name="user[name]" id="user_name">
|
|
360
|
+
<sl-select label="Name" name="user[name]" id="user_name">
|
|
285
361
|
<sl-menu-label>Main maintainers</sl-menu-label>
|
|
286
362
|
<sl-menu-item value="2">Matz</sl-menu-item>
|
|
287
363
|
<sl-menu-item value="3">Koichi Sasada</sl-menu-item>
|
|
@@ -304,9 +380,9 @@ class FormHelperTest < ActionView::TestCase
|
|
|
304
380
|
]
|
|
305
381
|
}
|
|
306
382
|
|
|
307
|
-
sl_form_for(User.new(name:
|
|
383
|
+
sl_form_for(User.new(name: 2), url: "/") do |form|
|
|
308
384
|
assert_dom_equal <<~HTML, form.select(:name, users)
|
|
309
|
-
<sl-select name="user[name]" id="user_name" value="2">
|
|
385
|
+
<sl-select label="Name" name="user[name]" id="user_name" value="2">
|
|
310
386
|
<sl-menu-label>Main maintainers</sl-menu-label>
|
|
311
387
|
<sl-menu-item value="2" checked="checked">Matz</sl-menu-item>
|
|
312
388
|
<sl-menu-item value="3">Koichi Sasada</sl-menu-item>
|
|
@@ -327,7 +403,7 @@ class FormHelperTest < ActionView::TestCase
|
|
|
327
403
|
|
|
328
404
|
sl_form_for(User.new, url: "/") do |form|
|
|
329
405
|
assert_dom_equal <<~HTML, form.collection_select(:name, users, :first, :last)
|
|
330
|
-
<sl-select name="user[name]" id="user_name">
|
|
406
|
+
<sl-select label="Name" name="user[name]" id="user_name">
|
|
331
407
|
<sl-menu-item value="1">Yuki Nishijima</sl-menu-item>
|
|
332
408
|
<sl-menu-item value="2">Matz</sl-menu-item>
|
|
333
409
|
<sl-menu-item value="3">Koichi Sasada</sl-menu-item>
|
|
@@ -345,7 +421,7 @@ class FormHelperTest < ActionView::TestCase
|
|
|
345
421
|
|
|
346
422
|
sl_form_for(User.new(name: "2"), url: "/") do |form|
|
|
347
423
|
assert_dom_equal <<~HTML, form.collection_select(:name, users, :first, :last)
|
|
348
|
-
<sl-select name="user[name]" id="user_name" value="2">
|
|
424
|
+
<sl-select label="Name" name="user[name]" id="user_name" value="2">
|
|
349
425
|
<sl-menu-item value="1">Yuki Nishijima</sl-menu-item>
|
|
350
426
|
<sl-menu-item value="2" checked="checked">Matz</sl-menu-item>
|
|
351
427
|
<sl-menu-item value="3">Koichi Sasada</sl-menu-item>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
require_relative '../../app/helpers/shoelace/tag_helper'
|
|
5
|
+
|
|
6
|
+
class TagHelperTest < ActionView::TestCase
|
|
7
|
+
include Shoelace::TagHelper
|
|
8
|
+
|
|
9
|
+
test "#sl_button_tag" do
|
|
10
|
+
assert_dom_equal(<<~HTML, sl_button_tag { "Submit" })
|
|
11
|
+
<sl-button>Submit</sl-button>
|
|
12
|
+
HTML
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test "#sl_button_to" do
|
|
16
|
+
assert_dom_equal <<~HTML, sl_button_to("Next", "/next")
|
|
17
|
+
<sl-button href="/next">Next</sl-button>
|
|
18
|
+
HTML
|
|
19
|
+
|
|
20
|
+
assert_dom_equal <<~HTML, sl_button_to("Next", "/next", class: "mt-1")
|
|
21
|
+
<sl-button href="/next" class="mt-1">Next</sl-button>
|
|
22
|
+
HTML
|
|
23
|
+
|
|
24
|
+
assert_dom_equal(<<~HTML, sl_button_to("/next") { "Next" })
|
|
25
|
+
<sl-button href="/next">Next</sl-button>
|
|
26
|
+
HTML
|
|
27
|
+
|
|
28
|
+
assert_dom_equal(<<~HTML, sl_button_to("/next", class: "mt-1") { "Next" })
|
|
29
|
+
<sl-button href="/next" class="mt-1">Next</sl-button>
|
|
30
|
+
HTML
|
|
31
|
+
|
|
32
|
+
assert_dom_equal <<~HTML, sl_button_to("Next")
|
|
33
|
+
<sl-button>Next</sl-button>
|
|
34
|
+
HTML
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test "#sl_icon_tag"do
|
|
38
|
+
assert_dom_equal <<~HTML, sl_icon_tag("0-circle-fill")
|
|
39
|
+
<sl-icon name="0-circle-fill"></sl-icon>
|
|
40
|
+
HTML
|
|
41
|
+
|
|
42
|
+
assert_dom_equal <<~HTML, sl_icon_tag("0-circle-fill", slot: "icon")
|
|
43
|
+
<sl-icon name="0-circle-fill" slot="icon"></sl-icon>
|
|
44
|
+
HTML
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test "#sl_avatar_tag"do
|
|
48
|
+
assert_dom_equal <<~HTML, sl_avatar_tag("/path/to/image.jpg")
|
|
49
|
+
<sl-avatar image="/path/to/image.jpg"></sl-avatar>
|
|
50
|
+
HTML
|
|
51
|
+
|
|
52
|
+
assert_dom_equal(<<~HTML, sl_avatar_tag("/path/to/image.jpg", slot: "trigger") { "Body" })
|
|
53
|
+
<sl-avatar image="/path/to/image.jpg" slot="trigger">
|
|
54
|
+
Body
|
|
55
|
+
</sl-avatar>
|
|
56
|
+
HTML
|
|
57
|
+
end
|
|
58
|
+
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.3.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:
|
|
11
|
+
date: 2023-01-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: actionview
|
|
@@ -98,6 +98,7 @@ files:
|
|
|
98
98
|
- README.md
|
|
99
99
|
- Rakefile
|
|
100
100
|
- app/helpers/shoelace/form_helper.rb
|
|
101
|
+
- app/helpers/shoelace/tag_helper.rb
|
|
101
102
|
- bin/console
|
|
102
103
|
- bin/setup
|
|
103
104
|
- dist/.keep
|
|
@@ -114,7 +115,7 @@ files:
|
|
|
114
115
|
- lib/shoelace/rails/version.rb
|
|
115
116
|
- lib/shoelace/railtie.rb
|
|
116
117
|
- lib/shoelace/testing.rb
|
|
117
|
-
- lib/tasks/
|
|
118
|
+
- lib/tasks/shoelace.rake
|
|
118
119
|
- package.json
|
|
119
120
|
- rollup.config.js
|
|
120
121
|
- shoelace-rails.gemspec
|
|
@@ -166,6 +167,7 @@ files:
|
|
|
166
167
|
- test/dummy_app/test/system/turbolinks_form_test.rb
|
|
167
168
|
- test/dummy_app/test/test_helper.rb
|
|
168
169
|
- test/helpers/form_helper_test.rb
|
|
170
|
+
- test/helpers/tag_helper_test.rb
|
|
169
171
|
- test/test_helper.rb
|
|
170
172
|
- tsconfig.json
|
|
171
173
|
- yarn.lock
|
|
@@ -191,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
191
193
|
- !ruby/object:Gem::Version
|
|
192
194
|
version: '0'
|
|
193
195
|
requirements: []
|
|
194
|
-
rubygems_version: 3.
|
|
196
|
+
rubygems_version: 3.4.1
|
|
195
197
|
signing_key:
|
|
196
198
|
specification_version: 4
|
|
197
199
|
summary: Rails view helpers Shoelace.style, the design system.
|