wice_grid 3.6.2 → 4.1.0

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 (332) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +41 -0
  3. data/.circleci/run-build-locally.sh +7 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
  5. data/.gitignore +5 -2
  6. data/Appraisals +11 -0
  7. data/CHANGELOG.md +38 -1
  8. data/Gemfile.lock +299 -0
  9. data/README.md +77 -34
  10. data/config/locales/ja.yml +3 -3
  11. data/gemfiles/rails_5.0.gemfile +7 -0
  12. data/gemfiles/rails_5.0.gemfile.lock +291 -0
  13. data/gemfiles/rails_5.1.gemfile +7 -0
  14. data/gemfiles/rails_5.1.gemfile.lock +291 -0
  15. data/gemfiles/rails_5.2.gemfile +7 -0
  16. data/gemfiles/rails_5.2.gemfile.lock +299 -0
  17. data/lib/wice/columns.rb +13 -6
  18. data/lib/wice/columns/column_integer.rb +11 -1
  19. data/lib/wice/columns/column_rails_datetime_helper.rb +3 -2
  20. data/lib/wice/columns/column_range.rb +6 -4
  21. data/lib/wice/grid_renderer.rb +23 -7
  22. data/lib/wice/helpers/bs_calendar_helpers.rb +9 -1
  23. data/lib/wice/helpers/wice_grid_view_helpers.rb +6 -6
  24. data/lib/wice/wice_grid_controller.rb +7 -5
  25. data/lib/wice/wice_grid_core_ext.rb +5 -1
  26. data/lib/wice/wice_grid_misc.rb +1 -1
  27. data/lib/wice_grid.rb +86 -59
  28. data/spec/acceptance_helper.rb +58 -0
  29. data/spec/features/action_column_request_spec.rb +280 -0
  30. data/spec/features/adding_rows_request_spec.rb +21 -0
  31. data/spec/features/all_records_request_spec.rb +18 -0
  32. data/spec/features/auto_reloads2_request_spec.rb +349 -0
  33. data/spec/features/auto_reloads3_request_spec.rb +130 -0
  34. data/spec/features/auto_reloads_request_spec.rb +348 -0
  35. data/spec/features/basics1_request_spec.rb +11 -0
  36. data/spec/features/basics2_request_spec.rb +10 -0
  37. data/spec/features/basics3_request_spec.rb +29 -0
  38. data/spec/features/basics4_request_spec.rb +19 -0
  39. data/spec/features/basics5_request_spec.rb +13 -0
  40. data/spec/features/basics6_request_spec.rb +22 -0
  41. data/spec/features/blockless_column_definition_spec.rb +27 -0
  42. data/spec/features/buttons_request_spec.rb +172 -0
  43. data/spec/features/csv_and_detached_filters_spec.rb +10 -0
  44. data/spec/features/csv_export_request_spec.rb +13 -0
  45. data/spec/features/custom_filter_params_request_spec.rb +29 -0
  46. data/spec/features/custom_filters1_request_spec.rb +155 -0
  47. data/spec/features/custom_filters2_request_spec.rb +53 -0
  48. data/spec/features/custom_filters3_request_spec.rb +50 -0
  49. data/spec/features/custom_filters4_request_spec.rb +13 -0
  50. data/spec/features/custom_ordering_on_calculated_request_spec.rb +30 -0
  51. data/spec/features/custom_ordering_request_spec.rb +36 -0
  52. data/spec/features/custom_ordering_with_arel_request_spec.rb +36 -0
  53. data/spec/features/custom_ordering_with_proc_request_spec.rb +44 -0
  54. data/spec/features/custom_ordering_with_ruby_request_spec.rb +30 -0
  55. data/spec/features/dates_request_spec.rb +56 -0
  56. data/spec/features/detached_filters_spec.rb +10 -0
  57. data/spec/features/detached_filters_two_grids_spec.rb +127 -0
  58. data/spec/features/disable_all_filters_spec.rb +22 -0
  59. data/spec/features/hiding_checkboxes_in_action_column_request_spec.rb +294 -0
  60. data/spec/features/integration_with_application_view_request_spec.rb +43 -0
  61. data/spec/features/integration_with_forms_request_spec.rb +141 -0
  62. data/spec/features/joining_tables_spec.rb +40 -0
  63. data/spec/features/localization_request_spec.rb +24 -0
  64. data/spec/features/many_grids_on_page_request_spec.rb +104 -0
  65. data/spec/features/negation_request_spec.rb +25 -0
  66. data/spec/features/no_records_request_spec.rb +26 -0
  67. data/spec/features/numeric_filters_request_spec.rb +10 -0
  68. data/spec/features/resultset_processings2_request_spec.rb +27 -0
  69. data/spec/features/resultset_processings_request_spec.rb +30 -0
  70. data/spec/features/saved_queries_request_spec.rb +120 -0
  71. data/spec/features/shared.rb +1005 -0
  72. data/spec/features/shared_detached_filters.rb +158 -0
  73. data/spec/features/styling_spec.rb +15 -0
  74. data/spec/features/two_associations_spec.rb +48 -0
  75. data/spec/features/upper_pagination_panel_request_spec.rb +23 -0
  76. data/spec/features/when_filtered_spec.rb +209 -0
  77. data/spec/fixtures/.gitkeep +0 -0
  78. data/spec/fixtures/companies.yml +21 -0
  79. data/spec/fixtures/priorities.yml +31 -0
  80. data/spec/fixtures/project_roles.yml +25 -0
  81. data/spec/fixtures/projects.yml +22 -0
  82. data/spec/fixtures/statuses.yml +55 -0
  83. data/spec/fixtures/tasks.yml +751 -0
  84. data/spec/fixtures/tasks_users.yml +2089 -0
  85. data/spec/fixtures/users.yml +61 -0
  86. data/spec/fixtures/versions.yml +78 -0
  87. data/spec/models/company_spec.rb +6 -0
  88. data/spec/models/priority_spec.rb +6 -0
  89. data/spec/models/project_spec.rb +11 -0
  90. data/spec/models/status_spec.rb +6 -0
  91. data/spec/models/task_spec.rb +12 -0
  92. data/spec/models/user_project_participation_spec.rb +7 -0
  93. data/spec/models/user_spec.rb +12 -0
  94. data/spec/models/version_spec.rb +5 -0
  95. data/spec/rails_helper.rb +15 -0
  96. data/spec/spec_helper.rb +10 -9
  97. data/spec/support/test_app/Rakefile +3 -0
  98. data/spec/support/test_app/app/assets/javascripts/application.js +20 -0
  99. data/spec/support/test_app/app/assets/javascripts/common.js.coffee +6 -0
  100. data/spec/support/test_app/app/assets/javascripts/jquery.ui.datepicker.locales.js +56 -0
  101. data/spec/support/test_app/app/assets/stylesheets/adding_rows.scss +3 -0
  102. data/spec/support/test_app/app/assets/stylesheets/application.scss +46 -0
  103. data/spec/support/test_app/app/assets/stylesheets/csv_and_detached_filters.scss +3 -0
  104. data/spec/support/test_app/app/assets/stylesheets/many_grids_on_page.scss +3 -0
  105. data/spec/support/test_app/app/controllers/action_column_controller.rb +15 -0
  106. data/spec/support/test_app/app/controllers/adding_rows_controller.rb +14 -0
  107. data/spec/support/test_app/app/controllers/all_records_controller.rb +14 -0
  108. data/spec/support/test_app/app/controllers/application_controller.rb +99 -0
  109. data/spec/support/test_app/app/controllers/auto_reloads2_controller.rb +14 -0
  110. data/spec/support/test_app/app/controllers/auto_reloads3_controller.rb +20 -0
  111. data/spec/support/test_app/app/controllers/auto_reloads_controller.rb +14 -0
  112. data/spec/support/test_app/app/controllers/basics1_controller.rb +6 -0
  113. data/spec/support/test_app/app/controllers/basics2_controller.rb +6 -0
  114. data/spec/support/test_app/app/controllers/basics3_controller.rb +6 -0
  115. data/spec/support/test_app/app/controllers/basics4_controller.rb +6 -0
  116. data/spec/support/test_app/app/controllers/basics5_controller.rb +6 -0
  117. data/spec/support/test_app/app/controllers/basics6_controller.rb +11 -0
  118. data/spec/support/test_app/app/controllers/blockless_column_definition_controller.rb +6 -0
  119. data/spec/support/test_app/app/controllers/buttons_controller.rb +6 -0
  120. data/spec/support/test_app/app/controllers/csv_and_detached_filters_controller.rb +13 -0
  121. data/spec/support/test_app/app/controllers/csv_export_controller.rb +28 -0
  122. data/spec/support/test_app/app/controllers/custom_filter_params_controller.rb +6 -0
  123. data/spec/support/test_app/app/controllers/custom_filters1_controller.rb +9 -0
  124. data/spec/support/test_app/app/controllers/custom_filters2_controller.rb +14 -0
  125. data/spec/support/test_app/app/controllers/custom_filters3_controller.rb +12 -0
  126. data/spec/support/test_app/app/controllers/custom_filters4_controller.rb +12 -0
  127. data/spec/support/test_app/app/controllers/custom_ordering_controller.rb +18 -0
  128. data/spec/support/test_app/app/controllers/custom_ordering_on_calculated_controller.rb +6 -0
  129. data/spec/support/test_app/app/controllers/custom_ordering_with_arel_controller.rb +18 -0
  130. data/spec/support/test_app/app/controllers/custom_ordering_with_proc_controller.rb +11 -0
  131. data/spec/support/test_app/app/controllers/custom_ordering_with_ruby_controller.rb +6 -0
  132. data/spec/support/test_app/app/controllers/dates_controller.rb +8 -0
  133. data/spec/support/test_app/app/controllers/detached_filters_controller.rb +6 -0
  134. data/spec/support/test_app/app/controllers/detached_filters_two_grids_controller.rb +7 -0
  135. data/spec/support/test_app/app/controllers/disable_all_filters_controller.rb +6 -0
  136. data/spec/support/test_app/app/controllers/hiding_checkboxes_in_action_column_controller.rb +13 -0
  137. data/spec/support/test_app/app/controllers/home_controller.rb +3 -0
  138. data/spec/support/test_app/app/controllers/integration_with_application_view_controller.rb +16 -0
  139. data/spec/support/test_app/app/controllers/integration_with_forms_controller.rb +11 -0
  140. data/spec/support/test_app/app/controllers/joining_tables_controller.rb +11 -0
  141. data/spec/support/test_app/app/controllers/localization_controller.rb +26 -0
  142. data/spec/support/test_app/app/controllers/many_grids_on_page_controller.rb +7 -0
  143. data/spec/support/test_app/app/controllers/negation_controller.rb +14 -0
  144. data/spec/support/test_app/app/controllers/no_records_controller.rb +8 -0
  145. data/spec/support/test_app/app/controllers/null_values_controller.rb +10 -0
  146. data/spec/support/test_app/app/controllers/numeric_filters_controller.rb +6 -0
  147. data/spec/support/test_app/app/controllers/queries_controller.rb +4 -0
  148. data/spec/support/test_app/app/controllers/resultset_processings2_controller.rb +29 -0
  149. data/spec/support/test_app/app/controllers/resultset_processings_controller.rb +30 -0
  150. data/spec/support/test_app/app/controllers/saved_queries_controller.rb +14 -0
  151. data/spec/support/test_app/app/controllers/styling_controller.rb +7 -0
  152. data/spec/support/test_app/app/controllers/tasks_controller.rb +14 -0
  153. data/spec/support/test_app/app/controllers/two_associations_controller.rb +6 -0
  154. data/spec/support/test_app/app/controllers/upper_pagination_panel_controller.rb +6 -0
  155. data/spec/support/test_app/app/controllers/when_filtered_controller.rb +6 -0
  156. data/spec/support/test_app/app/helpers/application_helper.rb +82 -0
  157. data/spec/support/test_app/app/mailers/.gitkeep +0 -0
  158. data/spec/support/test_app/app/models/.gitkeep +0 -0
  159. data/spec/support/test_app/app/models/company.rb +5 -0
  160. data/spec/support/test_app/app/models/populate.rb +84 -0
  161. data/spec/support/test_app/app/models/priority.rb +10 -0
  162. data/spec/support/test_app/app/models/project.rb +14 -0
  163. data/spec/support/test_app/app/models/project_role.rb +3 -0
  164. data/spec/support/test_app/app/models/status.rb +10 -0
  165. data/spec/support/test_app/app/models/task.rb +11 -0
  166. data/spec/support/test_app/app/models/to_dropdown_mixin.rb +16 -0
  167. data/spec/support/test_app/app/models/user.rb +8 -0
  168. data/spec/support/test_app/app/models/user_project_participation.rb +6 -0
  169. data/spec/support/test_app/app/models/version.rb +6 -0
  170. data/spec/support/test_app/app/views/action_column/_grid.html.erb +35 -0
  171. data/spec/support/test_app/app/views/action_column/index.html.haml +45 -0
  172. data/spec/support/test_app/app/views/adding_rows/_grid.html.erb +58 -0
  173. data/spec/support/test_app/app/views/adding_rows/index.html.haml +37 -0
  174. data/spec/support/test_app/app/views/all_records/_grid.html.erb +30 -0
  175. data/spec/support/test_app/app/views/all_records/index.html.haml +12 -0
  176. data/spec/support/test_app/app/views/auto_reloads/_grid.html.erb +32 -0
  177. data/spec/support/test_app/app/views/auto_reloads/index.html.haml +15 -0
  178. data/spec/support/test_app/app/views/auto_reloads2/_grid.html.erb +32 -0
  179. data/spec/support/test_app/app/views/auto_reloads2/index.html.haml +65 -0
  180. data/spec/support/test_app/app/views/auto_reloads3/_grid.html.erb +25 -0
  181. data/spec/support/test_app/app/views/auto_reloads3/index.html.haml +78 -0
  182. data/spec/support/test_app/app/views/basics1/_grid.html.erb +26 -0
  183. data/spec/support/test_app/app/views/basics1/index.html.haml +13 -0
  184. data/spec/support/test_app/app/views/basics2/_grid.html.erb +27 -0
  185. data/spec/support/test_app/app/views/basics2/index.html.haml +12 -0
  186. data/spec/support/test_app/app/views/basics3/_grid.html.erb +28 -0
  187. data/spec/support/test_app/app/views/basics3/index.html.haml +13 -0
  188. data/spec/support/test_app/app/views/basics4/_grid.html.erb +21 -0
  189. data/spec/support/test_app/app/views/basics4/index.html.haml +12 -0
  190. data/spec/support/test_app/app/views/basics5/_grid.html.erb +19 -0
  191. data/spec/support/test_app/app/views/basics5/index.html.haml +12 -0
  192. data/spec/support/test_app/app/views/basics6/_grid.html.erb +19 -0
  193. data/spec/support/test_app/app/views/basics6/index.html.haml +23 -0
  194. data/spec/support/test_app/app/views/blockless_column_definition/_grid.html.erb +19 -0
  195. data/spec/support/test_app/app/views/blockless_column_definition/index.html.haml +15 -0
  196. data/spec/support/test_app/app/views/buttons/_grid.html.erb +20 -0
  197. data/spec/support/test_app/app/views/buttons/index.html.haml +30 -0
  198. data/spec/support/test_app/app/views/csv_and_detached_filters/_grid.html.erb +23 -0
  199. data/spec/support/test_app/app/views/csv_and_detached_filters/index.html.haml +58 -0
  200. data/spec/support/test_app/app/views/csv_export/_projects_grid.html.erb +17 -0
  201. data/spec/support/test_app/app/views/csv_export/_tasks_grid.html.erb +43 -0
  202. data/spec/support/test_app/app/views/csv_export/index.html.haml +90 -0
  203. data/spec/support/test_app/app/views/custom_filter_params/_grid.html.erb +12 -0
  204. data/spec/support/test_app/app/views/custom_filter_params/index.html.haml +12 -0
  205. data/spec/support/test_app/app/views/custom_filters1/_g1.html.erb +8 -0
  206. data/spec/support/test_app/app/views/custom_filters1/_g2.html.erb +9 -0
  207. data/spec/support/test_app/app/views/custom_filters1/_g3.html.erb +9 -0
  208. data/spec/support/test_app/app/views/custom_filters1/_g4.html.erb +8 -0
  209. data/spec/support/test_app/app/views/custom_filters1/index.html.haml +30 -0
  210. data/spec/support/test_app/app/views/custom_filters2/_grid.html.erb +30 -0
  211. data/spec/support/test_app/app/views/custom_filters2/index.html.haml +41 -0
  212. data/spec/support/test_app/app/views/custom_filters3/_grid.html.erb +18 -0
  213. data/spec/support/test_app/app/views/custom_filters3/index.html.haml +16 -0
  214. data/spec/support/test_app/app/views/custom_filters4/_grid.html.erb +20 -0
  215. data/spec/support/test_app/app/views/custom_filters4/index.html.haml +12 -0
  216. data/spec/support/test_app/app/views/custom_ordering/_grid.html.erb +10 -0
  217. data/spec/support/test_app/app/views/custom_ordering/index.html.haml +24 -0
  218. data/spec/support/test_app/app/views/custom_ordering_on_calculated/_grid.html.erb +14 -0
  219. data/spec/support/test_app/app/views/custom_ordering_on_calculated/index.html.haml +23 -0
  220. data/spec/support/test_app/app/views/custom_ordering_with_arel/_grid.html.erb +10 -0
  221. data/spec/support/test_app/app/views/custom_ordering_with_arel/index.html.haml +24 -0
  222. data/spec/support/test_app/app/views/custom_ordering_with_proc/_grid.html.erb +10 -0
  223. data/spec/support/test_app/app/views/custom_ordering_with_proc/index.html.haml +21 -0
  224. data/spec/support/test_app/app/views/custom_ordering_with_ruby/_grid.html.erb +10 -0
  225. data/spec/support/test_app/app/views/custom_ordering_with_ruby/index.html.haml +23 -0
  226. data/spec/support/test_app/app/views/dates/_grid.html.erb +25 -0
  227. data/spec/support/test_app/app/views/dates/index.html.haml +52 -0
  228. data/spec/support/test_app/app/views/detached_filters/_grid.html.erb +23 -0
  229. data/spec/support/test_app/app/views/detached_filters/index.html.haml +79 -0
  230. data/spec/support/test_app/app/views/detached_filters_two_grids/_grid.html.erb +23 -0
  231. data/spec/support/test_app/app/views/detached_filters_two_grids/index.html.haml +85 -0
  232. data/spec/support/test_app/app/views/disable_all_filters/_grid.html.erb +21 -0
  233. data/spec/support/test_app/app/views/disable_all_filters/index.html.haml +14 -0
  234. data/spec/support/test_app/app/views/hiding_checkboxes_in_action_column/_grid.html.erb +34 -0
  235. data/spec/support/test_app/app/views/hiding_checkboxes_in_action_column/index.html.haml +32 -0
  236. data/spec/support/test_app/app/views/integration_with_application_view/_grid.html.erb +27 -0
  237. data/spec/support/test_app/app/views/integration_with_application_view/index.html.haml +33 -0
  238. data/spec/support/test_app/app/views/integration_with_forms/_grid.html.erb +23 -0
  239. data/spec/support/test_app/app/views/integration_with_forms/index.html.haml +18 -0
  240. data/spec/support/test_app/app/views/joining_tables/_grid.html.erb +23 -0
  241. data/spec/support/test_app/app/views/joining_tables/index.html.haml +26 -0
  242. data/spec/support/test_app/app/views/layouts/application.html.haml +61 -0
  243. data/spec/support/test_app/app/views/localization/_grid.html.erb +36 -0
  244. data/spec/support/test_app/app/views/localization/index.html.haml +20 -0
  245. data/spec/support/test_app/app/views/many_grids_on_page/_tasks_grid1.html.erb +12 -0
  246. data/spec/support/test_app/app/views/many_grids_on_page/_tasks_grid2.html.erb +12 -0
  247. data/spec/support/test_app/app/views/many_grids_on_page/index.html.haml +26 -0
  248. data/spec/support/test_app/app/views/negation/_grid.html.erb +30 -0
  249. data/spec/support/test_app/app/views/negation/index.html.haml +15 -0
  250. data/spec/support/test_app/app/views/no_records/_empty_grid.html.haml +1 -0
  251. data/spec/support/test_app/app/views/no_records/_grid1.html.erb +11 -0
  252. data/spec/support/test_app/app/views/no_records/_grid2.html.erb +9 -0
  253. data/spec/support/test_app/app/views/no_records/_grid3.html.erb +9 -0
  254. data/spec/support/test_app/app/views/no_records/index.html.haml +24 -0
  255. data/spec/support/test_app/app/views/null_values/_grid.html.erb +17 -0
  256. data/spec/support/test_app/app/views/null_values/index.html.haml +21 -0
  257. data/spec/support/test_app/app/views/numeric_filters/_grid.html.erb +19 -0
  258. data/spec/support/test_app/app/views/numeric_filters/index.html.haml +12 -0
  259. data/spec/support/test_app/app/views/resultset_processings/_grid.html.erb +27 -0
  260. data/spec/support/test_app/app/views/resultset_processings/index.html.haml +50 -0
  261. data/spec/support/test_app/app/views/resultset_processings2/_grid.html.erb +27 -0
  262. data/spec/support/test_app/app/views/resultset_processings2/index.html.haml +48 -0
  263. data/spec/support/test_app/app/views/saved_queries/_grid.html.erb +30 -0
  264. data/spec/support/test_app/app/views/saved_queries/index.html.haml +15 -0
  265. data/spec/support/test_app/app/views/styling/_grid1.html.erb +12 -0
  266. data/spec/support/test_app/app/views/styling/_grid2.html.erb +31 -0
  267. data/spec/support/test_app/app/views/styling/index.html.haml +65 -0
  268. data/spec/support/test_app/app/views/tasks/_grid.html.erb +19 -0
  269. data/spec/support/test_app/app/views/tasks/index.html.haml +1 -0
  270. data/spec/support/test_app/app/views/two_associations/_grid.html.erb +13 -0
  271. data/spec/support/test_app/app/views/two_associations/index.html.haml +13 -0
  272. data/spec/support/test_app/app/views/upper_pagination_panel/_grid.html.erb +27 -0
  273. data/spec/support/test_app/app/views/upper_pagination_panel/index.html.haml +14 -0
  274. data/spec/support/test_app/app/views/when_filtered/_grid.html.erb +19 -0
  275. data/spec/support/test_app/app/views/when_filtered/index.html.haml +15 -0
  276. data/spec/support/test_app/bin/rails +4 -0
  277. data/spec/support/test_app/bin/rake +4 -0
  278. data/spec/support/test_app/config.ru +5 -0
  279. data/spec/support/test_app/config/application.rb +70 -0
  280. data/spec/support/test_app/config/boot.rb +7 -0
  281. data/spec/support/test_app/config/database.travis.yml +27 -0
  282. data/spec/support/test_app/config/database.yml +16 -0
  283. data/spec/support/test_app/config/database.yml.mysql +19 -0
  284. data/spec/support/test_app/config/database.yml.postgresql +18 -0
  285. data/spec/support/test_app/config/environment.rb +6 -0
  286. data/spec/support/test_app/config/environments/development.rb +34 -0
  287. data/spec/support/test_app/config/environments/production.rb +66 -0
  288. data/spec/support/test_app/config/environments/test.rb +34 -0
  289. data/spec/support/test_app/config/initializers/backtrace_silencers.rb +8 -0
  290. data/spec/support/test_app/config/initializers/inflections.rb +16 -0
  291. data/spec/support/test_app/config/initializers/mime_types.rb +6 -0
  292. data/spec/support/test_app/config/initializers/secret_token.rb +12 -0
  293. data/spec/support/test_app/config/initializers/session_store.rb +9 -0
  294. data/spec/support/test_app/config/initializers/wice_grid_config.rb +163 -0
  295. data/spec/support/test_app/config/initializers/wrap_parameters.rb +15 -0
  296. data/spec/support/test_app/config/locales/en.yml +5 -0
  297. data/spec/support/test_app/config/locales/wice_grid.yml +550 -0
  298. data/spec/support/test_app/config/puma.rb +15 -0
  299. data/spec/support/test_app/config/routes.rb +125 -0
  300. data/spec/support/test_app/db/migrate/20120224193505_create_tasks.rb +27 -0
  301. data/spec/support/test_app/db/migrate/20120224193517_create_users.rb +12 -0
  302. data/spec/support/test_app/db/migrate/20120224193522_create_projects.rb +14 -0
  303. data/spec/support/test_app/db/migrate/20120224193529_create_priorities.rb +13 -0
  304. data/spec/support/test_app/db/migrate/20120224193537_create_statuses.rb +13 -0
  305. data/spec/support/test_app/db/migrate/20120224193543_create_versions.rb +15 -0
  306. data/spec/support/test_app/db/migrate/20120224193550_create_project_roles.rb +12 -0
  307. data/spec/support/test_app/db/migrate/20120224193610_create_companies.rb +12 -0
  308. data/spec/support/test_app/db/migrate/20120224195351_create_user_project_participations.rb +16 -0
  309. data/spec/support/test_app/db/migrate/20120224195521_add_tasks_users.rb +11 -0
  310. data/spec/support/test_app/db/migrate/20120610091944_create_wice_grid_serialized_queries.rb +14 -0
  311. data/spec/support/test_app/db/schema.rb +139 -0
  312. data/spec/support/test_app/db/seeds.rb +10 -0
  313. data/spec/support/test_app/lib/ar_fixtures.rb +100 -0
  314. data/spec/support/test_app/lib/assets/.gitkeep +0 -0
  315. data/spec/support/test_app/lib/tasks/.gitkeep +0 -0
  316. data/spec/support/test_app/lib/tasks/ar_fixtures.rake +45 -0
  317. data/spec/support/test_app/public/404.html +26 -0
  318. data/spec/support/test_app/public/422.html +26 -0
  319. data/spec/support/test_app/public/500.html +25 -0
  320. data/spec/support/test_app/public/favicon.ico +0 -0
  321. data/spec/support/test_app/public/robots.txt +5 -0
  322. data/spec/wice/grid_output_buffer_spec.rb +2 -2
  323. data/spec/wice/table_column_matrix_spec.rb +1 -1
  324. data/vendor/assets/javascripts/wice_grid_init.js.coffee +16 -4
  325. data/vendor/assets/javascripts/wice_grid_saved_queries_init.js.coffee +1 -0
  326. data/wice_grid.gemspec +29 -9
  327. metadata +606 -62
  328. data/release_notes/RELEASE_NOTES_3.2.pre1.rdoc +0 -81
  329. data/release_notes/RELEASE_NOTES_3.2.pre2.rdoc +0 -6
  330. data/release_notes/RELEASE_NOTES_3.3.0.rdoc +0 -21
  331. data/spec/support/wice_grid_test_config.rb +0 -173
  332. data/test/readme.txt +0 -1
