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

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.
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" }