view_partial_form_builder 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d1550e43fb981483d25dedf89ab64478b5dd2c5803b4aa7345ae6d7efba4fe2
|
4
|
+
data.tar.gz: d8bb992d8d959d2288c761d764275af9e470081145884b6bfcff7b7dda3fdc45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 121978b8280e71e3cf114291cf4874949c9323f7b909ab7cd93602f1a3fb00b143c2028ed1188623c8b926efe8b3a27e67005947599d66b8e1cb33c98d8c589e
|
7
|
+
data.tar.gz: 9e56d40123f55fac7ee53b3bd3e087ccc35bdf3ca709485cad0d636fb41f7f684744dbc068d7af13bcdc6aa246e9707373c557f792d86a1d3fee1cd76468e4f0
|
data/README.md
CHANGED
@@ -87,7 +87,7 @@ generating HTML through Rails' helpers:
|
|
87
87
|
<%# app/views/form_builder/_button.html.erb %>
|
88
88
|
|
89
89
|
<div class="button-wrapper">
|
90
|
-
<%= form.button(
|
90
|
+
<%= form.button(value, options, &block) %>
|
91
91
|
</div>
|
92
92
|
```
|
93
93
|
|
@@ -116,31 +116,8 @@ In addition, each view partial receives:
|
|
116
116
|
* `form` - a reference to the instance of `ViewPartialFormBuilder`, which is a
|
117
117
|
descendant of [`ActionView::Helpers::FormBuilder`][FormBuilder]
|
118
118
|
|
119
|
-
* `arguments` - an Array containing the arguments the helper received, in the
|
120
|
-
order they were received. This can be useful to pass to the view partial's
|
121
|
-
helper by [splatting them][splat] out.
|
122
|
-
|
123
119
|
* `&block` - a callable, `yield`-able block if the helper method was passed one
|
124
120
|
|
125
|
-
In cases when a [`ActionView::Helpers::FormBuilder` helper
|
126
|
-
method][FormBuilder]'s last arguments are options (either `Hash` instances or
|
127
|
-
[keyword arguments][]), they're omitted from the `arguments` array.
|
128
|
-
|
129
|
-
If you want to pass-through all arguments, options, and block parameters, you
|
130
|
-
can splat them out:
|
131
|
-
|
132
|
-
```html+erb
|
133
|
-
<%# app/views/form_builder/_label.html.erb %>
|
134
|
-
|
135
|
-
<%= form.label(*arguments, **options, &block) %>
|
136
|
-
```
|
137
|
-
|
138
|
-
```html+erb
|
139
|
-
<%# app/views/form_builder/_select.html.erb %>
|
140
|
-
|
141
|
-
<%= form.select(*arguments, **html_options, &block) %>
|
142
|
-
```
|
143
|
-
|
144
121
|
#### Handling DOMTokenList attributes
|
145
122
|
|
146
123
|
An [HTML element's `class` attribute][mdn-class] is treated by browsers as a
|
@@ -158,16 +135,12 @@ When rendering a field's DOMTokenList-backed attributes (like `class` or
|
|
158
135
|
controllers][stimulus-controller]), transforming and combining singular `String`
|
159
136
|
instances into lists of token can be very useful.
|
160
137
|
|
161
|
-
To simplify those scenarios, a partial's template-local optional attributes are
|
162
|
-
made available with the `#merge_token_lists` method.
|
163
|
-
|
164
138
|
These optional attributes are available through the `options` or `html_options`
|
165
139
|
partial-local variables. Their name will depend on the partial's corresponding
|
166
140
|
[`ActionView::Helpers::FormBuilder`][FormBuilder] interface.
|
167
141
|
|
168
|
-
|
169
|
-
|
170
|
-
Given call to `form.text_field` and a corresponding partial declaration:
|
142
|
+
To "merge" attributes together, you can combine Ruby's `String` interpolation
|
143
|
+
and `Hash#delete`:
|
171
144
|
|
172
145
|
```html+erb
|
173
146
|
<%# app/views/users/new.html.erb %>
|
@@ -177,7 +150,11 @@ Given call to `form.text_field` and a corresponding partial declaration:
|
|
177
150
|
|
178
151
|
<# app/views/form_builder/_text_field.html.erb %>
|
179
152
|
|
180
|
-
<%= form.text_field(
|
153
|
+
<%= form.text_field(
|
154
|
+
method,
|
155
|
+
class: "text-field #{options.delete(:class)}",
|
156
|
+
**options
|
157
|
+
) %>
|
181
158
|
```
|
182
159
|
|
183
160
|
The resulting HTML `<input>` element will merge have its [`class`
|
@@ -192,7 +169,6 @@ values:
|
|
192
169
|
[button]: https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-button
|
193
170
|
[local_assigns]: https://api.rubyonrails.org/classes/ActionView/Template.html#method-i-local_assigns
|
194
171
|
[splat]: https://ruby-doc.org/core-2.2.0/doc/syntax/calling_methods_rdoc.html#label-Array+to+Arguments+Conversion
|
195
|
-
[keyword arguments]: https://thoughtbot.com/blog/ruby-2-keyword-arguments
|
196
172
|
[mdn-class]: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class
|
197
173
|
[DOMTokenList]: https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList
|
198
174
|
[classList]: https://developer.mozilla.org/en-US/docs/Web/API/Element/classList
|
@@ -210,7 +186,7 @@ block-local `form` variable:
|
|
210
186
|
```erb
|
211
187
|
<%# app/views/users/form_builder/_email_field.html.erb %>
|
212
188
|
|
213
|
-
<%= form.default.email_field(
|
189
|
+
<%= form.default.email_field(method, options) %>
|
214
190
|
```
|
215
191
|
|
216
192
|
When passing a `model:` or `scope:` to calls to [`form_with`][form_with],
|
@@ -225,26 +201,41 @@ For example, when calling `form_with(model: User.new)`, a partial declared in
|
|
225
201
|
<%# app/views/users/form_builder/_password_field.html.erb %>
|
226
202
|
|
227
203
|
<div class="password-field-wrapper">
|
228
|
-
<%= form.password_field(
|
204
|
+
<%= form.password_field(method, options) %>
|
229
205
|
</div>
|
230
206
|
```
|
231
207
|
|
232
|
-
If you'd like to render a specific partial for a field,
|
233
|
-
|
208
|
+
If you'd like to render a specific partial for a field, make sure that you pass
|
209
|
+
along the `form:` (along with any other partial-local variables) as part of the
|
210
|
+
`render` call's `locals:` option:
|
211
|
+
|
234
212
|
|
235
213
|
```erb
|
236
214
|
<%# app/views/users/new.html.erb %>
|
237
215
|
|
238
216
|
<%= form_with(model: User.new) do |form| %>
|
239
|
-
<%=
|
217
|
+
<%= render("emails/my_special_email_field", {
|
218
|
+
form: form,
|
219
|
+
method: :email,
|
220
|
+
options: { class: "user-email" },
|
221
|
+
) %>
|
240
222
|
<% end %>
|
223
|
+
|
224
|
+
<%# app/views/emails/_my_special_email_field.html.erb %>
|
225
|
+
|
226
|
+
<%= form.email_field(
|
227
|
+
method,
|
228
|
+
class: "my-special-email #{options.delete(:class)},
|
229
|
+
**options
|
230
|
+
) %>
|
241
231
|
```
|
242
232
|
|
243
233
|
#### Composing partials
|
244
234
|
|
245
|
-
|
246
|
-
|
247
|
-
with a consumer facing site, but has
|
235
|
+
Layering partials on top of one another can be useful to share foundational
|
236
|
+
styles and configuration across your fields. For instance, consider an
|
237
|
+
administrative interface that shares styles with a consumer facing site, but has
|
238
|
+
additional bells and whistles.
|
248
239
|
|
249
240
|
Declare the consumer facing inputs (in this example, `<input type="search">`):
|
250
241
|
|
@@ -252,11 +243,16 @@ Declare the consumer facing inputs (in this example, `<input type="search">`):
|
|
252
243
|
<%# app/views/form_builder/_search_field.html.erb %>
|
253
244
|
|
254
245
|
<%= form.search_field(
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
246
|
+
method,
|
247
|
+
class: "
|
248
|
+
search-field
|
249
|
+
#{options.delete(:class}
|
250
|
+
",
|
251
|
+
"data-controller": "
|
252
|
+
input->search#executeQuery
|
253
|
+
#{options.delete(:"data-controller")}
|
254
|
+
",
|
255
|
+
**options
|
260
256
|
) %>
|
261
257
|
```
|
262
258
|
|
@@ -267,12 +263,15 @@ foundation built by the more general definitions:
|
|
267
263
|
<%# app/views/admin/form_builder/_search_field.html.erb %>
|
268
264
|
|
269
265
|
<%= form.search_field(
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
class
|
274
|
-
|
275
|
-
|
266
|
+
method,
|
267
|
+
class: "
|
268
|
+
search-field--admin
|
269
|
+
#{options.delete(:class}
|
270
|
+
",
|
271
|
+
"data-controller": "
|
272
|
+
focus->admin-search#clearResults
|
273
|
+
#{options.delete(:"data-controller")}
|
274
|
+
",
|
276
275
|
) %>
|
277
276
|
```
|
278
277
|
|
@@ -261,9 +261,17 @@ module ViewPartialFormBuilder
|
|
261
261
|
def render_partial(field, locals, fallback:, &block)
|
262
262
|
options = locals.fetch(:options, {})
|
263
263
|
partial_override = options.delete(:partial)
|
264
|
-
|
264
|
+
options_as_locals = objectify_options(options)
|
265
|
+
locals = DeprecatedHash.new(
|
266
|
+
options_as_locals.merge(locals, form: self),
|
267
|
+
deprecated_keys: options_as_locals.keys + [:arguments],
|
268
|
+
)
|
265
269
|
|
266
270
|
partial = if partial_override.present?
|
271
|
+
ActiveSupport::Deprecation.new("0.2.0", "ViewPartialFormBuilder").warn(<<~WARNING)
|
272
|
+
Providing a `partial:` option for a form field is deprecated.
|
273
|
+
WARNING
|
274
|
+
|
267
275
|
find_partial(partial_override, locals, prefixes: [])
|
268
276
|
else
|
269
277
|
find_partial(field, locals, prefixes: prefixes_after(field))
|
@@ -284,7 +292,15 @@ module ViewPartialFormBuilder
|
|
284
292
|
prefixes,
|
285
293
|
template_is_partial,
|
286
294
|
locals.keys,
|
287
|
-
).first
|
295
|
+
).first.tap do |partial|
|
296
|
+
root_directory = ViewPartialFormBuilder.view_partial_directory
|
297
|
+
|
298
|
+
if partial&.virtual_path == "#{root_directory}/_#{template_name}"
|
299
|
+
ActiveSupport::Deprecation.new("0.2.0", "ViewPartialFormBuilder").warn(<<~WARNING.strip)
|
300
|
+
Declare root-level partials in app/views/application/#{root_directory}/, not app/views/#{root_directory}/.
|
301
|
+
WARNING
|
302
|
+
end
|
303
|
+
end
|
288
304
|
end
|
289
305
|
|
290
306
|
def prefixes_after(template_name)
|
@@ -310,4 +326,22 @@ module ViewPartialFormBuilder
|
|
310
326
|
end
|
311
327
|
end
|
312
328
|
end
|
329
|
+
|
330
|
+
class DeprecatedHash < Hash
|
331
|
+
def initialize(hash, deprecated_keys: [])
|
332
|
+
super()
|
333
|
+
merge!(hash)
|
334
|
+
@deprecated_keys = deprecated_keys
|
335
|
+
end
|
336
|
+
|
337
|
+
def [](key)
|
338
|
+
if @deprecated_keys.include?(key)
|
339
|
+
ActiveSupport::Deprecation.new("0.2.0", "ViewPartialFormBuilder").warn <<~WARNING
|
340
|
+
Accessing `#{key}` from partials is deprecated.
|
341
|
+
WARNING
|
342
|
+
end
|
343
|
+
|
344
|
+
super
|
345
|
+
end
|
346
|
+
end
|
313
347
|
end
|
@@ -1,5 +1,13 @@
|
|
1
1
|
module ViewPartialFormBuilder
|
2
2
|
class HtmlAttributes
|
3
|
+
deprecate merge_token_lists: <<~'WARNING', deprecator: ActiveSupport::Deprecation.new("0.2.0", "ViewPartialFormBuilder")
|
4
|
+
|
5
|
+
As an alternative, merge arguments through String interpolation:
|
6
|
+
|
7
|
+
<%= form.label(method, class: "label #{options.delete(:class)}", **options) %>
|
8
|
+
|
9
|
+
WARNING
|
10
|
+
|
3
11
|
def initialize(**attributes)
|
4
12
|
@attributes = attributes
|
5
13
|
end
|