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.
@@ -1,140 +1,124 @@
1
1
  module Formize
2
+
3
+ module Definition
2
4
 
3
- # Main class for form elements
4
- class FormElement
5
- attr_reader :form, :parent, :children, :unique_name, :id, :depend_on, :html_id
6
- @@count = 0
7
-
8
- def initialize(form, parent = nil)
9
- raise ArgumentError.new("Bad form (#{form.class.name}). Must be an Formize::Form") unless form.is_a? Formize::Form
10
- @form = form
11
- @parent = parent
12
- @depend_on = nil
13
- @children = []
14
- @@count += 1
15
- @id = @@count.to_s(36)
16
- @html_id = "fz#{@id}"
17
- @unique_name = self.form.unique_name + "_" + @html_id
18
- end
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
- def dependeds
22
- l = (self.parent ? self.parent.dependeds : [])
23
- l << {:name=>self.depend_on} unless self.depend_on.blank?
24
- return l
25
- end
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
- def arguments
28
- args = []
29
- args << {:name=>form.record_name}
30
- # args += self.dependeds
31
- # args << {:name=>@depend_on} if @depend_on
32
- return args
33
- end
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
- def prototype
36
- return "#{@unique_name}(" + arguments.collect{|x| x[:name]}.join(', ') + ")"
37
- end
42
+ def prototype
43
+ return "#{@unique_name}(" + arguments.collect{|x| x[:name]}.join(', ') + ")"
44
+ end
38
45
 
39
- # def method_name=(name)
40
- # raise ArgumentError.new("Name of field_set must be written only with a-z and 0-9 and _ (not #{name.inspect})") unless name.to_s == name.to_s.downcase.gsub(/[^a-z0-9\_]/, '')
41
- # @method_name = name
42
- # end
43
-
44
-
45
- # def method_code(options={})
46
- # varh = options[:html_variable] ||= 'html'
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
- def fields
89
- elements = HashWithIndifferentAccess.new()
90
- for child in self.children
91
- elements.merge!(child.fields)
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
- def dependents
98
- elements = []
99
- for child in self.children
100
- elements += child.dependents
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
- def all_elements
108
- elements = self.children.collect{|c| c.all_elements}.flatten
109
- elements << self
110
- return elements
111
- end
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
- # Find form elements
115
- def dependents_on(element)
116
- elements = []
117
- for child in self.children
118
- elements += child.dependents_on(element)
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
- protected
111
+ protected
128
112
 
129
- def new_child(klass, *args)
130
- raise ArgumentError.new("Bad child type (#{klass.name}). Must be an Formize::FormElement") unless klass < FormElement
131
- element = klass.new(self.form, self, *args)
132
- @children << element
133
- return element
134
- end
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
@@ -0,0 +1,5 @@
1
+ module Formize
2
+ # Required for assets pipeline
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
@@ -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
- 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
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
- # Generates the controller method from a form object
27
- def controller_code
28
- code = "def #{form.controller_method_name}\n"
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
- # 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"
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
- event << mono_choice_search_code(mono_choice).strip.gsub(/^/, ' ') << "\n"
44
- event << "end\n"
46
+ code << events.collect{|e| e.gsub(/^/, ' ')}.join
47
+ code << " end\n"
45
48
  end
46
- code << events.collect{|e| e.gsub(/^/, ' ')}.join
47
- code << " end\n"
48
- end
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.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::Field) and dependent.reflection
66
- event << " #{record_name}.#{dependent.reflection.primary_key_name} = params[:selected].to_i if params[:selected]\n"
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
- event << " render(:inline=>'<%=#{dependent.prototype}-%>', :locals=>#{locals.inspect})\n"
69
- event << "end\n"
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
- # 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"
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
- code << "if #{dependeds.join(' and ')}\n"
157
+ code << "if #{dependeds.join(' and ')}\n"
158
158
 