@@ -99,7 +99,8 @@ module Wice #:nodoc:
99
99
 
100
100
  # fields defined from the options parameter
101
101
  FIELDS = [:attribute, :name, :html, :filter, :model, :allow_multiple_selection,
102
- :in_html, :in_csv, :table_alias, :custom_order, :detach_with_id, :ordering, :auto_reload]
102
+ :in_html, :in_csv, :table_alias, :custom_order, :detach_with_id, :ordering, :auto_reload,
103
+ :filter_control_options, :sort_by]
103
104
 
104
105
  attr_accessor(*FIELDS)
105
106
 
@@ -124,6 +125,9 @@ module Wice #:nodoc:
124
125
  # A boolean flag: whether a column has a text input or not
125
126
  attr_reader :contains_a_text_input
126
127
 
128
+ # options for rendering filter controls. Supported options are specific to the type.
129
+ attr_accessor :filter_control_options
130
+
127
131
  def initialize(block, options, grid_obj, tname, mtable, cfilter, view) #:nodoc:
128
132
  self.cell_rendering_block = block
129
133
  self.grid = grid_obj
@@ -199,13 +203,16 @@ module Wice #:nodoc:
199
203
  [query, query_without_equals_sign, parameter_name, dom_id.tr('.', '_')]
200
204
  end
