active_scaffold 3.0.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 (272) hide show
  1. data/.autotest +27 -0
  2. data/CHANGELOG +152 -0
  3. data/Gemfile +4 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README +51 -0
  6. data/Rakefile +24 -0
  7. data/active_scaffold.gemspec +24 -0
  8. data/environment.rb +22 -0
  9. data/frontends/default/images/add.gif +0 -0
  10. data/frontends/default/images/arrow_down.gif +0 -0
  11. data/frontends/default/images/arrow_up.gif +0 -0
  12. data/frontends/default/images/close.gif +0 -0
  13. data/frontends/default/images/cross.png +0 -0
  14. data/frontends/default/images/indicator-small.gif +0 -0
  15. data/frontends/default/images/indicator.gif +0 -0
  16. data/frontends/default/images/magnifier.png +0 -0
  17. data/frontends/default/javascripts/jquery/active_scaffold.js +957 -0
  18. data/frontends/default/javascripts/jquery/jquery.editinplace.js +726 -0
  19. data/frontends/default/javascripts/prototype/active_scaffold.js +954 -0
  20. data/frontends/default/javascripts/prototype/dhtml_history.js +867 -0
  21. data/frontends/default/javascripts/prototype/form_enhancements.js +117 -0
  22. data/frontends/default/javascripts/prototype/rico_corner.js +370 -0
  23. data/frontends/default/stylesheets/stylesheet-ie.css +35 -0
  24. data/frontends/default/stylesheets/stylesheet.css +858 -0
  25. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  26. data/frontends/default/views/_base_form.html.erb +41 -0
  27. data/frontends/default/views/_create_form.html.erb +6 -0
  28. data/frontends/default/views/_create_form_on_list.html.erb +5 -0
  29. data/frontends/default/views/_field_search.html.erb +32 -0
  30. data/frontends/default/views/_form.html.erb +24 -0
  31. data/frontends/default/views/_form_association.html.erb +14 -0
  32. data/frontends/default/views/_form_association_footer.html.erb +40 -0
  33. data/frontends/default/views/_form_attribute.html.erb +15 -0
  34. data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
  35. data/frontends/default/views/_form_messages.html.erb +5 -0
  36. data/frontends/default/views/_horizontal_subform.html.erb +19 -0
  37. data/frontends/default/views/_horizontal_subform_header.html.erb +10 -0
  38. data/frontends/default/views/_horizontal_subform_record.html.erb +37 -0
  39. data/frontends/default/views/_human_conditions.html.erb +1 -0
  40. data/frontends/default/views/_list.html.erb +18 -0
  41. data/frontends/default/views/_list_actions.html.erb +16 -0
  42. data/frontends/default/views/_list_calculations.html.erb +16 -0
  43. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  44. data/frontends/default/views/_list_header.html.erb +12 -0
  45. data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
  46. data/frontends/default/views/_list_messages.html.erb +32 -0
  47. data/frontends/default/views/_list_pagination.html.erb +11 -0
  48. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  49. data/frontends/default/views/_list_record.html.erb +14 -0
  50. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  51. data/frontends/default/views/_list_with_header.html.erb +32 -0
  52. data/frontends/default/views/_messages.html.erb +10 -0
  53. data/frontends/default/views/_render_field.js.rjs +13 -0
  54. data/frontends/default/views/_row.html.erb +12 -0
  55. data/frontends/default/views/_search.html.erb +34 -0
  56. data/frontends/default/views/_search_attribute.html.erb +10 -0
  57. data/frontends/default/views/_show.html.erb +8 -0
  58. data/frontends/default/views/_show_columns.html.erb +12 -0
  59. data/frontends/default/views/_update_actions.html.erb +9 -0
  60. data/frontends/default/views/_update_form.html.erb +5 -0
  61. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  62. data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
  63. data/frontends/default/views/add_existing.js.rjs +17 -0
  64. data/frontends/default/views/add_existing_form.html.erb +5 -0
  65. data/frontends/default/views/create.html.erb +5 -0
  66. data/frontends/default/views/delete.html.erb +13 -0
  67. data/frontends/default/views/destroy.js.rjs +5 -0
  68. data/frontends/default/views/edit_associated.js.rjs +11 -0
  69. data/frontends/default/views/field_search.html.erb +5 -0
  70. data/frontends/default/views/form_messages.js.rjs +1 -0
  71. data/frontends/default/views/list.html.erb +1 -0
  72. data/frontends/default/views/list.js.rjs +1 -0
  73. data/frontends/default/views/on_action_update.js.rjs +8 -0
  74. data/frontends/default/views/on_create.js.rjs +24 -0
  75. data/frontends/default/views/on_update.js.rjs +15 -0
  76. data/frontends/default/views/search.html.erb +5 -0
  77. data/frontends/default/views/show.html.erb +5 -0
  78. data/frontends/default/views/update.html.erb +8 -0
  79. data/frontends/default/views/update_column.js.rjs +13 -0
  80. data/frontends/default/views/update_row.js.rjs +1 -0
  81. data/init.rb +1 -0
  82. data/install_assets.rb +44 -0
  83. data/lib/active_record_permissions.rb +134 -0
  84. data/lib/active_scaffold.rb +279 -0
  85. data/lib/active_scaffold/actions/common_search.rb +22 -0
  86. data/lib/active_scaffold/actions/core.rb +150 -0
  87. data/lib/active_scaffold/actions/create.rb +152 -0
  88. data/lib/active_scaffold/actions/delete.rb +72 -0
  89. data/lib/active_scaffold/actions/field_search.rb +82 -0
  90. data/lib/active_scaffold/actions/list.rb +128 -0
  91. data/lib/active_scaffold/actions/mark.rb +50 -0
  92. data/lib/active_scaffold/actions/nested.rb +241 -0
  93. data/lib/active_scaffold/actions/search.rb +47 -0
  94. data/lib/active_scaffold/actions/show.rb +54 -0
  95. data/lib/active_scaffold/actions/subform.rb +17 -0
  96. data/lib/active_scaffold/actions/update.rb +134 -0
  97. data/lib/active_scaffold/attribute_params.rb +207 -0
  98. data/lib/active_scaffold/bridges/ancestry/bridge.rb +5 -0
  99. data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +38 -0
  100. data/lib/active_scaffold/bridges/bridge.rb +52 -0
  101. data/lib/active_scaffold/bridges/calendar_date_select/bridge.rb +16 -0
  102. data/lib/active_scaffold/bridges/calendar_date_select/lib/as_cds_bridge.rb +79 -0
  103. data/lib/active_scaffold/bridges/carrierwave/bridge.rb +7 -0
  104. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge.rb +38 -0
  105. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge_helpers.rb +26 -0
  106. data/lib/active_scaffold/bridges/carrierwave/lib/form_ui.rb +35 -0
  107. data/lib/active_scaffold/bridges/carrierwave/lib/list_ui.rb +17 -0
  108. data/lib/active_scaffold/bridges/date_picker/bridge.rb +22 -0
  109. data/lib/active_scaffold/bridges/date_picker/lib/datepicker_bridge.rb +225 -0
  110. data/lib/active_scaffold/bridges/date_picker/public/javascripts/date_picker_bridge.js +22 -0
  111. data/lib/active_scaffold/bridges/file_column/bridge.rb +11 -0
  112. data/lib/active_scaffold/bridges/file_column/lib/as_file_column_bridge.rb +46 -0
  113. data/lib/active_scaffold/bridges/file_column/lib/file_column_helpers.rb +59 -0
  114. data/lib/active_scaffold/bridges/file_column/lib/form_ui.rb +37 -0
  115. data/lib/active_scaffold/bridges/file_column/lib/list_ui.rb +26 -0
  116. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  117. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  118. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  119. data/lib/active_scaffold/bridges/paperclip/bridge.rb +12 -0
  120. data/lib/active_scaffold/bridges/paperclip/lib/form_ui.rb +27 -0
  121. data/lib/active_scaffold/bridges/paperclip/lib/list_ui.rb +16 -0
  122. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge.rb +38 -0
  123. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge_helpers.rb +26 -0
  124. data/lib/active_scaffold/bridges/semantic_attributes/bridge.rb +5 -0
  125. data/lib/active_scaffold/bridges/semantic_attributes/lib/semantic_attributes_bridge.rb +20 -0
  126. data/lib/active_scaffold/bridges/shared/date_bridge.rb +187 -0
  127. data/lib/active_scaffold/bridges/tiny_mce/bridge.rb +5 -0
  128. data/lib/active_scaffold/bridges/tiny_mce/lib/tiny_mce_bridge.rb +45 -0
  129. data/lib/active_scaffold/bridges/validation_reflection/bridge.rb +8 -0
  130. data/lib/active_scaffold/bridges/validation_reflection/lib/validation_reflection_bridge.rb +21 -0
  131. data/lib/active_scaffold/config/base.rb +54 -0
  132. data/lib/active_scaffold/config/core.rb +229 -0
  133. data/lib/active_scaffold/config/create.rb +43 -0
  134. data/lib/active_scaffold/config/delete.rb +25 -0
  135. data/lib/active_scaffold/config/field_search.rb +74 -0
  136. data/lib/active_scaffold/config/form.rb +46 -0
  137. data/lib/active_scaffold/config/list.rb +174 -0
  138. data/lib/active_scaffold/config/mark.rb +22 -0
  139. data/lib/active_scaffold/config/nested.rb +43 -0
  140. data/lib/active_scaffold/config/search.rb +68 -0
  141. data/lib/active_scaffold/config/show.rb +34 -0
  142. data/lib/active_scaffold/config/subform.rb +35 -0
  143. data/lib/active_scaffold/config/update.rb +38 -0
  144. data/lib/active_scaffold/configurable.rb +29 -0
  145. data/lib/active_scaffold/constraints.rb +179 -0
  146. data/lib/active_scaffold/data_structures/action_columns.rb +133 -0
  147. data/lib/active_scaffold/data_structures/action_link.rb +162 -0
  148. data/lib/active_scaffold/data_structures/action_links.rb +59 -0
  149. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  150. data/lib/active_scaffold/data_structures/column.rb +348 -0
  151. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  152. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  153. data/lib/active_scaffold/data_structures/nested_info.rb +108 -0
  154. data/lib/active_scaffold/data_structures/set.rb +62 -0
  155. data/lib/active_scaffold/data_structures/sorting.rb +168 -0
  156. data/lib/active_scaffold/finder.rb +333 -0
  157. data/lib/active_scaffold/helpers/association_helpers.rb +40 -0
  158. data/lib/active_scaffold/helpers/controller_helpers.rb +40 -0
  159. data/lib/active_scaffold/helpers/country_helpers.rb +352 -0
  160. data/lib/active_scaffold/helpers/form_column_helpers.rb +343 -0
  161. data/lib/active_scaffold/helpers/human_condition_helpers.rb +59 -0
  162. data/lib/active_scaffold/helpers/id_helpers.rb +131 -0
  163. data/lib/active_scaffold/helpers/list_column_helpers.rb +363 -0
  164. data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
  165. data/lib/active_scaffold/helpers/search_column_helpers.rb +238 -0
  166. data/lib/active_scaffold/helpers/show_column_helpers.rb +46 -0
  167. data/lib/active_scaffold/helpers/view_helpers.rb +315 -0
  168. data/lib/active_scaffold/locale/de.rb +113 -0
  169. data/lib/active_scaffold/locale/en.rb +118 -0
  170. data/lib/active_scaffold/locale/es.yml +112 -0
  171. data/lib/active_scaffold/locale/fr.rb +113 -0
  172. data/lib/active_scaffold/locale/hu.yml +63 -0
  173. data/lib/active_scaffold/locale/ja.yml +64 -0
  174. data/lib/active_scaffold/locale/ru.yml +62 -0
  175. data/lib/active_scaffold/marked_model.rb +38 -0
  176. data/lib/dhtml_confirm.rb +54 -0
  177. data/lib/extensions/action_controller_rendering.rb +20 -0
  178. data/lib/extensions/action_view_rendering.rb +113 -0
  179. data/lib/extensions/action_view_resolver.rb +7 -0
  180. data/lib/extensions/active_record_offset.rb +12 -0
  181. data/lib/extensions/array.rb +7 -0
  182. data/lib/extensions/localize.rb +10 -0
  183. data/lib/extensions/name_option_for_datetime.rb +12 -0
  184. data/lib/extensions/nil_id_in_url_params.rb +7 -0
  185. data/lib/extensions/paginator_extensions.rb +26 -0
  186. data/lib/extensions/reverse_associations.rb +62 -0
  187. data/lib/extensions/routing_mapper.rb +34 -0
  188. data/lib/extensions/to_label.rb +8 -0
  189. data/lib/extensions/unsaved_associated.rb +61 -0
  190. data/lib/extensions/unsaved_record.rb +20 -0
  191. data/lib/extensions/usa_state.rb +46 -0
  192. data/lib/generators/active_scaffold/USAGE +29 -0
  193. data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
  194. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  195. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +28 -0
  196. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  197. data/lib/generators/active_scaffold_setup/USAGE +10 -0
  198. data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +53 -0
  199. data/lib/paginator.rb +136 -0
  200. data/lib/responds_to_parent.rb +70 -0
  201. data/public/blank.html +33 -0
  202. data/shoulda_macros/macros.rb +136 -0
  203. data/test/bridges/bridge_test.rb +47 -0
  204. data/test/config/base_test.rb +15 -0
  205. data/test/config/create_test.rb +55 -0
  206. data/test/config/list_test.rb +74 -0
  207. data/test/config/show_test.rb +43 -0
  208. data/test/config/update_test.rb +17 -0
  209. data/test/const_mocker.rb +36 -0
  210. data/test/data_structures/action_columns_test.rb +113 -0
  211. data/test/data_structures/action_link_test.rb +78 -0
  212. data/test/data_structures/action_links_test.rb +78 -0
  213. data/test/data_structures/actions_test.rb +25 -0
  214. data/test/data_structures/association_column_test.rb +42 -0
  215. data/test/data_structures/column_test.rb +185 -0
  216. data/test/data_structures/columns_test.rb +69 -0
  217. data/test/data_structures/error_message_test.rb +28 -0
  218. data/test/data_structures/set_test.rb +86 -0
  219. data/test/data_structures/sorting_test.rb +126 -0
  220. data/test/data_structures/standard_column_test.rb +24 -0
  221. data/test/data_structures/virtual_column_test.rb +23 -0
  222. data/test/extensions/active_record_test.rb +45 -0
  223. data/test/extensions/array_test.rb +12 -0
  224. data/test/helpers/form_column_helpers_test.rb +31 -0
  225. data/test/helpers/list_column_helpers_test.rb +31 -0
  226. data/test/helpers/pagination_helpers_test.rb +55 -0
  227. data/test/misc/active_record_permissions_test.rb +154 -0
  228. data/test/misc/attribute_params_test.rb +110 -0
  229. data/test/misc/configurable_test.rb +96 -0
  230. data/test/misc/constraints_test.rb +193 -0
  231. data/test/misc/finder_test.rb +93 -0
  232. data/test/misc/lang_test.rb +12 -0
  233. data/test/mock_app/.gitignore +2 -0
  234. data/test/mock_app/app/controllers/application_controller.rb +10 -0
  235. data/test/mock_app/app/helpers/application_helper.rb +3 -0
  236. data/test/mock_app/config/boot.rb +110 -0
  237. data/test/mock_app/config/database.yml +16 -0
  238. data/test/mock_app/config/environment.rb +43 -0
  239. data/test/mock_app/config/environments/development.rb +17 -0
  240. data/test/mock_app/config/environments/production.rb +28 -0
  241. data/test/mock_app/config/environments/test.rb +28 -0
  242. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  243. data/test/mock_app/config/initializers/inflections.rb +10 -0
  244. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  245. data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
  246. data/test/mock_app/config/initializers/session_store.rb +15 -0
  247. data/test/mock_app/config/locales/en.yml +5 -0
  248. data/test/mock_app/config/routes.rb +43 -0
  249. data/test/mock_app/db/test.sqlite3 +1 -0
  250. data/test/mock_app/public/blank.html +33 -0
  251. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  252. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  253. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  254. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  255. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  256. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  257. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  258. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  259. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  260. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  261. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
  262. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  263. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
  264. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  265. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  266. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  267. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +839 -0
  268. data/test/model_stub.rb +55 -0
  269. data/test/run_all.rb +8 -0
  270. data/test/test_helper.rb +39 -0
  271. data/uninstall.rb +13 -0
  272. metadata +478 -0
