active_scaffold-sequel 0.3.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 (318) hide show
  1. data/CHANGELOG +179 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +36 -0
  4. data/app/assets/images/active_scaffold/add.gif +0 -0
  5. data/app/assets/images/active_scaffold/arrow_down.gif +0 -0
  6. data/app/assets/images/active_scaffold/arrow_up.gif +0 -0
  7. data/app/assets/images/active_scaffold/close.gif +0 -0
  8. data/app/assets/images/active_scaffold/close_touch.png +0 -0
  9. data/app/assets/images/active_scaffold/config.png +0 -0
  10. data/app/assets/images/active_scaffold/cross.png +0 -0
  11. data/app/assets/images/active_scaffold/gears.png +0 -0
  12. data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
  13. data/app/assets/images/active_scaffold/indicator.gif +0 -0
  14. data/app/assets/images/active_scaffold/magnifier.png +0 -0
  15. data/app/assets/javascripts/active_scaffold.js.erb +19 -0
  16. data/app/assets/javascripts/jquery/active_scaffold.js +1057 -0
  17. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +24 -0
  18. data/app/assets/javascripts/jquery/draggable_lists.js +27 -0
  19. data/app/assets/javascripts/jquery/jquery.editinplace.js +743 -0
  20. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +7 -0
  21. data/app/assets/javascripts/prototype/active_scaffold.js +1052 -0
  22. data/app/assets/javascripts/prototype/dhtml_history.js +870 -0
  23. data/app/assets/javascripts/prototype/form_enhancements.js +117 -0
  24. data/app/assets/javascripts/prototype/rico_corner.js +370 -0
  25. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +7 -0
  26. data/app/assets/stylesheets/active_scaffold-ie.css +35 -0
  27. data/app/assets/stylesheets/active_scaffold.css.scss +14 -0
  28. data/app/assets/stylesheets/active_scaffold_colors.css.scss +395 -0
  29. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
  30. data/app/assets/stylesheets/active_scaffold_images.css.scss +43 -0
  31. data/app/assets/stylesheets/active_scaffold_layout.css +912 -0
  32. data/app/assets/stylesheets/blue-theme.css +74 -0
  33. data/config/locales/de.yml +114 -0
  34. data/config/locales/en.yml +118 -0
  35. data/config/locales/es.yml +120 -0
  36. data/config/locales/fr.yml +121 -0
  37. data/config/locales/hu.yml +74 -0
  38. data/config/locales/ja.yml +73 -0
  39. data/config/locales/ru.yml +123 -0
  40. data/frontends/default/views/_action_group.html.erb +24 -0
  41. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  42. data/frontends/default/views/_base_form.html.erb +51 -0
  43. data/frontends/default/views/_create_form.html.erb +8 -0
  44. data/frontends/default/views/_create_form_on_list.html.erb +6 -0
  45. data/frontends/default/views/_field_search.html.erb +32 -0
  46. data/frontends/default/views/_form.html.erb +24 -0
  47. data/frontends/default/views/_form_association.html.erb +15 -0
  48. data/frontends/default/views/_form_association_footer.html.erb +47 -0
  49. data/frontends/default/views/_form_attribute.html.erb +20 -0
  50. data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
  51. data/frontends/default/views/_form_messages.html.erb +5 -0
  52. data/frontends/default/views/_horizontal_subform.html.erb +28 -0
  53. data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
  54. data/frontends/default/views/_horizontal_subform_header.html.erb +11 -0
  55. data/frontends/default/views/_horizontal_subform_record.html.erb +38 -0
  56. data/frontends/default/views/_human_conditions.html.erb +1 -0
  57. data/frontends/default/views/_list.html.erb +18 -0
  58. data/frontends/default/views/_list_actions.html.erb +15 -0
  59. data/frontends/default/views/_list_calculations.html.erb +16 -0
  60. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  61. data/frontends/default/views/_list_header.html.erb +10 -0
  62. data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
  63. data/frontends/default/views/_list_messages.html.erb +30 -0
  64. data/frontends/default/views/_list_pagination.html.erb +11 -0
  65. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  66. data/frontends/default/views/_list_record.html.erb +14 -0
  67. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  68. data/frontends/default/views/_list_with_header.html.erb +36 -0
  69. data/frontends/default/views/_messages.html.erb +10 -0
  70. data/frontends/default/views/_render_field.js.erb +20 -0
  71. data/frontends/default/views/_row.html.erb +6 -0
  72. data/frontends/default/views/_search.html.erb +34 -0
  73. data/frontends/default/views/_search_attribute.html.erb +10 -0
  74. data/frontends/default/views/_show.html.erb +8 -0
  75. data/frontends/default/views/_show_columns.html.erb +15 -0
  76. data/frontends/default/views/_update_actions.html.erb +9 -0
  77. data/frontends/default/views/_update_form.html.erb +6 -0
  78. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  79. data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
  80. data/frontends/default/views/action_confirmation.html.erb +13 -0
  81. data/frontends/default/views/add_existing.js.erb +18 -0
  82. data/frontends/default/views/add_existing_form.html.erb +5 -0
  83. data/frontends/default/views/create.html.erb +5 -0
  84. data/frontends/default/views/delete.html.erb +13 -0
  85. data/frontends/default/views/destroy.js.erb +24 -0
  86. data/frontends/default/views/edit_associated.js.erb +12 -0
  87. data/frontends/default/views/field_search.html.erb +5 -0
  88. data/frontends/default/views/form_messages.js.erb +1 -0
  89. data/frontends/default/views/list.html.erb +1 -0
  90. data/frontends/default/views/on_action_update.js.erb +13 -0
  91. data/frontends/default/views/on_create.js.erb +47 -0
  92. data/frontends/default/views/on_mark_all.js.erb +12 -0
  93. data/frontends/default/views/on_update.js.erb +31 -0
  94. data/frontends/default/views/refresh_list.js.erb +1 -0
  95. data/frontends/default/views/render_field.js.erb +1 -0
  96. data/frontends/default/views/search.html.erb +5 -0
  97. data/frontends/default/views/show.html.erb +5 -0
  98. data/frontends/default/views/update.html.erb +8 -0
  99. data/frontends/default/views/update_column.js.erb +16 -0
  100. data/frontends/default/views/update_row.js.erb +1 -0
  101. data/lib/active_scaffold/actions/common_search.rb +25 -0
  102. data/lib/active_scaffold/actions/core.rb +197 -0
  103. data/lib/active_scaffold/actions/create.rb +148 -0
  104. data/lib/active_scaffold/actions/delete.rb +76 -0
  105. data/lib/active_scaffold/actions/field_search.rb +82 -0
  106. data/lib/active_scaffold/actions/list.rb +196 -0
  107. data/lib/active_scaffold/actions/mark.rb +75 -0
  108. data/lib/active_scaffold/actions/nested.rb +245 -0
  109. data/lib/active_scaffold/actions/search.rb +48 -0
  110. data/lib/active_scaffold/actions/show.rb +61 -0
  111. data/lib/active_scaffold/actions/subform.rb +23 -0
  112. data/lib/active_scaffold/actions/update.rb +150 -0
  113. data/lib/active_scaffold/active_record_permissions.rb +136 -0
  114. data/lib/active_scaffold/attribute_params.rb +208 -0
  115. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +39 -0
  116. data/lib/active_scaffold/bridges/ancestry.rb +5 -0
  117. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +67 -0
  118. data/lib/active_scaffold/bridges/calendar_date_select.rb +24 -0
  119. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +107 -0
  120. data/lib/active_scaffold/bridges/cancan.rb +15 -0
  121. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +31 -0
  122. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +10 -0
  123. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +45 -0
  124. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +17 -0
  125. data/lib/active_scaffold/bridges/carrierwave.rb +12 -0
  126. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +358 -0
  127. data/lib/active_scaffold/bridges/country_helper.rb +9 -0
  128. data/lib/active_scaffold/bridges/date_picker/ext.rb +45 -0
  129. data/lib/active_scaffold/bridges/date_picker/helper.rb +180 -0
  130. data/lib/active_scaffold/bridges/date_picker.rb +23 -0
  131. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +34 -0
  132. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +10 -0
  133. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +27 -0
  134. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +16 -0
  135. data/lib/active_scaffold/bridges/dragonfly.rb +9 -0
  136. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +48 -0
  137. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +57 -0
  138. data/lib/active_scaffold/bridges/file_column/form_ui.rb +34 -0
  139. data/lib/active_scaffold/bridges/file_column/list_ui.rb +26 -0
  140. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  141. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  142. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  143. data/lib/active_scaffold/bridges/file_column.rb +11 -0
  144. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +27 -0
  145. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +16 -0
  146. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +36 -0
  147. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +24 -0
  148. data/lib/active_scaffold/bridges/paperclip.rb +12 -0
  149. data/lib/active_scaffold/bridges/record_select/helpers.rb +86 -0
  150. data/lib/active_scaffold/bridges/record_select.rb +11 -0
  151. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +20 -0
  152. data/lib/active_scaffold/bridges/semantic_attributes.rb +5 -0
  153. data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
  154. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +46 -0
  155. data/lib/active_scaffold/bridges/tiny_mce.rb +17 -0
  156. data/lib/active_scaffold/bridges.rb +61 -0
  157. data/lib/active_scaffold/config/base.rb +71 -0
  158. data/lib/active_scaffold/config/core.rb +219 -0
  159. data/lib/active_scaffold/config/create.rb +44 -0
  160. data/lib/active_scaffold/config/delete.rb +33 -0
  161. data/lib/active_scaffold/config/field_search.rb +76 -0
  162. data/lib/active_scaffold/config/form.rb +48 -0
  163. data/lib/active_scaffold/config/list.rb +196 -0
  164. data/lib/active_scaffold/config/mark.rb +35 -0
  165. data/lib/active_scaffold/config/nested.rb +42 -0
  166. data/lib/active_scaffold/config/search.rb +73 -0
  167. data/lib/active_scaffold/config/show.rb +32 -0
  168. data/lib/active_scaffold/config/subform.rb +35 -0
  169. data/lib/active_scaffold/config/update.rb +41 -0
  170. data/lib/active_scaffold/configurable.rb +29 -0
  171. data/lib/active_scaffold/constraints.rb +170 -0
  172. data/lib/active_scaffold/data_structures/action_columns.rb +140 -0
  173. data/lib/active_scaffold/data_structures/action_link.rb +179 -0
  174. data/lib/active_scaffold/data_structures/action_links.rb +185 -0
  175. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  176. data/lib/active_scaffold/data_structures/bridge.rb +22 -0
  177. data/lib/active_scaffold/data_structures/column.rb +389 -0
  178. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  179. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  180. data/lib/active_scaffold/data_structures/nested_info.rb +130 -0
  181. data/lib/active_scaffold/data_structures/set.rb +57 -0
  182. data/lib/active_scaffold/data_structures/sorting.rb +172 -0
  183. data/lib/active_scaffold/engine.rb +4 -0
  184. data/lib/active_scaffold/extensions/action_controller_rendering.rb +22 -0
  185. data/lib/active_scaffold/extensions/action_view_rendering.rb +115 -0
  186. data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
  187. data/lib/active_scaffold/extensions/array.rb +7 -0
  188. data/lib/active_scaffold/extensions/cache_association.rb +16 -0
  189. data/lib/active_scaffold/extensions/localize.rb +10 -0
  190. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
  191. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
  192. data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
  193. data/lib/active_scaffold/extensions/routing_mapper.rb +48 -0
  194. data/lib/active_scaffold/extensions/to_label.rb +8 -0
  195. data/lib/active_scaffold/extensions/unsaved_associated.rb +60 -0
  196. data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
  197. data/lib/active_scaffold/extensions/usa_state.rb +46 -0
  198. data/lib/active_scaffold/finder.rb +372 -0
  199. data/lib/active_scaffold/helpers/association_helpers.rb +48 -0
  200. data/lib/active_scaffold/helpers/controller_helpers.rb +88 -0
  201. data/lib/active_scaffold/helpers/form_column_helpers.rb +321 -0
  202. data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -0
  203. data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
  204. data/lib/active_scaffold/helpers/list_column_helpers.rb +340 -0
  205. data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
  206. data/lib/active_scaffold/helpers/search_column_helpers.rb +267 -0
  207. data/lib/active_scaffold/helpers/show_column_helpers.rb +50 -0
  208. data/lib/active_scaffold/helpers/view_helpers.rb +342 -0
  209. data/lib/active_scaffold/marked_model.rb +38 -0
  210. data/lib/active_scaffold/paginator.rb +136 -0
  211. data/lib/active_scaffold/responds_to_parent.rb +70 -0
  212. data/lib/active_scaffold/version.rb +9 -0
  213. data/lib/active_scaffold.rb +368 -0
  214. data/lib/active_scaffold_env.rb +11 -0
  215. data/lib/generators/active_scaffold/USAGE +29 -0
  216. data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
  217. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  218. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
  219. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  220. data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
  221. data/public/blank.html +33 -0
  222. data/shoulda_macros/macros.rb +136 -0
  223. data/test/bridges/active_scaffold_dependent_protect_test.rb +34 -0
  224. data/test/bridges/bridge_test.rb +90 -0
  225. data/test/bridges/company.rb +81 -0
  226. data/test/bridges/paperclip_test.rb +68 -0
  227. data/test/bridges/tiny_mce_test.rb +27 -0
  228. data/test/bridges/unobtrusive_date_picker_test.rb +49 -0
  229. data/test/bridges/validation_reflection_test.rb +57 -0
  230. data/test/config/base_test.rb +15 -0
  231. data/test/config/core_test.rb +58 -0
  232. data/test/config/create_test.rb +58 -0
  233. data/test/config/delete_test.rb +33 -0
  234. data/test/config/field_search_test.rb +47 -0
  235. data/test/config/list_test.rb +129 -0
  236. data/test/config/nested_test.rb +62 -0
  237. data/test/config/search_test.rb +60 -0
  238. data/test/config/show_test.rb +43 -0
  239. data/test/config/subform_test.rb +17 -0
  240. data/test/config/update_test.rb +40 -0
  241. data/test/const_mocker.rb +36 -0
  242. data/test/data_structures/action_columns_test.rb +113 -0
  243. data/test/data_structures/action_link_test.rb +78 -0
  244. data/test/data_structures/action_links_test.rb +78 -0
  245. data/test/data_structures/actions_test.rb +25 -0
  246. data/test/data_structures/association_column_test.rb +42 -0
  247. data/test/data_structures/column_test.rb +185 -0
  248. data/test/data_structures/columns_test.rb +69 -0
  249. data/test/data_structures/error_message_test.rb +28 -0
  250. data/test/data_structures/set_test.rb +86 -0
  251. data/test/data_structures/sorting_test.rb +126 -0
  252. data/test/data_structures/standard_column_test.rb +24 -0
  253. data/test/data_structures/virtual_column_test.rb +23 -0
  254. data/test/extensions/active_record_test.rb +45 -0
  255. data/test/extensions/array_test.rb +12 -0
  256. data/test/helpers/form_column_helpers_test.rb +31 -0
  257. data/test/helpers/list_column_helpers_test.rb +42 -0
  258. data/test/helpers/pagination_helpers_test.rb +59 -0
  259. data/test/misc/active_record_permissions_test.rb +154 -0
  260. data/test/misc/attribute_params_test.rb +146 -0
  261. data/test/misc/configurable_test.rb +96 -0
  262. data/test/misc/constraints_test.rb +193 -0
  263. data/test/misc/finder_test.rb +92 -0
  264. data/test/misc/lang_test.rb +11 -0
  265. data/test/mock_app/app/controllers/application_controller.rb +10 -0
  266. data/test/mock_app/app/helpers/application_helper.rb +3 -0
  267. data/test/mock_app/config/boot.rb +110 -0
  268. data/test/mock_app/config/database.yml +16 -0
  269. data/test/mock_app/config/environment.rb +43 -0
  270. data/test/mock_app/config/environments/development.rb +17 -0
  271. data/test/mock_app/config/environments/production.rb +28 -0
  272. data/test/mock_app/config/environments/test.rb +28 -0
  273. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  274. data/test/mock_app/config/initializers/inflections.rb +10 -0
  275. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  276. data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
  277. data/test/mock_app/config/initializers/session_store.rb +15 -0
  278. data/test/mock_app/config/locales/en.yml +5 -0
  279. data/test/mock_app/config/routes.rb +43 -0
  280. data/test/mock_app/db/test.sqlite3 +1 -0
  281. data/test/mock_app/public/blank.html +33 -0
  282. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  283. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  284. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  285. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  286. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  287. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  288. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  289. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  290. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  291. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  292. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
  293. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  294. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
  295. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  296. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  297. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  298. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +848 -0
  299. data/test/model_stub.rb +55 -0
  300. data/test/run_all.rb +8 -0
  301. data/test/test_helper.rb +39 -0
  302. data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  303. data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  304. data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
  305. data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  306. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  307. data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  308. data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  309. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  310. data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  311. data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
  312. data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
  313. data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
  314. data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
  315. data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
  316. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1276 -0
  317. data/vendor/assets/stylesheets/jquery-ui.css +568 -0
  318. metadata +502 -0