201
205
 
202
- # bad name, because for the main table the name is not really 'fully_qualified'
203
- def attribute_name_fully_qualified_for_all_but_main_table_columns #:nodoc:
204
- self.main_table ? attribute : table_alias_or_table_name + '.' + attribute
206
+ # Returns a reference to the column in the form: "table_name.column_name", unless it is a column in the main
207
+ # table, in which case it will return just "column_name",
208
+ def attribute_name_fully_qualified_for_all_but_main_table_columns
209
+ return attribute if main_table
210
+ return fully_qualified_attribute_name
205
211
  end
206
212
 
207
- def fully_qualified_attribute_name #:nodoc:
208
- table_alias_or_table_name + '.' + attribute
213
+ # Returns a reference to the column in the form: "table_name.column_name".
214
+ def fully_qualified_attribute_name
215
+ table_alias_or_table_name ? (table_alias_or_table_name + '.' + attribute) : nil
209
216
  end
210
217
 
211
218
  def filter_shown? #:nodoc:
@@ -30,6 +30,16 @@ module Wice
30
30
  end
31
31
 
32
32
  class ConditionsGeneratorColumnInteger < ConditionsGeneratorColumn #:nodoc:
33
+ # Note: also used in ColumnRange, hence class method
34
+ def self.get_value(val) #:nodoc:
35
+ # Try to determine localized separator using I18n and replace it with default one
36
+ separator = I18n.t!('number.format.separator') rescue nil
37
+ val = val.sub(separator, '.') if val.respond_to?(:sub) && separator
38
+
39
+ # Parse as float
40
+ Float(val) rescue nil
41
+ end
42
+
33
43
  def get_op_and_value(val) #:nodoc:
