hanami-helpers 0.5.1 → 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|