compass-jquery-plugin 0.3.0.beta.21 → 0.3.0.beta.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. data/README.textile +212 -211
  2. data/VERSION.yml +5 -5
  3. data/compass-jquery-plugin.gemspec +25 -2
  4. data/gem_tasks/jqtouch.rake +221 -201
  5. data/gem_tasks/jrails.rake +322 -311
  6. data/lib/compiler.jar +0 -0
  7. data/lib/jquery/flash_messages.rb +45 -45
  8. data/lib/jquery/gridify/grid.rb +147 -147
  9. data/lib/jquery/gridify/grid_column.rb +134 -134
  10. data/lib/jquery/gridify/grid_finder.rb +223 -211
  11. data/lib/jquery/gridify/grid_options.rb +279 -279
  12. data/lib/jquery/gridify/grid_view.rb +435 -436
  13. data/lib/jquery/gridify.rb +42 -42
  14. data/templates/dynatree/jquery.dynatree.min.js +1 -1
  15. data/templates/jqgrid/i18n/jqgrid/locale-bg.min.js +6 -15
  16. data/templates/jqgrid/i18n/jqgrid/locale-bg1251.min.js +6 -15
  17. data/templates/jqgrid/i18n/jqgrid/locale-cat.min.js +5 -6
  18. data/templates/jqgrid/i18n/jqgrid/locale-cn.min.js +5 -8
  19. data/templates/jqgrid/i18n/jqgrid/locale-cs.min.js +6 -8
  20. data/templates/jqgrid/i18n/jqgrid/locale-da.min.js +6 -6
  21. data/templates/jqgrid/i18n/jqgrid/locale-de.min.js +7 -7
  22. data/templates/jqgrid/i18n/jqgrid/locale-el.min.js +7 -13
  23. data/templates/jqgrid/i18n/jqgrid/locale-es.min.js +7 -7
  24. data/templates/jqgrid/i18n/jqgrid/locale-fa.min.js +6 -12
  25. data/templates/jqgrid/i18n/jqgrid/locale-fr.min.js +7 -7
  26. data/templates/jqgrid/i18n/jqgrid/locale-gl.min.js +7 -7
  27. data/templates/jqgrid/i18n/jqgrid/locale-he.min.js +6 -13
  28. data/templates/jqgrid/i18n/jqgrid/locale-hu.min.js +6 -8
  29. data/templates/jqgrid/i18n/jqgrid/locale-is.min.js +6 -7
  30. data/templates/jqgrid/i18n/jqgrid/locale-it.min.js +4 -4
  31. data/templates/jqgrid/i18n/jqgrid/locale-ja.min.js +5 -10
  32. data/templates/jqgrid/i18n/jqgrid/locale-no.min.js +6 -6
  33. data/templates/jqgrid/i18n/jqgrid/locale-pl.min.js +6 -7
  34. data/templates/jqgrid/i18n/jqgrid/locale-pt-br.min.js +6 -7
  35. data/templates/jqgrid/i18n/jqgrid/locale-pt.min.js +4 -5
  36. data/templates/jqgrid/i18n/jqgrid/locale-ro.min.js +7 -8
  37. data/templates/jqgrid/i18n/jqgrid/locale-ru.min.js +7 -16
  38. data/templates/jqgrid/i18n/jqgrid/locale-sk.min.js +6 -8
  39. data/templates/jqgrid/i18n/jqgrid/locale-sv.min.js +6 -7
  40. data/templates/jqgrid/i18n/jqgrid/locale-tr.min.js +6 -7
  41. data/templates/jqgrid/i18n/jqgrid/locale-ua.min.js +7 -16
  42. data/templates/jqgrid/jquery.jqGrid.js +11567 -11565
  43. data/templates/jqgrid/jquery.jqGrid.min.js +472 -472
  44. data/templates/jqical/jquery.jqical.js +5 -9
  45. data/templates/jqical/jquery.jqical.min.js +44 -44
  46. data/templates/jqical/jquery.ui/jqical.scss +1 -1
  47. data/templates/jqtouch/config/initializers/jqtouch.rb +5 -4
  48. data/templates/jqtouch/jqtouch/apple/activeButton.png +0 -0
  49. data/templates/jqtouch/jqtouch/default/backButton.png +0 -0
  50. data/templates/jqtouch/jqtouch/default/backButtonActive.png +0 -0
  51. data/templates/jqtouch/jqtouch/default/bigButton.png +0 -0
  52. data/templates/jqtouch/jqtouch/default/bigButtonActive.png +0 -0
  53. data/templates/jqtouch/jqtouch/default/button.png +0 -0
  54. data/templates/jqtouch/jqtouch/default/buttonActive.png +0 -0
  55. data/templates/jqtouch/jqtouch/default/chevron.png +0 -0
  56. data/templates/jqtouch/jqtouch/default/chevronActive.png +0 -0
  57. data/templates/jqtouch/jqtouch/default/chevronCircle.png +0 -0
  58. data/templates/jqtouch/jqtouch/default/chevronCircleActive.png +0 -0
  59. data/templates/jqtouch/jqtouch/default/loading.gif +0 -0
  60. data/templates/jqtouch/jqtouch/default/toggleSwitch.png +0 -0
  61. data/templates/jqtouch/jqtouch/default/toolbarBackground.png +0 -0
  62. data/templates/jqtouch/jqtouch/jqt/back_button_clicked.png +0 -0
  63. data/templates/jqtouch/jqtouch/jqt.apple.scss +24 -11
  64. data/templates/jqtouch/jqtouch/jqt.default.scss +537 -0
  65. data/templates/jqtouch/jqtouch/jqt.jqt.scss +20 -6
  66. data/templates/jqtouch/jqtouch/jqtouch.scss +173 -1
  67. data/templates/jqtouch/jqtouch/photo/btnBack.png +0 -0
  68. data/templates/jqtouch/jqtouch/photo/loading.gif +0 -0
  69. data/templates/jqtouch/jqtouch/photo/navNext.png +0 -0
  70. data/templates/jqtouch/jqtouch/photo/navPause.png +0 -0
  71. data/templates/jqtouch/jqtouch/photo/navPlay.png +0 -0
  72. data/templates/jqtouch/jqtouch/photo/navPrev.png +0 -0
  73. data/templates/jqtouch/jqtouch/photo/toolbar.png +0 -0
  74. data/templates/jqtouch/jquery.jqtouch.js +8219 -632
  75. data/templates/jqtouch/jquery.jqtouch.min.js +60 -1
  76. data/templates/jqtouch/manifest.rb +21 -0
  77. data/templates/jrails/config/initializers/jrails.rb +1 -0
  78. data/templates/jrails/haml.js +2 -2
  79. data/templates/jrails/i18n/jquery.ui/datepicker-ar.min.js +2 -4
  80. data/templates/jrails/i18n/jquery.ui/datepicker-az.min.js +2 -2
  81. data/templates/jrails/i18n/jquery.ui/datepicker-bg.min.js +2 -4
  82. data/templates/jrails/i18n/jquery.ui/datepicker-bs.min.js +2 -2
  83. data/templates/jrails/i18n/jquery.ui/datepicker-cs.min.js +2 -2
  84. data/templates/jrails/i18n/jquery.ui/datepicker-da.min.js +2 -2
  85. data/templates/jrails/i18n/jquery.ui/datepicker-de.min.js +2 -2
  86. data/templates/jrails/i18n/jquery.ui/datepicker-el.min.js +2 -4
  87. data/templates/jrails/i18n/jquery.ui/datepicker-eo.min.js +2 -2
  88. data/templates/jrails/i18n/jquery.ui/datepicker-et.min.js +2 -2
  89. data/templates/jrails/i18n/jquery.ui/datepicker-fa.min.js +2 -3
  90. data/templates/jrails/i18n/jquery.ui/datepicker-fo.min.js +2 -2
  91. data/templates/jrails/i18n/jquery.ui/datepicker-fr-CH.min.js +2 -2
  92. data/templates/jrails/i18n/jquery.ui/datepicker-fr.min.js +2 -2
  93. data/templates/jrails/i18n/jquery.ui/datepicker-he.min.js +2 -3
  94. data/templates/jrails/i18n/jquery.ui/datepicker-hr.min.js +2 -2
  95. data/templates/jrails/i18n/jquery.ui/datepicker-hu.min.js +2 -2
  96. data/templates/jrails/i18n/jquery.ui/datepicker-hy.min.js +2 -4
  97. data/templates/jrails/i18n/jquery.ui/datepicker-ja.min.js +2 -2
  98. data/templates/jrails/i18n/jquery.ui/datepicker-ko.min.js +2 -2
  99. data/templates/jrails/i18n/jquery.ui/datepicker-kz.min.js +2 -4
  100. data/templates/jrails/i18n/jquery.ui/datepicker-lt.min.js +2 -2
  101. data/templates/jrails/i18n/jquery.ui/datepicker-lv.min.js +2 -2
  102. data/templates/jrails/i18n/jquery.ui/datepicker-nl.min.js +2 -2
  103. data/templates/jrails/i18n/jquery.ui/datepicker-no.min.js +2 -2
  104. data/templates/jrails/i18n/jquery.ui/datepicker-pl.min.js +2 -2
  105. data/templates/jrails/i18n/jquery.ui/datepicker-ro.min.js +2 -2
  106. data/templates/jrails/i18n/jquery.ui/datepicker-ru.min.js +2 -4
  107. data/templates/jrails/i18n/jquery.ui/datepicker-sk.min.js +2 -2
  108. data/templates/jrails/i18n/jquery.ui/datepicker-sq.min.js +2 -2
  109. data/templates/jrails/i18n/jquery.ui/datepicker-sr-SR.min.js +2 -2
  110. data/templates/jrails/i18n/jquery.ui/datepicker-sr.min.js +2 -4
  111. data/templates/jrails/i18n/jquery.ui/datepicker-sv.min.js +2 -2
  112. data/templates/jrails/i18n/jquery.ui/datepicker-ta.min.js +2 -4
  113. data/templates/jrails/i18n/jquery.ui/datepicker-th.min.js +2 -4
  114. data/templates/jrails/i18n/jquery.ui/datepicker-tr.min.js +2 -2
  115. data/templates/jrails/i18n/jquery.ui/datepicker-uk.min.js +2 -4
  116. data/templates/jrails/i18n/jquery.ui/datepicker-vi.min.js +2 -2
  117. data/templates/jrails/i18n/jquery.ui/datepicker-zh-CN.min.js +2 -2
  118. data/templates/jrails/i18n/jquery.ui/datepicker-zh-HK.min.js +2 -2
  119. data/templates/jrails/i18n/jquery.ui/datepicker-zh-TW.min.js +2 -2
  120. data/templates/jrails/jquery-1.4.2.min.js +156 -156
  121. data/templates/jrails/jquery-ui-1.8.5.js +23753 -23341
  122. data/templates/jrails/jquery-ui-1.8.5.min.js +823 -808
  123. data/templates/jrails/jquery.contextMenu.min.js +1 -1
  124. data/templates/jrails/jquery.sparkline.js +1050 -0
  125. data/templates/jrails/jquery.sparkline.min.js +31 -0
  126. data/templates/jrails/jquery.ui/_theme.scss +1699 -1634
  127. data/templates/jrails/manifest.rb +13 -11
  128. data/templates/jstree/jquery.jstree.min.js +10 -10
  129. data/templates/ribbon/jquery.ribbon.min.js +6 -6
  130. metadata +27 -4
