view_partial_form_builder 0.1.4 → 0.1.5
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
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
|