formular 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -4
- data/CHANGELOG.md +29 -2
- data/README.md +5 -4
- data/formular.gemspec +1 -1
- data/lib/formular/attributes.rb +10 -21
- data/lib/formular/builders/basic.rb +4 -3
- data/lib/formular/builders/bootstrap3.rb +2 -1
- data/lib/formular/builders/bootstrap4.rb +4 -4
- data/lib/formular/element.rb +54 -23
- data/lib/formular/element/bootstrap3.rb +40 -8
- data/lib/formular/element/bootstrap3/checkable_control.rb +5 -8
- data/lib/formular/element/bootstrap3/horizontal.rb +7 -7
- data/lib/formular/element/bootstrap3/input_group.rb +2 -2
- data/lib/formular/element/bootstrap4.rb +17 -8
- data/lib/formular/element/bootstrap4/checkable_control.rb +5 -4
- data/lib/formular/element/bootstrap4/custom_control.rb +8 -4
- data/lib/formular/element/bootstrap4/horizontal.rb +3 -3
- data/lib/formular/element/bootstrap4/input_group.rb +12 -0
- data/lib/formular/element/foundation6.rb +5 -5
- data/lib/formular/element/foundation6/checkable_control.rb +2 -4
- data/lib/formular/element/foundation6/input_group.rb +2 -2
- data/lib/formular/element/foundation6/{wrapped_control.rb → wrapped.rb} +4 -4
- data/lib/formular/element/modules/checkable.rb +10 -11
- data/lib/formular/element/modules/control.rb +12 -4
- data/lib/formular/element/modules/error.rb +6 -1
- data/lib/formular/element/modules/escape_value.rb +14 -0
- data/lib/formular/element/modules/hint.rb +5 -3
- data/lib/formular/element/modules/label.rb +5 -2
- data/lib/formular/element/modules/{wrapped_control.rb → wrapped.rb} +14 -13
- data/lib/formular/elements.rb +62 -19
- data/lib/formular/helper.rb +18 -4
- data/lib/formular/html_block.rb +1 -1
- data/lib/formular/html_escape.rb +19 -0
- data/lib/formular/path.rb +1 -6
- data/lib/formular/version.rb +1 -1
- metadata +16 -7
@@ -7,7 +7,7 @@ module Formular
|
|
7
7
|
class Element
|
8
8
|
module Bootstrap3
|
9
9
|
module Horizontal
|
10
|
-
module
|
10
|
+
module Wrapped
|
11
11
|
include Formular::Element::Module
|
12
12
|
|
13
13
|
html(:label_column) do |input|
|
@@ -35,11 +35,11 @@ module Formular
|
|
35
35
|
has_label? ? [] : builder.class.column_classes[:left_offset]
|
36
36
|
end
|
37
37
|
end
|
38
|
-
end # module
|
38
|
+
end # module Wrapped
|
39
39
|
|
40
40
|
module WrappedCheckableControl
|
41
41
|
include Formular::Element::Module
|
42
|
-
include
|
42
|
+
include Wrapped
|
43
43
|
|
44
44
|
html(:label_column) do |input|
|
45
45
|
input.group_label
|
@@ -80,19 +80,19 @@ module Formular
|
|
80
80
|
end # class Form
|
81
81
|
|
82
82
|
class Select < Formular::Element::Bootstrap3::Select
|
83
|
-
include
|
83
|
+
include Wrapped
|
84
84
|
end # class Select
|
85
85
|
|
86
86
|
class Textarea < Formular::Element::Bootstrap3::Textarea
|
87
|
-
include
|
87
|
+
include Wrapped
|
88
88
|
end # class Textarea
|
89
89
|
|
90
90
|
class Input < Formular::Element::Bootstrap3::Input
|
91
|
-
include
|
91
|
+
include Wrapped
|
92
92
|
end # class Input
|
93
93
|
|
94
94
|
class InputGroup < Formular::Element::Bootstrap3::InputGroup
|
95
|
-
include
|
95
|
+
include Wrapped
|
96
96
|
|
97
97
|
html(:start) do |input|
|
98
98
|
wrapper = input.wrapper
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'formular/elements'
|
2
2
|
require 'formular/element/modules/container'
|
3
|
-
require 'formular/element/modules/
|
3
|
+
require 'formular/element/modules/wrapped'
|
4
4
|
|
5
5
|
module Formular
|
6
6
|
class Element
|
7
7
|
module Bootstrap3
|
8
8
|
class InputGroup < Formular::Element::Input
|
9
|
-
include Formular::Element::Modules::
|
9
|
+
include Formular::Element::Modules::Wrapped
|
10
10
|
include Formular::Element::Modules::Container
|
11
11
|
include Formular::Element::Bootstrap3::ColumnControl
|
12
12
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'formular/element'
|
2
2
|
require 'formular/elements'
|
3
|
-
require 'formular/element/modules/
|
3
|
+
require 'formular/element/modules/wrapped'
|
4
4
|
require 'formular/element/module'
|
5
5
|
require 'formular/element/bootstrap4/checkable_control'
|
6
6
|
require 'formular/element/bootstrap4/custom_control'
|
7
|
+
require 'formular/element/bootstrap3'
|
7
8
|
require 'formular/element/bootstrap3/column_control'
|
8
9
|
|
9
10
|
module Formular
|
@@ -18,22 +19,30 @@ module Formular
|
|
18
19
|
end # class Submit
|
19
20
|
|
20
21
|
class Error < Formular::Element::Error
|
21
|
-
tag :
|
22
|
+
tag :div
|
22
23
|
set_default :class, ['form-control-feedback']
|
23
24
|
end # class Error
|
24
25
|
|
25
26
|
class Hint < Formular::Element::Small
|
26
|
-
set_default :class, ['text-muted']
|
27
|
+
set_default :class, ['form-text', 'text-muted']
|
27
28
|
end # class Hint
|
28
29
|
|
29
|
-
class
|
30
|
-
|
31
|
-
|
30
|
+
class Select < Formular::Element::Bootstrap3::Select
|
31
|
+
set_default :label_options, { class: ['form-control-label'] }
|
32
|
+
end # class Textarea
|
32
33
|
|
33
|
-
|
34
|
+
|
35
|
+
class Textarea < Formular::Element::Bootstrap3::Textarea
|
36
|
+
set_default :label_options, { class: ['form-control-label'] }
|
37
|
+
end # class Textarea
|
38
|
+
|
39
|
+
class Input < Formular::Element::Bootstrap3::Input
|
40
|
+
set_default :label_options, { class: ['form-control-label'] }
|
34
41
|
|
35
42
|
def input_class
|
36
|
-
|
43
|
+
return %(form-control-file) if options[:type].to_s == 'file'
|
44
|
+
|
45
|
+
has_errors? ? ['form-control', 'form-control-danger'] : ['form-control']
|
37
46
|
end
|
38
47
|
end # class Input
|
39
48
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'formular/elements'
|
2
|
-
require 'formular/element/modules/
|
2
|
+
require 'formular/element/modules/wrapped'
|
3
3
|
require 'formular/element/module'
|
4
4
|
|
5
5
|
module Formular
|
@@ -7,15 +7,14 @@ module Formular
|
|
7
7
|
module Bootstrap4
|
8
8
|
module CheckableControl
|
9
9
|
class Checkbox < Formular::Element::Checkbox
|
10
|
-
include Formular::Element::Modules::
|
10
|
+
include Formular::Element::Modules::Wrapped
|
11
11
|
set_default :class, ['form-check-input']
|
12
|
-
set_default :value, '1' # instead of reader value
|
13
12
|
|
14
13
|
html { closed_start_tag }
|
15
14
|
end # class Checkbox
|
16
15
|
|
17
16
|
class Radio < Formular::Element::Radio
|
18
|
-
include Formular::Element::Modules::
|
17
|
+
include Formular::Element::Modules::Wrapped
|
19
18
|
set_default :class, ['form-check-input']
|
20
19
|
|
21
20
|
def hidden_tag
|
@@ -26,6 +25,7 @@ module Formular
|
|
26
25
|
module InlineCheckable
|
27
26
|
include Formular::Element::Module
|
28
27
|
|
28
|
+
set_default :label_options, { class: ['form-control-label'] }
|
29
29
|
set_default :control_label_options, { class: ['form-check-inline'] }
|
30
30
|
|
31
31
|
html(:wrapped) do |input|
|
@@ -72,6 +72,7 @@ module Formular
|
|
72
72
|
}.join('')
|
73
73
|
end
|
74
74
|
|
75
|
+
set_default :label_options, { class: ['form-control-label'] }
|
75
76
|
set_default :control_label_options, { class: ['form-check-label'] }
|
76
77
|
|
77
78
|
module InstanceMethods
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'formular/elements'
|
2
|
-
require 'formular/element/modules/
|
2
|
+
require 'formular/element/modules/wrapped'
|
3
3
|
require 'formular/element/bootstrap4'
|
4
4
|
require 'formular/element/bootstrap3'
|
5
5
|
require 'formular/element/module'
|
@@ -10,8 +10,9 @@ module Formular
|
|
10
10
|
module CustomControl
|
11
11
|
module CustomCheckable
|
12
12
|
include Formular::Element::Module
|
13
|
-
include Formular::Element::Modules::
|
13
|
+
include Formular::Element::Modules::Wrapped
|
14
14
|
set_default :class, ['custom-control-input']
|
15
|
+
set_default :label_options, { class: ['form-control-label'] }
|
15
16
|
|
16
17
|
html(:checkable_label) do |input|
|
17
18
|
Formular::Element::Label.(input.label_options) do
|
@@ -57,7 +58,6 @@ module Formular
|
|
57
58
|
html { closed_start_tag }
|
58
59
|
|
59
60
|
set_default :control_label_options, { class: ['custom-control custom-checkbox'] }
|
60
|
-
set_default :value, '1' # instead of reader value
|
61
61
|
end # class Checkbox
|
62
62
|
|
63
63
|
class CustomRadio < Formular::Element::Radio
|
@@ -71,13 +71,15 @@ module Formular
|
|
71
71
|
|
72
72
|
class CustomSelect < Formular::Element::Bootstrap3::Select
|
73
73
|
set_default :class, ['custom-select']
|
74
|
+
set_default :label_options, { class: ['form-control-label'] }
|
74
75
|
end # class CustomSelect
|
75
76
|
|
76
77
|
class CustomFile < Formular::Element::Input
|
77
|
-
include Formular::Element::Modules::
|
78
|
+
include Formular::Element::Modules::Wrapped
|
78
79
|
include Formular::Element::Bootstrap3::ColumnControl
|
79
80
|
|
80
81
|
set_default :class, ['custom-file-input']
|
82
|
+
set_default :label_options, { class: ['form-control-label'] }
|
81
83
|
set_default :type, 'file'
|
82
84
|
|
83
85
|
rename_html_context(:default, :control)
|
@@ -93,6 +95,7 @@ module Formular
|
|
93
95
|
|
94
96
|
class CustomSelect < Inline::CustomSelect
|
95
97
|
rename_html_context(:default, :input)
|
98
|
+
set_default :label_options, { class: ['form-control-label'] }
|
96
99
|
|
97
100
|
html do |input|
|
98
101
|
Formular::Element::Div.(content: input.to_html(context: :input))
|
@@ -101,6 +104,7 @@ module Formular
|
|
101
104
|
|
102
105
|
class CustomFile < Inline::CustomFile
|
103
106
|
rename_html_context(:default, :input)
|
107
|
+
set_default :label_options, { class: ['form-control-label'] }
|
104
108
|
|
105
109
|
html do |input|
|
106
110
|
Formular::Element::Div.(content: input.to_html(context: :input))
|
@@ -26,15 +26,15 @@ module Formular
|
|
26
26
|
end # class Legend
|
27
27
|
|
28
28
|
class Input < Formular::Element::Bootstrap4::Input
|
29
|
-
include Formular::Element::Bootstrap3::Horizontal::
|
29
|
+
include Formular::Element::Bootstrap3::Horizontal::Wrapped
|
30
30
|
end # class Input
|
31
31
|
|
32
32
|
class CustomFile < Formular::Element::Bootstrap4::CustomFile
|
33
|
-
include Formular::Element::Bootstrap3::Horizontal::
|
33
|
+
include Formular::Element::Bootstrap3::Horizontal::Wrapped
|
34
34
|
end # class CustomFile
|
35
35
|
|
36
36
|
class CustomSelect < Formular::Element::Bootstrap4::CustomSelect
|
37
|
-
include Formular::Element::Bootstrap3::Horizontal::
|
37
|
+
include Formular::Element::Bootstrap3::Horizontal::Wrapped
|
38
38
|
end # class CustomFile
|
39
39
|
|
40
40
|
class Submit < Formular::Element::Bootstrap4::Submit
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'formular/elements'
|
2
|
+
require 'formular/element/bootstrap3/input_group'
|
3
|
+
|
4
|
+
module Formular
|
5
|
+
class Element
|
6
|
+
module Bootstrap4
|
7
|
+
class InputGroup < Formular::Element::Bootstrap3::InputGroup
|
8
|
+
set_default :label_options, { class: ['form-control-label'] }
|
9
|
+
end # class InputGroup
|
10
|
+
end # module Bootstrap4
|
11
|
+
end # class Element
|
12
|
+
end # module Formular
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'formular/elements'
|
2
|
-
require 'formular/element/modules/
|
2
|
+
require 'formular/element/modules/wrapped'
|
3
3
|
require 'formular/element/module'
|
4
4
|
require 'formular/element/foundation6/checkable_control'
|
5
|
-
require 'formular/element/foundation6/
|
5
|
+
require 'formular/element/foundation6/wrapped'
|
6
6
|
module Formular
|
7
7
|
class Element
|
8
8
|
module Foundation6
|
@@ -36,7 +36,7 @@ module Formular
|
|
36
36
|
end # class Hint
|
37
37
|
|
38
38
|
class Input < Formular::Element::Input
|
39
|
-
include
|
39
|
+
include Wrapped
|
40
40
|
include InputWithErrors
|
41
41
|
end # class Input
|
42
42
|
|
@@ -56,12 +56,12 @@ module Formular
|
|
56
56
|
end # class File
|
57
57
|
|
58
58
|
class Select < Formular::Element::Select
|
59
|
-
include
|
59
|
+
include Wrapped
|
60
60
|
include InputWithErrors
|
61
61
|
end # class Select
|
62
62
|
|
63
63
|
class Textarea < Formular::Element::Textarea
|
64
|
-
include
|
64
|
+
include Wrapped
|
65
65
|
include InputWithErrors
|
66
66
|
end # class Textarea
|
67
67
|
end # module Foundation6
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'formular/elements'
|
2
2
|
require 'formular/element/module'
|
3
|
-
require 'formular/element/foundation6/
|
3
|
+
require 'formular/element/foundation6/wrapped'
|
4
4
|
module Formular
|
5
5
|
class Element
|
6
6
|
module Foundation6
|
7
7
|
module CheckableControl
|
8
8
|
module Checkable
|
9
9
|
include Formular::Element::Module
|
10
|
-
include Formular::Element::Foundation6::
|
10
|
+
include Formular::Element::Foundation6::Wrapped
|
11
11
|
|
12
12
|
set_default :label_options, { class: ['is-invalid-label'] }, if: :has_errors?
|
13
13
|
set_default :control_label_options, { class: ['is-invalid-label'] }, if: :has_errors?
|
@@ -43,8 +43,6 @@ module Formular
|
|
43
43
|
|
44
44
|
class Checkbox < Formular::Element::Checkbox
|
45
45
|
include Checkable
|
46
|
-
|
47
|
-
set_default :value, '1' # instead of reader value
|
48
46
|
set_default :label_options, { class: ['is-invalid-label'] }, if: :has_errors?
|
49
47
|
set_default :control_label_options, { class: ['is-invalid-label'] }, if: :has_errors?
|
50
48
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'formular/elements'
|
2
2
|
require 'formular/element/modules/container'
|
3
|
-
require 'formular/element/modules/
|
3
|
+
require 'formular/element/modules/wrapped'
|
4
4
|
module Formular
|
5
5
|
class Element
|
6
6
|
module Foundation6
|
7
7
|
class InputGroup < Formular::Element::Input
|
8
8
|
module WrappedGroup
|
9
9
|
include Formular::Element::Module
|
10
|
-
include Formular::Element::Modules::
|
10
|
+
include Formular::Element::Modules::Wrapped
|
11
11
|
|
12
12
|
def wrapper(&block)
|
13
13
|
builder.fieldset(Attributes[options[:wrapper_options]], &block)
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'formular/element/module'
|
2
|
-
require 'formular/element/modules/
|
2
|
+
require 'formular/element/modules/wrapped'
|
3
3
|
module Formular
|
4
4
|
class Element
|
5
5
|
module Foundation6
|
6
|
-
module
|
6
|
+
module Wrapped
|
7
7
|
include Formular::Element::Module
|
8
|
-
include Formular::Element::Modules::
|
8
|
+
include Formular::Element::Modules::Wrapped
|
9
9
|
|
10
10
|
html(:wrapped) do |input|
|
11
11
|
input.wrapper do
|
@@ -15,7 +15,7 @@ module Formular
|
|
15
15
|
concat input.error
|
16
16
|
end.to_s
|
17
17
|
end
|
18
|
-
end # module
|
18
|
+
end # module Wrapped
|
19
19
|
end # module Foundation6
|
20
20
|
end # class Element
|
21
21
|
end # module Formular
|
@@ -15,7 +15,6 @@ module Formular
|
|
15
15
|
include Label
|
16
16
|
|
17
17
|
add_option_keys :control_label_options
|
18
|
-
|
19
18
|
set_default :checked, 'checked', if: :is_checked?
|
20
19
|
|
21
20
|
html(:checkable_label) do |input|
|
@@ -38,8 +37,9 @@ module Formular
|
|
38
37
|
module InstanceMethods
|
39
38
|
def group_label
|
40
39
|
return '' unless has_group_label?
|
41
|
-
|
42
|
-
|
40
|
+
label_opts = label_options.dup
|
41
|
+
label_opts[:content] = label_text
|
42
|
+
builder.checkable_group_label(label_opts).to_s
|
43
43
|
end
|
44
44
|
|
45
45
|
def has_group_label?
|
@@ -59,10 +59,10 @@ module Formular
|
|
59
59
|
opts[:value] = item.send(options[:value_method])
|
60
60
|
opts[:label] = item.send(options[:label_method])
|
61
61
|
|
62
|
-
opts[:id] = if
|
63
|
-
"#{
|
62
|
+
opts[:id] = if options[:id]
|
63
|
+
"#{options[:id]}_#{opts[:value]}"
|
64
64
|
else
|
65
|
-
"#{attribute_name ||
|
65
|
+
"#{attribute_name || options[:name].gsub('[]', '')}_#{opts[:value]}"
|
66
66
|
end
|
67
67
|
|
68
68
|
self.class.(opts)
|
@@ -74,18 +74,17 @@ module Formular
|
|
74
74
|
end
|
75
75
|
|
76
76
|
private
|
77
|
-
|
78
|
-
# we can't access other defaults
|
79
77
|
def is_checked?
|
80
|
-
!options[:checked].nil? || reader_value ==
|
78
|
+
!options[:checked].nil? || reader_value == options[:value]
|
81
79
|
end
|
82
80
|
|
83
81
|
def collection_base_options
|
84
|
-
opts = attributes.select { |k, v| ![:name, :id, :checked, :class].include?(k) }
|
82
|
+
opts = attributes.select { |k, v| ![:name, :id, :checked, :class].include?(k) }
|
83
|
+
# FIXME due to class merging, we'll end up with duplicate classes...
|
85
84
|
opts[:attribute_name] = attribute_name if attribute_name
|
86
85
|
opts[:builder] = builder if builder
|
87
86
|
opts[:label_options] = options[:control_label_options] if options[:control_label_options]
|
88
|
-
opts[:name] =
|
87
|
+
opts[:name] = options[:name] if options[:name] # do we need this??
|
89
88
|
|
90
89
|
opts
|
91
90
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'formular/element/module'
|
2
|
+
require 'formular/element/modules/escape_value'
|
2
3
|
module Formular
|
3
4
|
class Element
|
4
5
|
module Modules
|
@@ -6,6 +7,7 @@ module Formular
|
|
6
7
|
# name & value based on the attribute name
|
7
8
|
module Control
|
8
9
|
include Formular::Element::Module
|
10
|
+
include Formular::Element::Modules::EscapeValue
|
9
11
|
|
10
12
|
add_option_keys :attribute_name
|
11
13
|
|
@@ -20,20 +22,26 @@ module Formular
|
|
20
22
|
|
21
23
|
private
|
22
24
|
|
25
|
+
# FIXME... we should probably find a better way of returning nil to all of these if
|
26
|
+
# no attribute_name or builder
|
27
|
+
def builder_attribute?
|
28
|
+
attribute_name && builder
|
29
|
+
end
|
30
|
+
|
23
31
|
def path
|
24
|
-
@path ||= builder.path(attribute_name) if
|
32
|
+
@path ||= builder.path(attribute_name) if builder_attribute?
|
25
33
|
end
|
26
34
|
|
27
35
|
def form_encoded_name
|
28
|
-
path.to_encoded_name if
|
36
|
+
path.to_encoded_name if builder_attribute?
|
29
37
|
end
|
30
38
|
|
31
39
|
def form_encoded_id
|
32
|
-
path.to_encoded_id if
|
40
|
+
path.to_encoded_id if builder_attribute?
|
33
41
|
end
|
34
42
|
|
35
43
|
def reader_value
|
36
|
-
builder.reader_value(attribute_name) if
|
44
|
+
builder.reader_value(attribute_name) if builder_attribute?
|
37
45
|
end
|
38
46
|
end # model InstanceMethods
|
39
47
|
end # module Control
|
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'formular/element/module'
|
2
|
+
require 'formular/html_escape'
|
2
3
|
module Formular
|
3
4
|
class Element
|
4
5
|
module Modules
|
5
6
|
# this module provides error methods and options to a control when included
|
6
7
|
module Error
|
7
8
|
include Formular::Element::Module
|
9
|
+
include HtmlEscape
|
8
10
|
add_option_keys :error
|
9
11
|
|
10
12
|
# options functionality (same as SimpleForm):
|
@@ -12,7 +14,10 @@ module Formular
|
|
12
14
|
# options[:error] == String return the string, regardless of model errors
|
13
15
|
module InstanceMethods
|
14
16
|
def error_text
|
15
|
-
|
17
|
+
return unless has_errors?
|
18
|
+
|
19
|
+
text = has_custom_error? ? options[:error] : errors_on_attribute.send(error_method)
|
20
|
+
html_escape(text)
|
16
21
|
end
|
17
22
|
|
18
23
|
def has_errors?
|