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,197 @@
1
+ module ActiveScaffold::Actions
2
+ module Core
3
+ def self.included(base)
4
+ base.class_eval do
5
+ before_filter :register_constraints_with_action_columns
6
+ after_filter :clear_flashes
7
+ end
8
+ base.helper_method :nested?
9
+ base.helper_method :beginning_of_chain
10
+ base.helper_method :new_model
11
+ end
12
+ def render_field
13
+ if params[:in_place_editing]
14
+ render_field_for_inplace_editing
15
+ else
16
+ render_field_for_update_columns
17
+ end
18
+ end
19
+
20
+ protected
21
+
22
+ def nested?
23
+ false
24
+ end
25
+
26
+ def render_field_for_inplace_editing
27
+ register_constraints_with_action_columns(nested.constrained_fields, active_scaffold_config.update.hide_nested_column ? [] : [:update]) if nested?
28
+ @record = find_if_allowed(params[:id], :update)
29
+ render :inline => "<%= active_scaffold_input_for(active_scaffold_config.columns[params[:update_column].to_sym]) %>"
30
+ end
31
+
32
+ def render_field_for_update_columns
33
+ column = active_scaffold_config.columns[params[:column]]
34
+ unless column.nil?
35
+ @source_id = params.delete(:source_id)
36
+ @columns = column.update_columns
37
+ @scope = params[:scope]
38
+
39
+ if column.send_form_on_update_column
40
+ hash = if @scope
41
+ @scope.gsub('[','').split(']').inject(params[:record]) do |hash, index|
42
+ hash[index]
43
+ end
44
+ else
45
+ params[:record]
46
+ end
47
+ @record = hash[:id] ? find_if_allowed(hash[:id], :update) : new_model
48
+ @record = update_record_from_params(@record, active_scaffold_config.send(@scope ? :subform : (params[:id] ? :update : :create)).columns, hash)
49
+ else
50
+ @record = new_model
51
+ value = column_value_from_param_value(@record, column, params[:value])
52
+ @record.send "#{column.name}=", value
53
+ end
54
+
55
+ after_render_field(@record, column)
56
+ end
57
+ end
58
+
59
+ # override this method if you want to do something after render_field
60
+ def after_render_field(record, column); end
61
+
62
+ def authorized_for?(options = {})
63
+ active_scaffold_config.model.authorized_for?(options)
64
+ end
65
+
66
+ def clear_flashes
67
+ if request.xhr?
68
+ flash.keys.each do |flash_key|
69
+ flash[flash_key] = nil
70
+ end
71
+ end
72
+ end
73
+
74
+ def marked_records
75
+ active_scaffold_session_storage[:marked_records] ||= Set.new
76
+ end
77
+
78
+ def default_formats
79
+ [:html, :js, :json, :xml, :yaml]
80
+ end
81
+ # Returns true if the client accepts one of the MIME types passed to it
82
+ # ex: accepts? :html, :xml
83
+ def accepts?(*types)
84
+ for priority in request.accepts.compact
85
+ if priority == Mime::ALL
86
+ # Because IE always sends */* in the accepts header and we assume
87
+ # that if you really wanted XML or something else you would say so
88
+ # explicitly, we will assume */* to only ask for :html
89
+ return types.include?(:html)
90
+ elsif types.include?(priority.to_sym)
91
+ return true
92
+ end
93
+ end
94
+ false
95
+ end
96
+
97
+ def response_status
98
+ if successful?
99
+ action_name == 'create' ? 201 : 200
100
+ else
101
+ 422
102
+ end
103
+ end
104
+
105
+ # API response object that will be converted to XML/YAML/JSON using to_xxx
106
+ def response_object
107
+ @response_object = successful? ? (@record || @records) : @record.errors
108
+ end
109
+
110
+ # Success is the existence of certain variables and the absence of errors (when applicable).
111
+ # Success can also be defined.
112
+ def successful?
113
+ if @successful.nil?
114
+ @records or (@record and @record.errors.count == 0 and @record.no_errors_in_associated?)
115
+ else
116
+ @successful
117
+ end
118
+ end
119
+
120
+ def successful=(val)
121
+ @successful = (val) ? true : false
122
+ end
123
+
124
+ # Redirect to the main page (override if the ActiveScaffold is used as a component on another controllers page) for Javascript degradation
125
+ def return_to_main
126
+ redirect_to main_path_to_return
127
+ end
128
+
129
+ # Override this method on your controller to define conditions to be used when querying a recordset (e.g. for List). The return of this method should be any format compatible with the :conditions clause of Sequel::Model's find.
130
+ def conditions_for_collection
131
+ end
132
+
133
+ # Override this method on your controller to define joins to be used when querying a recordset (e.g. for List). The return of this method should be any format compatible with the :joins clause of Sequel::Model's find.
134
+ def joins_for_collection
135
+ end
136
+
137
+ # Override this method on your controller to provide custom finder options to the find() call. The return of this method should be a hash.
138
+ def custom_finder_options
139
+ {}
140
+ end
141
+
142
+ #Overide this method on your controller to provide model with named scopes
143
+ def beginning_of_chain
144
+ active_scaffold_config.model
145
+ end
146
+
147
+ # Builds search conditions by search params for column names. This allows urls like "contacts/list?company_id=5".
148
+ def conditions_from_params
149
+ conditions = nil
150
+ params.reject {|key, value| [:controller, :action, :id, :page, :sort, :sort_direction].include?(key.to_sym)}.each do |key, value|
151
+ next unless active_scaffold_config.model.columns.include?(key)
152
+ conditions = merge_conditions(conditions, {"#{active_scaffold_config.model.table_name}__#{key}".to_sym => value})
153
+ end
154
+ conditions
155
+ end
156
+
157
+ def new_model
158
+ model = beginning_of_chain
159
+ if model.respond_to?(:sti_key)
160
+ build_options = {model.sti_key => active_scaffold_config.model_id} if nested? && nested.association && nested.association.collection?
161
+ sti_key = model.sti_key.to_s
162
+ params = self.params # in new action sti_key must be in params
163
+ params = params[:record] || {} unless params[sti_key] # in create action must be inside record key
164
+ model = params.delete(sti_key).camelize.constantize if params[sti_key]
165
+ end
166
+ model.respond_to?(:build) ? model.build(build_options || {}) : model.new
167
+ end
168
+
169
+ private
170
+ def respond_to_action(action)
171
+ respond_to do |type|
172
+ action_formats.each do |format|
173
+ type.send(format){ send("#{action}_respond_to_#{format}") }
174
+ end
175
+ end
176
+ end
177
+
178
+ def action_formats
179
+ @action_formats ||= if respond_to? "#{action_name}_formats", true
180
+ send("#{action_name}_formats")
181
+ else
182
+ (default_formats + active_scaffold_config.formats).uniq
183
+ end
184
+ end
185
+
186
+ def response_code_for_rescue(exception)
187
+ case exception
188
+ when ActiveScaffold::RecordNotAllowed
189
+ "403 Record Not Allowed"
190
+ when ActiveScaffold::ActionNotAllowed
191
+ "403 Action Not Allowed"
192
+ else
193
+ super
194
+ end
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,148 @@
1
+ module ActiveScaffold::Actions
2
+ module Create
3
+ def self.included(base)
4
+ base.before_filter :create_authorized_filter, :only => [:new, :create]
5
+ end
6
+
7
+ def new
8
+ do_new
9
+ respond_to_action(:new)
10
+ end
11
+
12
+ def create
13
+ do_create
14
+ respond_to_action(:create)
15
+ end
16
+
17
+ protected
18
+ def response_location
19
+ url_for(params_for(:action => "show", :id => @record.id)) if successful?
20
+ end
21
+
22
+ def new_respond_to_html
23
+ if successful?
24
+ render(:action => 'create')
25
+ else
26
+ return_to_main
27
+ end
28
+ end
29
+
30
+ def new_respond_to_js
31
+ render(:partial => 'create_form')
32
+ end
33
+
34
+ def create_respond_to_html
35
+ if params[:iframe]=='true' # was this an iframe post ?
36
+ responds_to_parent do
37
+ render :action => 'on_create.js', :layout => false
38
+ end
39
+ else
40
+ if successful?
41
+ flash[:info] = as_(:created_model, :model => @record.to_label)
42
+ if action = active_scaffold_config.create.action_after_create
43
+ redirect_to params_for(:action => action, :id => @record.id)
44
+ elsif active_scaffold_config.create.persistent
45
+ redirect_to params_for(:action => "new")
46
+ else
47
+ return_to_main
48
+ end
49
+ else
50
+ if !nested? && active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.always_show_create
51
+ do_list
52
+ render(:action => 'list')
53
+ else
54
+ render(:action => 'create')
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ def create_respond_to_js
61
+ if successful? && active_scaffold_config.create.refresh_list && !render_parent?
62
+ do_search if respond_to? :do_search
63
+ do_list
64
+ end
65
+ render :action => 'on_create'
66
+ end
67
+
68
+ def create_respond_to_xml
69
+ render :xml => response_object.to_xml(:only => active_scaffold_config.create.columns.names), :content_type => Mime::XML, :status => response_status, :location => response_location
70
+ end
71
+
72
+ def create_respond_to_json
73
+ render :text => response_object.to_json(:only => active_scaffold_config.create.columns.names), :content_type => Mime::JSON, :status => response_status, :location => response_location
74
+ end
75
+
76
+ def create_respond_to_yaml
77
+ render :text => Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.create.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status, :location => response_location
78
+ end
79
+
80
+ # A simple method to find and prepare an example new record for the form
81
+ # May be overridden to customize the behavior (add default values, for instance)
82
+ def do_new
83
+ @record = new_model
84
+ apply_constraints_to_record(@record)
85
+ if nested?
86
+ create_association_with_parent(@record)
87
+ register_constraints_with_action_columns(nested.constrained_fields)
88
+ end
89
+ @record
90
+ end
91
+
92
+ # A somewhat complex method to actually create a new record. The complexity is from support for subforms and associated records.
93
+ # If you want to customize this behavior, consider using the +before_create_save+ and +after_create_save+ callbacks.
94
+ def do_create
95
+ begin
96
+ active_scaffold_config.model.db.transaction do
97
+ @record = update_record_from_params(new_model, active_scaffold_config.create.columns, params[:record])
98
+ apply_constraints_to_record(@record, :allow_autosave => true)
99
+ if nested?
100
+ create_association_with_parent(@record)
101
+ register_constraints_with_action_columns(nested.constrained_fields)
102
+ end
103
+ create_save
104
+ end
105
+ rescue ActiveRecord::RecordInvalid
106
+ flash[:error] = $!.message
107
+ self.successful = false
108
+ end
109
+ end
110
+
111
+ def create_save
112
+ before_create_save(@record)
113
+ self.successful = [@record.valid?, @record.associated_valid?].all? {|v| v == true} # this syntax avoids a short-circuit
114
+ if successful?
115
+ @record.save! and @record.save_associated!
116
+ after_create_save(@record)
117
+ end
118
+ end
119
+
120
+ # override this method if you want to inject data in the record (or its associated objects) before the save
121
+ def before_create_save(record); end
122
+
123
+ # override this method if you want to do something after the save
124
+ def after_create_save(record); end
125
+
126
+ # The default security delegates to ModelPermissions.
127
+ # You may override the method to customize.
128
+
129
+ def create_ignore?
130
+ nested? && active_scaffold_config.list.always_show_create
131
+ end
132
+
133
+ def create_authorized?
134
+ authorized_for?(:crud_type => :create)
135
+ end
136
+ private
137
+ def create_authorized_filter
138
+ link = active_scaffold_config.create.link || active_scaffold_config.create.class.link
139
+ raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
140
+ end
141
+ def new_formats
142
+ (default_formats + active_scaffold_config.formats).uniq
143
+ end
144
+ def create_formats
145
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.create.formats).uniq
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,76 @@
1
+ module ActiveScaffold::Actions
2
+ module Delete
3
+ def self.included(base)
4
+ base.before_filter :delete_authorized_filter, :only => [:destroy]
5
+ end
6
+
7
+ def destroy
8
+ params.delete :destroy_action
9
+ process_action_link_action(:destroy) do |record|
10
+ do_destroy
11
+ end
12
+ end
13
+
14
+ protected
15
+ def destroy_respond_to_html
16
+ if self.successful?
17
+ flash[:info] = as_(:deleted_model, :model => @record.to_label)
18
+ else
19
+ #error_message_for not available in controller...
20
+ #flash[:error] = active_scaffold_error_messages_for(@record, :object_name => "#{@record.class.model_name.human.downcase}#{@record.new? ? '' : ": #{@record.to_label}"}", :header_message => '', :message => "#{@record.class.model_name.human.downcase}#{@record.new? ? '' : ": #{@record.to_label}"}", :container_tag => nil, :list_type => :br)
21
+ end
22
+ return_to_main
23
+ end
24
+
25
+ def destroy_respond_to_js
26
+ if successful? && active_scaffold_config.delete.refresh_list && !render_parent?
27
+ do_search if respond_to? :do_search
28
+ do_list
29
+ end
30
+ render(:action => 'destroy')
31
+ end
32
+
33
+ def destroy_respond_to_xml
34
+ render :xml => successful? ? "" : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
35
+ end
36
+
37
+ def destroy_respond_to_json
38
+ render :text => successful? ? "" : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
39
+ end
40
+
41
+ def destroy_respond_to_yaml
42
+ render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.list.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
43
+ end
44
+
45
+ def destroy_find_record
46
+ @record = find_if_allowed(params[:id], :delete)
47
+ end
48
+
49
+ # A simple method to handle the actual destroying of a record
50
+ # May be overridden to customize the behavior
51
+ def do_destroy
52
+ @record ||= destroy_find_record
53
+ begin
54
+ self.successful = @record.destroy
55
+ marked_records.delete @record.id.to_s if successful?
56
+ rescue
57
+ flash[:warning] = as_(:cant_destroy_record, :record => @record.to_label)
58
+ self.successful = false
59
+ end
60
+ end
61
+
62
+ # The default security delegates to ModelPermissions.
63
+ # You may override the method to customize.
64
+ def delete_authorized?(record = nil)
65
+ authorized_for?(:crud_type => :delete)
66
+ end
67
+ private
68
+ def delete_authorized_filter
69
+ link = active_scaffold_config.delete.link || active_scaffold_config.delete.class.link
70
+ raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
71
+ end
72
+ def destroy_formats
73
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.delete.formats).uniq
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,82 @@
1
+ module ActiveScaffold::Actions
2
+ module FieldSearch
3
+ include ActiveScaffold::Actions::CommonSearch
4
+ def self.included(base)
5
+ base.before_filter :search_authorized_filter, :only => :show_search
6
+ base.before_filter :store_search_params_into_session, :only => [:index]
7
+ base.before_filter :do_search, :only => [:index]
8
+ base.helper_method :field_search_params
9
+ end
10
+
11
+ # FieldSearch uses params[:search] and not @record because search conditions do not always pass the Model's validations.
12
+ # This facilitates for example, textual searches against associations via .search_sql
13
+ def show_search
14
+ @record = new_model
15
+ respond_to_action(:field_search)
16
+ end
17
+
18
+ protected
19
+
20
+ def store_search_params_into_session
21
+ set_field_search_default_params(active_scaffold_config.field_search.default_params) unless active_scaffold_config.field_search.default_params.nil?
22
+ super
23
+ active_scaffold_session_storage[:search] = nil if search_params.is_a?(String)
24
+ end
25
+
26
+ def set_field_search_default_params(default_params)
27
+ if (params[:search].nil? && search_params.nil?) || (params[:search].is_a?(String) && params[:search].blank?)
28
+ params[:search] = default_params.is_a?(Proc) ? self.instance_eval(&default_params) : default_params
29
+ end
30
+ end
31
+
32
+ def field_search_params
33
+ search_params || {}
34
+ end
35
+
36
+ def field_search_respond_to_html
37
+ render(:action => "field_search")
38
+ end
39
+
40
+ def field_search_respond_to_js
41
+ render(:partial => "field_search")
42
+ end
43
+
44
+ def do_search
45
+ unless search_params.blank?
46
+ text_search = active_scaffold_config.field_search.text_search
47
+ search_conditions = []
48
+ human_condition_columns = [] if active_scaffold_config.field_search.human_conditions
49
+ columns = active_scaffold_config.field_search.columns
50
+ search_params.each do |key, value|
51
+ next unless columns.include? key
52
+ search_condition = self.class.condition_for_column(active_scaffold_config.columns[key], value, text_search)
53
+ unless search_condition.blank?
54
+ search_conditions << search_condition
55
+ human_condition_columns << active_scaffold_config.columns[key] unless human_condition_columns.nil?
56
+ end
57
+ end
58
+ self.active_scaffold_conditions = merge_conditions(self.active_scaffold_conditions, *search_conditions)
59
+ if search_conditions.blank?
60
+ @filtered = false
61
+ else
62
+ @filtered = human_condition_columns.nil? ? true : human_condition_columns
63
+ end
64
+
65
+ includes_for_search_columns = columns.collect{ |column| column.includes}.flatten.uniq.compact
66
+ self.active_scaffold_includes.concat includes_for_search_columns
67
+
68
+ active_scaffold_config.list.user.page = nil
69
+ end
70
+ end
71
+
72
+ private
73
+
74
+ def search_authorized_filter
75
+ link = active_scaffold_config.field_search.link || active_scaffold_config.field_search.class.link
76
+ raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
77
+ end
78
+ def field_search_formats
79
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.field_search.formats).uniq
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,196 @@
1
+ module ActiveScaffold::Actions
2
+ module List
3
+ def self.included(base)
4
+ base.before_filter :list_authorized_filter, :only => [:index, :row]
5
+ base.helper_method :list_columns
6
+ end
7
+
8
+ def index
9
+ list
10
+ end
11
+
12
+ # get just a single row
13
+ def row
14
+ @record = find_if_allowed(params[:id], :read)
15
+ respond_to_action(:row)
16
+ end
17
+
18
+ def list
19
+ do_list
20
+ @nested_auto_open = active_scaffold_config.list.nested_auto_open
21
+ respond_to_action(:list)
22
+ end
23
+
24
+ protected
25
+ def list_respond_to_html
26
+ if params.delete(:embedded)
27
+ render :action => 'list', :layout => false
28
+ else
29
+ render :action => 'list'
30
+ end
31
+ end
32
+ def list_respond_to_js
33
+ if params[:adapter]
34
+ render(:partial => 'list_with_header')
35
+ elsif params[:embedded]
36
+ params.delete(:embedded)
37
+ render(:partial => 'list_with_header')
38
+ else
39
+ render :action => 'refresh_list.js'
40
+ end
41
+ end
42
+ def list_respond_to_xml
43
+ render :xml => response_object.to_xml(:only => list_columns_names), :content_type => Mime::XML, :status => response_status
44
+ end
45
+ def list_respond_to_json
46
+ render :text => response_object.to_json(:only => list_columns_names), :content_type => Mime::JSON, :status => response_status
47
+ end
48
+ def list_respond_to_yaml
49
+ render :text => Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
50
+ end
51
+
52
+ def row_respond_to_html
53
+ render(:partial => 'row', :locals => {:record => @record})
54
+ end
55
+
56
+ # The actual algorithm to prepare for the list view
57
+ def set_includes_for_list_columns
58
+ includes_for_list_columns = active_scaffold_config.list.columns.collect{ |c| c.includes }.flatten.uniq.compact
59
+ self.active_scaffold_includes.concat includes_for_list_columns
60
+ end
61
+
62
+ # The actual algorithm to prepare for the list view
63
+ def do_list
64
+ set_includes_for_list_columns
65
+
66
+ options = { :sorting => active_scaffold_config.list.user.sorting,
67
+ :count_includes => active_scaffold_config.list.user.count_includes }
68
+ paginate = (params[:format].nil?) ? (accepts? :html, :js) : ['html', 'js'].include?(params[:format])
69
+ if paginate
70
+ options.merge!({
71
+ :per_page => active_scaffold_config.list.user.per_page,
72
+ :page => active_scaffold_config.list.user.page,
73
+ :pagination => active_scaffold_config.list.pagination
74
+ })
75
+ end
76
+
77
+ page = find_page(options)
78
+ if page.items.blank? && !page.pager.infinite?
79
+ page = page.pager.last
80
+ active_scaffold_config.list.user.page = page.number
81
+ end
82
+ @page, @records = page, page.items
83
+ end
84
+
85
+ def each_record_in_page
86
+ _page = active_scaffold_config.list.user.page
87
+ do_search if respond_to? :do_search
88
+ active_scaffold_config.list.user.page = _page
89
+ do_list
90
+ @page.items.each {|record| yield record}
91
+ end
92
+
93
+ def each_record_in_scope
94
+ do_search if respond_to? :do_search
95
+ finder_options = { :order => "#{active_scaffold_config.model.connection.quote_table_name(active_scaffold_config.model.table_name)}.#{active_scaffold_config.model.primary_key} ASC",
96
+ :conditions => all_conditions,
97
+ :joins => joins_for_finder}
98
+ finder_options.merge! custom_finder_options
99
+ finder_options.merge! :include => (active_scaffold_includes.blank? ? nil : active_scaffold_includes)
100
+ klass = beginning_of_chain
101
+ klass.all(finder_options).each {|record| yield record}
102
+ end
103
+
104
+ # The default security delegates to ModelPermissions.
105
+ # You may override the method to customize.
106
+ def list_authorized?
107
+ authorized_for?(:crud_type => :read)
108
+ end
109
+
110
+ # call this method in your action_link action to simplify processing of actions
111
+ # eg for member action_link :fire
112
+ # process_action_link_action do |record|
113
+ # record.update_attributes(:fired => true)
114
+ # self.successful = true
115
+ # flash[:info] = 'Player fired'
116
+ # end
117
+ def process_action_link_action(render_action = :action_update, crud_type = nil)
118
+ if request.get?
119
+ # someone has disabled javascript, we have to show confirmation form first
120
+ @record = find_if_allowed(params[:id], :read) if params[:id] && params[:id] && params[:id].to_i > 0
121
+ respond_to_action(:action_confirmation)
122
+ else
123
+ if params[:id] && params[:id] && params[:id].to_i > 0
124
+ crud_type ||= (request.post? || request.put?) ? :update : :delete
125
+ @record = find_if_allowed(params[:id], crud_type)
126
+ unless @record.nil?
127
+ yield @record
128
+ else
129
+ self.successful = false
130
+ flash[:error] = as_(:no_authorization_for_action, :action => action_name)
131
+ end
132
+ else
133
+ yield
134
+ end
135
+ respond_to_action(render_action)
136
+ end
137
+ end
138
+
139
+ def action_confirmation_respond_to_html(confirm_action = action_name.to_sym)
140
+ link = active_scaffold_config.action_links[confirm_action]
141
+ render :action => 'action_confirmation', :locals => {:record => @record, :link => link}
142
+ end
143
+
144
+ def action_update_respond_to_html
145
+ do_search if respond_to? :do_search
146
+ do_list
147
+ redirect_to :action => 'index'
148
+ end
149
+
150
+ def action_update_respond_to_js
151
+ render(:action => 'on_action_update')
152
+ end
153
+
154
+ def action_update_respond_to_xml
155
+ render :xml => successful? ? "" : response_object.to_xml(:only => list_columns_names), :content_type => Mime::XML, :status => response_status
156
+ end
157
+
158
+ def action_update_respond_to_json
159
+ render :text => successful? ? "" : response_object.to_json(:only => list_columns_names), :content_type => Mime::JSON, :status => response_status
160
+ end
161
+
162
+ def action_update_respond_to_yaml
163
+ render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
164
+ end
165
+
166
+ private
167
+ def list_authorized_filter
168
+ raise ActiveScaffold::ActionNotAllowed unless list_authorized?
169
+ end
170
+
171
+ def list_formats
172
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
173
+ end
174
+ alias_method :index_formats, :list_formats
175
+
176
+ def row_formats
177
+ ([:html] + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
178
+ end
179
+
180
+ def action_update_formats
181
+ (default_formats + active_scaffold_config.formats).uniq
182
+ end
183
+
184
+ def action_confirmation_formats
185
+ (default_formats + active_scaffold_config.formats).uniq
186
+ end
187
+
188
+ def list_columns
189
+ active_scaffold_config.list.columns.collect_visible
190
+ end
191
+
192
+ def list_columns_names
193
+ list_columns.collect(&:name)
194
+ end
195
+ end
196
+ end