34
44
  num = nil
35
45
  op = nil
@@ -41,7 +51,7 @@ module Wice
41
51
  if start_of_num
42
52
  op = val[0...start_of_num]
43
53
  op = '=' if op == ''
44
- num = Float(val[start_of_num..-1]) rescue nil
54
+ num = ConditionsGeneratorColumnInteger.get_value(val[start_of_num..-1])
45
55
 
46
56
  op = nil unless ['<', '>', '<=', '>=', '='].include?(op)
47
57
  end
@@ -11,9 +11,10 @@ module Wice
11
11
  end
12
12
 
13
13
  def do_render(params) #:nodoc:
14
+ datetime_options = filter_control_options ? filter_control_options.slice(:start_year, :end_year, :max_year_allowed) : {}
14
15
  '<div class="date-filter">' +
15
- select_datetime(params[:fr], include_blank: true, prefix: @name1) + '<br/>' +
16
- select_datetime(params[:to], include_blank: true, prefix: @name2) +
16
+ select_datetime(params[:fr], datetime_options.merge(include_blank: true, prefix: @name1)) + '<br/>' +
17
+ select_datetime(params[:to], datetime_options.merge(include_blank: true, prefix: @name2)) +
17
18
  '</div>'
18
19
  end
19
20
 
@@ -41,18 +41,20 @@ module Wice
41
41
  end