159
- code << partial_code.strip.gsub(/^/, ' ') << "\n"
159
+ code << partial_code.strip.gsub(/^/, ' ') << "\n"
160
160
 
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
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
- def view_method_code(element, varh='varh')
171
- # send("#{element.class.name.split('::')[-1].underscore}_#{__method__}", element, varh)
172
- special_method = "#{element.class.name.split('::')[-1].underscore}_#{__method__}".to_sym
173
- return send(special_method, element, varh) if self.respond_to?(special_method)
174
- code = "def #{element.prototype}\n"
175
- code << " #{varh} = ''\n"
176
- code << view_partial_code(element, varh).strip.gsub(/^/, ' ') << "\n"
177
- code << " return #{varh}.html_safe\n"
178
- code << "end\n"
179
- return code
180
- end
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
- def view_method_call(element, varh='varh')
183
- special_method = "#{element.class.name.split('::')[-1].underscore}_#{__method__}".to_sym
184
- return send(special_method, element, varh) if self.respond_to?(special_method)
185
- if @partials.include?(element)
186
- return "#{varh} << #{element.prototype}\n"
187
- else
188
- return view_partial_code(element, varh).strip << "\n"
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
- def wrapper_attrs(element)
193
- html_options = (element.respond_to?(:html_options) ? element.html_options.dup : {})
194
- html_options[:id] = element.html_id
195
- if @partials.include?(element)
196
- url = {:controller => controller.controller_name.to_sym, :action=>form.action_name.to_sym, :refresh=>element.html_id}
197
- # for depended in element.dependeds
198
- # df = form.fields[depended[:name]]
199
- # # url[df.input_id.to_sym] = Code.new(df.reflection.nil? ? df.name : "#{df.name}.id")
200
- # end
201
- html_options["data-refresh"] = Code.new("url_for(#{url.inspect})")
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
- # F I E L D _ S E T M E T H O D S #
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
- varc = field_set.html_id # "field_set_#{field_set.html_id}"
217
- code = "#{varh} << hard_content_tag(:fieldset, #{html_options.inspect}) do |#{varc}|\n"
218
- unless field_set.title.nil?
219
- code << " #{varc} << content_tag(:legend, ::I18n.translate('labels.#{field_set.title}'))\n"
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
- for child in field_set.children
222
- code << view_method_call(child, varc).strip.gsub(/^/, ' ') << "\n"
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
- # F I E L D M E T H O D S #
230
- #####################################################################################
258
+ #####################################################################################
259
+ # F I E L D M E T H O D S #
260
+ #####################################################################################
231
261
 
