active_scaffold_san 3.0.18

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 (284) hide show
  1. data/.autotest +27 -0
  2. data/.document +5 -0
  3. data/CHANGELOG +179 -0
  4. data/Gemfile +13 -0
  5. data/Gemfile.lock +20 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README +69 -0
  8. data/Rakefile +53 -0
  9. data/active_scaffold_vho.gemspec +388 -0
  10. data/frontends/default/images/add.gif +0 -0
  11. data/frontends/default/images/arrow_down.gif +0 -0
  12. data/frontends/default/images/arrow_up.gif +0 -0
  13. data/frontends/default/images/close.gif +0 -0
  14. data/frontends/default/images/config.png +0 -0
  15. data/frontends/default/images/cross.png +0 -0
  16. data/frontends/default/images/gears.png +0 -0
  17. data/frontends/default/images/indicator-small.gif +0 -0
  18. data/frontends/default/images/indicator.gif +0 -0
  19. data/frontends/default/images/magnifier.png +0 -0
  20. data/frontends/default/javascripts/jquery/active_scaffold.js +1004 -0
  21. data/frontends/default/javascripts/jquery/jquery.editinplace.js +743 -0
  22. data/frontends/default/javascripts/prototype/active_scaffold.js +1003 -0
  23. data/frontends/default/javascripts/prototype/dhtml_history.js +867 -0
  24. data/frontends/default/javascripts/prototype/form_enhancements.js +117 -0
  25. data/frontends/default/javascripts/prototype/rico_corner.js +370 -0
  26. data/frontends/default/stylesheets/stylesheet-ie.css +35 -0
  27. data/frontends/default/stylesheets/stylesheet.css +973 -0
  28. data/frontends/default/views/_action_group.html.erb +20 -0
  29. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  30. data/frontends/default/views/_base_form.html.erb +51 -0
  31. data/frontends/default/views/_create_form.html.erb +8 -0
  32. data/frontends/default/views/_create_form_on_list.html.erb +6 -0
  33. data/frontends/default/views/_field_search.html.erb +32 -0
  34. data/frontends/default/views/_form.html.erb +24 -0
  35. data/frontends/default/views/_form_association.html.erb +19 -0
  36. data/frontends/default/views/_form_association_footer.html.erb +40 -0
  37. data/frontends/default/views/_form_attribute.html.erb +15 -0
  38. data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
  39. data/frontends/default/views/_form_messages.html.erb +5 -0
  40. data/frontends/default/views/_horizontal_subform.html.erb +29 -0
  41. data/frontends/default/views/_horizontal_subform_header.html.erb +10 -0
  42. data/frontends/default/views/_horizontal_subform_record.html.erb +37 -0
  43. data/frontends/default/views/_human_conditions.html.erb +1 -0
  44. data/frontends/default/views/_list.html.erb +18 -0
  45. data/frontends/default/views/_list_actions.html.erb +15 -0
  46. data/frontends/default/views/_list_calculations.html.erb +16 -0
  47. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  48. data/frontends/default/views/_list_header.html.erb +10 -0
  49. data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
  50. data/frontends/default/views/_list_messages.html.erb +32 -0
  51. data/frontends/default/views/_list_pagination.html.erb +11 -0
  52. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  53. data/frontends/default/views/_list_record.html.erb +14 -0
  54. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  55. data/frontends/default/views/_list_with_header.html.erb +32 -0
  56. data/frontends/default/views/_messages.html.erb +10 -0
  57. data/frontends/default/views/_render_field.js.rjs +10 -0
  58. data/frontends/default/views/_row.html.erb +12 -0
  59. data/frontends/default/views/_search.html.erb +34 -0
  60. data/frontends/default/views/_search_attribute.html.erb +10 -0
  61. data/frontends/default/views/_show.html.erb +8 -0
  62. data/frontends/default/views/_show_columns.html.erb +15 -0
  63. data/frontends/default/views/_update_actions.html.erb +9 -0
  64. data/frontends/default/views/_update_form.html.erb +6 -0
  65. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  66. data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
  67. data/frontends/default/views/action_confirmation.html.erb +13 -0
  68. data/frontends/default/views/add_existing.js.rjs +17 -0
  69. data/frontends/default/views/add_existing_form.html.erb +5 -0
  70. data/frontends/default/views/create.html.erb +5 -0
  71. data/frontends/default/views/delete.html.erb +13 -0
  72. data/frontends/default/views/destroy.js.rjs +23 -0
  73. data/frontends/default/views/edit_associated.js.rjs +11 -0
  74. data/frontends/default/views/field_search.html.erb +5 -0
  75. data/frontends/default/views/form_messages.js.rjs +1 -0
  76. data/frontends/default/views/list.html.erb +1 -0
  77. data/frontends/default/views/list.js.rjs +1 -0
  78. data/frontends/default/views/on_action_update.js.rjs +8 -0
  79. data/frontends/default/views/on_create.js.rjs +41 -0
  80. data/frontends/default/views/on_mark_all.js.rjs +4 -0
  81. data/frontends/default/views/on_update.js.rjs +28 -0
  82. data/frontends/default/views/search.html.erb +5 -0
  83. data/frontends/default/views/show.html.erb +5 -0
  84. data/frontends/default/views/update.html.erb +8 -0
  85. data/frontends/default/views/update_column.js.rjs +13 -0
  86. data/frontends/default/views/update_row.js.rjs +1 -0
  87. data/init.rb +8 -0
  88. data/lib/active_scaffold.rb +360 -0
  89. data/lib/active_scaffold/actions/common_search.rb +22 -0
  90. data/lib/active_scaffold/actions/core.rb +180 -0
  91. data/lib/active_scaffold/actions/create.rb +149 -0
  92. data/lib/active_scaffold/actions/delete.rb +75 -0
  93. data/lib/active_scaffold/actions/field_search.rb +82 -0
  94. data/lib/active_scaffold/actions/list.rb +184 -0
  95. data/lib/active_scaffold/actions/mark.rb +63 -0
  96. data/lib/active_scaffold/actions/nested.rb +250 -0
  97. data/lib/active_scaffold/actions/search.rb +47 -0
  98. data/lib/active_scaffold/actions/show.rb +61 -0
  99. data/lib/active_scaffold/actions/subform.rb +27 -0
  100. data/lib/active_scaffold/actions/update.rb +151 -0
  101. data/lib/active_scaffold/active_record_permissions.rb +134 -0
  102. data/lib/active_scaffold/attribute_params.rb +211 -0
  103. data/lib/active_scaffold/bridges/ancestry/bridge.rb +5 -0
  104. data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +39 -0
  105. data/lib/active_scaffold/bridges/bridge.rb +59 -0
  106. data/lib/active_scaffold/bridges/calendar_date_select/bridge.rb +16 -0
  107. data/lib/active_scaffold/bridges/calendar_date_select/lib/as_cds_bridge.rb +83 -0
  108. data/lib/active_scaffold/bridges/cancan/bridge.rb +12 -0
  109. data/lib/active_scaffold/bridges/cancan/lib/cancan_bridge.rb +107 -0
  110. data/lib/active_scaffold/bridges/carrierwave/bridge.rb +9 -0
  111. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge.rb +33 -0
  112. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge_helpers.rb +12 -0
  113. data/lib/active_scaffold/bridges/carrierwave/lib/form_ui.rb +45 -0
  114. data/lib/active_scaffold/bridges/carrierwave/lib/list_ui.rb +17 -0
  115. data/lib/active_scaffold/bridges/date_picker/bridge.rb +24 -0
  116. data/lib/active_scaffold/bridges/date_picker/lib/datepicker_bridge.rb +225 -0
  117. data/lib/active_scaffold/bridges/date_picker/public/javascripts/date_picker_bridge.js +22 -0
  118. data/lib/active_scaffold/bridges/file_column/bridge.rb +11 -0
  119. data/lib/active_scaffold/bridges/file_column/lib/as_file_column_bridge.rb +46 -0
  120. data/lib/active_scaffold/bridges/file_column/lib/file_column_helpers.rb +59 -0
  121. data/lib/active_scaffold/bridges/file_column/lib/form_ui.rb +37 -0
  122. data/lib/active_scaffold/bridges/file_column/lib/list_ui.rb +26 -0
  123. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  124. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  125. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  126. data/lib/active_scaffold/bridges/paperclip/bridge.rb +12 -0
  127. data/lib/active_scaffold/bridges/paperclip/lib/form_ui.rb +27 -0
  128. data/lib/active_scaffold/bridges/paperclip/lib/list_ui.rb +16 -0
  129. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge.rb +38 -0
  130. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge_helpers.rb +26 -0
  131. data/lib/active_scaffold/bridges/semantic_attributes/bridge.rb +5 -0
  132. data/lib/active_scaffold/bridges/semantic_attributes/lib/semantic_attributes_bridge.rb +20 -0
  133. data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
  134. data/lib/active_scaffold/bridges/tiny_mce/bridge.rb +5 -0
  135. data/lib/active_scaffold/bridges/tiny_mce/lib/tiny_mce_bridge.rb +61 -0
  136. data/lib/active_scaffold/bridges/validation_reflection/bridge.rb +8 -0
  137. data/lib/active_scaffold/bridges/validation_reflection/lib/validation_reflection_bridge.rb +21 -0
  138. data/lib/active_scaffold/config/base.rb +62 -0
  139. data/lib/active_scaffold/config/core.rb +220 -0
  140. data/lib/active_scaffold/config/create.rb +51 -0
  141. data/lib/active_scaffold/config/delete.rb +34 -0
  142. data/lib/active_scaffold/config/field_search.rb +75 -0
  143. data/lib/active_scaffold/config/form.rb +47 -0
  144. data/lib/active_scaffold/config/list.rb +174 -0
  145. data/lib/active_scaffold/config/mark.rb +22 -0
  146. data/lib/active_scaffold/config/nested.rb +44 -0
  147. data/lib/active_scaffold/config/search.rb +69 -0
  148. data/lib/active_scaffold/config/show.rb +35 -0
  149. data/lib/active_scaffold/config/subform.rb +35 -0
  150. data/lib/active_scaffold/config/update.rb +46 -0
  151. data/lib/active_scaffold/configurable.rb +29 -0
  152. data/lib/active_scaffold/constraints.rb +184 -0
  153. data/lib/active_scaffold/data_structures/action_columns.rb +137 -0
  154. data/lib/active_scaffold/data_structures/action_link.rb +175 -0
  155. data/lib/active_scaffold/data_structures/action_links.rb +185 -0
  156. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  157. data/lib/active_scaffold/data_structures/column.rb +355 -0
  158. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  159. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  160. data/lib/active_scaffold/data_structures/nested_info.rb +123 -0
  161. data/lib/active_scaffold/data_structures/set.rb +62 -0
  162. data/lib/active_scaffold/data_structures/sorting.rb +168 -0
  163. data/lib/active_scaffold/extensions/action_controller_rendering.rb +20 -0
  164. data/lib/active_scaffold/extensions/action_view_rendering.rb +123 -0
  165. data/lib/active_scaffold/extensions/action_view_resolver.rb +7 -0
  166. data/lib/active_scaffold/extensions/active_association_reflection.rb +13 -0
  167. data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
  168. data/lib/active_scaffold/extensions/array.rb +7 -0
  169. data/lib/active_scaffold/extensions/localize.rb +10 -0
  170. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
  171. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
  172. data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
  173. data/lib/active_scaffold/extensions/reverse_associations.rb +62 -0
  174. data/lib/active_scaffold/extensions/routing_mapper.rb +34 -0
  175. data/lib/active_scaffold/extensions/to_label.rb +8 -0
  176. data/lib/active_scaffold/extensions/unsaved_associated.rb +61 -0
  177. data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
  178. data/lib/active_scaffold/extensions/usa_state.rb +46 -0
  179. data/lib/active_scaffold/finder.rb +343 -0
  180. data/lib/active_scaffold/helpers/association_helpers.rb +40 -0
  181. data/lib/active_scaffold/helpers/controller_helpers.rb +87 -0
  182. data/lib/active_scaffold/helpers/country_helpers.rb +352 -0
  183. data/lib/active_scaffold/helpers/form_column_helpers.rb +350 -0
  184. data/lib/active_scaffold/helpers/human_condition_helpers.rb +59 -0
  185. data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
  186. data/lib/active_scaffold/helpers/list_column_helpers.rb +361 -0
  187. data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
  188. data/lib/active_scaffold/helpers/search_column_helpers.rb +249 -0
  189. data/lib/active_scaffold/helpers/show_column_helpers.rb +46 -0
  190. data/lib/active_scaffold/helpers/view_helpers.rb +360 -0
  191. data/lib/active_scaffold/locale/de.rb +120 -0
  192. data/lib/active_scaffold/locale/en.rb +119 -0
  193. data/lib/active_scaffold/locale/es.yml +115 -0
  194. data/lib/active_scaffold/locale/fr.rb +122 -0
  195. data/lib/active_scaffold/locale/hu.yml +63 -0
  196. data/lib/active_scaffold/locale/ja.yml +64 -0
  197. data/lib/active_scaffold/locale/ru.yml +119 -0
  198. data/lib/active_scaffold/marked_model.rb +38 -0
  199. data/lib/active_scaffold/paginator.rb +136 -0
  200. data/lib/active_scaffold/responds_to_parent.rb +70 -0
  201. data/lib/active_scaffold/version.rb +9 -0
  202. data/lib/active_scaffold_assets.rb +45 -0
  203. data/lib/active_scaffold_env.rb +14 -0
  204. data/lib/active_scaffold_vho.rb +2 -0
  205. data/lib/generators/active_scaffold/USAGE +29 -0
  206. data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
  207. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  208. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
  209. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  210. data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
  211. data/lib/generators/active_scaffold_setup/USAGE +10 -0
  212. data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +61 -0
  213. data/public/blank.html +33 -0
  214. data/shoulda_macros/macros.rb +136 -0
  215. data/test/bridges/bridge_test.rb +47 -0
  216. data/test/config/base_test.rb +15 -0
  217. data/test/config/create_test.rb +55 -0
  218. data/test/config/list_test.rb +74 -0
  219. data/test/config/show_test.rb +43 -0
  220. data/test/config/update_test.rb +17 -0
  221. data/test/const_mocker.rb +36 -0
  222. data/test/data_structures/action_columns_test.rb +113 -0
  223. data/test/data_structures/action_link_test.rb +78 -0
  224. data/test/data_structures/action_links_test.rb +78 -0
  225. data/test/data_structures/actions_test.rb +25 -0
  226. data/test/data_structures/association_column_test.rb +42 -0
  227. data/test/data_structures/column_test.rb +185 -0
  228. data/test/data_structures/columns_test.rb +69 -0
  229. data/test/data_structures/error_message_test.rb +28 -0
  230. data/test/data_structures/set_test.rb +86 -0
  231. data/test/data_structures/sorting_test.rb +126 -0
  232. data/test/data_structures/standard_column_test.rb +24 -0
  233. data/test/data_structures/virtual_column_test.rb +23 -0
  234. data/test/extensions/active_record_test.rb +45 -0
  235. data/test/extensions/array_test.rb +12 -0
  236. data/test/helpers/form_column_helpers_test.rb +31 -0
  237. data/test/helpers/list_column_helpers_test.rb +31 -0
  238. data/test/helpers/pagination_helpers_test.rb +55 -0
  239. data/test/misc/active_record_permissions_test.rb +154 -0
  240. data/test/misc/attribute_params_test.rb +110 -0
  241. data/test/misc/configurable_test.rb +96 -0
  242. data/test/misc/constraints_test.rb +193 -0
  243. data/test/misc/finder_test.rb +93 -0
  244. data/test/misc/lang_test.rb +12 -0
  245. data/test/mock_app/.gitignore +2 -0
  246. data/test/mock_app/app/controllers/application_controller.rb +10 -0
  247. data/test/mock_app/app/helpers/application_helper.rb +3 -0
  248. data/test/mock_app/config/boot.rb +110 -0
  249. data/test/mock_app/config/database.yml +16 -0
  250. data/test/mock_app/config/environment.rb +43 -0
  251. data/test/mock_app/config/environments/development.rb +17 -0
  252. data/test/mock_app/config/environments/production.rb +28 -0
  253. data/test/mock_app/config/environments/test.rb +28 -0
  254. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  255. data/test/mock_app/config/initializers/inflections.rb +10 -0
  256. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  257. data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
  258. data/test/mock_app/config/initializers/session_store.rb +15 -0
  259. data/test/mock_app/config/locales/en.yml +5 -0
  260. data/test/mock_app/config/routes.rb +43 -0
  261. data/test/mock_app/db/test.sqlite3 +1 -0
  262. data/test/mock_app/public/blank.html +33 -0
  263. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  264. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  265. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  266. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  267. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  268. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  269. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  270. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  271. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  272. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  273. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
  274. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  275. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
  276. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  277. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  278. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  279. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +842 -0
  280. data/test/model_stub.rb +55 -0
  281. data/test/run_all.rb +8 -0
  282. data/test/test_helper.rb +39 -0
  283. data/uninstall.rb +13 -0
  284. metadata +497 -0