42
42
  conditions = [[]]
43
43
  if opts[:fr]
44
- if opts[:fr] =~ /\d/
44
+ fr_num = ConditionsGeneratorColumnInteger.get_value(opts[:fr])
45
+ if fr_num
45
46
  conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} >= ? "
46
- conditions << opts[:fr]
47
+ conditions << fr_num
47
48
  else
48
49
  opts.delete(:fr)
49
50
  end
50
51
  end
51
52
 
52
53
  if opts[:to]
53
- if opts[:to] =~ /\d/
54
+ to_num = ConditionsGeneratorColumnInteger.get_value(opts[:to])
55
+ if to_num
54
56
  conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} <= ? "
55
- conditions << opts[:to]
57
+ conditions << to_num
56
58
  else
57
59
  opts.delete(:to)
58
60
  end
@@ -215,6 +215,9 @@ module Wice
215
215
  # * <tt>:filter_type</tt> - Using a column filter different from the default filter chosen automatically based on the
216
216
  # data type or the <tt>:custom_filter</tt> argument. See <tt>lib/columns/column_processor_index.rb</tt> for the
217
217
  # list of available filters.
218
+ # * <tt>:filter_control_options</tt> - Additional options to pass to the filter class to change the filter control
219
+ # behaviour. Supported options are dependent on the filter used.
220
+ # This is needed if sorting is required while filters are not.
218
221
  # * <tt>:ordering</tt> - Enable/disable ordering links in the column titles. The default is +true+
219
222
  # (i.e. if <tt>:attribute</tt> is defined, ordering is enabled)
220
223
  # * <tt>:assoc</tt> - Name of the model association. <tt>:attribute</tt> belongs to the table joined via this association.
@@ -259,6 +262,12 @@ module Wice
259
262
  # However, if the retuned value is a two element array, the first element is used for the option label and the
260
263
  # second - for the value.
261
264
  # Read more in README, section 'Custom dropdown filters'
265
+ # * <tt>:sort_by</tt> - allows arbitrary sorting of the results. This option takes a Proc which returns a value to
266
+ # sort by. When this option is used and sorting on this column is activated, the entire resultset is loaded and
267
+ # the Proc is passed to Enumerable#sort_by. This can also be used with calculated columns, but an arbitrary
268
+ # <tt>:attribute</tt> option must be included to provide a request parameter key. Because this option will load
269
+ # the entire resultset, it should only be used with small resultsets. The <tt>:custom_order</tt> option on grid
270
+ # initialization should be preferred if possible, as it will perform the sorting in SQL.
262
271
  # * <tt>:boolean_filter_true_label</tt> - overrides the label for <tt>true</tt> in the boolean filter (<tt>wice_grid.boolean_filter_true_label</tt> in <tt>wice_grid.yml</tt>).