232
- def field_view_partial_code(field, varh='varh')
233
- input_attrs = (field.options[:input_options].is_a?(Hash) ? field.options[:input_options] : {})
234
- deps = form.dependents_on(field)
235
- if deps.size > 0
236
- input_attrs["data-dependents"] = deps.collect{|d| "##{d.html_id}"}.join(',')
237
- end
238
-
239
- # Initialize html attributes
240
- html_options = wrapper_attrs(field)
241
-
242
- varc = field.html_id
243
- code = "#{varh} << hard_content_tag(:table, #{html_options.inspect}) do |#{varc}|\n"
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
- def field_datasource(field)
262
- source = field.source
263
- source = Formize.default_source unless [Array, String, Symbol].include?(source.class)
264
- if source.is_a?(Array)
265
- return "#{source[0]}.#{field.choices}"
266
- elsif source == :foreign_class
267
- # return field.reflection.class_name if field.choices.to_s == "all"
268
- return "#{field.reflection.class_name}.#{field.choices}"
269
- elsif source == :class
270
- # return form.model.name if field.choices.to_s == "all"
271
- return "#{form.model.name}.#{field.choices}"
272
- else
273
- return "#{source}.#{field.choices}"
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
- end
276
-
277
- # Returns the name of the class of the source
278
- #
279
- def field_datasource_class_name(field)
280
- source = field.source
281
- source = Formize.default_source unless [Array, String, Symbol].include?(source.class)
282
- if source.is_a?(Array)
283
- return source[1]
284
- elsif source == :foreign_class
285
- return field.reflection.class_name
286
- elsif source == :class
287
- return form.model.name
288
- else
289
- return source.to_s.classify
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
- def field_wrapper_attrs(field, html_options={})
297
- html_options[:class] = "fz field #{html_options[:class]}".strip
298
- html_options[:class] = "#{html_options[:class]} #{field.type.to_s.gsub('_', '-')}".strip
299
- html_options[:class] = "#{html_options[:class]} required".strip if field.required
300
- html_options[:class] = Code.new("\"#{html_options[:class]}\#{' invalid' if @#{field.form.record_name}.errors['#{field.name}'].any?}\"")
301
- return html_options
302
- end
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
- def field_check_box_input(field, attrs={}, varc='varc')
308
- return "#{varc} << check_box(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
309
- end
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
- def field_choice_input(field, attrs={}, varc='varc')
312
- code = if field.choices.size <= Formize.radio_count_max
313
- field_radio_input(field, attrs, varc)
314
- else
315
- field_select_input(field, attrs, varc)
316
- end
317
- return code
318
- end
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
- def field_date_input(field, attrs={}, varc='varc')
321
- attrs[:size] ||= 10
322
- return "#{varc} << date_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
323
- end
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
- def field_datetime_input(field, attrs={}, varc='varc')
326
- attrs[:size] ||= 16
327
- # TODO define Date format
328
- return "#{varc} << datetime_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
329
- end
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
- def field_label_input(field, attrs={}, varc='varc')
332
- attrs[:class] = (attrs[:class]+" readonly").strip
333
- return "#{varc} << content_tag(:span, @:#{field.record_name}.#{field.method}, #{attrs.inspect})\n"
334
- end
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
- def field_numeric_input(field, attrs={}, varc='varc')
337
- attrs[:size] ||= 16
338
- return "#{varc} << text_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
339
- end
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
- def field_password_input(field, attrs={}, varc='varc')
342
- attrs[:size] ||= 24
343
- return "#{varc} << password_field(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
344
- end
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
- def field_radio_input(field, attrs={}, varc='varc')
347
- return "#{varc} << radio(:#{field.record_name}, :#{field.method}, #{field.choices.inspect}, #{attrs.inspect})\n"
348
- # 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"
349
- end
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
- def field_select_input(field, attrs={}, varc='varc')
352
- if (include_blank = attrs.delete(:include_blank)).is_a? String
353
- field.choices.insert(0, [include_blank, ''])
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
- def field_mono_choice_input(field, attrs={}, varc='varc')
359
- source_model = field_datasource_class_name(field).constantize
360
- reflection = source_model.reflections[field.choices]
361
- # if reflection.nil?
362
- # raise Exception.new("#{source_model.name} must have a reflection :#{field.choices}.")
363
- # end
364
- count = "#{field.choices}_count"
365
- select_first_if_empty = " #{record_name}.#{field.name} ||= #{field_datasource(field)}.first\n"
366
- code = "#{count} = #{field_datasource(field)}.count\n"
367
- code << "if (#{count} == 0)\n"
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 << "else\n"
405
+ code << "elsif (#{count} <= #{Formize.radio_count_max})\n"
377
406
  code << select_first_if_empty