@@ -1,211 +1,223 @@
1
- module Gridify
2
- class Grid
3
-
4
- attr_accessor :search_rules, # current search/filter rules, as hash
5
- :search_rules_op # :and, :or
6
-
7
- # finds records based on request params
8
- # e.g. params from jqGrid
9
- # :_search do search (true/false) ["false"]
10
- # :sidx sort index (column to search on) [""]
11
- # :sord sort direction (desc/asc) ["asc"]
12
- # :nd ?
13
- # :rows number of items to get ["20"]
14
- # :page page number (starts at 1) ["1"]
15
-
16
- def update_from_params( params )
17
- params.symbolize_keys!
18
- params_to_rules params
19
- self.data_type = params[:datatype] if params[:datatype]
20
- self.sort_by = params[:sidx] if params[:sidx]
21
- self.sort_order = params[:sord] if params[:sord]
22
- self.current_page = params[:page].to_i if params[:page]
23
- self.rows_per_page = params[:rows].to_i if params[:rows]
24
- self.total_rows = params[:total_rows].to_i if params[:total_rows]
25
- end
26
-
27
- # return find args (scope) for current settings
28
- def current_scope
29
- #debugger
30
- find_args = {}
31
- find_args[:include] = colInclude if colInclude
32
- if sort_by.present? && col = columns_hash[sort_by]
33
- if case_sensitive || !([:string, :text].include?(col.value_type))
34
- find_args[:order] = "#{sort_by} #{sort_order}"
35
- else
36
- find_args[:order] = "upper(#{sort_by}) #{sort_order}"
37
- end
38
- end
39
- if total_rows.present? && total_rows > 0
40
- find_args[:limit] = total_rows
41
- offset = (current_page.to_i-1) * rows_per_page if current_page.present?
42
- find_args[:offset] = offset if offset && offset > 0
43
- elsif rows_per_page.present? && rows_per_page > 0
44
- find_args[:limit] = rows_per_page
45
- offset = (current_page.to_i-1) * rows_per_page if current_page.present?
46
- find_args[:offset] = offset if offset && offset > 0
47
- end
48
- cond = rules_to_conditions
49
- find_args[:conditions] = cond unless cond.blank?
50
- find_args
51
- end
52
-
53
- def find( params )
54
- #debugger
55
- update_from_params params
56
- find_args = current_scope
57
- klass = resource.classify.constantize
58
- records = klass.send( finder, :all, find_args )
59
- end
60
-
61
- def encode_records( records, total_count=nil )
62
- #debugger
63
- klass = resource.classify.constantize
64
- total_count ||= klass.count
65
- total_pages = total_count / rows_per_page + 1
66
- #TODO: :only => [attributes], :methods => [virtual attributes]
67
- case data_type
68
- when :xml
69
- # if colInclude
70
- # xml = records.to_xml( :include => [ colInclude ], :skip_types => true, :dasherize => false ) do |xml|
71
- # if rows_per_page > 0
72
- # xml.page current_page
73
- # xml.total_pages total_pages
74
- # xml.total_records total_count
75
- # end
76
- # end
77
- # else
78
- xml = records.to_xml( :skip_types => true, :dasherize => false ) do |xml|
79
- if rows_per_page > 0
80
- xml.page current_page
81
- xml.total total_pages
82
- xml.records total_count
83
- end
84
- end
85
- # end
86
-
87
- when :json
88
- #debugger
89
- data = { resource => records }
90
- if rows_per_page > 0
91
- data.merge!(
92
- :page => current_page,
93
- :total => total_pages,
94
- :records => total_count
95
- )
96
- end
97
- save = ActiveRecord::Base.include_root_in_json
98
- ActiveRecord::Base.include_root_in_json = false
99
- if colInclude
100
- json = data.to_json(:include => colInclude)
101
- else
102
- json = data.to_json
103
- end
104
- ActiveRecord::Base.include_root_in_json = save
105
- json
106
-
107
- #others...
108
- else #nop ?
109
- records.to_s
110
- end
111
- end
112
-
113
- def find_and_encode( params )
114
- encode_records( find( params ) )
115
- end
116
-
117
- # grid doesnt nest attributes inside the resource
118
- # could change this behavior in jqGrid, see grid.postext.js ?
119
- # http://www.trirand.com/jqgridwiki/doku.php?id=wiki:post_data_module
120
- #
121
- def member_params( params )
122
- params.inject({}) {|h, (name, value)| h[name] = value if columns_hash[name]; h }
123
- end
124
-
125
- protected
126
-
127
- OPS = { 'eq' => '=', 'lt' => '<', 'le' => '<=', 'gt' => '>', 'ge' => '>=', 'ne' => '!=' }
128
- #['eq','ne','lt','le','gt','ge',
129
- # 'bw','bn','in','ni','ew','en','cn','nc']
130
- #['equal','not equal', 'less', 'less or equal','greater','greater or equal',
131
- # 'begins with','does not begin with','is in','is not in','ends with','does not end with','contains','does not contain']
132
-
133
- OPS_PATTERN = {
134
- 'bw' => '?%',
135
- 'bn' => '?%',
136
- # 'in'
137
- # 'ni'
138
- 'ew' => '%?',
139
- 'en' => '%?',
140
- 'cn' => '%?%',
141
- 'nc' => '%?%',
142
- }
143
-
144
- STRING_OPS = {
145
- 'bw' => 'LIKE',
146
- 'bn' => 'NOT LIKE',
147
- 'ew' => 'LIKE',
148
- 'en' => 'NOT LIKE',
149
- 'cn' => 'LIKE',
150
- 'nc' => 'NOT LIKE',
151
- }
152
-
153
- # params[:filters] => {"groupOp"=>"AND",
154
- # "rules"=>[{"data"=>"b", "op"=>"ge", "field"=>"title"}, {"data"=>"f", "op"=>"le", "field"=>"title"}] }
155
- def params_to_rules( params )
156
- #debugger
157
- if params[:_search]=='true' || params[:_search]==true
158
- if params[:filters]
159
- # advanced search
160
- filters = ActiveSupport::JSON.decode( params[:filters] )
161
- self.search_rules = filters['rules']
162
- self.search_rules_op = filters['groupOp']
163
- elsif params[:searchField]
164
- # simple search
165
- self.search_rules = [{ "field" => params[:searchField], "op" => params[:searchOper], "data" => params[:searchString]}]
166
- else
167
- # toolbar search
168
- self.search_rules = []
169
- self.search_rules_op = :and
170
- colModel.each do |col|
171
- name = col.name
172
- data = params[name.to_sym]
173
- self.search_rules << { "field" => name, "op" => "cn", "data" => data } if data
174
- end
175
- end
176
- end
177
- search_rules
178
- end
179
-
180
- def rules_to_conditions
181
- # note: ignoring case_sensitive as an option, ActiveRecord find is insensitive by default (have to model the db to let it be case sensitive?)
182
- return nil if search_rules.blank?
183
- cond = nil
184
- expr = ''
185
- vals = []
186
- search_rules.each do |rule|
187
- expr << " #{search_rules_op} " unless expr.blank?
188
- if op = OPS[rule['op']]
189
- expr << "#{rule['field']} #{op} ?"
190
- vals << rule['data']
191
- elsif op = STRING_OPS[rule['op']]
192
- expr << "#{rule['field']} #{op} ?"
193
- vals << OPS_PATTERN[rule['op']].gsub('?', rule['data'])
194
- end
195
- end
196
- cond = [ expr ] + vals
197
- end
198
- end
199
- end
200
-
201
- # # If you need to display error messages
202
- # err = ""
203
- # if user
204
- # user.errors.entries.each do |error|
205
- # err << "<strong>#{error[0]}</strong> : #{error[1]}<br/>"
206
- # end
207
- # end
208
- #
209
- # render :text => "#{err}"
210
-
211
- # { :add => true, :edit => true, :inline_edit => false, :delete => true, :edit_url => "/users/post_data", :error_handler => "after_submit" }
1
+ module Gridify
2
+ class Grid
3
+
4
+ attr_accessor :search_rules, # current search/filter rules, as hash
5
+ :search_rules_op # :and, :or
6
+
7
+ # finds records based on request params
8
+ # e.g. params from jqGrid
9
+ # :_search do search (true/false) ["false"]
10
+ # :sidx sort index (column to search on) [""]
11
+ # :sord sort direction (desc/asc) ["asc"]
12
+ # :nd ?
13
+ # :rows number of items to get ["20"]
14
+ # :page page number (starts at 1) ["1"]
15
+
16
+ def update_from_params( params )
17
+ params.symbolize_keys!
18
+ params_to_rules params
19
+ self.data_type = params[:datatype] if params[:datatype]
20
+ self.sort_by = params[:sidx] if params[:sidx]
21
+ self.sort_order = params[:sord] if params[:sord]
22
+ self.current_page = params[:page].to_i if params[:page]
23
+ self.rows_per_page = params[:rows].to_i if params[:rows]
24
+ self.total_rows = params[:total_rows].to_i if params[:total_rows]
25
+ end
26
+
27
+ # return find args (scope) for current settings
28
+ def current_scope
29
+ #debugger
30
+ find_args = {}
31
+ find_args[:include] = colInclude if colInclude
32
+ if sort_by.present? && col = columns_hash[sort_by]
33
+ if (sort_by.include? ".")
34
+ # Workaround for :include and nested attributes
35
+ field = sort_by.split('.', 2)
36
+ if field.length == 2
37
+ self.sort_by = field[0].pluralize + "." + field[1]
38
+ end
39
+ end
40
+ if case_sensitive || !([:string, :text].include?(col.value_type))
41
+ find_args[:order] = "#{sort_by} #{sort_order}"
42
+ else
43
+ find_args[:order] = "upper(#{sort_by}) #{sort_order}"
44
+ end
45
+ end
46
+ if total_rows.present? && total_rows > 0
47
+ find_args[:limit] = total_rows
48
+ offset = (current_page.to_i-1) * rows_per_page if current_page.present?
49
+ find_args[:offset] = offset if offset && offset > 0
50
+ elsif rows_per_page.present? && rows_per_page > 0
51
+ find_args[:limit] = rows_per_page
52
+ offset = (current_page.to_i-1) * rows_per_page if current_page.present?
53
+ find_args[:offset] = offset if offset && offset > 0
54
+ end
55
+ cond = rules_to_conditions
56
+ find_args[:conditions] = cond unless cond.blank?
57
+ find_args
58
+ end
59
+
60
+ def find( params )
61
+ #debugger
62
+ update_from_params params
63
+ klass = resource.classify.constantize
64
+ records = klass.send( finder, :all, current_scope )
65
+ end
66
+
67
+ def encode_records( records, userdata=nil, total_count=nil )
68
+ #debugger
69
+ klass = resource.classify.constantize
70
+ total_count ||= klass.count
71
+ total_pages = total_count / rows_per_page + 1
72
+ #TODO: :only => [attributes], :methods => [virtual attributes]
73
+ case data_type
74
+ when :xml
75
+ if colInclude
76
+ xml = records.to_xml( :include => colInclude, :skip_types => true, :dasherize => false ) do |xml|
77
+ if rows_per_page > 0
78
+ xml.page current_page
79
+ xml.total total_pages
80
+ xml.records total_count
81
+ end
82
+ end
83
+ else
84
+ xml = records.to_xml( :skip_types => true, :dasherize => false ) do |xml|
85
+ if rows_per_page > 0
86
+ xml.page current_page
87
+ xml.total total_pages
88
+ xml.records total_count
89
+ end
90
+ end
91
+ end
92
+ when :json
93
+ #debugger
94
+ data = { resource => records }
95
+ if rows_per_page > 0
96
+ data.merge!(
97
+ :page => current_page,
98
+ :total => total_pages,
99
+ :records => total_count
100
+ )
101
+ end
102
+ data.merge!( :userdata => userdata ) if userdata
103
+ save = ActiveRecord::Base.include_root_in_json
104
+ ActiveRecord::Base.include_root_in_json = false
105
+ if colInclude
106
+ json = data.to_json(:include => colInclude)
107
+ else
108
+ json = data.to_json
109
+ end
110
+ ActiveRecord::Base.include_root_in_json = save
111
+ json
112
+ #others...
113
+ else #nop ?
114
+ records.to_s
115
+ end
116
+ end
117
+
118
+ def find_and_encode( params )
119
+ encode_records( find( params ) )
120
+ end
121
+
122
+ # grid doesnt nest attributes inside the resource
123
+ # could change this behavior in jqGrid, see grid.postext.js ?
124
+ # http://www.trirand.com/jqgridwiki/doku.php?id=wiki:post_data_module
125
+ #
126
+ def member_params( params )
127
+ params.inject({}) {|h, (name, value)| h[name] = value if columns_hash[name]; h }
128
+ end
129
+
130
+ protected
131
+
132
+ OPS = { 'eq' => '=', 'lt' => '<', 'le' => '<=', 'gt' => '>', 'ge' => '>=', 'ne' => '!=' }
133
+ #['eq','ne','lt','le','gt','ge',
134
+ # 'bw','bn','in','ni','ew','en','cn','nc']
135
+ #['equal','not equal', 'less', 'less or equal','greater','greater or equal',
136
+ # 'begins with','does not begin with','is in','is not in','ends with','does not end with','contains','does not contain']
137
+
138
+ OPS_PATTERN = {
139
+ 'bw' => '?%',
140
+ 'bn' => '?%',
141
+ # 'in'
142
+ # 'ni'
143
+ 'ew' => '%?',
144
+ 'en' => '%?',
145
+ 'cn' => '%?%',
146
+ 'nc' => '%?%',
147
+ }
148
+
149
+ STRING_OPS = {
150
+ 'bw' => 'LIKE',
151
+ 'bn' => 'NOT LIKE',
152
+ 'ew' => 'LIKE',
153
+ 'en' => 'NOT LIKE',
154
+ 'cn' => 'LIKE',
155
+ 'nc' => 'NOT LIKE',
156
+ }
157
+
158
+ # params[:filters] => {"groupOp"=>"AND",
159
+ # "rules"=>[{"data"=>"b", "op"=>"ge", "field"=>"title"}, {"data"=>"f", "op"=>"le", "field"=>"title"}] }
160
+ def params_to_rules( params )
161
+ #debugger
162
+ if params[:_search]=='true' || params[:_search]==true
163
+ if params[:filters]
164
+ # advanced search
165
+ filters = ActiveSupport::JSON.decode( params[:filters] )
166
+ self.search_rules = filters['rules']
167
+ self.search_rules_op = filters['groupOp']
168
+ elsif params[:searchField]
169
+ # simple search
170
+ self.search_rules = [{ "field" => params[:searchField], "op" => params[:searchOper], "data" => params[:searchString]}]
171
+ else
172
+ # toolbar search
173
+ self.search_rules = []
174
+ self.search_rules_op = :and
175
+ colModel.each do |col|
176
+ name = col.name
177
+ data = params[name.to_sym]
178
+ self.search_rules << { "field" => name, "op" => "cn", "data" => data } if data
179
+ end
180
+ end
181
+ end
182
+ search_rules
183
+ end
184
+
185
+ def rules_to_conditions
186
+ # note: ignoring case_sensitive as an option, ActiveRecord find is insensitive by default (have to model the db to let it be case sensitive?)
187
+ return nil if search_rules.blank?
188
+ cond = nil
189
+ expr = ''
190
+ vals = []
191
+ search_rules.each do |rule|
192
+
193
+ # Workaround for :include and nested attributes
194
+ field = rule['field'].split('.', 2)
195
+ if field.length == 2
196
+ rule['field'] = field[0].pluralize + "." + field[1]
197
+ end
198
+
199
+ expr << " #{search_rules_op} " unless expr.blank?
200
+ if op = OPS[rule['op']]
201
+ expr << "#{rule['field']} #{op} ?"
202
+ vals << rule['data']
203
+ elsif op = STRING_OPS[rule['op']]
204
+ expr << "#{rule['field']} #{op} ?"
205
+ vals << OPS_PATTERN[rule['op']].gsub('?', rule['data'])
206
+ end
207
+ end
208
+ cond = [ expr ] + vals
209
+ end
210
+ end
211
+ end
212
+
213
+ # # If you need to display error messages
214
+ # err = ""
215
+ # if user
216
+ # user.errors.entries.each do |error|
217
+ # err << "<strong>#{error[0]}</strong> : #{error[1]}<br/>"
218
+ # end
219
+ # end
220
+ #
221
+ # render :text => "#{err}"
222
+
223
+ # { :add => true, :edit => true, :inline_edit => false, :delete => true, :edit_url => "/users/post_data", :error_handler => "after_submit" }