formize 0.0.10 → 0.0.11
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/{LICENSE.txt → MIT-LICENSE} +0 -0
- data/README.rdoc +19 -3
- data/VERSION +1 -1
- data/lib/assets/javascripts/formize.js +23 -5
- data/lib/formize.rb +14 -10
- data/lib/formize/{action_pack.rb → action_controller.rb} +6 -5
- data/lib/formize/definition.rb +9 -5
- data/lib/formize/definition/field.rb +55 -53
- data/lib/formize/definition/field_set.rb +52 -27
- data/lib/formize/definition/form.rb +97 -83
- data/lib/formize/definition/form_element.rb +98 -114
- data/lib/formize/engine.rb +5 -0
- data/lib/formize/generator.rb +520 -484
- data/lib/formize/helpers.rb +8 -0
- data/lib/formize/helpers/asset_tag_helper.rb +33 -0
- data/lib/formize/helpers/form_helper.rb +131 -0
- data/lib/formize/helpers/tag_helper.rb +14 -0
- data/lib/formize/railtie.rb +17 -0
- metadata +22 -27
- data/.document +0 -5
- data/.travis.yml +0 -8
- data/Rakefile +0 -54
- data/ci/Gemfile.rails-3.0.x +0 -11
- data/ci/Gemfile.rails-3.1.x +0 -11
- data/formize.gemspec +0 -150
- data/lib/formize/definition/element.rb +0 -56
- data/lib/formize/form_helper.rb +0 -150
- data/test/helper.rb +0 -9
- data/test/test_formize.rb +0 -9
@@ -1,140 +1,124 @@
|
|
1
1
|
module Formize
|
2
|
+
|
3
|
+
module Definition
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
5
|
+
# Main class for form elements
|
6
|
+
class FormElement
|
7
|
+
attr_reader :children, :depend_on, :form, :html_id, :id, :options, :parent, :unique_name
|
8
|
+
@@count = 0 # unless defined? @@count
|
9
|
+
|
10
|
+
def initialize(form, parent = nil, options={})
|
11
|
+
raise ArgumentError.new("Bad form (#{form.class.name}). Must be an Formize::Definition::Form") unless form.is_a? Formize::Definition::Form
|
12
|
+
@form = form
|
13
|
+
@parent = parent
|
14
|
+
@options = (options.is_a?(Hash) ? options : {})
|
15
|
+
@depend_on = nil
|
16
|
+
@children = []
|
17
|
+
@@count += 1
|
18
|
+
@id = @@count.to_s(36)
|
19
|
+
if Rails.env == "development"
|
20
|
+
@html_id = "fz_#{@form.options[:best_name]}_#{@id}"
|
21
|
+
else
|
22
|
+
@html_id = "fz#{@id}"
|
23
|
+
end
|
24
|
+
@unique_name = self.form.unique_name + "_" + @html_id
|
25
|
+
end
|
19
26
|
|
20
27
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
28
|
+
def dependeds
|
29
|
+
l = (self.parent ? self.parent.dependeds : [])
|
30
|
+
l << {:name=>self.depend_on} unless self.depend_on.blank?
|
31
|
+
return l
|
32
|
+
end
|
26
33
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
def arguments
|
35
|
+
args = []
|
36
|
+
args << {:name=>form.record_name}
|
37
|
+
# args += self.dependeds
|
38
|
+
# args << {:name=>@depend_on} if @depend_on
|
39
|
+
return args
|
40
|
+
end
|
34
41
|
|
35
|
-
|
36
|
-
|
37
|
-
|
42
|
+
def prototype
|
43
|
+
return "#{@unique_name}(" + arguments.collect{|x| x[:name]}.join(', ') + ")"
|
44
|
+
end
|
38
45
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
# code = "def #{method_name}(record)\n"
|
48
|
-
# code << inner_method_code(options).gsub(/^/, ' ')
|
49
|
-
# code << " return #{varh}\n"
|
50
|
-
# code << "end\n"
|
51
|
-
# return code
|
52
|
-
# end
|
53
|
-
|
54
|
-
# def method_call_code(options={})
|
55
|
-
# return inner_method_code(options) unless self.is_method?
|
56
|
-
# return "#{method_name}(record)"
|
57
|
-
# end
|
58
|
-
|
59
|
-
# def inner_method_code(options={})
|
60
|
-
# # raise NotImplementedError.new
|
61
|
-
# return content_tag(:strong, "'#{self.class.name} does not implement :#{__method__} method'", options)
|
62
|
-
# end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
# def is_method?
|
67
|
-
# @depend_on.nil?
|
68
|
-
# end
|
69
|
-
|
70
|
-
# def methodics
|
71
|
-
# elements = []
|
72
|
-
# for child in self.children
|
73
|
-
# elements += child.methodics
|
74
|
-
# end
|
75
|
-
# elements << self if self.is_method?
|
76
|
-
# return elements
|
77
|
-
# end
|
78
|
-
|
79
|
-
def mono_choices
|
80
|
-
elements = []
|
81
|
-
for child in self.children
|
82
|
-
elements += child.mono_choices
|
46
|
+
|
47
|
+
def mono_choices
|
48
|
+
elements = []
|
49
|
+
for child in self.children
|
50
|
+
elements += child.mono_choices
|
51
|
+
end
|
52
|
+
elements << self if self.class == Formize::Definition::Field and self.type == :mono_choice
|
53
|
+
return elements
|
83
54
|
end
|
84
|
-
elements << self if self.class == Formize::Field and self.type == :mono_choice
|
85
|
-
return elements
|
86
|
-
end
|
87
55
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
56
|
+
def all_fields
|
57
|
+
elements = HashWithIndifferentAccess.new()
|
58
|
+
for child in self.children
|
59
|
+
elements.merge!(child.all_fields)
|
60
|
+
end
|
61
|
+
elements[self.name] = self if self.class == Formize::Definition::Field
|
62
|
+
return elements
|
92
63
|
end
|
93
|
-
elements[self.name] = self if self.class == Formize::Field
|
94
|
-
return elements
|
95
|
-
end
|
96
64
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
65
|
+
def dependents
|
66
|
+
elements = []
|
67
|
+
for child in self.children
|
68
|
+
elements += child.dependents
|
69
|
+
end
|
70
|
+
elements << self if self.options[:depend_on]
|
71
|
+
return elements
|
101
72
|
end
|
102
|
-
elements << self if self.options[:depend_on]
|
103
|
-
return elements
|
104
|
-
end
|
105
73
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
74
|
+
|
75
|
+
def all_elements
|
76
|
+
elements = self.children.collect{|c| c.all_elements}.flatten
|
77
|
+
elements << self
|
78
|
+
return elements
|
79
|
+
end
|
112
80
|
|
113
81
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
82
|
+
# Find form elements
|
83
|
+
def dependents_on(element)
|
84
|
+
elements = []
|
85
|
+
for child in self.children
|
86
|
+
elements += child.dependents_on(element)
|
87
|
+
end
|
88
|
+
elements << self if self.depend_on and self.depend_on.to_s == element.name.to_s # form.fields[self.depend_on].name == element.name
|
89
|
+
return elements
|
119
90
|
end
|
120
|
-
elements << self if self.depend_on and self.depend_on.to_s == element.name.to_s # form.fields[self.depend_on].name == element.name
|
121
|
-
return elements
|
122
|
-
end
|
123
91
|
|
92
|
+
def shown_if(element)
|
93
|
+
elements = []
|
94
|
+
for child in self.children
|
95
|
+
elements += child.shown_if(element)
|
96
|
+
end
|
97
|
+
elements << self if self.options[:shown_if] and self.options[:shown_if].to_s == element.name.to_s
|
98
|
+
return elements
|
99
|
+
end
|
124
100
|
|
101
|
+
def hidden_if(element)
|
102
|
+
elements = []
|
103
|
+
for child in self.children
|
104
|
+
elements += child.hidden_if(element)
|
105
|
+
end
|
106
|
+
elements << self if self.options[:hidden_if] and self.options[:hidden_if].to_s == element.name.to_s
|
107
|
+
return elements
|
108
|
+
end
|
125
109
|
|
126
110
|
|
127
|
-
|
111
|
+
protected
|
128
112
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
113
|
+
def new_child(klass, *args)
|
114
|
+
raise ArgumentError.new("Bad child type (#{klass.name}). Must be an Formize::Definition::FormElement") unless klass < Formize::Definition::FormElement
|
115
|
+
element = klass.new(self.form, self, *args)
|
116
|
+
@children << element
|
117
|
+
return element
|
118
|
+
end
|
135
119
|
|
136
120
|
|
121
|
+
end
|
137
122
|
end
|
138
123
|
|
139
|
-
|
140
124
|
end
|
data/lib/formize/generator.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Formize
|
2
2
|
|
3
3
|
# Permits to not quote text in inspect method
|
4
|
-
class Code < String
|
4
|
+
class Code < String # :nodoc:
|
5
5
|
|
6
6
|
def inspect
|
7
7
|
self.to_s
|
@@ -9,564 +9,600 @@ module Formize
|
|
9
9
|
|
10
10
|
end
|
11
11
|
|
12
|
+
module Generator
|
13
|
+
class Base
|
14
|
+
|
15
|
+
attr_accessor :form, :elements, :record_name, :partial, :controller
|
16
|
+
|
17
|
+
def initialize(form, controller)
|
18
|
+
@form = form
|
19
|
+
@controller = controller
|
20
|
+
@record_name = @form.record_name
|
21
|
+
@elements = form.all_elements
|
22
|
+
@partials = @elements.select{|e| !e.depend_on.nil? or e.options[:new]}
|
23
|
+
end
|
12
24
|
|
13
|
-
class Generator
|
14
|
-
|
15
|
-
attr_accessor :form, :elements, :record_name, :partial, :controller
|
16
25
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
@record_name = @form.record_name
|
21
|
-
@elements = form.all_elements
|
22
|
-
@partials = @elements.select{|e| !e.depend_on.nil? or e.options[:new]}
|
23
|
-
end
|
26
|
+
# Generates the controller method from a form object
|
27
|
+
def controller_code
|
28
|
+
code = "def #{form.controller_method_name}\n"
|
24
29
|
|
30
|
+
# Mono_choice search/filter
|
31
|
+
items = form.mono_choices
|
32
|
+
if items.size > 0
|
33
|
+
code << " if params[:unroll]\n"
|
34
|
+
events = form.mono_choices.collect do |mono_choice|
|
35
|
+
event = "if params[:unroll] == '#{mono_choice.html_id}'\n"
|
25
36
|
|
26
|
-
|
27
|
-
|
28
|
-
|
37
|
+
for depended in mono_choice.dependeds
|
38
|
+
df = form.all_fields[depended[:name]]
|
39
|
+
event << " #{df.name} = " << (df.reflection.nil? ? "params[:#{df.input_id}]" : "#{df.reflection.class_name}.find_by_id(params[:#{df.input_id}])") << "\n"
|
40
|
+
# locals[df.name.to_sym] = Code.new(df.name)
|
41
|
+
end
|
29
42
|
|
30
|
-
|
31
|
-
|
32
|
-
if items.size > 0
|
33
|
-
code << " if params[:unroll]\n"
|
34
|
-
events = form.mono_choices.collect do |mono_choice|
|
35
|
-
event = "if params[:unroll] == '#{mono_choice.html_id}'\n"
|
36
|
-
|
37
|
-
for depended in mono_choice.dependeds
|
38
|
-
df = form.fields[depended[:name]]
|
39
|
-
event << " #{df.name} = " << (df.reflection.nil? ? "params[:#{df.input_id}]" : "#{df.reflection.class_name}.find_by_id(params[:#{df.input_id}])") << "\n"
|
40
|
-
# locals[df.name.to_sym] = Code.new(df.name)
|
43
|
+
event << mono_choice_search_code(mono_choice).strip.gsub(/^/, ' ') << "\n"
|
44
|
+
event << "end\n"
|
41
45
|
end
|
42
|
-
|
43
|
-
|
44
|
-
event << "end\n"
|
46
|
+
code << events.collect{|e| e.gsub(/^/, ' ')}.join
|
47
|
+
code << " end\n"
|
45
48
|
end
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
event << "
|
49
|
+
|
50
|
+
# Dependencies refresh
|
51
|
+
items = @partials
|
52
|
+
if items.size > 0
|
53
|
+
code << " if params[:refresh]\n"
|
54
|
+
code << " #{record_name} = #{form.model.name}.find(params[:id]) if params[:id].to_i > 0\n"
|
55
|
+
code << " #{record_name} ||= #{form.model.name}.new\n"
|
56
|
+
code << " @#{record_name} = #{record_name}\n"
|
57
|
+
events = items.collect do |dependent|
|
58
|
+
event = "if params[:refresh] == '#{dependent.html_id}'\n"
|
59
|
+
locals = {record_name.to_sym => Code.new(record_name)}
|
60
|
+
for depended in dependent.dependeds
|
61
|
+
df = form.all_fields[depended[:name]]
|
62
|
+
event << " #{record_name}.#{df.name} = " << (df.reflection.nil? ? "params[:#{df.input_id}]" : "#{df.reflection.class_name}.find_by_id(params[:#{df.input_id}])") << "\n"
|
63
|
+
# locals[df.name.to_sym] = Code.new(df.name)
|
64
|
+
end
|
65
|
+
if dependent.is_a?(Formize::Definition::Field) and dependent.reflection
|
66
|
+
event << " #{record_name}.#{dependent.reflection.primary_key_name} = params[:selected].to_i if params[:selected]\n"
|
67
|
+
end
|
68
|
+
event << " render(:inline=>'<%=#{dependent.prototype}-%>', :locals=>#{locals.inspect})\n"
|
69
|
+
event << "end\n"
|
67
70
|
end
|
68
|
-
|
69
|
-
|
71
|
+
code << events.collect{|e| e.gsub(/^/, ' ')}.join
|
72
|
+
code << " end\n"
|
73
|
+
end
|
74
|
+
|
75
|
+
# End
|
76
|
+
code << "end\n"
|
77
|
+
code.gsub!(/end\s*if/, 'elsif')
|
78
|
+
# raise code
|
79
|
+
# list = code.split("\n"); list.each_index{|x| puts((x+1).to_s.rjust(4)+": "+list[x])}
|
80
|
+
return code
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
# Generates the view method from a form object
|
86
|
+
def view_code
|
87
|
+
code = ""
|
88
|
+
|
89
|
+
varh = 'html'
|
90
|
+
|
91
|
+
# Build view methods assimilated to partials
|
92
|
+
for element in @partials
|
93
|
+
code << "# #{element.class.name}: #{element.html_id}/#{element.name}\n"
|
94
|
+
code << view_method_code(element, varh)
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
code << "\n"
|
99
|
+
code << "def #{form.options[:view_fields_method_name]}(#{form.record_name}=nil)\n"
|
100
|
+
code << " #{form.record_name} = @#{form.record_name} unless #{form.record_name}.is_a?(#{form.model.name})\n"
|
101
|
+
code << " #{varh} = ''\n"
|
102
|
+
code << " with_custom_field_error_proc do\n"
|
103
|
+
for element in form.elements
|
104
|
+
code << view_method_call(element, varh).strip.gsub(/^/, ' ') << "\n"
|
70
105
|
end
|
71
|
-
code << events.collect{|e| e.gsub(/^/, ' ')}.join
|
72
106
|
code << " end\n"
|
107
|
+
code << " return #{varh}.html_safe\n"
|
108
|
+
code << "end\n"
|
109
|
+
|
110
|
+
code << "\n"
|
111
|
+
code << "def #{form.options[:view_form_method_name]}(#{form.record_name}=nil)\n"
|
112
|
+
code << " #{form.record_name} = @#{form.record_name} unless #{form.record_name}.is_a?(#{form.model.name})\n"
|
113
|
+
code << " #{varh} = ''\n"
|
114
|
+
code << " if #{form.record_name}.errors.any?\n"
|
115
|
+
code << " #{varh} << hard_content_tag(:div, :class=>'errors') do |fe|\n"
|
116
|
+
code << " fe << content_tag(:h2, ::I18n.translate('activerecord.errors.template.body', :count=>#{form.record_name}.errors.size))\n"
|
117
|
+
code << " if #{form.record_name}.errors[:base].any?\n"
|
118
|
+
code << " fe << '<ul>'\n"
|
119
|
+
code << " for error in #{form.record_name}.errors[:base]\n"
|
120
|
+
code << " fe << content_tag(:li, error)\n"
|
121
|
+
code << " end\n"
|
122
|
+
code << " fe << '</ul>'\n"
|
123
|
+
code << " end\n"
|
124
|
+
code << " end\n"
|
125
|
+
code << " end\n"
|
126
|
+
code << " #{varh} << form_for(#{form.record_name}, :html=>(params[:dialog] ? {'data-dialog'=>params[:dialog]} : {})) do\n"
|
127
|
+
code << " concat(#{form.options[:view_fields_method_name]}(#{form.record_name}))\n"
|
128
|
+
code << " concat(submit_for(#{form.record_name}))\n"
|
129
|
+
code << " end\n"
|
130
|
+
code << " return #{varh}.html_safe\n"
|
131
|
+
code << "end\n"
|
132
|
+
|
133
|
+
# raise code
|
134
|
+
# list = code.split("\n"); list.each_index{|x| puts((x+1).to_s.rjust(4)+": "+list[x])}
|
135
|
+
return code
|
73
136
|
end
|
74
137
|
|
75
|
-
# End
|
76
|
-
code << "end\n"
|
77
|
-
code.gsub!(/end\s*if/, 'elsif')
|
78
|
-
# raise code
|
79
|
-
list = code.split("\n"); list.each_index{|x| puts((x+1).to_s.rjust(4)+": "+list[x])}
|
80
|
-
return code
|
81
|
-
end
|
82
138
|
|
83
139
|
|
84
140
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
code << "def #{form.options[:view_fields_method_name]}(#{form.record_name}=nil)\n"
|
100
|
-
code << " #{form.record_name} = @#{form.record_name} unless #{form.record_name}.is_a?(#{form.model.name})\n"
|
101
|
-
code << " #{varh} = ''\n"
|
102
|
-
code << " with_custom_field_error_proc do\n"
|
103
|
-
for element in form.elements
|
104
|
-
code << view_method_call(element, varh).strip.gsub(/^/, ' ') << "\n"
|
105
|
-
end
|
106
|
-
code << " end\n"
|
107
|
-
code << " return #{varh}.html_safe\n"
|
108
|
-
code << "end\n"
|
109
|
-
|
110
|
-
code << "\n"
|
111
|
-
code << "def #{form.options[:view_form_method_name]}(#{form.record_name}=nil)\n"
|
112
|
-
code << " #{form.record_name} = @#{form.record_name} unless #{form.record_name}.is_a?(#{form.model.name})\n"
|
113
|
-
code << " #{varh} = ''\n"
|
114
|
-
code << " if #{form.record_name}.errors.any?\n"
|
115
|
-
code << " #{varh} << hard_content_tag(:div, :class=>'errors') do |fe|\n"
|
116
|
-
code << " fe << content_tag(:h2, ::I18n.translate('activerecord.errors.template.body', :count=>#{form.record_name}.errors.size))\n"
|
117
|
-
code << " if #{form.record_name}.errors[:base].any?\n"
|
118
|
-
code << " fe << '<ul>'\n"
|
119
|
-
code << " for error in #{form.record_name}.errors[:base]\n"
|
120
|
-
code << " fe << content_tag(:li, error)\n"
|
121
|
-
code << " end\n"
|
122
|
-
code << " fe << '</ul>'\n"
|
123
|
-
code << " end\n"
|
124
|
-
code << " end\n"
|
125
|
-
code << " end\n"
|
126
|
-
code << " #{varh} << form_for(#{form.record_name}, :html=>(params[:dialog] ? {'data-dialog'=>params[:dialog]} : {})) do\n"
|
127
|
-
code << " concat(#{form.options[:view_fields_method_name]}(#{form.record_name}))\n"
|
128
|
-
code << " concat(submit_for(#{form.record_name}))\n"
|
129
|
-
code << " end\n"
|
130
|
-
code << " return #{varh}.html_safe\n"
|
131
|
-
code << "end\n"
|
132
|
-
|
133
|
-
# raise code
|
134
|
-
list = code.split("\n"); list.each_index{|x| puts((x+1).to_s.rjust(4)+": "+list[x])}
|
135
|
-
return code
|
136
|
-
end
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
def view_partial_code(element, varh='varh')
|
143
|
-
# send("#{element.class.name.split('::')[-1].underscore}_#{__method__}", element, varh)
|
144
|
-
special_method = "#{element.class.name.split('::')[-1].underscore}_#{__method__}".to_sym
|
145
|
-
code = ""
|
146
|
-
partial_code = send(special_method, element, varh)
|
147
|
-
dependeds = element.dependeds.collect{|d| d[:name]}
|
148
|
-
if dependeds.size > 0
|
149
|
-
for depended in dependeds
|
150
|
-
depended_field = form.fields[depended]
|
151
|
-
code << "#{depended_field.name} = #{form.record_name}.#{depended_field.name}\n"
|
152
|
-
if depended_field.reflection
|
153
|
-
code << "#{depended_field.name} ||= #{field_datasource(depended_field)}.first\n"
|
141
|
+
|
142
|
+
def view_partial_code(element, varh='varh')
|
143
|
+
# send("#{element.class.name.split('::')[-1].underscore}_#{__method__}", element, varh)
|
144
|
+
special_method = "#{element.class.name.split('::')[-1].underscore}_#{__method__}".to_sym
|
145
|
+
code = ""
|
146
|
+
partial_code = send(special_method, element, varh)
|
147
|
+
dependeds = element.dependeds.collect{|d| d[:name]}
|
148
|
+
if dependeds.size > 0
|
149
|
+
for depended in dependeds
|
150
|
+
depended_field = form.all_fields[depended]
|
151
|
+
code << "#{depended_field.name} = #{form.record_name}.#{depended_field.name}\n"
|
152
|
+
if depended_field.reflection
|
153
|
+
code << "#{depended_field.name} ||= #{field_datasource(depended_field)}.first\n"
|
154
|
+
end
|
154
155
|
end
|
155
|
-
end
|
156
156
|
|
157
|
-
|
157
|
+
code << "if #{dependeds.join(' and ')}\n"
|
158
158
|
|
159
|
-
|
159
|
+
code << partial_code.strip.gsub(/^/, ' ') << "\n"
|
160
160
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
161
|
+
code << "else\n"
|
162
|
+
code << " #{varh} << content_tag(:div, '', #{wrapper_attrs(element).inspect})\n"
|
163
|
+
code << "end\n"
|
164
|
+
else
|
165
|
+
code = partial_code
|
166
|
+
end
|
167
|
+
|
168
|
+
# General condition
|
169
|
+
if element.options[:if]
|
170
|
+
code = "if #{options[:if]}\n"+code.strip.gsub(/^/, ' ')+"\nend\n"
|
171
|
+
elsif element.options[:unless]
|
172
|
+
code = "unless #{options[:unless]}\n"+code.strip.gsub(/^/, ' ')+"\nend\n"
|
173
|
+
end
|
174
|
+
return code
|
166
175
|
end
|
167
|
-
return code
|
168
|
-
end
|
169
176
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
177
|
+
def view_method_code(element, varh='varh')
|
178
|
+
# send("#{element.class.name.split('::')[-1].underscore}_#{__method__}", element, varh)
|
179
|
+
special_method = "#{element.class.name.split('::')[-1].underscore}_#{__method__}".to_sym
|
180
|
+
return send(special_method, element, varh) if self.respond_to?(special_method)
|
181
|
+
code = "def #{element.prototype}\n"
|
182
|
+
code << " #{varh} = ''\n"
|
183
|
+
code << view_partial_code(element, varh).strip.gsub(/^/, ' ') << "\n"
|
184
|
+
code << " return #{varh}.html_safe\n"
|
185
|
+
code << "end\n"
|
186
|
+
return code
|
187
|
+
end
|
181
188
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
+
def view_method_call(element, varh='varh')
|
190
|
+
special_method = "#{element.class.name.split('::')[-1].underscore}_#{__method__}".to_sym
|
191
|
+
return send(special_method, element, varh) if self.respond_to?(special_method)
|
192
|
+
if @partials.include?(element)
|
193
|
+
return "#{varh} << #{element.prototype}\n"
|
194
|
+
else
|
195
|
+
return view_partial_code(element, varh).strip << "\n"
|
196
|
+
end
|
189
197
|
end
|
190
|
-
end
|
191
198
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
199
|
+
def wrapper_attrs(element)
|
200
|
+
html_options = (element.respond_to?(:html_options) ? element.html_options.dup : {})
|
201
|
+
html_options[:id] = element.html_id
|
202
|
+
if element.options[:hidden_if]
|
203
|
+
field = form.all_fields[element.options[:hidden_if]]
|
204
|
+
raise ArgumentError.new("Option :hidden_if must reference a check_box field (Not #{field.type.inspect})") unless field.type == :check_box
|
205
|
+
html_options['data-hidden-if'] = field.input_id
|
206
|
+
elsif element.options[:shown_if]
|
207
|
+
field = form.all_fields[element.options[:shown_if]]
|
208
|
+
raise ArgumentError.new("Option :shown_if must reference a check_box field (Not #{field.type.inspect})") unless field.type == :check_box
|
209
|
+
html_options['data-shown-if'] = field.input_id
|
210
|
+
end
|
211
|
+
if @partials.include?(element)
|
212
|
+
url = {:controller => controller.controller_name.to_sym, :action=>form.action_name.to_sym, :refresh=>element.html_id}
|
213
|
+
# for depended in element.dependeds
|
214
|
+
# df = form.all_fields[depended[:name]]
|
215
|
+
# # url[df.input_id.to_sym] = Code.new(df.reflection.nil? ? df.name : "#{df.name}.id")
|
216
|
+
# end
|
217
|
+
html_options["data-refresh"] = Code.new("url_for(#{url.inspect})")
|
218
|
+
end
|
219
|
+
special_method = "#{element.class.name.split('::')[-1].underscore}_#{__method__}".to_sym
|
220
|
+
return send(special_method, element, html_options) if self.respond_to?(special_method)
|
221
|
+
return html_options
|
202
222
|
end
|
203
|
-
special_method = "#{element.class.name.split('::')[-1].underscore}_#{__method__}".to_sym
|
204
|
-
return send(special_method, element, html_options) if self.respond_to?(special_method)
|
205
|
-
return html_options
|
206
|
-
end
|
207
223
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
def field_set_view_partial_code(field_set, varh='varh')
|
213
|
-
# Initialize html attributes
|
214
|
-
html_options = wrapper_attrs(field_set)
|
224
|
+
#####################################################################################
|
225
|
+
# F I E L D _ S E T M E T H O D S #
|
226
|
+
#####################################################################################
|
215
227
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
228
|
+
def group_view_partial_code(group, varh='varh')
|
229
|
+
# Initialize html attributes
|
230
|
+
html_options = wrapper_attrs(group)
|
231
|
+
|
232
|
+
varc = group.html_id # "group_#{group.html_id}"
|
233
|
+
code = "#{varh} << hard_content_tag(:div, #{html_options.inspect}) do |#{varc}|\n"
|
234
|
+
for child in group.children
|
235
|
+
code << view_method_call(child, varc).strip.gsub(/^/, ' ') << "\n"
|
236
|
+
end
|
237
|
+
code << "end\n"
|
238
|
+
return code
|
220
239
|
end
|
221
|
-
|
222
|
-
|
240
|
+
|
241
|
+
|
242
|
+
def field_set_view_partial_code(field_set, varh='varh')
|
243
|
+
# Initialize html attributes
|
244
|
+
html_options = wrapper_attrs(field_set)
|
245
|
+
|
246
|
+
varc = field_set.html_id # "field_set_#{field_set.html_id}"
|
247
|
+
code = "#{varh} << hard_content_tag(:fieldset, #{html_options.inspect}) do |#{varc}|\n"
|
248
|
+
unless field_set.title.nil?
|
249
|
+
code << " #{varc} << content_tag(:legend, ::I18n.translate('labels.#{field_set.title}'))\n"
|
250
|
+
end
|
251
|
+
for child in field_set.children
|
252
|
+
code << view_method_call(child, varc).strip.gsub(/^/, ' ') << "\n"
|
253
|
+
end
|
254
|
+
code << "end\n"
|
255
|
+
return code
|
223
256
|
end
|
224
|
-
code << "end\n"
|
225
|
-
return code
|
226
|
-
end
|
227
257
|
|
228
|
-
|
229
|
-
|
230
|
-
|
258
|
+
#####################################################################################
|
259
|
+
# F I E L D M E T H O D S #
|
260
|
+
#####################################################################################
|
231
261
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
input_attrs["data-dependents"] = deps.collect{|d| "##{d.html_id}"}.join(',')
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
code << " #{varc} << '<tr><td class=\"label\">'\n"
|
245
|
-
code << " #{varc} << label(:#{form.record_name}, :#{field.name}, nil, :class=>'attr')\n"
|
246
|
-
code << " #{varc} << '</td><td class=\"input\">'\n"
|
247
|
-
code << " #{form.record_name}.#{field.name} ||= #{field.default.inspect}\n" if field.default
|
248
|
-
code << self.send("field_#{field.type}_input", field, input_attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
249
|
-
code << " if @#{form.record_name}.errors['#{field.name}'].any?\n"
|
250
|
-
code << " #{varc} << '<ul class=\"inline-errors\">'\n"
|
251
|
-
code << " for error in @#{form.record_name}.errors['#{field.name}']\n"
|
252
|
-
code << " #{varc} << content_tag(:li, error)\n"
|
253
|
-
code << " end\n"
|
254
|
-
code << " #{varc} << '</ul>'\n"
|
255
|
-
code << " end\n"
|
256
|
-
code << " #{varc} << '</td></tr>'\n"
|
257
|
-
code << "end\n"
|
258
|
-
return code
|
259
|
-
end
|
262
|
+
def field_view_partial_code(field, varh='varh')
|
263
|
+
input_attrs = (field.options[:input_options].is_a?(Hash) ? field.options[:input_options] : {})
|
264
|
+
# deps = form.dependents_on(field)
|
265
|
+
# if deps.size > 0
|
266
|
+
# input_attrs["data-dependents"] = deps.collect{|d| "##{d.html_id}"}.join(',')
|
267
|
+
# end
|
268
|
+
for method, name in {:dependents_on=>"dependents", :shown_if=>"show", :hidden_if=>"hide"}
|
269
|
+
elements = form.send(method, field)
|
270
|
+
if elements.size > 0
|
271
|
+
input_attrs["data-#{name}"] = elements.collect{|d| "##{d.html_id}"}.join(',')
|
272
|
+
end
|
273
|
+
end
|
260
274
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
#
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
275
|
+
# Initialize html attributes
|
276
|
+
html_options = wrapper_attrs(field)
|
277
|
+
|
278
|
+
varc = field.html_id
|
279
|
+
code = "#{varh} << hard_content_tag(:table, #{html_options.inspect}) do |#{varc}|\n"
|
280
|
+
code << " #{varc} << '<tr><td class=\"label\">'\n"
|
281
|
+
code << " #{varc} << label(:#{form.record_name}, :#{field.name}, nil, :class=>'attr')\n"
|
282
|
+
code << " #{varc} << '</td><td class=\"input\">'\n"
|
283
|
+
code << " #{form.record_name}.#{field.name} ||= (#{Code.new(field.default)})\n" if field.default
|
284
|
+
code << self.send("field_#{field.type}_input", field, input_attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
285
|
+
code << " if @#{form.record_name}.errors['#{field.name}'].any?\n"
|
286
|
+
code << " #{varc} << '<ul class=\"inline-errors\">'\n"
|
287
|
+
code << " for error in @#{form.record_name}.errors['#{field.name}']\n"
|
288
|
+
code << " #{varc} << content_tag(:li, error)\n"
|
289
|
+
code << " end\n"
|
290
|
+
code << " #{varc} << '</ul>'\n"
|
291
|
+
code << " end\n"
|
292
|
+
code << " #{varc} << '</td></tr>'\n"
|
293
|
+
code << "end\n"
|
294
|
+
return code
|
274
295
|
end
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
296
|
+
|
297
|
+
def field_datasource(field)
|
298
|
+
source = field.source
|
299
|
+
source = Formize.default_source unless [Array, String, Symbol].include?(source.class)
|
300
|
+
if source.is_a?(Array)
|
301
|
+
return "#{source[0]}.#{field.choices}"
|
302
|
+
elsif source == :foreign_class
|
303
|
+
# return field.reflection.class_name if field.choices.to_s == "all"
|
304
|
+
return "#{field.reflection.class_name}.#{field.choices}"
|
305
|
+
elsif source == :class
|
306
|
+
# return form.model.name if field.choices.to_s == "all"
|
307
|
+
return "#{form.model.name}.#{field.choices}"
|
308
|
+
else
|
309
|
+
return "#{source}.#{field.choices}"
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# Returns the name of the class of the source
|
314
|
+
#
|
315
|
+
def field_datasource_class_name(field)
|
316
|
+
source = field.source
|
317
|
+
source = Formize.default_source unless [Array, String, Symbol].include?(source.class)
|
318
|
+
if source.is_a?(Array)
|
319
|
+
return source[1]
|
320
|
+
elsif source == :foreign_class
|
321
|
+
return field.reflection.class_name
|
322
|
+
elsif source == :class
|
323
|
+
return form.model.name
|
324
|
+
else
|
325
|
+
return source.to_s.classify
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
def field_input_options(field)
|
290
330
|
end
|
291
|
-
end
|
292
|
-
|
293
|
-
def field_input_options(field)
|
294
|
-
end
|
295
331
|
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
332
|
+
def field_wrapper_attrs(field, html_options={})
|
333
|
+
html_options[:class] = "fz field #{html_options[:class]}".strip
|
334
|
+
html_options[:class] = "#{html_options[:class]} #{field.type.to_s.gsub('_', '-')}".strip
|
335
|
+
html_options[:class] = "#{html_options[:class]} required".strip if field.required
|
336
|
+
html_options[:class] = Code.new("\"#{html_options[:class]}\#{' invalid' if @#{field.form.record_name}.errors['#{field.name}'].any?}\"")
|
337
|
+
return html_options
|
338
|
+
end
|
303
339
|
|
304
340
|
|
305
341
|
|
306
342
|
|
307
|
-
|
308
|
-
|
309
|
-
|
343
|
+
def field_check_box_input(field, attrs={}, varc='varc')
|
344
|
+
return "#{varc} << check_box(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
|
345
|
+
end
|
310
346
|
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
347
|
+
def field_choice_input(field, attrs={}, varc='varc')
|
348
|
+
code = if field.choices.size <= Formize.radio_count_max
|
349
|
+
field_radio_input(field, attrs, varc)
|
350
|
+
else
|
351
|
+
field_select_input(field, attrs, varc)
|
352
|
+
end
|
353
|
+
return code
|
354
|
+
end
|
319
355
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
356
|
+
def field_date_input(field, attrs={}, varc='varc')
|
357
|
+
attrs[:size] ||= 10
|
358
|
+
return "#{varc} << date_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
|
359
|
+
end
|
324
360
|
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
361
|
+
def field_datetime_input(field, attrs={}, varc='varc')
|
362
|
+
attrs[:size] ||= 16
|
363
|
+
# TODO define Date format
|
364
|
+
return "#{varc} << datetime_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
|
365
|
+
end
|
330
366
|
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
367
|
+
def field_label_input(field, attrs={}, varc='varc')
|
368
|
+
attrs[:class] = (attrs[:class]+" readonly").strip
|
369
|
+
return "#{varc} << content_tag(:span, @:#{field.record_name}.#{field.method}, #{attrs.inspect})\n"
|
370
|
+
end
|
335
371
|
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
372
|
+
def field_numeric_input(field, attrs={}, varc='varc')
|
373
|
+
attrs[:size] ||= 16
|
374
|
+
return "#{varc} << text_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
|
375
|
+
end
|
340
376
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
377
|
+
def field_password_input(field, attrs={}, varc='varc')
|
378
|
+
attrs[:size] ||= 24
|
379
|
+
return "#{varc} << password_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
|
380
|
+
end
|
345
381
|
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
382
|
+
def field_radio_input(field, attrs={}, varc='varc')
|
383
|
+
return "#{varc} << radio(:#{field.record_name}, :#{field.method}, #{field.choices.inspect}, #{attrs.inspect})\n"
|
384
|
+
# return "#{varc} << " << field.choices.collect{|x| "content_tag(:span, radio_button(:#{field.record_name}, :#{field.method}, #{x[1].inspect}) << ' ' << content_tag(:label, #{x[0].inspect}, :for=>'#{field.input_id}_#{x[1]}'), :class=>'rad')"}.join(" << ") << "\n"
|
385
|
+
end
|
350
386
|
|
351
|
-
|
352
|
-
|
353
|
-
|
387
|
+
def field_select_input(field, attrs={}, varc='varc')
|
388
|
+
if (include_blank = attrs.delete(:include_blank)).is_a? String
|
389
|
+
field.choices.insert(0, [include_blank, ''])
|
390
|
+
end
|
391
|
+
return "#{varc} << select(:#{field.record_name}, :#{field.method}), #{field.choices.inspect}, #{attrs.inspect})\n"
|
354
392
|
end
|
355
|
-
return "#{varc} << select(:#{field.record_name}, :#{field.method}), #{field.choices.inspect}, #{attrs.inspect})\n"
|
356
|
-
end
|
357
393
|
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
code << field_mono_select_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
369
|
-
code << "elsif (#{count} <= #{Formize.radio_count_max})\n"
|
370
|
-
code << select_first_if_empty
|
371
|
-
code << field_mono_radio_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
372
|
-
if !reflection or (reflection and reflection.options[:finder_sql].nil?)
|
373
|
-
code << "elsif (#{count} <= #{Formize.select_count_max})\n"
|
374
|
-
code << select_first_if_empty
|
394
|
+
def field_mono_choice_input(field, attrs={}, varc='varc')
|
395
|
+
source_model = field_datasource_class_name(field).constantize
|
396
|
+
reflection = source_model.reflections[field.choices]
|
397
|
+
# if reflection.nil?
|
398
|
+
# raise Exception.new("#{source_model.name} must have a reflection :#{field.choices}.")
|
399
|
+
# end
|
400
|
+
count = "#{field.choices}_count"
|
401
|
+
select_first_if_empty = " #{record_name}.#{field.name} ||= #{field_datasource(field)}.first\n"
|
402
|
+
code = "#{count} = #{field_datasource(field)}.count\n"
|
403
|
+
code << "if (#{count} == 0)\n"
|
375
404
|
code << field_mono_select_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
376
|
-
code << "
|
405
|
+
code << "elsif (#{count} <= #{Formize.radio_count_max})\n"
|
377
406
|
code << select_first_if_empty
|
378
|
-
code <<
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
new_item_url = {}
|
391
|
-
end
|
392
|
-
|
393
|
-
if new_item_url.is_a?(Hash)
|
394
|
-
for k, v in new_item_url
|
395
|
-
new_item_url[k] = Code.new(v) if v.is_a?(String)
|
407
|
+
code << field_mono_radio_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
408
|
+
if !reflection or (reflection and reflection.options[:finder_sql].nil?)
|
409
|
+
code << "elsif (#{count} <= #{Formize.select_count_max})\n"
|
410
|
+
code << select_first_if_empty
|
411
|
+
code << field_mono_select_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
412
|
+
code << "else\n"
|
413
|
+
code << select_first_if_empty
|
414
|
+
code << field_mono_unroll_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
415
|
+
else
|
416
|
+
code << "else\n"
|
417
|
+
code << select_first_if_empty
|
418
|
+
code << field_mono_select_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
|
396
419
|
end
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
420
|
+
code << "end\n"
|
421
|
+
|
422
|
+
new_item_url = field.options.delete(:new)
|
423
|
+
if new_item_url.is_a? Symbol
|
424
|
+
new_item_url = {:controller=>new_item_url.to_s.pluralize.to_sym}
|
425
|
+
elsif new_item_url.is_a? TrueClass
|
426
|
+
new_item_url = {}
|
401
427
|
end
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
428
|
+
|
429
|
+
if new_item_url.is_a?(Hash)
|
430
|
+
for k, v in new_item_url
|
431
|
+
new_item_url[k] = Code.new(v) if v.is_a?(String)
|
432
|
+
end
|
433
|
+
edit_item_url = {} unless edit_item_url.is_a? Hash
|
434
|
+
if field.method.to_s.match(/_id$/) and refl = field.reflection # form.model.reflections[field.method.to_s[0..-4].to_sym]
|
435
|
+
new_item_url[:controller] ||= refl.class_name.underscore.pluralize
|
436
|
+
edit_item_url[:controller] ||= new_item_url[:controller]
|
437
|
+
end
|
438
|
+
new_item_url[:action] ||= :new
|
439
|
+
edit_item_url[:action] ||= :edit
|
440
|
+
data = field.options.delete(:update)||field.html_id
|
441
|
+
html_options = {"data-add-item"=>data, :class=>"icon im-new"}
|
442
|
+
code << "#{varc} << content_tag(:span, content_tag(:span, link_to(::I18n.translate('form.new'), #{new_item_url.inspect}, #{html_options.inspect}).html_safe, :class=>:tool).html_safe, :class=>\"toolbar mini-toolbar\")\n" # if authorized?(#{new_item_url.inspect})
|
443
|
+
end
|
444
|
+
return code
|
407
445
|
end
|
408
|
-
return code
|
409
|
-
end
|
410
446
|
|
411
|
-
|
412
|
-
|
413
|
-
|
447
|
+
def field_mono_radio_input(field, attrs={}, varc='varc')
|
448
|
+
return "#{varc} << radio(:#{field.record_name}, :#{field.method}, #{field_datasource(field)}.collect{|item| [item.#{field.item_label}, item.id]}, {}, #{attrs.inspect})"
|
449
|
+
end
|
414
450
|
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
451
|
+
def field_mono_select_input(field, attrs={}, varc='varc')
|
452
|
+
return "#{varc} << select(:#{field.record_name}, :#{field.method}, #{field_datasource(field)}.collect{|item| [item.#{field.item_label}, item.id]}, {}, #{attrs.inspect})"
|
453
|
+
end
|
454
|
+
|
455
|
+
def field_mono_unroll_input(field, attrs={}, varc='varc')
|
456
|
+
options = {}
|
457
|
+
options[:label] ||= Code.new("Proc.new{|r| \"#{mono_choice_label(field, 'r')}\"}")
|
458
|
+
url = {:controller=>controller.controller_name, :action=>form.action_name, :unroll=>field.html_id}
|
459
|
+
for depended in field.dependeds
|
460
|
+
df = form.all_fields[depended[:name]]
|
461
|
+
url[df.input_id.to_sym] = Code.new(df.reflection.nil? ? df.name : "#{df.name}.id")
|
462
|
+
end
|
463
|
+
return "#{varc} << unroll(:#{field.record_name}, :#{field.method}, #{url.inspect}, #{options.inspect}, #{attrs.inspect})"
|
464
|
+
end
|
429
465
|
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
466
|
+
def field_string_input(field, attrs={}, varc='varc')
|
467
|
+
attrs[:size] ||= 24
|
468
|
+
if field.column and !field.column.limit.nil?
|
469
|
+
attrs[:size] = field.column.limit if field.column.limit<attrs[:size]
|
470
|
+
attrs[:maxlength] = field.column.limit
|
471
|
+
end
|
472
|
+
return "#{varc} << text_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
|
435
473
|
end
|
436
|
-
return "#{varc} << text_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
|
437
|
-
end
|
438
474
|
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
475
|
+
def field_text_area_input(field, attrs={}, varc='varc')
|
476
|
+
attrs[:cols] ||= 40
|
477
|
+
attrs[:rows] ||= 3
|
478
|
+
attrs[:class] = "#{attrs[:class]} #{attrs[:cols]==80 ? :code : nil}".strip
|
479
|
+
return "#{varc} << resizable_text_area(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
|
480
|
+
end
|
445
481
|
|
446
482
|
|
447
483
|
|
448
484
|
|
449
485
|
|
450
486
|
|
451
|
-
|
487
|
+
protected
|
452
488
|
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
489
|
+
def sanitize_conditions(value)
|
490
|
+
if value.is_a? Array
|
491
|
+
if value.size==1 and value[0].is_a? String
|
492
|
+
value[0].to_s
|
493
|
+
else
|
494
|
+
value.inspect
|
495
|
+
end
|
496
|
+
elsif value.is_a? String
|
497
|
+
'"'+value.gsub('"','\"')+'"'
|
498
|
+
elsif [Date, DateTime].include? value.class
|
499
|
+
'"'+value.to_formatted_s(:db)+'"'
|
457
500
|
else
|
458
|
-
value.
|
501
|
+
value.to_s
|
459
502
|
end
|
460
|
-
elsif value.is_a? String
|
461
|
-
'"'+value.gsub('"','\"')+'"'
|
462
|
-
elsif [Date, DateTime].include? value.class
|
463
|
-
'"'+value.to_formatted_s(:db)+'"'
|
464
|
-
else
|
465
|
-
value.to_s
|
466
503
|
end
|
467
|
-
end
|
468
504
|
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
505
|
+
|
506
|
+
def mono_choice_label(choice, varr='record')
|
507
|
+
return "\#\{#{varr}.#{choice.item_label}\}"
|
508
|
+
end
|
473
509
|
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
end
|
495
|
-
query = []
|
496
|
-
parameters = ''
|
497
|
-
if options[:conditions].is_a? Hash
|
498
|
-
options[:conditions].each do |key, value|
|
499
|
-
query << (key.is_a?(Symbol) ? model.table_name+"."+key.to_s : key.to_s)+'=?'
|
500
|
-
parameters += ', ' + sanitize_conditions(value)
|
510
|
+
def mono_choice_search_code(field)
|
511
|
+
source_model = field_datasource_class_name(field).constantize
|
512
|
+
# reflection = source_model.reflections[field.choices]
|
513
|
+
# if reflection.nil?
|
514
|
+
# raise Exception.new("#{source_model.name} must have a reflection :#{field.choices}.")
|
515
|
+
# end
|
516
|
+
model = field.reflection.class_name.constantize #reflection.class_name.constantize
|
517
|
+
foreign_record = model.name.underscore
|
518
|
+
foreign_records = "#{source_model.name.underscore}_#{field.choices}"
|
519
|
+
options = field.options
|
520
|
+
attributes = field.search_attributes
|
521
|
+
attributes = [attributes] unless attributes.is_a? Array
|
522
|
+
attributes_hash = {}
|
523
|
+
attributes.each_index do |i|
|
524
|
+
attribute = attributes[i]
|
525
|
+
attributes[i] = [
|
526
|
+
(attribute.to_s.match(/\./) ? attribute.to_s : model.table_name+'.'+attribute.to_s.split(/\:/)[0]),
|
527
|
+
(attribute.to_s.match(/\:/) ? attribute.to_s.split(/\:/)[1] : (options[:filter]||'%X%')),
|
528
|
+
'_a'+i.to_s]
|
529
|
+
attributes_hash[attributes[i][2]] = attributes[i][0]
|
501
530
|
end
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
531
|
+
query = []
|
532
|
+
parameters = ''
|
533
|
+
if options[:conditions].is_a? Hash
|
534
|
+
options[:conditions].each do |key, value|
|
535
|
+
query << (key.is_a?(Symbol) ? model.table_name+"."+key.to_s : key.to_s)+'=?'
|
536
|
+
parameters += ', ' + sanitize_conditions(value)
|
537
|
+
end
|
538
|
+
elsif options[:conditions].is_a? Array
|
539
|
+
conditions = options[:conditions]
|
540
|
+
case conditions[0]
|
541
|
+
when String # SQL
|
542
|
+
# query << '["'+conditions[0].to_s+'"'
|
543
|
+
query << conditions[0].to_s
|
544
|
+
parameters += ', '+conditions[1..-1].collect{|p| sanitize_conditions(p)}.join(', ') if conditions.size>1
|
545
|
+
# query << ')'
|
546
|
+
else
|
547
|
+
raise Exception.new("First element of an Array can only be String or Symbol.")
|
548
|
+
end
|
549
|
+
end
|
550
|
+
|
551
|
+
select = (model.table_name+".id AS id, "+attributes_hash.collect{|k,v| v+" AS "+k}.join(", ")).inspect
|
552
|
+
|
553
|
+
code = ""
|
554
|
+
code << "conditions = [#{query.join(' AND ').inspect+parameters}]\n"
|
555
|
+
code << "search = params[:term]\n"
|
556
|
+
code << "words = search.to_s.mb_chars.downcase.strip.normalize.split(/[\\s\\,]+/)\n"
|
557
|
+
code << "if words.size > 0\n"
|
558
|
+
code << " conditions[0] << '#{' AND ' if query.size>0}('\n"
|
559
|
+
code << " words.each_index do |index|\n"
|
560
|
+
code << " word = words[index].to_s\n"
|
561
|
+
code << " conditions[0] << ') AND (' if index > 0\n"
|
562
|
+
|
563
|
+
if ActiveRecord::Base.connection.adapter_name == "MySQL"
|
564
|
+
code << " conditions[0] << "+attributes.collect{|key| "LOWER(CAST(#{key[0]} AS CHAR)) LIKE ?"}.join(' OR ').inspect+"\n"
|
510
565
|
else
|
511
|
-
|
566
|
+
code << " conditions[0] << "+attributes.collect{|key| "LOWER(CAST(#{key[0]} AS VARCHAR)) LIKE ?"}.join(' OR ').inspect+"\n"
|
512
567
|
end
|
568
|
+
|
569
|
+
code << " conditions += ["+attributes.collect{|key| key[1].inspect.gsub('X', '"+word+"').gsub(/(^\"\"\+|\+\"\"\+|\+\"\")/, '')}.join(", ")+"]\n"
|
570
|
+
code << " end\n"
|
571
|
+
code << " conditions[0] << ')'\n"
|
572
|
+
code << "end\n"
|
573
|
+
|
574
|
+
# joins = options[:joins] ? ", :joins=>"+options[:joins].inspect : ""
|
575
|
+
# order = ", :order=>"+attributes.collect{|key| "#{key[0]} ASC"}.join(', ').inspect
|
576
|
+
# limit = ", :limit=>"+(options[:limit]||80).to_s
|
577
|
+
joins = options[:joins] ? ".joins(#{options[:joins].inspect})" : ""
|
578
|
+
order = ".order("+attributes.collect{|key| "#{key[0]} ASC"}.join(', ').inspect+")"
|
579
|
+
limit = ".limit(#{options[:limit]||80})"
|
580
|
+
|
581
|
+
partial = options[:partial]
|
582
|
+
|
583
|
+
html = "<ul><%for #{foreign_record} in #{foreign_records}-%><li id='<%=#{foreign_record}.id-%>'>"
|
584
|
+
html << "<%content=#{foreign_record}.#{field.item_label}-%>"
|
585
|
+
# html << "<%content="+attributes.collect{|key| "#{foreign_record}['#{key[2]}'].to_s"}.join('+", "+')+" -%>"
|
586
|
+
if partial
|
587
|
+
html << "<%=render(:partial=>#{partial.inspect}, :locals =>{:#{foreign_record}=>#{foreign_record}, :content=>content, :search=>search})-%>"
|
588
|
+
else
|
589
|
+
html << "<%=highlight(content, search)-%>"
|
590
|
+
end
|
591
|
+
html << '</li><%end-%></ul>'
|
592
|
+
|
593
|
+
# code << "#{foreign_records} = #{field_datasource(field)}.find(:all, :conditions=>conditions"+joins+order+limit+")\n"
|
594
|
+
code << "#{foreign_records} = #{field_datasource(field).gsub(/\.all$/, '')}.where(conditions)"+joins+order+limit+"\n"
|
595
|
+
# Render HTML is old Style
|
596
|
+
code << "respond_to do |format|\n"
|
597
|
+
code << " format.html { render :inline=>#{html.inspect}, :locals=>{:#{foreign_records}=>#{foreign_records}, :search=>search} }\n"
|
598
|
+
code << " format.json { render :json=>#{foreign_records}.collect{|#{foreign_record}| {:label=>#{foreign_record}.#{field.item_label}, :id=>#{foreign_record}.id}}.to_json }\n"
|
599
|
+
code << " format.xml { render :xml=>#{foreign_records}.collect{|#{foreign_record}| {:label=>#{foreign_record}.#{field.item_label}, :id=>#{foreign_record}.id}}.to_xml }\n"
|
600
|
+
code << "end\n"
|
601
|
+
return code
|
513
602
|
end
|
514
|
-
|
515
|
-
select = (model.table_name+".id AS id, "+attributes_hash.collect{|k,v| v+" AS "+k}.join(", ")).inspect
|
516
|
-
|
517
|
-
code = ""
|
518
|
-
code << "conditions = [#{query.join(' AND ').inspect+parameters}]\n"
|
519
|
-
code << "search = params[:term]\n"
|
520
|
-
code << "words = search.to_s.mb_chars.downcase.strip.normalize.split(/[\\s\\,]+/)\n"
|
521
|
-
code << "if words.size > 0\n"
|
522
|
-
code << " conditions[0] << '#{' AND ' if query.size>0}('\n"
|
523
|
-
code << " words.each_index do |index|\n"
|
524
|
-
code << " word = words[index].to_s\n"
|
525
|
-
code << " conditions[0] << ') AND (' if index > 0\n"
|
526
|
-
|
527
|
-
if ActiveRecord::Base.connection.adapter_name == "MySQL"
|
528
|
-
code << " conditions[0] << "+attributes.collect{|key| "LOWER(CAST(#{key[0]} AS CHAR)) LIKE ?"}.join(' OR ').inspect+"\n"
|
529
|
-
else
|
530
|
-
code << " conditions[0] << "+attributes.collect{|key| "LOWER(CAST(#{key[0]} AS VARCHAR)) LIKE ?"}.join(' OR ').inspect+"\n"
|
531
|
-
end
|
532
|
-
|
533
|
-
code << " conditions += ["+attributes.collect{|key| key[1].inspect.gsub('X', '"+word+"').gsub(/(^\"\"\+|\+\"\"\+|\+\"\")/, '')}.join(", ")+"]\n"
|
534
|
-
code << " end\n"
|
535
|
-
code << " conditions[0] << ')'\n"
|
536
|
-
code << "end\n"
|
537
|
-
|
538
|
-
# joins = options[:joins] ? ", :joins=>"+options[:joins].inspect : ""
|
539
|
-
# order = ", :order=>"+attributes.collect{|key| "#{key[0]} ASC"}.join(', ').inspect
|
540
|
-
# limit = ", :limit=>"+(options[:limit]||80).to_s
|
541
|
-
joins = options[:joins] ? ".joins(#{options[:joins].inspect})" : ""
|
542
|
-
order = ".order("+attributes.collect{|key| "#{key[0]} ASC"}.join(', ').inspect+")"
|
543
|
-
limit = ".limit(#{options[:limit]||80})"
|
544
|
-
|
545
|
-
partial = options[:partial]
|
546
|
-
|
547
|
-
html = "<ul><%for #{foreign_record} in #{foreign_records}-%><li id='<%=#{foreign_record}.id-%>'>"
|
548
|
-
html << "<%content=#{foreign_record}.#{field.item_label}-%>"
|
549
|
-
# html << "<%content="+attributes.collect{|key| "#{foreign_record}['#{key[2]}'].to_s"}.join('+", "+')+" -%>"
|
550
|
-
if partial
|
551
|
-
html << "<%=render(:partial=>#{partial.inspect}, :locals =>{:#{foreign_record}=>#{foreign_record}, :content=>content, :search=>search})-%>"
|
552
|
-
else
|
553
|
-
html << "<%=highlight(content, search)-%>"
|
554
|
-
end
|
555
|
-
html << '</li><%end-%></ul>'
|
556
|
-
|
557
|
-
# code << "#{foreign_records} = #{field_datasource(field)}.find(:all, :conditions=>conditions"+joins+order+limit+")\n"
|
558
|
-
code << "#{foreign_records} = #{field_datasource(field).gsub(/\.all$/, '')}.where(conditions)"+joins+order+limit+"\n"
|
559
|
-
# Render HTML is old Style
|
560
|
-
code << "respond_to do |format|\n"
|
561
|
-
code << " format.html { render :inline=>#{html.inspect}, :locals=>{:#{foreign_records}=>#{foreign_records}, :search=>search} }\n"
|
562
|
-
code << " format.json { render :json=>#{foreign_records}.collect{|#{foreign_record}| {:label=>#{foreign_record}.#{field.item_label}, :id=>#{foreign_record}.id}}.to_json }\n"
|
563
|
-
code << " format.xml { render :xml=>#{foreign_records}.collect{|#{foreign_record}| {:label=>#{foreign_record}.#{field.item_label}, :id=>#{foreign_record}.id}}.to_xml }\n"
|
564
|
-
code << "end\n"
|
565
|
-
return code
|
566
|
-
end
|
567
603
|
|
568
604
|
|
569
|
-
|
570
|
-
|
571
|
-
|
605
|
+
|
606
|
+
end
|
607
|
+
end
|
572
608
|
end
|