@@ -0,0 +1,152 @@
1
+ module ActiveScaffold::Actions
2
+ module Create
3
+ def self.included(base)
4
+ base.before_filter :create_authorized_filter, :only => [:new, :create]
5
+ base.verify :method => :post,
6
+ :only => :create,
7
+ :redirect_to => { :action => :index }
8
+ end
9
+
10
+ def new
11
+ do_new
12
+ respond_to_action(:new)
13
+ end
14
+
15
+ def create
16
+ do_create
17
+ @insert_row = !(nested? && nested.belongs_to?) && params[:parent_controller].nil?
18
+ respond_to_action(:create)
19
+ end
20
+
21
+ protected
22
+ def response_location
23
+ url_for(params_for(:action => "show", :id => @record.id)) if successful?
24
+ end
25
+
26
+ def new_respond_to_html
27
+ if successful?
28
+ render(:action => 'create')
29
+ else
30
+ return_to_main
31
+ end
32
+ end
33
+
34
+ def new_respond_to_js
35
+ render(:partial => 'create_form')
36
+ end
37
+
38
+ def create_respond_to_html
39
+ if params[:iframe]=='true' # was this an iframe post ?
40
+ responds_to_parent do
41
+ render :action => 'on_create.js', :layout => false
42
+ end
43
+ else
44
+ if successful?
45
+ flash[:info] = as_(:created_model, :model => @record.to_label)
46
+ if active_scaffold_config.create.edit_after_create
47
+ redirect_to params_for(:action => "edit", :id => @record.id)
48
+ elsif active_scaffold_config.create.persistent
49
+ redirect_to params_for(:action => "new")
50
+ else
51
+ return_to_main
52
+ end
53
+ else
54
+ if !nested? && active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.always_show_create
55
+ do_list
56
+ render(:action => 'list')
57
+ else
58
+ render(:action => 'create')
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ def create_respond_to_js
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.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
+ before_create_save(@record)
104
+ self.successful = [@record.valid?, @record.associated_valid?].all? {|v| v == true} # this syntax avoids a short-circuit
105
+ if successful?
106
+ @record.save! and @record.save_associated!
107
+ after_create_save(@record)
108
+ end
109
+ end
110
+ rescue ActiveRecord::RecordInvalid
111
+ end
112
+ end
113
+
114
+ def new_model
115
+ model = beginning_of_chain
116
+ if model.columns_hash[model.inheritance_column]
117
+ params = self.params # in new action inheritance_column must be in params
118
+ params = params[:record] || {} unless params[model.inheritance_column] # in create action must be inside record key
119
+ model = params.delete(model.inheritance_column).camelize.constantize if params[model.inheritance_column]
120
+ end
121
+ model.new
122
+ end
123
+
124
+ # override this method if you want to inject data in the record (or its associated objects) before the save
125
+ def before_create_save(record); end
126
+
127
+ # override this method if you want to do something after the save
128
+ def after_create_save(record); end
129
+
130
+ # The default security delegates to ActiveRecordPermissions.
131
+ # You may override the method to customize.
132
+
133
+ def create_ignore?
134
+ nested? && active_scaffold_config.list.always_show_create
135
+ end
136
+
137
+ def create_authorized?
138
+ (!nested? || !nested.readonly?) && authorized_for?(:crud_type => :create)
139
+ end
140
+ private
141
+ def create_authorized_filter
142
+ link = active_scaffold_config.create.link || active_scaffold_config.create.class.link
143
+ raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
144
+ end
145
+ def new_formats
146
+ (default_formats + active_scaffold_config.formats).uniq
147
+ end
148
+ def create_formats
149
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.create.formats).uniq
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,72 @@
1
+ module ActiveScaffold::Actions
2
+ module Delete
3
+ def self.included(base)
4
+ base.before_filter :delete_authorized_filter, :only => [:delete, :destroy]
5
+ end
6
+
7
+ # this method is for html mode. it provides "the missing action" (http://thelucid.com/articles/2006/07/26/simply-restful-the-missing-action).
8
+ # it also gives us delete confirmation for html mode. woo!
9
+ def delete
10
+ destroy_find_record
11
+ render :action => 'delete'
12
+ end
13
+
14
+ def destroy
15
+ return redirect_to(params.merge(:action => :delete)) if request.get?
16
+ do_destroy
17
+ respond_to_action(:destroy)
18
+ end
19
+
20
+ protected
21
+ def destroy_respond_to_html
22
+ flash[:info] = as_(:deleted_model, :model => @record.to_label) if self.successful?
23
+ return_to_main
24
+ end
25
+
26
+ def destroy_respond_to_js
27
+ render(:action => 'destroy')
28
+ end
29
+
30
+ def destroy_respond_to_xml
31
+ render :xml => successful? ? "" : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
32
+ end
33
+
34
+ def destroy_respond_to_json
35
+ render :text => successful? ? "" : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
36
+ end
37
+
38
+ def destroy_respond_to_yaml
39
+ 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
40
+ end
41
+
42
+ def destroy_find_record
43
+ @record = find_if_allowed(params[:id], :delete)
44
+ end
45
+
46
+ # A simple method to handle the actual destroying of a record
47
+ # May be overridden to customize the behavior
48
+ def do_destroy
49
+ destroy_find_record
50
+ begin
51
+ self.successful = @record.destroy
52
+ rescue
53
+ flash[:warning] = as_(:cant_destroy_record, :record => @record.to_label)
54
+ self.successful = false
55
+ end
56
+ end
57
+
58
+ # The default security delegates to ActiveRecordPermissions.
59
+ # You may override the method to customize.
60
+ def delete_authorized?(record = nil)
61
+ (!nested? || !nested.readonly?) && authorized_for?(:crud_type => :delete)
62
+ end
63
+ private
64
+ def delete_authorized_filter
65
+ link = active_scaffold_config.delete.link || active_scaffold_config.delete.class.link
66
+ raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
67
+ end
68
+ def destroy_formats
69
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.delete.formats).uniq
70
+ end
71
+ end
72
+ 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 = active_scaffold_config.model.new
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.nil?
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,128 @@
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
+ render :partial => 'row', :locals => {:record => find_if_allowed(params[:id], :read)}
15
+ end
16
+
17
+ def list
18
+ do_list
19
+ do_new if active_scaffold_config.list.always_show_create
20
+ @record ||= active_scaffold_config.model.new if active_scaffold_config.list.always_show_search
21
+ @nested_auto_open = active_scaffold_config.list.nested_auto_open
22
+ respond_to_action(:list)
23
+ end
24
+
25
+ protected
26
+ def list_respond_to_html
27
+ if params.delete(:embedded)
28
+ render :action => 'list', :layout => false
29
+ else
30
+ render :action => 'list'
31
+ end
32
+ end
33
+ def list_respond_to_js
34
+ if params[:adapter]
35
+ render(:partial => 'list_with_header')
36
+ elsif params[:embedded]
37
+ params.delete(:embedded)
38
+ render(:partial => 'list_with_header')
39
+ else
40
+ render :action => 'list.js'
41
+ end
42
+ end
43
+ def list_respond_to_xml
44
+ render :xml => response_object.to_xml(:only => list_columns_names), :content_type => Mime::XML, :status => response_status
45
+ end
46
+ def list_respond_to_json
47
+ render :text => response_object.to_json(:only => list_columns_names), :content_type => Mime::JSON, :status => response_status
48
+ end
49
+ def list_respond_to_yaml
50
+ render :text => Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
51
+ end
52
+ # The actual algorithm to prepare for the list view
53
+ def do_list
54
+ includes_for_list_columns = active_scaffold_config.list.columns.collect{ |c| c.includes }.flatten.uniq.compact
55
+ self.active_scaffold_includes.concat includes_for_list_columns
56
+
57
+ options = { :sorting => active_scaffold_config.list.user.sorting,
58
+ :count_includes => active_scaffold_config.list.user.count_includes }
59
+ paginate = (params[:format].nil?) ? (accepts? :html, :js) : ['html', 'js'].include?(params[:format])
60
+ if paginate
61
+ options.merge!({
62
+ :per_page => active_scaffold_config.list.user.per_page,
63
+ :page => active_scaffold_config.list.user.page,
64
+ :pagination => active_scaffold_config.list.pagination
65
+ })
66
+ end
67
+
68
+ page = find_page(options);
69
+ if page.items.blank? && !page.pager.infinite?
70
+ page = page.pager.last
71
+ active_scaffold_config.list.user.page = page.number
72
+ end
73
+ @page, @records = page, page.items
74
+ end
75
+
76
+ def each_record_in_scope
77
+ do_search if respond_to? :do_search
78
+ finder_options = { :order => "#{active_scaffold_config.model.primary_key} ASC",
79
+ :conditions => all_conditions,
80
+ :joins => joins_for_finder}
81
+ finder_options.merge! custom_finder_options
82
+ finder_options.merge! :include => (active_scaffold_includes.blank? ? nil : active_scaffold_includes)
83
+ klass = beginning_of_chain
84
+ klass.all(finder_options).each {|record| yield record}
85
+ end
86
+
87
+ # The default security delegates to ActiveRecordPermissions.
88
+ # You may override the method to customize.
89
+ def list_authorized?
90
+ authorized_for?(:crud_type => :read)
91
+ end
92
+
93
+ def action_update_respond_to_js
94
+ render(:action => 'on_action_update')
95
+ end
96
+
97
+ def action_update_respond_to_xml
98
+ render :xml => successful? ? "" : response_object.to_xml(:only => list_columns_names), :content_type => Mime::XML, :status => response_status
99
+ end
100
+
101
+ def action_update_respond_to_json
102
+ render :text => successful? ? "" : response_object.to_json(:only => list_columns_names), :content_type => Mime::JSON, :status => response_status
103
+ end
104
+
105
+ def action_update_respond_to_yaml
106
+ render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
107
+ end
108
+
109
+ private
110
+ def list_authorized_filter
111
+ raise ActiveScaffold::ActionNotAllowed unless list_authorized?
112
+ end
113
+ def list_formats
114
+ (default_formats + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
115
+ end
116
+ def action_update_formats
117
+ (default_formats + active_scaffold_config.formats).uniq
118
+ end
119
+
120
+ def list_columns
121
+ active_scaffold_config.list.columns.collect_visible
122
+ end
123
+
124
+ def list_columns_names
125
+ list_columns.collect(&:name)
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,50 @@
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
+ do_list
17
+ respond_to_action(:list)
18
+ end
19
+ protected
20
+
21
+ # We need to give the ActiveRecord classes a handle to currently marked records. We don't want to just pass the object,
22
+ # because the object may change. So we give ActiveRecord a proc that ties to the
23
+ # marked_records_method on this ApplicationController.
24
+ def assign_marked_records_to_model
25
+ active_scaffold_config.model.marked_records_proc = proc {send(:marked_records)}
26
+ end
27
+
28
+ def marked_records
29
+ active_scaffold_session_storage[:marked_records] ||= Set.new
30
+ end
31
+
32
+ def mark_all?
33
+ @mark_all ||= [true, 'true', 1, '1', 'T', 't'].include?(params[:value].class == String ? params[:value].downcase : params[:value])
34
+ end
35
+
36
+ def do_mark_all
37
+ each_record_in_scope {|record| marked_records << record.id}
38
+ end
39
+
40
+ def do_demark_all
41
+ each_record_in_scope {|record| marked_records.delete(record.id)}
42
+ end
43
+
44
+ # The default security delegates to ActiveRecordPermissions.
45
+ # You may override the method to customize.
46
+ def mark_authorized?
47
+ authorized_for?(:action => :read)
48
+ end
49
+ end
50
+ end