active_scaffold-sequel 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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,75 @@
1
+ module ActiveScaffold::Actions
2
+ module Mark
3
+
4
+ def self.included(base)
5
+ base.before_filter :mark_authorized?, :only => :mark
6
+ #base.prepend_before_filter :assign_marked_records_to_model
7
+ base.helper_method :marked_records
8
+ end
9
+
10
+ def mark_all
11
+ if mark_all? || mark_all_scope_forced?
12
+ do_mark_all
13
+ else
14
+ do_unmark
15
+ end
16
+ respond_to_action(:mark_all)
17
+ end
18
+ protected
19
+
20
+ def mark_all_respond_to_html
21
+ do_list
22
+ list_respond_to_html
23
+ end
24
+
25
+ def mark_all_respond_to_js
26
+ do_list
27
+ render :action => 'on_mark_all', :locals => {:mark_all => mark_all?}
28
+ end
29
+
30
+ # We need to give the ActiveRecord classes a handle to currently marked records. We don't want to just pass the object,
31
+ # because the object may change. So we give ActiveRecord a proc that ties to the
32
+ # marked_records_method on this ApplicationController.
33
+ def assign_marked_records_to_model
34
+ active_scaffold_config.model.marked_records = marked_records
35
+ end
36
+
37
+ def mark?
38
+ params[:value] == 'true'
39
+ end
40
+
41
+ def mark_all?
42
+ @mark_all ||= [true, 'true', 1, '1', 'T', 't'].include?(params[:value].class == String ? params[:value].downcase : params[:value])
43
+ end
44
+
45
+ def mark_all_scope_forced?
46
+ !params[:mark_target].nil? && params[:mark_target]=='scope'
47
+ end
48
+
49
+ def do_mark_all
50
+ if active_scaffold_config.mark.mark_all_mode == :page && !mark_all_scope_forced? then
51
+ each_record_in_page {|record| marked_records << record.id}
52
+ else
53
+ each_record_in_scope {|record| marked_records << record.id}
54
+ end
55
+ end
56
+
57
+ def do_demark_all
58
+ if active_scaffold_config.mark.mark_all_mode == :page then
59
+ each_record_in_page {|record| marked_records.delete(record.id)}
60
+ else
61
+ each_record_in_scope {|record| marked_records.delete(record.id)}
62
+ end
63
+ end
64
+
65
+ # The default security delegates to ModelPermissions.
66
+ # You may override the method to customize.
67
+ def mark_authorized?
68
+ authorized_for?(:crud_type => :read)
69
+ end
70
+
71
+ def mark_all_formats
72
+ (default_formats + active_scaffold_config.formats).uniq
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,245 @@
1
+ module ActiveScaffold::Actions
2
+ # The Nested module basically handles automatically linking controllers together. It does this by creating column links with the right parameters, and by providing any supporting systems (like a /:controller/nested action for returning associated scaffolds).
3
+ module Nested
4
+
5
+ def self.included(base)
6
+ super
7
+ base.module_eval do
8
+ prepend_before_filter :set_nested
9
+ before_filter :configure_nested
10
+ include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.model.association_reflections.any? {|name,properties| properties[:type] == :many_to_many}
11
+ end
12
+ base.before_filter :include_habtm_actions
13
+ base.helper_method :nested
14
+ base.helper_method :nested_parent_record
15
+ end
16
+
17
+ protected
18
+ def nested
19
+ @nested
20
+ end
21
+
22
+ def nested?
23
+ !nested.nil?
24
+ end
25
+
26
+ def set_nested
27
+ if params[:parent_scaffold] && (params[:association] || params[:named_scope])
28
+ @nested = ActiveScaffold::DataStructures::NestedInfo.get(active_scaffold_config.model, params)
29
+ unless @nested.nil?
30
+ active_scaffold_constraints[:id] = params[:id] if @nested.belongs_to?
31
+ register_constraints_with_action_columns(@nested.constrained_fields, active_scaffold_config.list.hide_nested_column ? [] : [:list])
32
+ end
33
+ end
34
+ end
35
+
36
+ def configure_nested
37
+ if nested?
38
+ active_scaffold_session_storage[:list][:label] = if nested.belongs_to?
39
+ as_(:nested_of_model, :nested_model => active_scaffold_config.model.model_name.human, :parent_model => nested_parent_record.to_label)
40
+ else
41
+ as_(:nested_for_model, :nested_model => active_scaffold_config.list.label, :parent_model => nested_parent_record.to_label)
42
+ end
43
+ if nested.sorted?
44
+ active_scaffold_config.list.user.nested_default_sorting = {:table_name => active_scaffold_config.model.model_name, :default_sorting => nested.default_sorting}
45
+ end
46
+ end
47
+ end
48
+
49
+ def nested_authorized?(record = nil)
50
+ true
51
+ end
52
+
53
+ def include_habtm_actions
54
+ if nested?
55
+ if nested.habtm?
56
+ # Production mode is ok with adding a link everytime the scaffold is nested - we ar not ok with that.
57
+ active_scaffold_config.action_links.add('new_existing', :label => :add_existing, :type => :collection, :security_method => :add_existing_authorized?) unless active_scaffold_config.action_links['new_existing']
58
+ if active_scaffold_config.nested.shallow_delete
59
+ active_scaffold_config.action_links.add('destroy_existing', :label => :remove, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :position => false, :security_method => :delete_existing_authorized?) unless active_scaffold_config.action_links['destroy_existing']
60
+ if active_scaffold_config.actions.include?(:delete)
61
+ active_scaffold_config.action_links.delete("delete") if active_scaffold_config.action_links['delete']
62
+ end
63
+ end
64
+ else
65
+ # Production mode is caching this link into a non nested scaffold
66
+ active_scaffold_config.action_links.delete('new_existing') if active_scaffold_config.action_links['new_existing']
67
+
68
+ if active_scaffold_config.nested.shallow_delete
69
+ active_scaffold_config.action_links.delete("destroy_existing") if active_scaffold_config.action_links['destroy_existing']
70
+ if active_scaffold_config.actions.include?(:delete)
71
+ active_scaffold_config.action_links.add(ActiveScaffold::Config::Delete.link) unless active_scaffold_config.action_links['delete']
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ def beginning_of_chain
79
+ if nested? && nested.association && !nested.association.belongs_to?
80
+ if nested.association.collection?
81
+ nested.parent_scope.send(nested.association[:name])
82
+ elsif nested.child_association.belongs_to?
83
+ active_scaffold_config.model.where(nested.child_association.foreign_key => nested.parent_scope)
84
+ end
85
+ elsif nested? && nested.scope
86
+ nested.parent_scope.send(nested.scope)
87
+ else
88
+ active_scaffold_config.model
89
+ end
90
+ end
91
+
92
+ def nested_parent_record(crud = :read)
93
+ @nested_parent_record ||= find_if_allowed(nested.parent_id, crud, nested.parent_model)
94
+ end
95
+
96
+ def create_association_with_parent(record)
97
+ if nested?
98
+ if (nested.belongs_to? || nested.has_one? || nested.habtm?) && nested.child_association
99
+ parent = nested_parent_record(:read)
100
+ case nested.child_association[:type]
101
+ when :one_to_one
102
+ record.send("#{nested.child_association[:name]}=", parent)
103
+ when :many_to_one
104
+ record.send("#{nested.child_association[:name]}=", parent)
105
+ when :one_to_many, :many_to_many
106
+ record.send("add_#{nested.child_association[:name].to_s.singularize}", parent)
107
+ end unless parent.nil?
108
+ end
109
+ end
110
+ end
111
+
112
+ private
113
+ def nested_formats
114
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.nested.formats).uniq
115
+ end
116
+ end
117
+ end
118
+
119
+ module ActiveScaffold::Actions::Nested
120
+ module ChildMethods
121
+
122
+ def self.included(base)
123
+ super
124
+ end
125
+
126
+ def new_existing
127
+ do_new
128
+ respond_to_action(:new_existing)
129
+ end
130
+
131
+ def add_existing
132
+ do_add_existing
133
+ respond_to_action(:add_existing)
134
+ end
135
+
136
+ def destroy_existing
137
+ return redirect_to(params.merge(:action => :delete)) if request.get?
138
+ do_destroy_existing
139
+ respond_to_action(:destroy_existing)
140
+ end
141
+
142
+ protected
143
+ def new_existing_respond_to_html
144
+ if successful?
145
+ render(:action => 'add_existing_form')
146
+ else
147
+ return_to_main
148
+ end
149
+ end
150
+ def new_existing_respond_to_js
151
+ render(:partial => 'add_existing_form')
152
+ end
153
+ def add_existing_respond_to_html
154
+ if successful?
155
+ flash[:info] = as_(:created_model, :model => @record.to_label)
156
+ return_to_main
157
+ else
158
+ render(:action => 'add_existing_form')
159
+ end
160
+ end
161
+ def add_existing_respond_to_js
162
+ if successful?
163
+ render :action => 'add_existing'
164
+ else
165
+ render :action => 'form_messages'
166
+ end
167
+ end
168
+ def add_existing_respond_to_xml
169
+ render :xml => response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
170
+ end
171
+ def add_existing_respond_to_json
172
+ render :text => response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
173
+ end
174
+ def add_existing_respond_to_yaml
175
+ render :text => Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.list.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
176
+ end
177
+ def destroy_existing_respond_to_html
178
+ flash[:info] = as_(:deleted_model, :model => @record.to_label)
179
+ return_to_main
180
+ end
181
+
182
+ def destroy_existing_respond_to_js
183
+ render(:action => 'destroy')
184
+ end
185
+
186
+ def destroy_existing_respond_to_xml
187
+ render :xml => successful? ? "" : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
188
+ end
189
+
190
+ def destroy_existing_respond_to_json
191
+ render :text => successful? ? "" : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
192
+ end
193
+
194
+ def destroy_existing_respond_to_yaml
195
+ 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
196
+ end
197
+
198
+ def add_existing_authorized?(record = nil)
199
+ true
200
+ end
201
+ def delete_existing_authorized?(record = nil)
202
+ true
203
+ end
204
+
205
+ def after_create_save(record)
206
+ if params[:association_macro] == :has_and_belongs_to_many
207
+ params[:associated_id] = record
208
+ do_add_existing
209
+ end
210
+ end
211
+
212
+ # The actual "add_existing" algorithm
213
+ def do_add_existing
214
+ parent_record = nested_parent_record(:update)
215
+ @record = active_scaffold_config.model.find(params[:associated_id])
216
+ if parent_record && @record
217
+ parent_record.send(nested.association[:name]) << @record
218
+ parent_record.save
219
+ else
220
+ false
221
+ end
222
+ end
223
+
224
+ def do_destroy_existing
225
+ if active_scaffold_config.nested.shallow_delete
226
+ @record = nested_parent_record(:update)
227
+ collection = @record.send(nested.association[:name])
228
+ assoc_record = collection.find(params[:id])
229
+ collection.delete(assoc_record)
230
+ else
231
+ do_destroy
232
+ end
233
+ end
234
+ private
235
+ def new_existing_formats
236
+ (default_formats + active_scaffold_config.formats).uniq
237
+ end
238
+ def add_existing_formats
239
+ (default_formats + active_scaffold_config.formats).uniq
240
+ end
241
+ def destroy_existing_formats
242
+ (default_formats + active_scaffold_config.formats).uniq
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,48 @@
1
+ module ActiveScaffold::Actions
2
+ module Search
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 :search_params
9
+ end
10
+
11
+ def show_search
12
+ respond_to_action(:search)
13
+ end
14
+
15
+ protected
16
+ def search_respond_to_html
17
+ render(:action => "search")
18
+ end
19
+ def search_respond_to_js
20
+ render(:partial => "search")
21
+ end
22
+ def do_search
23
+ query = search_params.to_s.strip rescue ''
24
+ unless query.empty?
25
+ columns = active_scaffold_config.search.columns
26
+ text_search = active_scaffold_config.search.text_search
27
+ query = query.split(active_scaffold_config.search.split_terms) if active_scaffold_config.search.split_terms
28
+ search_conditions = self.class.create_conditions_for_columns(query, columns, text_search)
29
+ self.active_scaffold_conditions = merge_conditions(self.active_scaffold_conditions, search_conditions)
30
+ @filtered = !search_conditions.blank?
31
+
32
+ includes_for_search_columns = columns.collect{ |column| column.includes}.flatten.uniq.compact
33
+ self.active_scaffold_includes.concat includes_for_search_columns
34
+
35
+ active_scaffold_config.list.user.page = nil
36
+ end
37
+ end
38
+
39
+ private
40
+ def search_authorized_filter
41
+ link = active_scaffold_config.search.link || active_scaffold_config.search.class.link
42
+ raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
43
+ end
44
+ def search_formats
45
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.search.formats).uniq
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,61 @@
1
+ module ActiveScaffold::Actions
2
+ module Show
3
+ def self.included(base)
4
+ base.before_filter :show_authorized_filter, :only => :show
5
+ end
6
+
7
+ def show
8
+ # rest destroy falls back to rest show in case of disabled javascript
9
+ # just render action_confirmation message for destroy
10
+ unless params.delete :destroy_action
11
+ do_show
12
+ successful?
13
+ respond_to_action(:show)
14
+ else
15
+ @record = find_if_allowed(params[:id], :read) if params[:id] && params[:id] && params[:id].to_i > 0
16
+ action_confirmation_respond_to_html(:destroy)
17
+ end
18
+ end
19
+
20
+ protected
21
+
22
+ def show_respond_to_json
23
+ render :text => response_object.to_json(:only => active_scaffold_config.show.columns.names), :content_type => Mime::JSON, :status => response_status
24
+ end
25
+
26
+ def show_respond_to_yaml
27
+ render :text => Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.show.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
28
+ end
29
+
30
+ def show_respond_to_xml
31
+ render :xml => response_object.to_xml(:only => active_scaffold_config.show.columns.names), :content_type => Mime::XML, :status => response_status
32
+ end
33
+
34
+ def show_respond_to_js
35
+ render :partial => 'show'
36
+ end
37
+
38
+ def show_respond_to_html
39
+ render :action => 'show'
40
+ end
41
+ # A simple method to retrieve and prepare a record for showing.
42
+ # May be overridden to customize show routine
43
+ def do_show
44
+ @record = find_if_allowed(params[:id], :read)
45
+ end
46
+
47
+ # The default security delegates to ModelPermissions.
48
+ # You may override the method to customize.
49
+ def show_authorized?(record = nil)
50
+ authorized_for?(:crud_type => :read)
51
+ end
52
+ private
53
+ def show_authorized_filter
54
+ link = active_scaffold_config.show.link || active_scaffold_config.show.class.link
55
+ raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
56
+ end
57
+ def show_formats
58
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.show.formats).uniq
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,23 @@
1
+ module ActiveScaffold::Actions
2
+ module Subform
3
+ def edit_associated
4
+ do_edit_associated
5
+ render :action => 'edit_associated.js'
6
+ end
7
+
8
+ protected
9
+
10
+ def do_edit_associated
11
+ @parent_record = params[:id].nil? ? new_model : find_if_allowed(params[:id], :update)
12
+ @column = active_scaffold_config.columns[params[:association]]
13
+
14
+ # NOTE: we don't check whether the user is allowed to update this record, because if not, we'll still let them associate the record. we'll just refuse to do more than associate, is all.
15
+ @record = @column.association.associated_class[params[:associated_id]] if params[:associated_id]
16
+ @record ||= build_associated(@column, @parent_record)
17
+
18
+ @scope = "[#{@column.name}]"
19
+ @scope += (@record.new?) ? "[#{(Time.now.to_f*1000).to_i.to_s}]" : "[#{@record.id}]" if @column.plural_association?
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,150 @@
1
+ module ActiveScaffold::Actions
2
+ module Update
3
+ def self.included(base)
4
+ base.before_filter :update_authorized_filter, :only => [:edit, :update]
5
+ base.helper_method :update_refresh_list?
6
+ end
7
+
8
+ def edit
9
+ do_edit
10
+ respond_to_action(:edit)
11
+ end
12
+
13
+ def update
14
+ do_update
15
+ respond_to_action(:update)
16
+ end
17
+
18
+ # for inline (inlist) editing
19
+ def update_column
20
+ do_update_column
21
+ @column_span_id = params[:editor_id] || params[:editorId]
22
+ end
23
+
24
+ protected
25
+ def edit_respond_to_html
26
+ if successful?
27
+ render(:action => 'update')
28
+ else
29
+ return_to_main
30
+ end
31
+ end
32
+ def edit_respond_to_js
33
+ render(:partial => 'update_form')
34
+ end
35
+ def update_respond_to_html
36
+ if params[:iframe]=='true' # was this an iframe post ?
37
+ responds_to_parent do
38
+ render :action => 'on_update.js', :layout => false
39
+ end
40
+ else # just a regular post
41
+ if successful?
42
+ flash[:info] = as_(:updated_model, :model => @record.to_label)
43
+ return_to_main
44
+ else
45
+ render(:action => 'update')
46
+ end
47
+ end
48
+ end
49
+ def update_respond_to_js
50
+ if successful? && update_refresh_list? && !render_parent?
51
+ do_search if respond_to? :do_search
52
+ do_list
53
+ end
54
+ render :action => 'on_update'
55
+ end
56
+ def update_respond_to_xml
57
+ render :xml => response_object.to_xml(:only => active_scaffold_config.update.columns.names), :content_type => Mime::XML, :status => response_status
58
+ end
59
+ def update_respond_to_json
60
+ render :text => response_object.to_json(:only => active_scaffold_config.update.columns.names), :content_type => Mime::JSON, :status => response_status
61
+ end
62
+ def update_respond_to_yaml
63
+ render :text => Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.update.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
64
+ end
65
+ # A simple method to find and prepare a record for editing
66
+ # May be overridden to customize the record (set default values, etc.)
67
+ def do_edit
68
+ register_constraints_with_action_columns(nested.constrained_fields, active_scaffold_config.update.hide_nested_column ? [] : [:update]) if nested?
69
+ @record = find_if_allowed(params[:id], :update)
70
+ end
71
+
72
+ # A complex method to update a record. The complexity comes from the support for subforms, and saving associated records.
73
+ # If you want to customize this algorithm, consider using the +before_update_save+ callback
74
+ def do_update
75
+ do_edit
76
+ update_save
77
+ end
78
+
79
+ def update_save(options = {})
80
+ begin
81
+ active_scaffold_config.model.db.transaction do
82
+ @record = update_record_from_params(@record, active_scaffold_config.update.columns, params[:record]) unless options[:no_record_param_update]
83
+ before_update_save(@record)
84
+ self.successful = [@record.valid?, @record.associated_valid?].all? {|v| v == true} # this syntax avoids a short-circuit
85
+ if successful?
86
+ @record.save! and @record.save_associated!
87
+ after_update_save(@record)
88
+ else
89
+ # some associations such as habtm are saved before saved is called on parent object
90
+ # we have to revert these changes if validation fails
91
+ raise Sequel::Rollback, "don't save habtm associations unless record is valid"
92
+ end
93
+ end
94
+ rescue ActiveRecord::RecordInvalid
95
+ flash[:error] = $!.message
96
+ self.successful = false
97
+ rescue ActiveRecord::StaleObjectError
98
+ @record.errors.add(:base, as_(:version_inconsistency))
99
+ self.successful = false
100
+ rescue ActiveRecord::RecordNotSaved
101
+ @record.errors.add(:base, as_(:record_not_saved)) if @record.errors.empty?
102
+ self.successful = false
103
+ end
104
+ end
105
+
106
+ def do_update_column
107
+ @record = active_scaffold_config.model.find(params[:id])
108
+ if @record.authorized_for?(:crud_type => :update, :column => params[:column])
109
+ column = active_scaffold_config.columns[params[:column].to_sym]
110
+ params[:value] ||= @record.column_for_attribute(params[:column]).default unless @record.column_for_attribute(params[:column]).nil? || @record.column_for_attribute(params[:column])[:allow_null]
111
+ unless column.nil?
112
+ params[:value] = column_value_from_param_value(@record, column, params[:value])
113
+ params[:value] = [] if params[:value].nil? && column.form_ui && column.plural_association?
114
+ end
115
+ @record.send("#{params[:column]}=", params[:value])
116
+ before_update_save(@record)
117
+ @record.save
118
+ after_update_save(@record)
119
+ end
120
+ end
121
+
122
+ # override this method if you want to inject data in the record (or its associated objects) before the save
123
+ def before_update_save(record); end
124
+
125
+ # override this method if you want to do something after the save
126
+ def after_update_save(record); end
127
+
128
+ # should we refresh whole list after update operation
129
+ def update_refresh_list?
130
+ active_scaffold_config.update.refresh_list
131
+ end
132
+
133
+ # The default security delegates to ModelPermissions.
134
+ # You may override the method to customize.
135
+ def update_authorized?(record = nil)
136
+ authorized_for?(:crud_type => :update)
137
+ end
138
+ private
139
+ def update_authorized_filter
140
+ link = active_scaffold_config.update.link || active_scaffold_config.update.class.link
141
+ raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
142
+ end
143
+ def edit_formats
144
+ (default_formats + active_scaffold_config.formats).uniq
145
+ end
146
+ def update_formats
147
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.update.formats).uniq
148
+ end
149
+ end
150
+ end