@@ -0,0 +1,340 @@
1
+ # coding: utf-8
2
+ module ActiveScaffold
3
+ module Helpers
4
+ # Helpers that assist with the rendering of a List Column
5
+ module ListColumnHelpers
6
+ def get_column_value(record, column)
7
+ begin
8
+ # check for an override helper
9
+ value = if column_override? column
10
+ # we only pass the record as the argument. we previously also passed the formatted_value,
11
+ # but mike perham pointed out that prohibited the usage of overrides to improve on the
12
+ # performance of our default formatting. see issue #138.
13
+ send(column_override(column), record)
14
+ # second, check if the dev has specified a valid list_ui for this column
15
+ elsif column.list_ui and override_column_ui?(column.list_ui)
16
+ send(override_column_ui(column.list_ui), column, record)
17
+ elsif column.column and override_column_ui?(column.column[:type])
18
+ send(override_column_ui(column.column[:type]), column, record)
19
+ else
20
+ format_column_value(record, column)
21
+ end
22
+
23
+ value = ' '.html_safe if value.nil? or (value.respond_to?(:empty?) and value.empty?) # fix for IE 6
24
+ return value
25
+ rescue Exception => e
26
+ logger.error Time.now.to_s + "#{e.inspect} -- on the ActiveScaffold column = :#{column.name} in #{controller.class}"
27
+ raise e
28
+ end
29
+ end
30
+
31
+ # TODO: move empty_field_text and   logic in here?
32
+ # TODO: we need to distinguish between the automatic links *we* create and the ones that the dev specified. some logic may not apply if the dev specified the link.
33
+ def render_list_column(text, column, record)
34
+ if column.link
35
+ link = column.link
36
+ associated = record.send(column.association[:name]) if column.association
37
+ url_options = params_for(:action => nil, :id => record.id)
38
+
39
+ # setup automatic link
40
+ if column.autolink? && column.singular_association? # link to inline form
41
+ link = action_link_to_inline_form(column, record, associated, text)
42
+ return text if link.nil?
43
+ else
44
+ url_options[:link] = text
45
+ end
46
+
47
+ if column_link_authorized?(link, column, record, associated)
48
+ render_action_link(link, url_options, record)
49
+ else
50
+ "<a class='disabled'>#{text}</a>".html_safe
51
+ end
52
+ else
53
+ text = active_scaffold_inplace_edit(record, column, {:formatted_column => text}) if inplace_edit?(record, column)
54
+ text
55
+ end
56
+ end
57
+
58
+ # setup the action link to inline form
59
+ def action_link_to_inline_form(column, record, associated, text)
60
+ link = column.link.clone
61
+ link.label = text
62
+ configure_column_link(link, associated, column.actions_for_association_links)
63
+ end
64
+
65
+ def configure_column_link(link, associated, actions)
66
+ if column_empty?(associated) # if association is empty, we only can link to create form
67
+ if actions.include?(:new)
68
+ link.action = 'new'
69
+ link.crud_type = :create
70
+ link.label = as_(:create_new)
71
+ end
72
+ elsif actions.include?(:edit)
73
+ link.action = 'edit'
74
+ link.crud_type = :update
75
+ elsif actions.include?(:show)
76
+ link.action = 'show'
77
+ link.crud_type = :read
78
+ elsif actions.include?(:list)
79
+ link.action = 'index'
80
+ link.crud_type = :read
81
+ end
82
+ link if link.action.present?
83
+ end
84
+
85
+ def column_link_authorized?(link, column, record, associated)
86
+ if column.association
87
+ associated_for_authorized = if associated.nil? || (associated.respond_to?(:blank?) && associated.blank?)
88
+ column.association.associated_class
89
+ elsif column.plural_association?
90
+ associated.first
91
+ else
92
+ associated
93
+ end
94
+ authorized = associated_for_authorized.authorized_for?(:crud_type => link.crud_type)
95
+ authorized = authorized and record.authorized_for?(:crud_type => :update, :column => column.name) if link.crud_type == :create
96
+ authorized
97
+ else
98
+ record.authorized_for?(:crud_type => link.crud_type)
99
+ end
100
+ end
101
+
102
+ # There are two basic ways to clean a column's value: h() and sanitize(). The latter is useful
103
+ # when the column contains *valid* html data, and you want to just disable any scripting. People
104
+ # can always use field overrides to clean data one way or the other, but having this override
105
+ # lets people decide which way it should happen by default.
106
+ #
107
+ # Why is it not a configuration option? Because it seems like a somewhat rare request. But it
108
+ # could eventually be an option in config.list (and config.show, I guess).
109
+ def clean_column_value(v)
110
+ h(v)
111
+ end
112
+
113
+ ##
114
+ ## Overrides
115
+ ##
116
+ def active_scaffold_column_text(column, record)
117
+ clean_column_value(truncate(record.send(column.name), :length => column.options[:truncate] || 50))
118
+ end
119
+
120
+ def active_scaffold_column_checkbox(column, record)
121
+ options = {:disabled => true, :id => nil, :object => record}
122
+ options.delete(:disabled) if inplace_edit?(record, column)
123
+ check_box(:record, column.name, options)
124
+ end
125
+
126
+ def column_override_name(column, class_prefix = false)
127
+ "#{clean_class_name(column.active_record_class.name) + '_' if class_prefix}#{clean_column_name(column.name)}_column"
128
+ end
129
+
130
+ def column_override(column)
131
+ method_with_class = column_override_name(column, true)
132
+ return method_with_class if respond_to?(method_with_class)
133
+ method = column_override_name(column)
134
+ method if respond_to?(method)
135
+ end
136
+ alias_method :column_override?, :column_override
137
+
138
+ def override_column_ui?(list_ui)
139
+ respond_to?(override_column_ui(list_ui))
140
+ end
141
+
142
+ # the naming convention for overriding column types with helpers
143
+ def override_column_ui(list_ui)
144
+ "active_scaffold_column_#{list_ui}"
145
+ end
146
+
147
+ ##
148
+ ## Formatting
149
+ ##
150
+ def format_column_value(record, column, value = nil)
151
+ value ||= record.send(column.name) unless record.nil?
152
+ if value && column.association # cache association size before calling column_empty?
153
+ associated_size = value.size if column.plural_association? and column.associated_number? # get count before cache association
154
+ end
155
+ if column.association.nil? or column_empty?(value)
156
+ if column.form_ui == :select && column.options[:options]
157
+ text, val = column.options[:options].find {|text, val| (val.nil? ? text : val).to_s == value.to_s}
158
+ value = active_scaffold_translated_option(column, text, val).first if text
159
+ end
160
+ if value.is_a? Numeric
161
+ format_number_value(value, column.options)
162
+ else
163
+ format_value(value, column.options)
164
+ end
165
+ else
166
+ format_association_value(value, column, associated_size)
167
+ end
168
+ end
169
+
170
+ def format_number_value(value, options = {})
171
+ value = case options[:format]
172
+ when :size
173
+ number_to_human_size(value, options[:i18n_options] || {})
174
+ when :percentage
175
+ number_to_percentage(value, options[:i18n_options] || {})
176
+ when :currency
177
+ number_to_currency(value, options[:i18n_options] || {})
178
+ when :i18n_number
179
+ number_with_delimiter(value, options[:i18n_options] || {})
180
+ else
181
+ value
182
+ end
183
+ clean_column_value(value)
184
+ end
185
+
186
+ def format_association_value(value, column, size)
187
+ format_value case
188
+ when column.singular_association?
189
+ value.to_label
190
+ when column.plural_association?
191
+ if column.associated_limit.nil?
192
+ firsts = value.collect { |v| v.to_label }
193
+ else
194
+ firsts = value.first(column.associated_limit)
195
+ firsts.collect! { |v| v.to_label }
196
+ firsts[column.associated_limit] = '…' if value.size > column.associated_limit
197
+ end
198
+ if column.associated_limit == 0
199
+ size if column.associated_number?
200
+ else
201
+ joined_associated = firsts.join(active_scaffold_config.list.association_join_text)
202
+ joined_associated << " (#{size})" if column.associated_number? and column.associated_limit and value.size > column.associated_limit
203
+ joined_associated
204
+ end
205
+ end
206
+ end
207
+
208
+ def format_value(column_value, options = {})
209
+ value = if column_empty?(column_value)
210
+ active_scaffold_config.list.empty_field_text
211
+ elsif column_value.is_a?(Time) || column_value.is_a?(Date)
212
+ l(column_value, :format => options[:format] || :default)
213
+ elsif [FalseClass, TrueClass].include?(column_value.class)
214
+ as_(column_value.to_s.to_sym)
215
+ else
216
+ column_value.to_s
217
+ end
218
+ clean_column_value(value)
219
+ end
220
+
221
+ # ==========
222
+ # = Inline Edit =
223
+ # ==========
224
+
225
+ def inplace_edit?(record, column)
226
+ if column.inplace_edit
227
+ editable = controller.send(:update_authorized?, record) if controller.respond_to?(:update_authorized?)
228
+ editable = record.authorized_for?(:crud_type => :update, :column => column.name) if editable.nil? || editable == true
229
+ editable
230
+ end
231
+ end
232
+
233
+ def inplace_edit_cloning?(column)
234
+ column.inplace_edit != :ajax and (override_form_field?(column) or column.form_ui or (column.column and override_input?(column.column[:type])))
235
+ end
236
+
237
+ def active_scaffold_inplace_edit(record, column, options = {})
238
+ formatted_column = options[:formatted_column] || format_column_value(record, column)
239
+ id_options = {:id => record.id.to_s, :action => 'update_column', :name => column.name.to_s}
240
+ tag_options = {:id => element_cell_id(id_options), :class => "in_place_editor_field",
241
+ :title => as_(:click_to_edit), 'data-ie_id' => record.id.to_s}
242
+
243
+ content_tag(:span, formatted_column, tag_options)
244
+ end
245
+
246
+ def inplace_edit_control(column)
247
+ if inplace_edit?(active_scaffold_config.model, column) and inplace_edit_cloning?(column)
248
+ old_record, @record = @record, new_model
249
+ column = column.clone
250
+ column.options = column.options.clone
251
+ column.form_ui = :select if (column.association && column.form_ui.nil?)
252
+ content_tag(:div, active_scaffold_input_for(column), :style => "display:none;", :class => inplace_edit_control_css_class).tap do
253
+ @record = old_record
254
+ end
255
+ end
256
+ end
257
+
258
+ def inplace_edit_control_css_class
259
+ "as_inplace_pattern"
260
+ end
261
+
262
+ def inplace_edit_tag_attributes(column)
263
+ tag_options = {}
264
+ tag_options['data-ie_url'] = url_for({:controller => params_for[:controller], :action => "update_column", :column => column.name, :id => '__id__'})
265
+ tag_options['data-ie_cancel_text'] = column.options[:cancel_text] || as_(:cancel)
266
+ tag_options['data-ie_loading_text'] = column.options[:loading_text] || as_(:loading)
267
+ tag_options['data-ie_save_text'] = column.options[:save_text] || as_(:update)
268
+ tag_options['data-ie_saving_text'] = column.options[:saving_text] || as_(:saving)
269
+ tag_options['data-ie_rows'] = column.options[:rows] || 5 if column.column.try(:type) == :text
270
+ tag_options['data-ie_cols'] = column.options[:cols] if column.options[:cols]
271
+ tag_options['data-ie_size'] = column.options[:size] if column.options[:size]
272
+
273
+ if column.list_ui == :checkbox
274
+ tag_options['data-ie_mode'] = :inline_checkbox
275
+ elsif inplace_edit_cloning?(column)
276
+ tag_options['data-ie_mode'] = :clone
277
+ elsif column.inplace_edit == :ajax
278
+ url = url_for(:controller => params_for[:controller], :action => 'render_field', :id => '__id__', :column => column.name, :update_column => column.name, :in_place_editing => true)
279
+ plural = column.plural_association? && !override_form_field?(column) && [:select, :record_select].include?(column.form_ui)
280
+ tag_options['data-ie_render_url'] = url
281
+ tag_options['data-ie_mode'] = :ajax
282
+ tag_options['data-ie_plural'] = plural
283
+ end
284
+ tag_options
285
+ end
286
+
287
+ def mark_column_heading
288
+ if active_scaffold_config.mark.mark_all_mode == :page then
289
+ all_marked = true
290
+ @page.items.each do |record|
291
+ all_marked = false if !marked_records.entries.include?(record.id)
292
+ end
293
+ else
294
+ all_marked = (marked_records.length >= @page.pager.count)
295
+ end
296
+ tag_options = {:id => "#{controller_id}_mark_heading", :class => "mark_heading in_place_editor_field"}
297
+ tag_options['data-ie_url'] = url_for({:controller => params_for[:controller], :action => 'mark_all', :eid => params[:eid]})
298
+ content_tag(:span, check_box_tag("#{controller_id}_mark_heading_span_input", !all_marked, all_marked), tag_options)
299
+ end
300
+
301
+ def render_column_heading(column, sorting, sort_direction)
302
+ tag_options = {:id => active_scaffold_column_header_id(column), :class => column_heading_class(column, sorting), :title => column.description}
303
+ tag_options.merge!(inplace_edit_tag_attributes(column)) if column.inplace_edit
304
+ content_tag(:th, column_heading_value(column, sorting, sort_direction) + inplace_edit_control(column), tag_options)
305
+ end
306
+
307
+
308
+ def column_heading_value(column, sorting, sort_direction)
309
+ if column.sortable?
310
+ options = {:id => nil, :class => "as_sort",
311
+ 'data-page-history' => controller_id,
312
+ :remote => true, :method => :get}
313
+ url_options = params_for(:action => :index, :page => 1,
314
+ :sort => column.name, :sort_direction => sort_direction)
315
+ link_to column.label, url_options, options
316
+ else
317
+ if column.name != :marked
318
+ content_tag(:p, column.label)
319
+ else
320
+ mark_column_heading
321
+ end
322
+ end
323
+ end
324
+
325
+ def render_nested_view(action_links, url_options, record)
326
+ rendered = []
327
+ action_links.member.each do |link|
328
+ if link.nested_link? && link.column && @nested_auto_open[link.column.name] && @records.length <= @nested_auto_open[link.column.name] && controller.respond_to?(:render_component_into_view)
329
+ link_url_options = {:adapter => '_list_inline_adapter', :format => :js}.merge(action_link_url_options(link, url_options, record, options = {:reuse_eid => true}))
330
+ link_id = get_action_link_id(link_url_options, record, link.column)
331
+ rendered << (controller.send(:render_component_into_view, link_url_options) + javascript_tag("ActiveScaffold.ActionLink.get('#{link_id}').set_opened();"))
332
+ end
333
+ end
334
+ rendered.join(' ').html_safe
335
+ end
336
+
337
+ end
338
+ end
339
+ end
340
+
@@ -0,0 +1,55 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ module PaginationHelpers
4
+ def pagination_ajax_link(page_number, url_options, options)
5
+ link_to page_number, url_options.merge(:page => page_number), options.merge(:class => "as_paginate")
6
+ end
7
+
8
+ def pagination_ajax_links(current_page, url_options, options, window_size)
9
+ start_number = current_page.number - window_size
10
+ end_number = current_page.number + window_size
11
+ start_number = 1 if start_number <= 0
12
+ if current_page.pager.infinite?
13
+ offsets = [20, 100]
14
+ else
15
+ end_number = current_page.pager.last.number if end_number > current_page.pager.last.number
16
+ end
17
+
18
+ html = []
19
+ unless start_number == 1
20
+ last_page = 1
21
+ html << pagination_ajax_link(last_page, url_options, options)
22
+ if current_page.pager.infinite?
23
+ offsets.reverse.each do |offset|
24
+ page = current_page.number - offset
25
+ if page < start_number && page > 1
26
+ html << '..' if page > last_page + 1
27
+ html << pagination_ajax_link(page, params)
28
+ last_page = page
29
+ end
30
+ end
31
+ end
32
+ html << ".." if start_number > last_page + 1
33
+ end
34
+
35
+ start_number.upto(end_number) do |num|
36
+ if current_page.number == num
37
+ html << content_tag(:span, num.to_s, {:class => "as_paginate current"})
38
+ else
39
+ html << pagination_ajax_link(num, url_options, options)
40
+ end
41
+ end
42
+
43
+ if current_page.pager.infinite?
44
+ offsets.each do |offset|
45
+ html << '..' << pagination_ajax_link(current_page.number + offset, url_options, options)
46
+ end
47
+ else
48
+ html << ".." unless end_number >= current_page.pager.last.number - 1
49
+ html << pagination_ajax_link(current_page.pager.last.number, url_options, options) unless end_number == current_page.pager.last.number
50
+ end
51
+ html.join(' ').html_safe
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,267 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ # Helpers that assist with the rendering of a Form Column
4
+ module SearchColumnHelpers
5
+ # This method decides which input to use for the given column.
6
+ # It does not do any rendering. It only decides which method is responsible for rendering.
7
+ def active_scaffold_search_for(column)
8
+ options = active_scaffold_search_options(column)
9
+
10
+ # first, check if the dev has created an override for this specific field for search
11
+ if override_search_field?(column)
12
+ send(override_search_field(column), @record, options)
13
+
14
+ # second, check if the dev has specified a valid search_ui for this column, using specific ui for searches
15
+ elsif column.search_ui and override_search?(column.search_ui)
16
+ send(override_search(column.search_ui), column, options)
17
+
18
+ # third, check if the dev has specified a valid search_ui for this column, using generic ui for forms
19
+ elsif column.search_ui and override_input?(column.search_ui)
20
+ send(override_input(column.search_ui), column, options)
21
+
22
+ # fourth, check if the dev has created an override for this specific field
23
+ elsif override_form_field?(column)
24
+ send(override_form_field(column), @record, options)
25
+
26
+ # fallback: we get to make the decision
27
+ else
28
+ if column.association or column.virtual?
29
+ active_scaffold_search_text(column, options)
30
+
31
+ else # regular model attribute column
32
+ # if we (or someone else) have created a custom render option for the column type, use that
33
+ if override_search?(column.column[:type])
34
+ send(override_search(column.column[:type]), column, options)
35
+ # if we (or someone else) have created a custom render option for the column type, use that
36
+ elsif override_input?(column.column[:type])
37
+ send(override_input(column.column[:type]), column, options)
38
+ # final ultimate fallback: use rails' generic input method
39
+ else
40
+ # for textual fields we pass different options
41
+ text_types = [:text, :string, :integer, :float, :decimal]
42
+ options = active_scaffold_input_text_options(options) if text_types.include?(column.column[:type])
43
+ text_field(:record, column.name, options.merge(column.options))
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ # the standard active scaffold options used for class, name and scope
50
+ def active_scaffold_search_options(column)
51
+ { :name => "search[#{column.name}]", :class => "#{column.name}-input", :id => "search_#{column.name}", :value => field_search_params[column.name] }
52
+ end
53
+
54
+ ##
55
+ ## Search input methods
56
+ ##
57
+
58
+ def active_scaffold_search_multi_select(column, options)
59
+ associated = options.delete :value
60
+ associated = [associated].compact unless associated.is_a? Array
61
+ associated.collect!(&:to_i)
62
+
63
+ if column.association
64
+ select_options = options_for_association(column.association, false)
65
+ else
66
+ select_options = column.options[:options].collect do |text, value|
67
+ active_scaffold_translated_option(column, text, value)
68
+ end
69
+ end
70
+ return as_(:no_options) if select_options.empty?
71
+
72
+ active_scaffold_checkbox_list(column, select_options, associated, options)
73
+ end
74
+
75
+ def active_scaffold_search_select(column, html_options)
76
+ associated = html_options.delete :value
77
+ if column.association
78
+ associated = associated.is_a?(Array) ? associated.map(&:to_i) : associated.to_i unless associated.nil?
79
+ method = column.association.macro == :belongs_to ? column.association.foreign_key : column.name
80
+ select_options = options_for_association(column.association, true)
81
+ else
82
+ method = column.name
83
+ select_options = column.options[:options].collect do |text, value|
84
+ active_scaffold_translated_option(column, text, value)
85
+ end
86
+ end
87
+
88
+ options = { :selected => associated }.merge! column.options
89
+ html_options.merge! column.options[:html_options] || {}
90
+ if html_options[:multiple]
91
+ html_options[:name] += '[]'
92
+ else
93
+ options[:include_blank] ||= as_(:_select_)
94
+ end
95
+ select(:record, method, select_options, options, html_options)
96
+ end
97
+
98
+ def active_scaffold_search_text(column, options)
99
+ text_field :record, column.name, active_scaffold_input_text_options(options)
100
+ end
101
+
102
+ # we can't use active_scaffold_input_boolean because we need to have a nil value even when column can't be null
103
+ # to decide whether search for this field or not
104
+ def active_scaffold_search_boolean(column, options)
105
+ select_options = []
106
+ select_options << [as_(:_select_), nil]
107
+ select_options << [as_(:true), true]
108
+ select_options << [as_(:false), false]
109
+
110
+ select_tag(options[:name], options_for_select(select_options, column.active_record_class.db.send(:typecast_value_boolean, field_search_params[column.name])))
111
+ end
112
+ # we can't use checkbox ui because it's not possible to decide whether search for this field or not
113
+ alias_method :active_scaffold_search_checkbox, :active_scaffold_search_boolean
114
+
115
+ def active_scaffold_search_null(column, options)
116
+ select_options = []
117
+ select_options << [as_(:_select_), nil]
118
+ select_options.concat ActiveScaffold::Finder::NullComparators.collect {|comp| [as_(comp), comp]}
119
+ select_tag(options[:name], options_for_select(select_options, field_search_params[column.name]))
120
+ end
121
+
122
+ def field_search_params_range_values(column)
123
+ values = field_search_params[column.name]
124
+ return nil if values.nil?
125
+ return values[:opt], (values[:from].blank? ? nil : values[:from]), (values[:to].blank? ? nil : values[:to])
126
+
127
+ end
128
+
129
+ def active_scaffold_search_range_string?(column)
130
+ (column.column && column.column.text?) || column.search_ui == :string
131
+ end
132
+
133
+ def include_null_comparators?(column)
134
+ return column.options[:null_comparators] if column.options.has_key? :null_comparators
135
+ if column.association
136
+ column.association.macro != :belongs_to || active_scaffold_config.columns[column.association.primary_key_name].column.try(:null)
137
+ else
138
+ column.column.try(:null)
139
+ end
140
+ end
141
+
142
+ def active_scaffold_search_range_comparator_options(column)
143
+ select_options = ActiveScaffold::Finder::NumericComparators.collect {|comp| [as_(comp.downcase.to_sym), comp]}
144
+ if active_scaffold_search_range_string?(column)
145
+ select_options.unshift *ActiveScaffold::Finder::StringComparators.collect {|title, comp| [as_(title), comp]}
146
+ end
147
+ if include_null_comparators? column
148
+ select_options += ActiveScaffold::Finder::NullComparators.collect {|comp| [as_(comp), comp]}
149
+ end
150
+ select_options
151
+ end
152
+
153
+ def include_null_comparators?(column)
154
+ return column.options[:null_comparators] if column.options.has_key? :null_comparators
155
+ if column.association
156
+ column.association.macro != :belongs_to || active_scaffold_config.columns[column.association.primary_key_name].column.try(:null)
157
+ else
158
+ column.column.try(:null)
159
+ end
160
+ end
161
+
162
+ def active_scaffold_search_range(column, options)
163
+ opt_value, from_value, to_value = field_search_params_range_values(column)
164
+
165
+ select_options = active_scaffold_search_range_comparator_options(column)
166
+ if active_scaffold_search_range_string?(column)
167
+ text_field_size = 15
168
+ opt_value ||= '%?%'
169
+ else
170
+ text_field_size = 10
171
+ opt_value ||= '='
172
+ end
173
+
174
+ from_value = controller.class.condition_value_for_numeric(column, from_value)
175
+ to_value = controller.class.condition_value_for_numeric(column, to_value)
176
+ from_value = format_number_value(from_value, column.options) if from_value.is_a?(Numeric)
177
+ to_value = format_number_value(to_value, column.options) if to_value.is_a?(Numeric)
178
+ html = select_tag("#{options[:name]}[opt]",
179
+ options_for_select(select_options, opt_value),
180
+ :id => "#{options[:id]}_opt",
181
+ :class => "as_search_range_option")
182
+ html << ' ' << text_field_tag("#{options[:name]}[from]", from_value, active_scaffold_input_text_options(:id => options[:id], :size => text_field_size))
183
+ html << ' ' << content_tag(:span, (' - ' + text_field_tag("#{options[:name]}[to]", to_value,
184
+ active_scaffold_input_text_options(:id => "#{options[:id]}_to", :size => text_field_size))).html_safe,
185
+ :id => "#{options[:id]}_between", :class => "as_search_range_between", :style => "display:#{(opt_value == 'BETWEEN') ? '' : 'none'}")
186
+ content_tag :span, html, :class => 'search_range'
187
+ end
188
+ alias_method :active_scaffold_search_integer, :active_scaffold_search_range
189
+ alias_method :active_scaffold_search_decimal, :active_scaffold_search_range
190
+ alias_method :active_scaffold_search_float, :active_scaffold_search_range
191
+ alias_method :active_scaffold_search_string, :active_scaffold_search_range
192
+
193
+ def field_search_datetime_value(value)
194
+ DateTime.new(value[:year].to_i, value[:month].to_i, value[:day].to_i, value[:hour].to_i, value[:minute].to_i, value[:second].to_i) unless value.nil? || value[:year].blank?
195
+ end
196
+
197
+ def active_scaffold_search_datetime(column, options)
198
+ opt_value, from_value, to_value = field_search_params_range_values(column)
199
+ options = column.options.merge(options)
200
+ helper = "select_#{'date' unless options[:discard_date]}#{'time' unless options[:discard_time]}"
201
+
202
+ send(helper, field_search_datetime_value(from_value), {:include_blank => true, :prefix => "#{options[:name]}[from]"}.merge(options)) <<
203
+ ' - '.html_safe << send(helper, field_search_datetime_value(to_value), {:include_blank => true, :prefix => "#{options[:name]}[to]"}.merge(options))
204
+ end
205
+
206
+ def active_scaffold_search_date(column, options)
207
+ active_scaffold_search_datetime(column, options.merge!(:discard_time => true))
208
+ end
209
+ def active_scaffold_search_time(column, options)
210
+ active_scaffold_search_datetime(column, options.merge!(:discard_date => true))
211
+ end
212
+ alias_method :active_scaffold_search_timestamp, :active_scaffold_search_datetime
213
+
214
+ ##
215
+ ## Search column override signatures
216
+ ##
217
+
218
+ def override_search_field(column)
219
+ method_with_class = override_search_field_name(column, true)
220
+ return method_with_class if respond_to?(method_with_class)
221
+ method = override_search_field_name(column)
222
+ method if respond_to?(method)
223
+ end
224
+ alias_method :override_search_field?, :override_search_field
225
+
226
+ # the naming convention for overriding form fields with helpers
227
+ def override_search_field_name(column, class_prefix = false)
228
+ "#{clean_class_name(column.active_record_class.name) + '_' if class_prefix}#{clean_column_name(column.name)}_search_column"
229
+ end
230
+
231
+ def override_search?(search_ui)
232
+ respond_to?(override_search(search_ui))
233
+ end
234
+
235
+ # the naming convention for overriding search input types with helpers
236
+ def override_search(form_ui)
237
+ "active_scaffold_search_#{form_ui}"
238
+ end
239
+
240
+ def visibles_and_hiddens(search_config)
241
+ visibles = []
242
+ hiddens = []
243
+ search_config.columns.each do |column|
244
+ next unless column.search_sql
245
+ if search_config.optional_columns.include?(column.name) && !searched_by?(column)
246
+ hiddens << column
247
+ else
248
+ visibles << column
249
+ end
250
+ end
251
+ return visibles, hiddens
252
+ end
253
+
254
+ def searched_by?(column)
255
+ value = field_search_params[column.name]
256
+ case value
257
+ when Hash
258
+ !value['from'].blank?
259
+ when String
260
+ !value.blank?
261
+ else
262
+ false
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end