caisson 0.0.1 → 0.0.2
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.
- data/README.md +13 -1
- data/app/assets/javascripts/caisson/base.coffee +4 -0
- data/app/assets/javascripts/caisson/form/fields/base.coffee +115 -0
- data/app/assets/javascripts/caisson/form/fields/checkbox.coffee +13 -0
- data/app/assets/javascripts/caisson/form/fields/select.coffee +14 -0
- data/app/assets/javascripts/caisson/form/fields/text_field.coffee +22 -0
- data/app/assets/javascripts/caisson/form/fields/validator.coffee +116 -0
- data/app/assets/javascripts/caisson/form/form.coffee +119 -0
- data/app/assets/javascripts/caisson/form/form_caisson.coffee +30 -0
- data/app/assets/javascripts/caisson/index.js +2 -0
- data/app/assets/javascripts/caisson/module.coffee +8 -0
- data/app/assets/javascripts/caisson/orbit-slider.coffee +2 -1
- data/app/assets/stylesheets/caisson/base.css.scss +7 -0
- data/app/assets/stylesheets/caisson/index.css +3 -0
- data/lib/caisson/helpers/form/base.rb +195 -0
- data/lib/caisson/helpers/form/builder/base.rb +72 -0
- data/lib/caisson/helpers/form/builder/field/base.rb +168 -0
- data/lib/caisson/helpers/form/builder/field/checkbox.rb +15 -0
- data/lib/caisson/helpers/form/builder/field/money.rb +13 -0
- data/lib/caisson/helpers/form/builder/field/password.rb +13 -0
- data/lib/caisson/helpers/form/builder/field/percent.rb +13 -0
- data/lib/caisson/helpers/form/builder/field/select.rb +41 -0
- data/lib/caisson/helpers/form/builder/field/text.rb +13 -0
- data/lib/caisson/helpers/form/builder/field/textarea.rb +13 -0
- data/lib/caisson/helpers/form/builder/field_builder/base.rb +81 -0
- data/lib/caisson/helpers/form/builder/field_builder/nature.rb +85 -0
- data/lib/caisson/helpers/form/builder/interpreti.rb +107 -0
- data/lib/caisson/helpers/form/button.rb +62 -0
- data/lib/caisson/helpers/form/field/base.rb +43 -0
- data/lib/caisson/helpers/form/field/checkbox.rb +39 -0
- data/lib/caisson/helpers/form/field/money.rb +29 -0
- data/lib/caisson/helpers/form/field/password.rb +14 -0
- data/lib/caisson/helpers/form/field/percent.rb +23 -0
- data/lib/caisson/helpers/form/field/select.rb +34 -0
- data/lib/caisson/helpers/form/field/text.rb +17 -0
- data/lib/caisson/helpers/form/field/textarea.rb +16 -0
- data/lib/caisson/helpers/form.rb +30 -0
- data/lib/caisson/helpers/grid.rb +32 -0
- data/lib/caisson/helpers/orbit_slider.rb +16 -21
- data/lib/caisson/helpers.rb +26 -0
- data/lib/caisson/implants/mongoid.rb +67 -0
- data/lib/caisson/implants/railtie.rb +4 -0
- metadata +41 -6
@@ -0,0 +1,195 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form
|
5
|
+
class Base
|
6
|
+
#*************************************************************************************
|
7
|
+
# CONSTRUCTOR
|
8
|
+
#*************************************************************************************
|
9
|
+
def initialize(core)
|
10
|
+
@core = core
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
#*************************************************************************************
|
15
|
+
# PUBLIC INSTANCE METHODS
|
16
|
+
#*************************************************************************************
|
17
|
+
def button(text, options={})
|
18
|
+
Caisson::Helpers::Form::Button.new(@core).build(text, options)
|
19
|
+
end
|
20
|
+
|
21
|
+
def button_to(text, options={}, html_options={})
|
22
|
+
Caisson::Helpers::Form::Button.new(@core).build_button_to(text, options, html_options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def buttons(&block)
|
26
|
+
content = '<div class="buttons row"><div class="large-12 columns">'
|
27
|
+
content << @core.capture(self, &block)
|
28
|
+
content << '</div></div>'
|
29
|
+
|
30
|
+
return content.html_safe
|
31
|
+
end
|
32
|
+
|
33
|
+
def label(text, options={})
|
34
|
+
options.reverse_merge!(content: '', placeholder: nil, separator: ' : ')
|
35
|
+
|
36
|
+
label_for = options[:content].scan(/<[input|textarea|select|span|div].+id="(.+?)"./).flatten.first
|
37
|
+
|
38
|
+
attributes = {}
|
39
|
+
attributes[:for] = label_for if label_for
|
40
|
+
attributes[:class] = 'placeholder' if options[:placeholder]
|
41
|
+
|
42
|
+
text = ' '.html_safe if text.empty?
|
43
|
+
text += options[:separator].to_s if not options[:placeholder]
|
44
|
+
|
45
|
+
return content_tag(:label, text, attributes)
|
46
|
+
end
|
47
|
+
|
48
|
+
def line(label_str, content, options={})
|
49
|
+
options.reverse_merge!(class: nil, id: nil, label_separator: ' : ', placeholder: false)
|
50
|
+
|
51
|
+
css_class = ['row', 'form-line', options[:class]].compact.join(' ')
|
52
|
+
|
53
|
+
line_content = '<div class="' + css_class + '"><div class="large-12 columns field">'
|
54
|
+
line_content << label(label_str, content: content, separator: options[:label_separator], placeholder: options[:placeholder]) if not label_str.nil?
|
55
|
+
line_content << content
|
56
|
+
line_content << '</div></div>'
|
57
|
+
|
58
|
+
return line_content.html_safe
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
def checkbox(name, selected=false, options={})
|
75
|
+
new_field('checkbox', name, selected, options)
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
def line_checkbox(label_str, field_name, selected=false, options={})
|
83
|
+
options.reverse_merge!(label_separator: nil, wrap_field: false)
|
84
|
+
|
85
|
+
options[:class] = [options[:class], 'line-checkbox'].compact.join(' ')
|
86
|
+
|
87
|
+
return line(label_str, checkbox(field_name, selected), options)
|
88
|
+
end
|
89
|
+
|
90
|
+
def line_password(label_str, field_name, value='', options={})
|
91
|
+
field_options = get_field_options(label_str, options)
|
92
|
+
|
93
|
+
line(label_str, password(field_name, value, field_options), options)
|
94
|
+
end
|
95
|
+
|
96
|
+
def line_select(label_str, field_name, choices, selection, options={})
|
97
|
+
line(label_str, select(field_name, choices, selection), options)
|
98
|
+
end
|
99
|
+
|
100
|
+
def line_static(label_str, value, options={})
|
101
|
+
options.reverse_merge!(wrap_field: false)
|
102
|
+
|
103
|
+
options[:class] = [options[:class], 'line-static'].compact.join(' ')
|
104
|
+
|
105
|
+
field_options = {}
|
106
|
+
field_options[:date_format] = options.delete(:date_format) if options[:date_format]
|
107
|
+
|
108
|
+
line(label_str, static(value, field_options), options)
|
109
|
+
end
|
110
|
+
|
111
|
+
def line_switch(label_str, field_name, choices, selection, options={})
|
112
|
+
line(label_str, switch(field_name, choices, selection), options)
|
113
|
+
end
|
114
|
+
|
115
|
+
def line_text(label_str, field_name, value='', options={})
|
116
|
+
options.reverse_merge!(wrap_field: false)
|
117
|
+
|
118
|
+
field_options = get_field_options(label_str, options)
|
119
|
+
|
120
|
+
line(label_str, text(field_name, value, field_options), options)
|
121
|
+
end
|
122
|
+
|
123
|
+
def line_time(label_str, field_name, value='', options={})
|
124
|
+
line(label_str, time(field_name, value), options)
|
125
|
+
end
|
126
|
+
|
127
|
+
def password(name, value='', options={})
|
128
|
+
new_field('password', name, value, options)
|
129
|
+
end
|
130
|
+
|
131
|
+
def select(name, choices, selection, options={})
|
132
|
+
options.reverse_merge!(submit: false, translate: false)
|
133
|
+
|
134
|
+
new_field('select', name, choices, selection, options)
|
135
|
+
end
|
136
|
+
|
137
|
+
def static(value, options={})
|
138
|
+
new_field('static', value, options)
|
139
|
+
end
|
140
|
+
|
141
|
+
def switch(name, choices, selection, options={})
|
142
|
+
options.reverse_merge!(submit: false, translate: false)
|
143
|
+
|
144
|
+
new_field('switch', name, choices, selection, options)
|
145
|
+
end
|
146
|
+
|
147
|
+
def text(name, value='', options={})
|
148
|
+
new_field('text', name, value, options)
|
149
|
+
end
|
150
|
+
|
151
|
+
def time(name, value, options={})
|
152
|
+
new_field('time_field', name, value, options)
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
|
157
|
+
#*************************************************************************************
|
158
|
+
# PRIVATE INSTANCE METHODS
|
159
|
+
#*************************************************************************************
|
160
|
+
def get_field_options(label_str, line_options)
|
161
|
+
field_options = {}
|
162
|
+
|
163
|
+
if line_options[:placeholder]
|
164
|
+
field_options[:placeholder] = (line_options[:placeholder] == true) ? label_str : line_options[:placeholder]
|
165
|
+
end
|
166
|
+
|
167
|
+
field_options[:placeholder] = line_options[:placeholder_text] if line_options[:placeholder_text]
|
168
|
+
field_options[:validates] = line_options.delete(:validates) if line_options[:validates]
|
169
|
+
field_options[:maxlength] = line_options.delete(:maxlength) if line_options[:maxlength]
|
170
|
+
field_options[:field_size] = line_options.delete(:field_size) if line_options[:field_size]
|
171
|
+
|
172
|
+
return field_options
|
173
|
+
end
|
174
|
+
|
175
|
+
def line_options(options)
|
176
|
+
options[:class] = ['line', options[:class]].compact.flatten.join(' ')
|
177
|
+
options.delete(:label_separator)
|
178
|
+
options.delete(:wrap_field)
|
179
|
+
options.delete(:placeholder)
|
180
|
+
options.delete(:placeholder_text)
|
181
|
+
|
182
|
+
return options
|
183
|
+
end
|
184
|
+
|
185
|
+
def new_field(nature, *args)
|
186
|
+
wrap_field "Caisson::Helpers::Form::Field::#{nature.camelize}".constantize.new(@core).build(*args)
|
187
|
+
end
|
188
|
+
|
189
|
+
def wrap_field(content)
|
190
|
+
content_tag(:div, content, class: 'field')
|
191
|
+
end
|
192
|
+
|
193
|
+
def method_missing(*args, &block) return @core.send(*args, &block) end
|
194
|
+
end
|
195
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Caisson::Helpers::Form::Builder
|
2
|
+
class Base
|
3
|
+
attr_reader :interpreti, :record
|
4
|
+
|
5
|
+
#*************************************************************************************
|
6
|
+
# CONSTRUCTOR
|
7
|
+
#*************************************************************************************
|
8
|
+
def initialize(core, record)
|
9
|
+
@core = core
|
10
|
+
@record = record
|
11
|
+
@interpreti = Caisson::Helpers::Form::Builder::Interpreti.new(@record)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
#*************************************************************************************
|
16
|
+
# PUBLIC INSTANCE METHODS
|
17
|
+
#*************************************************************************************
|
18
|
+
def line(field_name, options={})
|
19
|
+
options.reverse_merge!(choices: nil, hint: true, id: 'undefined', label: 'undefined', nature: nil, placeholder: false, value: 'undefined')
|
20
|
+
|
21
|
+
field = field_builder(field_name, field_options(options))
|
22
|
+
|
23
|
+
label_str = line_label(field, force: options[:label])
|
24
|
+
|
25
|
+
return caisson.line(label_str, field.build, line_options(field, options))
|
26
|
+
end
|
27
|
+
|
28
|
+
def line_label(field, options={})
|
29
|
+
options.reverse_merge!(force: 'undefined')
|
30
|
+
|
31
|
+
return case
|
32
|
+
when options[:force] != 'undefined' then options[:force]
|
33
|
+
when field.checkbox? then nil
|
34
|
+
when field.hidden? then nil
|
35
|
+
else field.label
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
#*************************************************************************************
|
43
|
+
# PRIVATE INSTANCE METHODS
|
44
|
+
#*************************************************************************************
|
45
|
+
def field_builder(name, options={})
|
46
|
+
Caisson::Helpers::Form::Builder::FieldBuilder::Base.new(self, name, options)
|
47
|
+
end
|
48
|
+
|
49
|
+
def field_options(full_options)
|
50
|
+
options = {}
|
51
|
+
options.reverse_merge! full_options
|
52
|
+
options.delete :class
|
53
|
+
|
54
|
+
return options
|
55
|
+
end
|
56
|
+
|
57
|
+
def line_options(field, full_options)
|
58
|
+
options = { class: ["line-#{field.nature}", full_options[:class]].join(' ') }
|
59
|
+
options[:class] << ' errors' if field.errors?
|
60
|
+
options[:id] = 'line-' + full_options[:id] if not [nil, 'undefined'].include?(full_options[:id])
|
61
|
+
options[:wrap_field] = false
|
62
|
+
options[:placeholder] = full_options[:placeholder]
|
63
|
+
options[:hint] = full_options[:hint]
|
64
|
+
|
65
|
+
options[:label_separator] = '' if field.nature == 'checkbox'
|
66
|
+
|
67
|
+
return options
|
68
|
+
end
|
69
|
+
|
70
|
+
def method_missing(*args, &block) return @core.send(*args, &block) end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::Field
|
5
|
+
class Base
|
6
|
+
attr_reader :name
|
7
|
+
|
8
|
+
#*************************************************************************************
|
9
|
+
# CONSTRUCTOR
|
10
|
+
#*************************************************************************************
|
11
|
+
def initialize(core, record, name, options={})
|
12
|
+
@core = core
|
13
|
+
@record = record
|
14
|
+
@name = name
|
15
|
+
|
16
|
+
@options = OptionParser.new(@record, @name, options).parse
|
17
|
+
end
|
18
|
+
|
19
|
+
#*************************************************************************************
|
20
|
+
# PUBLIC INSTANCE METHODS
|
21
|
+
#*************************************************************************************
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
#*************************************************************************************
|
26
|
+
# PRIVATE INSTANCE METHODS
|
27
|
+
#*************************************************************************************
|
28
|
+
def field_id
|
29
|
+
"#{model_name}_#{@name}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def field_name
|
33
|
+
"#{model_name}[#{@name}]"
|
34
|
+
end
|
35
|
+
|
36
|
+
def label
|
37
|
+
interpreti.field_label(@name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def interpreti
|
41
|
+
@core.interpreti
|
42
|
+
end
|
43
|
+
|
44
|
+
def model_name
|
45
|
+
@record.class.to_s.underscore.downcase
|
46
|
+
end
|
47
|
+
|
48
|
+
def value(readable=false)
|
49
|
+
if @name.to_s.include?('[')
|
50
|
+
parsed_name = @name.gsub(']', '[').split('[')
|
51
|
+
|
52
|
+
return @record.read_attribute(parsed_name[0])[parsed_name[1]]
|
53
|
+
else
|
54
|
+
content = ''
|
55
|
+
content = interpreti.field_option(@name) if readable
|
56
|
+
|
57
|
+
if content.blank?
|
58
|
+
content = @record.respond_to?(@name) ? @record.send(@name) : @record.read_attribute(@name)
|
59
|
+
end
|
60
|
+
|
61
|
+
return content
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def value_readable
|
66
|
+
value true
|
67
|
+
end
|
68
|
+
|
69
|
+
def method_missing(*args, &block)
|
70
|
+
if [:check_box, :content_tag].include?(args.first)
|
71
|
+
return @core.send(*args, &block)
|
72
|
+
else
|
73
|
+
raise NoMethodError.new("undefined local variable or method '#{args.first}' for #{self.class}")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class OptionParser
|
78
|
+
def initialize(record, field_name, options)
|
79
|
+
@field_name = field_name
|
80
|
+
@options = options
|
81
|
+
@record = record
|
82
|
+
end
|
83
|
+
|
84
|
+
def parse
|
85
|
+
parse_id
|
86
|
+
parse_class
|
87
|
+
parse_placeholder
|
88
|
+
parse_validations
|
89
|
+
|
90
|
+
delete_junk
|
91
|
+
|
92
|
+
return @options
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def delete_junk
|
98
|
+
[:field_size, :nature].each { |n| @options.delete(n) }
|
99
|
+
|
100
|
+
@options.delete(:label) if @options[:label] == 'undefined'
|
101
|
+
@options.delete(:value) if @options[:value] == 'undefined'
|
102
|
+
@options.delete(:choices) if not @options[:choices]
|
103
|
+
end
|
104
|
+
|
105
|
+
def parse_class
|
106
|
+
@options[:class] = [@options[:class], @options[:field_size]].compact.join(" ") if @options[:field_size]
|
107
|
+
end
|
108
|
+
|
109
|
+
def parse_id
|
110
|
+
if @options[:id] == 'undefined'
|
111
|
+
model_name = @record.class.to_s.underscore.downcase
|
112
|
+
|
113
|
+
@options[:id] = "#{model_name}_#{@field_name}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def parse_length_validator(opts)
|
118
|
+
case
|
119
|
+
when (opts[:minimum] and opts[:maximum]) then "within-#{opts[:minimum]}-#{opts[:maximum]}"
|
120
|
+
when opts[:minimum] then "min-#{opts[:minimum]}"
|
121
|
+
when opts[:maximum] then "max-#{opts[:maximum]}"
|
122
|
+
when opts[:is] then "length-#{opts[:is]}"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def parse_placeholder
|
127
|
+
if @options[:placeholder] == true
|
128
|
+
@options[:placeholder] = interpreti.field_label @field_name
|
129
|
+
elsif not @options[:placeholder]
|
130
|
+
@options.delete(:placeholder)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def parse_validations
|
135
|
+
validators = @record.class.validators_on(@field_name).map { |v| parse_validator v }
|
136
|
+
validators << 'email' if @field_name.to_s.include? 'email'
|
137
|
+
validators << set_other_validations
|
138
|
+
|
139
|
+
data = [validators, @options.delete(:validates)].flatten.compact
|
140
|
+
|
141
|
+
@options[:validates] = data.join(" ") if not data.empty?
|
142
|
+
end
|
143
|
+
|
144
|
+
def parse_validator(validator)
|
145
|
+
return nil if validator.options[:if] and not @record.send(validator.options[:if])
|
146
|
+
return nil if validator.options[:unless] and @record.send(validator.options[:unless])
|
147
|
+
|
148
|
+
case validator.class.to_s
|
149
|
+
when /ConfirmationValidator$/ then nil # TODO: Implement this feature
|
150
|
+
when /FormatValidator$/ then nil
|
151
|
+
when /LengthValidator$/ then parse_length_validator validator.options
|
152
|
+
when /PresenceValidator$/ then 'blank'
|
153
|
+
when /UniquenessValidator$/ then nil
|
154
|
+
else nil
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def set_other_validations
|
159
|
+
validators = []
|
160
|
+
|
161
|
+
validators << 'numeric' if @record.fields[@field_name.to_s] and @record.fields[@field_name.to_s].options[:type] == Integer
|
162
|
+
|
163
|
+
return validators
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::Field
|
5
|
+
class Checkbox < Caisson::Helpers::Form::Builder::Field::Base
|
6
|
+
#*************************************************************************************
|
7
|
+
# PUBLIC INSTANCE METHODS
|
8
|
+
#*************************************************************************************
|
9
|
+
def build
|
10
|
+
@options[:label] = label
|
11
|
+
|
12
|
+
Caisson::Helpers::Form::Field::Checkbox.new(@core).build(field_name, value, @options)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::Field
|
5
|
+
class Money < Caisson::Helpers::Form::Builder::Field::Base
|
6
|
+
#*************************************************************************************
|
7
|
+
# PUBLIC INSTANCE METHODS
|
8
|
+
#*************************************************************************************
|
9
|
+
def build
|
10
|
+
Caisson::Helpers::Form::Field::Money.new(@core).build(field_name, value, @options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::Field
|
5
|
+
class Password < Caisson::Helpers::Form::Builder::Field::Base
|
6
|
+
#*************************************************************************************
|
7
|
+
# PUBLIC INSTANCE METHODS
|
8
|
+
#*************************************************************************************
|
9
|
+
def build
|
10
|
+
Caisson::Helpers::Form::Field::Password.new(@core).build(field_name, value, @options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::Field
|
5
|
+
class Percent < Caisson::Helpers::Form::Builder::Field::Base
|
6
|
+
#*************************************************************************************
|
7
|
+
# PUBLIC INSTANCE METHODS
|
8
|
+
#*************************************************************************************
|
9
|
+
def build
|
10
|
+
Caisson::Helpers::Form::Field::Percent.new(@core).build(field_name, value, @options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::Field
|
5
|
+
class Select < Caisson::Helpers::Form::Builder::Field::Base
|
6
|
+
#*************************************************************************************
|
7
|
+
# PUBLIC INSTANCE METHODS
|
8
|
+
#*************************************************************************************
|
9
|
+
def build
|
10
|
+
@options.reverse_merge!(choices: nil, include_blank: false)
|
11
|
+
|
12
|
+
choices = parse_choices @options[:choices]
|
13
|
+
|
14
|
+
@options.delete(:choices)
|
15
|
+
@options.delete(:include_blank)
|
16
|
+
@options[:translate] = false
|
17
|
+
|
18
|
+
Caisson::Helpers::Form::Field::Select.new(@core).build(field_name, choices, value, @options)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
#*************************************************************************************
|
24
|
+
# PRIVATE INSTANCE METHODS
|
25
|
+
#*************************************************************************************
|
26
|
+
def parse_choices(choices)
|
27
|
+
if choices
|
28
|
+
if not choices.is_a? Array or not choices.first.is_a? Array
|
29
|
+
# choices are a list of records
|
30
|
+
choices = choices.choices_for_select
|
31
|
+
choices.insert(0, interpreti.blank_choice(name)) if @options[:include_blank]
|
32
|
+
end
|
33
|
+
else
|
34
|
+
choices = interpreti.field_choices(name, include_blank: @options[:include_blank])
|
35
|
+
end
|
36
|
+
|
37
|
+
return choices
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::Field
|
5
|
+
class Text < Caisson::Helpers::Form::Builder::Field::Base
|
6
|
+
#*************************************************************************************
|
7
|
+
# PUBLIC INSTANCE METHODS
|
8
|
+
#*************************************************************************************
|
9
|
+
def build
|
10
|
+
Caisson::Helpers::Form::Field::Text.new(@core).build(field_name, value, @options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::Field
|
5
|
+
class Textarea < Caisson::Helpers::Form::Builder::Field::Base
|
6
|
+
#*************************************************************************************
|
7
|
+
# PUBLIC INSTANCE METHODS
|
8
|
+
#*************************************************************************************
|
9
|
+
def build
|
10
|
+
Caisson::Helpers::Form::Field::Textarea.new(@core).build(field_name, value, @options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#*************************************************************************************
|
2
|
+
# TOCOMMENT
|
3
|
+
#*************************************************************************************
|
4
|
+
module Caisson::Helpers::Form::Builder::FieldBuilder
|
5
|
+
class Base
|
6
|
+
attr_reader :nature
|
7
|
+
attr_reader :core
|
8
|
+
|
9
|
+
delegate :content_tag, to: :core
|
10
|
+
delegate :interpreti, to: :core
|
11
|
+
|
12
|
+
#*************************************************************************************
|
13
|
+
# CONSTRUCTOR
|
14
|
+
#*************************************************************************************
|
15
|
+
def initialize(core, name, options={})
|
16
|
+
options.reverse_merge!(nature: nil, hint: true)
|
17
|
+
|
18
|
+
@core = core
|
19
|
+
@name = name
|
20
|
+
@options = options.dup
|
21
|
+
@record = core.record
|
22
|
+
@show_hint = options[:hint]
|
23
|
+
|
24
|
+
@nature = Caisson::Helpers::Form::Builder::FieldBuilder::Nature.new(@record, name).get(force: options[:nature])
|
25
|
+
end
|
26
|
+
|
27
|
+
#*************************************************************************************
|
28
|
+
# PUBLIC INSTANCE METHODS
|
29
|
+
#*************************************************************************************
|
30
|
+
def build
|
31
|
+
"Caisson::Helpers::Form::Builder::Field::#{@nature.camelize}".constantize.new(@core, @record, @name, @options).build
|
32
|
+
end
|
33
|
+
|
34
|
+
def checkbox?
|
35
|
+
nature == 'checkbox'
|
36
|
+
end
|
37
|
+
|
38
|
+
def errors?
|
39
|
+
not errors.empty?
|
40
|
+
end
|
41
|
+
|
42
|
+
def errors
|
43
|
+
interpreti.field_errors(@name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def hidden?
|
47
|
+
@nature == 'hidden'
|
48
|
+
end
|
49
|
+
|
50
|
+
def hint?
|
51
|
+
not interpreti.field_hint(@name).blank? and @show_hint
|
52
|
+
end
|
53
|
+
|
54
|
+
def label
|
55
|
+
interpreti.field_label(@name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def wrap_field(field_tags)
|
59
|
+
css_class = ['field']
|
60
|
+
css_class << 'errors' if errors?
|
61
|
+
|
62
|
+
content_tag(:div, field_tags + wrapper_hint + wrapper_errors, class: css_class.join(' '))
|
63
|
+
end
|
64
|
+
|
65
|
+
def wrapper_errors
|
66
|
+
if errors?
|
67
|
+
content_tag(:div, errors.map{|e| content_tag(:span, e)}.join.html_safe, class: 'error-messages')
|
68
|
+
else
|
69
|
+
''
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def wrapper_hint
|
74
|
+
if hint?
|
75
|
+
content_tag(:div, interpreti.field_hint(@name).html_safe, class: 'hint')
|
76
|
+
else
|
77
|
+
''
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|