378
- code << field_mono_unroll_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
379
- else
380
- code << "else\n"
381
- code << select_first_if_empty
382
- code << field_mono_select_input(field, attrs, varc).strip.gsub(/^/, ' ') << "\n"
383
- end
384
- code << "end\n"
385
-
386
- new_item_url = field.options.delete(:new)
387
- if new_item_url.is_a? Symbol
388
- new_item_url = {:controller=>new_item_url.to_s.pluralize.to_sym}
389
- elsif new_item_url.is_a? TrueClass
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
- edit_item_url = {} unless edit_item_url.is_a? Hash
398
- if field.method.to_s.match(/_id$/) and refl = field.reflection # form.model.reflections[field.method.to_s[0..-4].to_sym]
399
- new_item_url[:controller] ||= refl.class_name.underscore.pluralize
400
- edit_item_url[:controller] ||= new_item_url[:controller]
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
- new_item_url[:action] ||= :new
403
- edit_item_url[:action] ||= :edit
404
- data = field.options.delete(:update)||field.html_id
405
- html_options = {"data-add-item"=>data, :class=>"icon im-new"}
406
- 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})
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
- def field_mono_radio_input(field, attrs={}, varc='varc')
412
- return "#{varc} << radio(:#{field.record_name}, :#{field.method}, #{field_datasource(field)}.collect{|item| [item.#{field.item_label}, item.id]}, {}, #{attrs.inspect})"
413
- end
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
- def field_mono_select_input(field, attrs={}, varc='varc')
416
- return "#{varc} << select(:#{field.record_name}, :#{field.method}, #{field_datasource(field)}.collect{|item| [item.#{field.item_label}, item.id]}, {}, #{attrs.inspect})"
417
- end
418
-
419
- def field_mono_unroll_input(field, attrs={}, varc='varc')
420
- options = {}
421
- options[:label] ||= Code.new("Proc.new{|r| \"#{mono_choice_label(field, 'r')}\"}")
422
- url = {:controller=>controller.controller_name, :action=>form.action_name, :unroll=>field.html_id}
423
- for depended in field.dependeds
424
- df = form.fields[depended[:name]]
425
- url[df.input_id.to_sym] = Code.new(df.reflection.nil? ? df.name : "#{df.name}.id")
426
- end
427
- return "#{varc} << unroll(:#{field.record_name}, :#{field.method}, #{url.inspect}, #{options.inspect}, #{attrs.inspect})"
428
- end
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
- def field_string_input(field, attrs={}, varc='varc')
431
- attrs[:size] ||= 24
432
- if field.column and !field.column.limit.nil?
433
- attrs[:size] = field.column.limit if field.column.limit<attrs[:size]
434
- attrs[:maxlength] = field.column.limit
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
- def field_text_area_input(field, attrs={}, varc='varc')
440
- attrs[:cols] ||= 40
441
- attrs[:rows] ||= 3
442
- attrs[:class] = "#{attrs[:class]} #{attrs[:cols]==80 ? :code : nil}".strip
443
- return "#{varc} << resizable_text_area(:#{field.record_name}, :#{field.method}, #{attrs.inspect})\n"
444
- end
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
- protected
487
+ protected
452
488
 
453
- def sanitize_conditions(value)
454
- if value.is_a? Array
455
- if value.size==1 and value[0].is_a? String
456
- value[0].to_s
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.inspect
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
- def mono_choice_label(choice, varr='record')
471
- return "\#\{#{varr}.#{choice.item_label}\}"
472
- end
505
+
506
+ def mono_choice_label(choice, varr='record')
507
+ return "\#\{#{varr}.#{choice.item_label}\}"
508
+ end
473
509
 
474
- def mono_choice_search_code(field)
475
- source_model = field_datasource_class_name(field).constantize
476
- # reflection = source_model.reflections[field.choices]
477
- # if reflection.nil?
478
- # raise Exception.new("#{source_model.name} must have a reflection :#{field.choices}.")
479
- # end
480
- model = field.reflection.class_name.constantize #reflection.class_name.constantize
481
- foreign_record = model.name.underscore
482
- foreign_records = "#{source_model.name.underscore}_#{field.choices}"
483
- options = field.options
484
- attributes = field.search_attributes
485
- attributes = [attributes] unless attributes.is_a? Array
486
- attributes_hash = {}
487
- attributes.each_index do |i|
488
- attribute = attributes[i]
489
- attributes[i] = [
490
- (attribute.to_s.match(/\./) ? attribute.to_s : model.table_name+'.'+attribute.to_s.split(/\:/)[0]),
491
- (attribute.to_s.match(/\:/) ? attribute.to_s.split(/\:/)[1] : (options[:filter]||'%X%')),
492
- '_a'+i.to_s]
493
- attributes_hash[attributes[i][2]] = attributes[i][0]
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
- elsif options[:conditions].is_a? Array
503
- conditions = options[:conditions]
504
- case conditions[0]
505
- when String # SQL
506
- # query << '["'+conditions[0].to_s+'"'
507
- query << conditions[0].to_s
508
- parameters += ', '+conditions[1..-1].collect{|p| sanitize_conditions(p)}.join(', ') if conditions.size>1
509
- # query << ')'
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
- raise Exception.new("First element of an Array can only be String or Symbol.")
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
- end
571
-
605
+
606
+ end
607
+ end
572
608
  end