hanami-helpers 0.5.1 → 1.0.0.beta1
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/CHANGELOG.md +9 -0
- data/hanami-helpers.gemspec +1 -1
- data/lib/hanami/helpers/form_helper/form_builder.rb +59 -5
- data/lib/hanami/helpers/form_helper/values.rb +12 -5
- data/lib/hanami/helpers/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a4372126c3d3cc4666a281f370b709108ce7522
|
4
|
+
data.tar.gz: a906c5adc94f6e22df677efde17f28ce529fc35c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f713e2872f9b0d40d2e51980e3563500b33f1ee8b54c278258cd37cad97361420bf56c35e5a5f61552c205075283e3a483fb28f84313f8de0e411a353b7ca6e
|
7
|
+
data.tar.gz: fa35b8534b30d4cd19698fe3b6cd7e82951bdf341e7831a196b190165f5476b382d4ced07d1099d11a9326a86ca14df1e19282b30f2cf87dda80e484cb9efac3
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
# Hanami::Helpers
|
2
2
|
View helpers for Ruby web applications
|
3
3
|
|
4
|
+
## v1.0.0.beta1 - 2017-02-14
|
5
|
+
### Added
|
6
|
+
- [Luca Guidi] Official support for Ruby: MRI 2.4
|
7
|
+
- [Marion Duprey] Introduced Form helper `fields_for_collection` to support arrays of nested fields
|
8
|
+
|
9
|
+
## Fixed
|
10
|
+
- [Ksenia Zalesnaya] Ensure radio buttons and selects to coerce the value to boolean before to decide if they should be checked or not.
|
11
|
+
- [Anton Davydov] Escape form values to prevent XSS attacks
|
12
|
+
|
4
13
|
## v0.5.1 - 2016-12-19
|
5
14
|
### Fixed
|
6
15
|
- [Alex Coles] Ensure `#form_for`'s `values:` to accept `Hanami::Entity` instances
|
data/hanami-helpers.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
spec.required_ruby_version = '>= 2.3.0'
|
22
22
|
|
23
|
-
spec.add_dependency 'hanami-utils', '~> 0.
|
23
|
+
spec.add_dependency 'hanami-utils', '~> 1.0.0.beta1'
|
24
24
|
|
25
25
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
26
26
|
spec.add_development_dependency 'rake', '~> 11'
|
@@ -198,7 +198,49 @@ module Hanami
|
|
198
198
|
def fields_for(name)
|
199
199
|
current_name = @name
|
200
200
|
@name = _input_name(name)
|
201
|
-
yield
|
201
|
+
yield(name)
|
202
|
+
ensure
|
203
|
+
@name = current_name
|
204
|
+
end
|
205
|
+
|
206
|
+
# Nested collections
|
207
|
+
#
|
208
|
+
# Supports nesting for collections, with infinite
|
209
|
+
# levels of nesting.
|
210
|
+
#
|
211
|
+
# @param name [Symbol] the nested name, it's used to generate input
|
212
|
+
# names, ids, and to lookup params to fill values.
|
213
|
+
#
|
214
|
+
# @example Basic usage
|
215
|
+
# <%=
|
216
|
+
# form_for :delivery, routes.deliveries_path do
|
217
|
+
# text_field :customer_name
|
218
|
+
#
|
219
|
+
# fields_for_collection :addresses do
|
220
|
+
# text_field :street
|
221
|
+
# end
|
222
|
+
#
|
223
|
+
# submit 'Create'
|
224
|
+
# end
|
225
|
+
# %>
|
226
|
+
#
|
227
|
+
# Output:
|
228
|
+
# # <form action="/deliveries" method="POST" accept-charset="utf-8" id="delivery-form">
|
229
|
+
# # <input type="text" name="delivery[customer_name]" id="delivery-customer-name" value="">
|
230
|
+
# # <input type="text" name="delivery[addresses][][street]" id="delivery-address-0-street" value="">
|
231
|
+
# # <input type="text" name="delivery[addresses][][street]" id="delivery-address-1-street" value="">
|
232
|
+
# #
|
233
|
+
# # <button type="submit">Create</button>
|
234
|
+
# # </form>
|
235
|
+
#
|
236
|
+
def fields_for_collection(name, &block)
|
237
|
+
current_name = @name
|
238
|
+
base_value = _value(name)
|
239
|
+
@name = _input_name(name)
|
240
|
+
|
241
|
+
base_value.count.times do |index|
|
242
|
+
fields_for(index, &block)
|
243
|
+
end
|
202
244
|
ensure
|
203
245
|
@name = current_name
|
204
246
|
end
|
@@ -678,7 +720,7 @@ module Hanami
|
|
678
720
|
# # <input type="radio" name="book[category]" value="Non-Fiction" checked="checked">
|
679
721
|
def radio_button(name, value, attributes = {})
|
680
722
|
attributes = { type: :radio, name: _input_name(name), value: value }.merge(attributes)
|
681
|
-
attributes[:checked] = CHECKED if _value(name) == value
|
723
|
+
attributes[:checked] = CHECKED if _value(name).to_s == value.to_s
|
682
724
|
input(attributes)
|
683
725
|
end
|
684
726
|
|
@@ -957,10 +999,14 @@ module Hanami
|
|
957
999
|
# @api private
|
958
1000
|
# @since 0.2.0
|
959
1001
|
def _attributes(type, name, attributes)
|
960
|
-
{ type: type, name:
|
1002
|
+
attrs = { type: type, name: _displayed_input_name(name), id: _input_id(name), value: _value(name) }
|
1003
|
+
attrs.merge!(attributes)
|
1004
|
+
attrs[:value] = Hanami::Utils::Escape.html(attrs[:value])
|
1005
|
+
attrs
|
961
1006
|
end
|
962
1007
|
|
963
|
-
#
|
1008
|
+
# Full input name, used to construct the input
|
1009
|
+
# attributes.
|
964
1010
|
#
|
965
1011
|
# @api private
|
966
1012
|
# @since 0.2.0
|
@@ -968,6 +1014,14 @@ module Hanami
|
|
968
1014
|
"#{@name}[#{name}]"
|
969
1015
|
end
|
970
1016
|
|
1017
|
+
# Input <tt>name</tt> HTML attribute
|
1018
|
+
#
|
1019
|
+
# @api private
|
1020
|
+
# @since 1.0.0.beta1
|
1021
|
+
def _displayed_input_name(name)
|
1022
|
+
_input_name(name).gsub(/\[\d+\]/, '[]')
|
1023
|
+
end
|
1024
|
+
|
971
1025
|
# Input <tt>id</tt> HTML attribute
|
972
1026
|
#
|
973
1027
|
# @api private
|
@@ -1047,7 +1101,7 @@ module Hanami
|
|
1047
1101
|
# rubocop:disable Metrics/PerceivedComplexity
|
1048
1102
|
def _select_option_selected?(value, selected, input_value, multiple)
|
1049
1103
|
value == selected || (multiple && (selected.is_a?(Array) && selected.include?(value))) ||
|
1050
|
-
value == input_value || (multiple && (input_value.is_a?(Array) && input_value.include?(value)))
|
1104
|
+
value.to_s == input_value.to_s || (multiple && (input_value.is_a?(Array) && input_value.include?(value)))
|
1051
1105
|
end
|
1052
1106
|
# rubocop:enable Metrics/PerceivedComplexity
|
1053
1107
|
# rubocop:enable Metrics/CyclomaticComplexity
|
@@ -36,6 +36,7 @@ module Hanami
|
|
36
36
|
# @since 0.5.0
|
37
37
|
# @api private
|
38
38
|
def _get_from_params(*keys)
|
39
|
+
keys.map! { |key| key.to_s =~ /\A\d+\z/ ? key.to_s.to_i : key }
|
39
40
|
@params.dig(*keys)
|
40
41
|
end
|
41
42
|
|
@@ -47,15 +48,21 @@ module Hanami
|
|
47
48
|
|
48
49
|
tail.each do |k|
|
49
50
|
break if result.nil?
|
50
|
-
|
51
|
-
result = case result
|
52
|
-
when Utils::Hash, ::Hash then result[k]
|
53
|
-
when ->(r) { r.respond_to?(k) } then result.public_send(k)
|
54
|
-
end
|
51
|
+
result = _dig(result, k)
|
55
52
|
end
|
56
53
|
|
57
54
|
result
|
58
55
|
end
|
56
|
+
|
57
|
+
# @since 1.0.0.beta1
|
58
|
+
# @api private
|
59
|
+
def _dig(base, key)
|
60
|
+
case base
|
61
|
+
when Utils::Hash, ::Hash then base[key]
|
62
|
+
when Array then base[key.to_s.to_i]
|
63
|
+
when ->(r) { r.respond_to?(key) } then base.public_send(key)
|
64
|
+
end
|
65
|
+
end
|
59
66
|
end
|
60
67
|
end
|
61
68
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-02-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: hanami-utils
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 1.0.0.beta1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
28
|
+
version: 1.0.0.beta1
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: bundler
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,9 +127,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
127
127
|
version: 2.3.0
|
128
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
|
-
- - "
|
130
|
+
- - ">"
|
131
131
|
- !ruby/object:Gem::Version
|
132
|
-
version:
|
132
|
+
version: 1.3.1
|
133
133
|
requirements: []
|
134
134
|
rubyforge_project:
|
135
135
|
rubygems_version: 2.6.8
|