@@ -0,0 +1,184 @@
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
+ do_new if active_scaffold_config.list.always_show_create
21
+ @record ||= new_model if active_scaffold_config.list.always_show_search
22
+ @nested_auto_open = active_scaffold_config.list.nested_auto_open
23
+ respond_to_action(:list)
24
+ end
25
+
26
+ protected
27
+ def list_respond_to_html
28
+ if params.delete(:embedded)
29
+ render :action => 'list', :layout => false
30
+ else
31
+ render :action => 'list'
32
+ end
33
+ end
34
+ def list_respond_to_js
35
+ if params[:adapter]
36
+ render(:partial => 'list_with_header')
37
+ elsif params[:embedded]
38
+ params.delete(:embedded)
39
+ render(:partial => 'list_with_header')
40
+ else
41
+ render :action => 'list.js'
42
+ end
43
+ end
44
+ def list_respond_to_xml
45
+ render :xml => response_object.to_xml(:only => list_columns_names), :content_type => Mime::XML, :status => response_status
46
+ end
47
+ def list_respond_to_json
48
+ render :text => response_object.to_json(:only => list_columns_names), :content_type => Mime::JSON, :status => response_status
49
+ end
50
+ def list_respond_to_yaml
51
+ render :text => Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
52
+ end
53
+
54
+ def row_respond_to_html
55
+ render(:partial => 'row', :locals => {:record => @record})
56
+ end
57
+
58
+ def row_respond_to_js
59
+ render(:partial => 'row', :locals => {:record => @record})
60
+ end
61
+
62
+ # The actual algorithm to prepare for the list view
63
+ def do_list
64
+ includes_for_list_columns = active_scaffold_config.list.columns.collect{ |c| c.includes }.flatten.uniq.compact
65
+ self.active_scaffold_includes.concat includes_for_list_columns
66
+
67
+ options = { :sorting => active_scaffold_config.list.user.sorting,
68
+ :count_includes => active_scaffold_config.list.user.count_includes }
69
+ paginate = (params[:format].nil?) ? (accepts? :html, :js) : ['html', 'js'].include?(params[:format])
70
+ if paginate
71
+ options.merge!({
72
+ :per_page => active_scaffold_config.list.user.per_page,
73
+ :page => active_scaffold_config.list.user.page,
74
+ :pagination => active_scaffold_config.list.pagination
75
+ })
76
+ end
77
+
78
+ page = find_page(options);
79
+ if page.items.blank? && !page.pager.infinite?
80
+ page = page.pager.last
81
+ active_scaffold_config.list.user.page = page.number
82
+ end
83
+ @page, @records = page, page.items
84
+ end
85
+
86
+ def each_record_in_scope
87
+ do_search if respond_to? :do_search
88
+ finder_options = { :order => "#{active_scaffold_config.model.connection.quote_table_name(active_scaffold_config.model.table_name)}.#{active_scaffold_config.model.primary_key} ASC",
89
+ :conditions => all_conditions,
90
+ :joins => joins_for_finder}
91
+ finder_options.merge! custom_finder_options
92
+ finder_options.merge! :include => (active_scaffold_includes.blank? ? nil : active_scaffold_includes)
93
+ klass = beginning_of_chain
94
+ klass.all(finder_options).each {|record| yield record}
95
+ end
96
+
97
+ # The default security delegates to ActiveRecordPermissions.
98
+ # You may override the method to customize.
99
+ def list_authorized?
100
+ authorized_for?(:crud_type => :read)
101
+ end
102
+
103
+ # call this method in your action_link action to simplify processing of actions
104
+ # eg for member action_link :fire
105
+ # process_action_link_action do |record|
106
+ # record.update_attributes(:fired => true)
107
+ # self.successful = true
108
+ # flash[:info] = 'Player fired'
109
+ # end
110
+ def process_action_link_action(render_action = :action_update)
111
+ if request.get?
112
+ # someone has disabled javascript, we have to show confirmation form first
113
+ @record = find_if_allowed(params[:id], :read) if params[:id] && params[:id] && params[:id].to_i > 0
114
+ respond_to_action(:action_confirmation)
115
+ else
116
+ if params[:id] && params[:id] && params[:id].to_i > 0
117
+ @record = find_if_allowed(params[:id], (request.post? || request.put?) ? :update : :delete)
118
+ unless @record.nil?
119
+ yield @record
120
+ else
121
+ self.successful = false
122
+ flash[:error] = as_(:no_authorization_for_action, :action => action_name)
123
+ end
124
+ else
125
+ yield
126
+ end
127
+ respond_to_action(render_action)
128
+ end
129
+ end
130
+
131
+ def action_confirmation_respond_to_html(confirm_action = action_name.to_sym)
132
+ link = active_scaffold_config.action_links[confirm_action]
133
+ render :action => 'action_confirmation', :locals => {:record => @record, :link => link}
134
+ end
135
+
136
+ def action_update_respond_to_html
137
+ do_search if respond_to? :do_search
138
+ do_list
139
+ redirect_to :action => 'index'
140
+ end
141
+
142
+ def action_update_respond_to_js
143
+ render(:action => 'on_action_update')
144
+ end
145
+
146
+ def action_update_respond_to_xml
147
+ render :xml => successful? ? "" : response_object.to_xml(:only => list_columns_names), :content_type => Mime::XML, :status => response_status
148
+ end
149
+
150
+ def action_update_respond_to_json
151
+ render :text => successful? ? "" : response_object.to_json(:only => list_columns_names), :content_type => Mime::JSON, :status => response_status
152
+ end
153
+
154
+ def action_update_respond_to_yaml
155
+ render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
156
+ end
157
+
158
+ private
159
+ def list_authorized_filter
160
+ raise ActiveScaffold::ActionNotAllowed unless list_authorized?
161
+ end
162
+
163
+ def list_formats
164
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
165
+ end
166
+ alias_method :row_formats, :list_formats
167
+
168
+ def action_update_formats
169
+ (default_formats + active_scaffold_config.formats).uniq
170
+ end
171
+
172
+ def action_confirmation_formats
173
+ (default_formats + active_scaffold_config.formats).uniq
174
+ end
175
+
176
+ def list_columns
177
+ active_scaffold_config.list.columns.collect_visible
178
+ end
179
+
180
+ def list_columns_names
181
+ list_columns.collect(&:name)
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,63 @@
1
+ module ActiveScaffold::Actions
2
+ module Mark
3
+
4
+ def self.included(base)
5
+ base.before_filter :mark_authorized?, :only => [:mark_all]
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?
12
+ do_mark_all
13
+ else
14
+ do_demark_all
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 marked_records
38
+ active_scaffold_session_storage[:marked_records] ||= Set.new
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 do_mark_all
46
+ each_record_in_scope {|record| marked_records << record.id}
47
+ end
48
+
49
+ def do_demark_all
50
+ each_record_in_scope {|record| marked_records.delete(record.id)}
51
+ end
52
+
53
+ # The default security delegates to ActiveRecordPermissions.
54
+ # You may override the method to customize.
55
+ def mark_authorized?
56
+ authorized_for?(:action => :read)
57
+ end
58
+
59
+ def mark_all_formats
60
+ (default_formats + active_scaffold_config.formats).uniq
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,250 @@
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
+ before_filter :register_constraints_with_action_columns
9
+ before_filter :set_nested
10
+ before_filter :configure_nested
11
+ include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.model.reflect_on_all_associations.any? {|a| a.macro == :has_and_belongs_to_many}
12
+ end
13
+ base.before_filter :include_habtm_actions
14
+ base.helper_method :nested
15
+ base.helper_method :nested_parent_record
16
+ end
17
+
18
+ protected
19
+ def nested
20
+ @nested ||= ActiveScaffold::DataStructures::NestedInfo.get(active_scaffold_config.model, active_scaffold_session_storage)
21
+ if !@nested.nil? && @nested.new_instance?
22
+ register_constraints_with_action_columns(@nested.constrained_fields)
23
+ active_scaffold_constraints[:id] = params[:id] if @nested.belongs_to?
24
+ end
25
+ @nested
26
+ end
27
+
28
+ def nested?
29
+ !nested.nil?
30
+ end
31
+
32
+ def set_nested
33
+ if params[:parent_scaffold] && ((params[:association] && params[:assoc_id]) || params[:named_scope])
34
+ @nested = nil
35
+ active_scaffold_session_storage[:nested] = {:parent_scaffold => params[:parent_scaffold].to_s,
36
+ :name => (params[:association] || params[:named_scope]).to_sym,
37
+ :parent_id => params[:assoc_id]}
38
+ params.delete_if {|key, value| [:parent_scaffold, :association, :named_scope, :assoc_id].include? key.to_sym}
39
+ end
40
+ end
41
+
42
+ def configure_nested
43
+ if nested?
44
+ active_scaffold_session_storage[:list][:label] = if nested.belongs_to?
45
+ as_(:nested_of_model, :nested_model => active_scaffold_config.model.model_name.human, :parent_model => nested_parent_record.to_label)
46
+ else
47
+ as_(:nested_for_model, :nested_model => active_scaffold_config.list.label, :parent_model => nested_parent_record.to_label)
48
+ end
49
+ if nested.sorted?
50
+ active_scaffold_config.list.user.nested_default_sorting = {:table_name => active_scaffold_config.model.model_name, :default_sorting => nested.default_sorting}
51
+ end
52
+ end
53
+ end
54
+
55
+ def nested_authorized?(record = nil)
56
+ true
57
+ end
58
+
59
+ def include_habtm_actions
60
+ if nested?
61
+ if nested.habtm?
62
+ # Production mode is ok with adding a link everytime the scaffold is nested - we ar not ok with that.
63
+ 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']
64
+ if active_scaffold_config.nested.shallow_delete
65
+ 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']
66
+ if active_scaffold_config.actions.include?(:delete)
67
+ active_scaffold_config.action_links.delete("delete") if active_scaffold_config.action_links['delete']
68
+ end
69
+ end
70
+ else
71
+ # Production mode is caching this link into a non nested scaffold
72
+ active_scaffold_config.action_links.delete('new_existing') if active_scaffold_config.action_links['new_existing']
73
+
74
+ if active_scaffold_config.nested.shallow_delete
75
+ active_scaffold_config.action_links.delete("destroy_existing") if active_scaffold_config.action_links['destroy_existing']
76
+ if active_scaffold_config.actions.include?(:delete)
77
+ active_scaffold_config.action_links.add(ActiveScaffold::Config::Delete.link) unless active_scaffold_config.action_links['delete']
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ def beginning_of_chain
85
+ if nested? && nested.association && nested.association.collection?
86
+ nested.parent_scope.send(nested.association.name)
87
+ elsif nested? && nested.scope
88
+ nested.parent_scope.send(nested.scope)
89
+ else
90
+ active_scaffold_config.model
91
+ end
92
+ end
93
+
94
+ def nested_parent_record(crud = :read)
95
+ @nested_parent_record ||= find_if_allowed(nested.parent_id, crud, nested.parent_model)
96
+ end
97
+
98
+ def create_association_with_parent(record)
99
+ if nested?
100
+ if (nested.belongs_to? || nested.has_one? || nested.habtm?) && nested.child_association
101
+ parent = nested_parent_record(:read)
102
+ case nested.child_association.macro
103
+ when :has_one
104
+ record.send("#{nested.child_association.name}=", parent)
105
+ when :belongs_to
106
+ record.send("#{nested.child_association.name}=", parent)
107
+ when :has_many, :has_and_belongs_to_many
108
+ record.send("#{nested.child_association.name}").send(:<<, parent)
109
+ end unless parent.nil?
110
+ end
111
+ end
112
+ end
113
+
114
+ private
115
+ def nested_formats
116
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.nested.formats).uniq
117
+ end
118
+ end
119
+ end
120
+
121
+ module ActiveScaffold::Actions::Nested
122
+ module ChildMethods
123
+
124
+ def self.included(base)
125
+ super
126
+ base.verify :method => :post,
127
+ :only => :add_existing,
128
+ :redirect_to => { :action => :index }
129
+ end
130
+
131
+ def new_existing
132
+ do_new
133
+ respond_to_action(:new_existing)
134
+ end
135
+
136
+ def add_existing
137
+ do_add_existing
138
+ respond_to_action(:add_existing)
139
+ end
140
+
141
+ def destroy_existing
142
+ return redirect_to(params.merge(:action => :delete)) if request.get?
143
+ do_destroy_existing
144
+ respond_to_action(:destroy_existing)
145
+ end
146
+
147
+ protected
148
+ def new_existing_respond_to_html
149
+ if successful?
150
+ render(:action => 'add_existing_form')
151
+ else
152
+ return_to_main
153
+ end
154
+ end
155
+ def new_existing_respond_to_js
156
+ render(:partial => 'add_existing_form')
157
+ end
158
+ def add_existing_respond_to_html
159
+ if successful?
160
+ flash[:info] = as_(:created_model, :model => @record.to_label)
161
+ return_to_main
162
+ else
163
+ render(:action => 'add_existing_form')
164
+ end
165
+ end
166
+ def add_existing_respond_to_js
167
+ if successful?
168
+ render :action => 'add_existing'
169
+ else
170
+ render :action => 'form_messages'
171
+ end
172
+ end
173
+ def add_existing_respond_to_xml
174
+ render :xml => response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
175
+ end
176
+ def add_existing_respond_to_json
177
+ render :text => response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
178
+ end
179
+ def add_existing_respond_to_yaml
180
+ 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
181
+ end
182
+ def destroy_existing_respond_to_html
183
+ flash[:info] = as_(:deleted_model, :model => @record.to_label)
184
+ return_to_main
185
+ end
186
+
187
+ def destroy_existing_respond_to_js
188
+ render(:action => 'destroy')
189
+ end
190
+
191
+ def destroy_existing_respond_to_xml
192
+ render :xml => successful? ? "" : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
193
+ end
194
+
195
+ def destroy_existing_respond_to_json
196
+ render :text => successful? ? "" : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
197
+ end
198
+
199
+ def destroy_existing_respond_to_yaml
200
+ 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
201
+ end
202
+
203
+ def add_existing_authorized?(record = nil)
204
+ true
205
+ end
206
+ def delete_existing_authorized?(record = nil)
207
+ true
208
+ end
209
+
210
+ def after_create_save(record)
211
+ if params[:association_macro] == :has_and_belongs_to_many
212
+ params[:associated_id] = record
213
+ do_add_existing
214
+ end
215
+ end
216
+
217
+ # The actual "add_existing" algorithm
218
+ def do_add_existing
219
+ parent_record = nested_parent_record(:update)
220
+ @record = active_scaffold_config.model.find(params[:associated_id])
221
+ if parent_record && @record
222
+ parent_record.send(nested.association.name) << @record
223
+ parent_record.save
224
+ else
225
+ false
226
+ end
227
+ end
228
+
229
+ def do_destroy_existing
230
+ if active_scaffold_config.nested.shallow_delete
231
+ @record = nested_parent_record(:update)
232
+ collection = @record.send(nested.association.name)
233
+ assoc_record = collection.find(params[:id])
234
+ collection.delete(assoc_record)
235
+ else
236
+ do_destroy
237
+ end
238
+ end
239
+ private
240
+ def new_existing_formats
241
+ (default_formats + active_scaffold_config.formats).uniq
242
+ end
243
+ def add_existing_formats
244
+ (default_formats + active_scaffold_config.formats).uniq
245
+ end
246
+ def destroy_existing_formats
247
+ (default_formats + active_scaffold_config.formats).uniq
248
+ end
249
+ end
250
+ end