263
272
  # * <tt>:boolean_filter_false_label</tt> - overrides the label for <tt>false</tt> in the boolean filter (<tt>wice_grid.boolean_filter_false_label</tt> in <tt>wice_grid.yml</tt>).
264
273
  # * <tt>:allow_multiple_selection</tt> - enables or disables switching between single and multiple selection modes for
@@ -305,6 +314,7 @@ module Wice
305
314
  detach_with_id: nil,
306
315
  filter: true,
307
316
  filter_all_label: ConfigurationProvider.value_for(:CUSTOM_FILTER_ALL_LABEL),
317
+ filter_control_options: {},
308
318
  filter_type: nil,
309
319
  html: {},
310
320
  in_csv: true,
@@ -313,7 +323,8 @@ module Wice
313
323
  name: '',
314
324
  negation: ConfigurationProvider.value_for(:NEGATION_IN_STRING_FILTERS),
315
325
  ordering: true,
316
- table_alias: nil
326
+ table_alias: nil,
327
+ sort_by: nil,
317
328
  }
318
329
 
319
330
  opts.assert_valid_keys(options.keys)
@@ -375,7 +386,8 @@ module Wice
375
386
  custom_filter_active: options[:custom_filter],
376
387
  table_alias: options[:table_alias],
377
388
  filter_type: options[:filter_type],
378
- assocs: assocs
389
+ assocs: assocs,
390
+ sort_by: options[:sort_by],
379
391
  )
380
392
 
381
393
  # [ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::Column, String, Boolean]
@@ -536,7 +548,7 @@ module Wice
536
548
  end
537
549
 
538
550
  def base_link_for_filter(controller, extra_parameters = {}) #:nodoc:
539
- new_params = Wice::WgHash.deep_clone controller.params
551
+ new_params = Wice::WgHash.deep_clone controller.params.to_unsafe_h
540
552
  new_params.merge!(extra_parameters)
541
553
 
542
554
  if new_params[@grid.name]
@@ -556,7 +568,7 @@ module Wice
556
568
  end
557
569
 
558
570
  def link_for_export(controller, format, extra_parameters = {}) #:nodoc:
559
- new_params = Wice::WgHash.deep_clone controller.params
571
+ new_params = Wice::WgHash.deep_clone controller.params.to_unsafe_h
560
572
  new_params.merge!(extra_parameters)
561
573
 
562
574
  new_params[@grid.name] = {} unless new_params[@grid.name]
@@ -567,7 +579,7 @@ module Wice
567
579
  end
568
580
 
569
581
  def column_link(column, direction, params, extra_parameters = {}) #:nodoc:
570
- column_attribute_name = if column.attribute.index('.') || column.main_table
582
+ column_attribute_name = if column.attribute.index('.') || column.main_table || column.table_alias_or_table_name.nil?
571
583
  column.attribute
572
584
  else
573
585
  column.table_alias_or_table_name + '.' + column.attribute
@@ -578,7 +590,7 @@ module Wice
578
590
  ORDER_DIRECTION_PARAMETER_NAME => direction
579
591
  } }
580
592
 
581
- cleaned_params = Wice::WgHash.deep_clone params
593
+ cleaned_params = Wice::WgHash.deep_clone params.to_unsafe_h
582
594
  cleaned_params.merge!(extra_parameters)
583
595
 
584
596
  cleaned_params.delete(:controller)
@@ -586,7 +598,11 @@ module Wice
586
598
 
587
599
  query_params = Wice::WgHash.rec_merge(cleaned_params, query_params)
588
600
 
589
- '?' + query_params.to_query
601
+ if Rails.version.to_i >= 5
602
+ '?' + query_params.to_h.to_query
603
+ else
604
+ '?' + query_params.to_query
605
+ end
590
606
  end
591
607
 
592
608
  protected
@@ -17,12 +17,20 @@ module Wice #:nodoc:
17
17
  end
18
18
 
19
19
  def date_calendar_bs(calendar_data) #:nodoc:
20
+ placeholder =
21
+ if calendar_data.the_other_datepicker_id_to
22
+ I18n.t("wice_grid.date_selector_tooltip_from")
23
+ else
24
+ I18n.t("wice_grid.date_selector_tooltip_to")
25
+ end
26
+
20
27
  text_field_tag_options = {
21
28
  :id => calendar_data.dom_id,
22
29
  'data-provide' => 'datepicker',
23
30
  'data-date-language' => I18n.locale,
24
31
  'data-date-autoclose' => true,
25
- 'data-date-format' => Wice::ConfigurationProvider.value_for(:DATE_FORMAT_BOOTSTRAP)
32
+ 'data-date-format' => Wice::ConfigurationProvider.value_for(:DATE_FORMAT_BOOTSTRAP),
33
+ 'placeholder' => placeholder
26
34
  }
27
35
 
28
36
  text_field_tag_options['class'] = 'form-control input-sm'
@@ -294,7 +294,7 @@ module Wice
294
294
 
295
295
  Wice::WgHash.add_or_append_class_value!(opts, column.css_class)
296
296
 
297
- if column.attribute && column.ordering
297
+ if column.attribute && (column.ordering || column.sort_by)
298
298
 
299
299
  column.add_css_class('active-filter') if grid.filtered_by?(column)
300
300
 
@@ -505,14 +505,14 @@ module Wice
505
505
  grid.output_buffer << '</div>'
506
506
 
507
507
  if Rails.env.development?
508
- grid.output_buffer << javascript_tag(%/ $(document).ready(function(){ \n/ +
508
+ grid.output_buffer << javascript_tag(%/ document.ready = function(){ \n/ +
509
509
  %$ if (typeof(WiceGridProcessor) == "undefined"){\n$ +
510
510
  %$ alert("wice_grid.js not loaded, WiceGrid cannot proceed!\\n" +\n$ +
511
511
  %( "Make sure that you have loaded wice_grid.js.\\n" + ) +
512
512
  %( "Add line //= require wice_grid.js " + ) +
513
513
  %$ "to app/assets/javascripts/application.js")\n$ +
514
514
  %( } ) +
515
- %$ }) $)
515
+ %$ } $)
516
516
  end
517
517
 
518
518
  grid.output_buffer
@@ -667,7 +667,7 @@ module Wice
667
667
  first = 1
668
668
  last = collection.size
669
669
 
670
- num_pages = 1
670
+ total_pages = 1
671
671
 
672
672
  class << collection
673
673
  def current_page
@@ -685,12 +685,12 @@ module Wice
685
685
  first = collection.offset_value + 1
686
686
  last = collection.last_page? ? collection.total_count : collection.offset_value + collection.limit_value
687
687
 
688
- num_pages = collection.total_pages
688
+ total_pages = collection.total_pages
689
689
  end
690
690
 
691
691
  parameters = grid.get_state_as_parameter_value_pairs
692
692
 
693
- if num_pages < 2 && collection.length == 0
693
+ if total_pages < 2 && collection.length == 0
694
694
  '0'
695
695
  else
696
696
  parameters << ["#{grid.name}[pp]", collection_total_entries]
@@ -40,10 +40,12 @@ module Wice
40
40
  # * <tt>:enable_export_to_csv</tt> - <Enable export of the table to CSV. Read the How-To to learn what else is needed to enable CSV export.
41
41
  # * <tt>:csv_file_name</tt> - Name of the exported CSV file. If the parameter is missing, the name of the grid will be used instead.
42
42
  # * <tt>:csv_field_separator</tt> - field separator for CSV files. The default is defined in +CSV_FIELD_SEPARATOR+ in the config file.
43
- # * <tt>:custom_order</tt> - used for overriding the ORDER BY clause with custom sql code (for example, including a function).
44
- # The value of the parameter is a hash where keys are fully qualified names
45
- # of database columns, and values the required chunks of SQL to use in the ORDER BY clause, either as strings or Proc object
46
- # evaluating to string. See section 'Custom Ordering' in the README.
43
+ # * <tt>:custom_order</tt> - used for overriding the ORDER BY clause with custom sql code (for example, using an SQL
44
+ # function). A Hash with keys of the fully qualified names of database columns and with values that specify the
45
+ # ordering to be used, without specifying the direction (no ASC or DESC). The values of this Hash can any String
46
+ # of SQL that can be passed to the ActiveRecord order clause, an instance of Arel::Attributes::Attribute, or a
47
+ # Proc that receives the fully qualified column name and returns a String or Arel::Attributes::Attribute. See
48
+ # section 'Custom Ordering' in the README.
47
49
  # * <tt>:saved_query</tt> - id of the saved query or the query object itself to load initially.
48
50
  # Read section "Saving Queries How-To" in README for more details.
49
51
  # * <tt>:after</tt> - defined a name of a controller method which would be called by the grid after all user input has been processed,
@@ -179,7 +181,7 @@ module Wice
179
181
  @performed_render = false
180
182
 
181
183
  logger.info "Sending file #{path}" unless logger.nil?
182
- File.open(path, 'rb') { |file| render status: options[:status], text: file.read }
184
+ File.open(path, 'rb') { |file| render status: options[:status], plain: file.read }
183
185
  end
184
186
 
185
187
  DEFAULT_SEND_FILE_OPTIONS_RAILS2 = { #:nodoc:
@@ -113,7 +113,11 @@ module ActionView #:nodoc:
113
113
  module Helpers #:nodoc:
114
114
  module TagHelper #:nodoc:
115
115
  def public_tag_options(options, escape = true) #:nodoc:
116
- tag_options(options, escape)
116
+ if respond_to?(:tag_options, true)
117
+ tag_options(options, escape)
118
+ else
119
+ tag_builder.tag_options(options, escape)
120
+ end
117
121
  end
118
122
  end
119
123
  end
@@ -159,7 +159,7 @@ module Wice
159
159
  end
160
160
 
161
161
  def log(message) #:nodoc:
162
- ActiveRecord::Base.logger.info('WiceGrid: ' + message)
162
+ ActiveRecord::Base.logger.info('WiceGrid: ' + message) if ActiveRecord::Base.logger
163
163
  end
164
164
  end
165
165
 
@@ -95,7 +95,7 @@ module Wice
95
95
  end
96
96
  end
97
97
 
98
- opts[:order_direction].downcase! if opts[:order_direction].is_a?(String)
98
+ opts[:order_direction] = opts[:order_direction].downcase if opts[:order_direction].is_a?(String)
99
99
 
100
100
  # validate :order_direction
101
101
  if opts[:order_direction] && ! (opts[:order_direction] == 'asc' || opts[:order_direction] == :asc || opts[:order_direction] == 'desc' ||
@@ -228,7 +228,8 @@ module Wice
228
228
  custom_filter_active: nil,
229
229
  table_alias: nil,
230
230
  filter_type: nil,
231
- assocs: []) #:nodoc:
231
+ assocs: [],
232
+ sort_by: nil) #:nodoc:
232
233
 
233
234
 
234
235
  @options[:include] = Wice.build_includes(@options[:include], assocs)
@@ -240,7 +241,8 @@ module Wice
240
241
  table_name = model.table_name
241
242
  else
242
243
  column = @table_column_matrix.get_column_in_default_model_class_by_column_name(column_name)
243
- if column.nil?
244
+ # Allow the column to not exist if we're doing a custom sort (calculated field)
245
+ if column.nil? && !sort_by
244
246
  raise WiceGridArgumentError.new("Column '#{column_name}' is not found in table '#{@klass.table_name}'! " \
245
247
  "If '#{column_name}' belongs to another table you should declare it in :include or :join when initialising " \
246
248
  'the grid, and specify :model in column declaration.')
@@ -296,9 +298,21 @@ module Wice
296
298
  # conditions processed
297
299
 
298
300
  if (!opts[:skip_ordering]) && ! @status[:order].blank?
299
- @ar_options[:order] = add_custom_order_sql(complete_column_name(@status[:order]))
300
-
301
- @ar_options[:order] += ' ' + @status[:order_direction]
301
+ custom_order = get_custom_order_reference
302
+ if custom_order
303
+ @ar_options[:order] = custom_order
304
+ else
305
+ @ar_options[:order] = arel_column_reference(@status[:order])
306
+ end
307
+ if @ar_options[:order].is_a?(Arel::Attributes::Attribute)
308
+ if @status[:order_direction] == 'desc'
309
+ @ar_options[:order] = @ar_options[:order].desc
310
+ else
311
+ @ar_options[:order] = @ar_options[:order].asc
312
+ end
313
+ else
314
+ @ar_options[:order] += " #{@status[:order_direction]}"
315
+ end
302
316
  end
303
317
 
304
318
  @ar_options[:joins] = @options[:joins]
@@ -326,36 +340,49 @@ module Wice
326
340
  relation
327
341
  end
328
342
 
343
+ # Apply the sort_by option to the results.
344
+ def apply_sort_by(relation)
345
+ active_sort_by = nil
346
+ @renderer.find_one_for(->(c) {c.attribute == @status[:order]}) {|r| active_sort_by = r.sort_by}
347
+ return relation if !active_sort_by
348
+ relation = relation.sort_by(&active_sort_by)
349
+ relation = relation.reverse if @status[:order_direction] == 'desc'
350
+ return relation
351
+ end
352
+
329
353
  # TO DO: what to do with other @ar_options values?
330
354
  def read #:nodoc:
331
355
  form_ar_options
332
356
  use_default_or_unscoped do
333
- @resultset = if self.output_csv? || all_record_mode?
334
- relation = @relation
335
- .includes(@ar_options[:include])
336
- .joins(@ar_options[:joins])
337
- .order(@ar_options[:order])
338
- .group(@ar_options[:group])
339
- .merge(@ar_options[:conditions])
340
- relation = add_references relation
341
-
342
- relation
343
- else
344
- # p @ar_options
345
- relation = @relation
346
- .send(@options[:page_method_name], @ar_options[:page])
347
- .per(@ar_options[:per_page])
348
- .includes(@ar_options[:include])
349
- .joins(@ar_options[:joins])
350
- .order(@ar_options[:order])
351
- .group(@ar_options[:group])
352
- .merge(@ar_options[:conditions])
353
-
354
- relation = add_references relation
355
-
356
- relation
357
+ relation = @relation
358
+ .includes(@ar_options[:include])
359
+ .joins(@ar_options[:joins])
360
+ .group(@ar_options[:group])
361
+ .merge(@ar_options[:conditions])
362
+ relation = add_references relation
363
+ relation = apply_sort_by relation
364
+
365
+ # If relation is an Array, it got the sort from apply_sort_by.
366
+ relation = relation.order(@ar_options[:order]) if !relation.is_a?(Array)
367
+
368
+ if !output_csv? && !all_record_mode?
369
+ if relation.is_a?(Array)
370
+ relation = Kaminari.paginate_array(relation, limit: @ar_options[:per_page], offset: @ar_options[:per_page].to_i * (@ar_options[:page].to_i - 1))
371
+ else
372
+ relation = relation
373
+ .send(@options[:page_method_name], @ar_options[:page])
374
+ .per(@ar_options[:per_page])
375
+ end
376
+ end
377
+
378
+ if all_record_mode? && relation.is_a?(Array)
379
+ # This still needs to be a Kaminari object as the paginator will read limit_value.
380
+ relation = Kaminari.paginate_array(relation, limit: relation.count)
357
381
  end
382
+
383
+ @resultset = relation
358
384
  end
385
+
359
386
  invoke_resultset_callbacks
360
387
  end
361
388
 
@@ -384,9 +411,10 @@ module Wice
384
411
  end
385
412
  end
386
413
 
387
- def ordered_by?(column) #:nodoc:
414
+ # Returns true if the current results are ordered by the passed column.
415
+ def ordered_by?(column)
388
416
  return nil if @status[:order].blank?
389
- if column.main_table && ! @status[:order].index('.')
417
+ if column.main_table && ! @status[:order].index('.') || column.table_alias_or_table_name.nil?
390
418
  @status[:order] == column.attribute
391
419
  else
392
420
  @status[:order] == column.table_alias_or_table_name + '.' + column.attribute
@@ -449,11 +477,11 @@ module Wice
449
477
  def do_count #:nodoc:
450
478
  @relation
451
479
  .all
452
- .merge(@ar_options[:conditions]).count(
453
- joins: @ar_options[:joins],
454
- include: @ar_options[:include],
455
- group: @ar_options[:group]
456
- )
480
+ .joins(@ar_options[:joins])
481
+ .includes(@ar_options[:include])
482
+ .group(@ar_options[:group])
483
+ .where(@options[:conditions])
484
+ .count
457
485
  end
458
486
 
459
487
  alias_method :size, :count
@@ -533,7 +561,11 @@ module Wice
533
561
  invoke_resultset_callback(@options[:with_resultset], self.active_relation_for_resultset_without_paging_with_user_filters)
534
562
  end
535
563
 
536
- def add_custom_order_sql(fully_qualified_column_name) #:nodoc:
564
+ # If a custom order has been configured, gets the column/function to be ordered by. If no custom order, returns nil.
565
+ def get_custom_order_reference
566
+ # TODO Do we need to distinguish between no custom order and a custom order that defines no ordering? Both return nil.
567
+
568
+ fully_qualified_column_name = complete_column_name(@status[:order])
537
569
  custom_order = if @options[:custom_order].key?(fully_qualified_column_name)
538
570
  @options[:custom_order][fully_qualified_column_name]
539
571
  else
@@ -542,39 +574,34 @@ module Wice
542
574
  end
543
575
  end
544
576
 
545
- if custom_order.blank?
546
- sqlite = ActiveRecord::ConnectionAdapters.const_defined?(:SQLite3Adapter) && ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters::SQLite3Adapter)
547
- postgres = ActiveRecord::ConnectionAdapters.const_defined?(:PostgreSQLAdapter) && ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
548
- if sqlite || postgres
549
- fully_qualified_column_name.strip.split('.').map { |chunk| ActiveRecord::Base.connection.quote_table_name(chunk) }.join('.')
550
- else
551
- ActiveRecord::Base.connection.quote_table_name(fully_qualified_column_name.strip)
552
- end
553
- else
554
- if custom_order.is_a? String
555
- custom_order.gsub(/\?/, fully_qualified_column_name)
556
- elsif custom_order.is_a? Proc
557
- custom_order.call(fully_qualified_column_name)
558
- else
559
- raise WiceGridArgumentError.new("invalid custom order #{custom_order.inspect}")
560
- end
561
- end
577
+ return custom_order if custom_order.nil? || custom_order.is_a?(Arel::Attributes::Attribute)
578
+ return custom_order.gsub(/\?/, fully_qualified_column_name) if custom_order.is_a?(String)
579
+ return custom_order.call(fully_qualified_column_name) if custom_order.is_a?(Proc)
580
+ raise WiceGridArgumentError.new("invalid custom order #{custom_order.inspect}")
562
581
  end
563
582
 
564
- def complete_column_name(col_name) #:nodoc:
583
+ # Returns an Arel::Attributes::Attribute for the passed column reference.
584
+ def arel_column_reference(col_name) #:nodoc:
565
585
  if col_name.index('.') # already has a table name
566
- col_name
586
+ table_name, col_name = col_name.split('.', 2)
587
+ Arel::Table.new(table_name)[col_name]
567
588
  else # add the default table
568
- "#{@klass.table_name}.#{col_name}"
589
+ @klass.arel_table[col_name]
569
590
  end
570
591
  end
571
592
 
593
+ # Returns tablename.columnname for the passed column reference.
594
+ def complete_column_name(col_name)
595
+ return col_name if col_name.index('.') # already has a table name
596
+ return "#{@klass.table_name}.#{col_name}"
597
+ end
598
+
572
599
  def params #:nodoc:
573
600
  @controller.params
574
601
  end
575
602
 
576
603
  def this_grid_params #:nodoc:
577
- params[name]
604
+ params[name].try(:to_unsafe_h) || params[name]
578
605
  end
579
606
 
580
607
  def resultset_without_paging_without_user_filters #:nodoc: