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,20 @@
1
+ # wrap the action rendering for ActiveScaffold controllers
2
+ module ActionController #:nodoc:
3
+ class Base
4
+ def render_with_active_scaffold(*args, &block)
5
+ if self.class.uses_active_scaffold? and params[:adapter] and @rendering_adapter.nil?
6
+ @rendering_adapter = true # recursion control
7
+ # if we need an adapter, then we render the actual stuff to a string and insert it into the adapter template
8
+ render :partial => params[:adapter][1..-1],
9
+ :locals => {:payload => render_to_string(args.first.merge(:layout => false), &block)},
10
+ :use_full_path => true, :layout => false
11
+ @rendering_adapter = nil # recursion control
12
+ else
13
+ render_without_active_scaffold(*args, &block)
14
+ end
15
+ end
16
+ alias_method_chain :render, :active_scaffold
17
+
18
+ # Rails 2.x implementation is post-initialization on :active_scaffold method
19
+ end
20
+ end
@@ -0,0 +1,123 @@
1
+ module ActionView
2
+ class LookupContext
3
+ module ViewPaths
4
+ def find_all_templates(name, prefix = nil, partial = false)
5
+ templates = []
6
+ @view_paths.each do |resolver|
7
+ template = resolver.find_all(*args_for_lookup(name, prefix, partial)).first
8
+ templates << template unless template.nil?
9
+ end
10
+ templates
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ # wrap the action rendering for ActiveScaffold views
17
+ module ActionView::Rendering #:nodoc:
18
+ # Adds two rendering options.
19
+ #
20
+ # ==render :super
21
+ #
22
+ # This syntax skips all template overrides and goes directly to the provided ActiveScaffold templates.
23
+ # Useful if you want to wrap an existing template. Just call super!
24
+ #
25
+ # ==render :active_scaffold => #{controller.to_s}, options = {}+
26
+ #
27
+ # Lets you embed an ActiveScaffold by referencing the controller where it's configured.
28
+ #
29
+ # You may specify options[:constraints] for the embedded scaffold. These constraints have three effects:
30
+ # * the scaffold's only displays records matching the constraint
31
+ # * all new records created will be assigned the constrained values
32
+ # * constrained columns will be hidden (they're pretty boring at this point)
33
+ #
34
+ # You may also specify options[:conditions] for the embedded scaffold. These only do 1/3 of what
35
+ # constraints do (they only limit search results). Any format accepted by ActiveRecord::Base.find is valid.
36
+ #
37
+ # Defining options[:label] lets you completely customize the list title for the embedded scaffold.
38
+ #
39
+ def render_with_active_scaffold(*args, &block)
40
+ if args.first == :super
41
+ last_view = @view_stack.last
42
+ options = args[1] || {}
43
+ options[:locals] ||= {}
44
+ options[:locals].reverse_merge!(last_view[:locals] || {})
45
+ if last_view[:templates].nil?
46
+ last_view[:templates] = lookup_context.find_all_templates(last_view[:view], controller_path, !last_view[:is_template])
47
+ last_view[:templates].shift
48
+ end
49
+ options[:template] = last_view[:templates].shift
50
+ @view_stack << last_view
51
+ result = render_without_active_scaffold options
52
+ @view_stack.pop
53
+ result
54
+ elsif args.first.is_a?(Hash) and args.first[:active_scaffold]
55
+ require 'digest/md5'
56
+ options = args.first
57
+
58
+ remote_controller = options[:active_scaffold]
59
+ constraints = options[:constraints]
60
+ conditions = options[:conditions]
61
+ eid = Digest::MD5.hexdigest(params[:controller] + remote_controller.to_s + constraints.to_s + conditions.to_s)
62
+ session["as:#{eid}"] = {:constraints => constraints, :conditions => conditions, :list => {:label => args.first[:label]}}
63
+ options[:params] ||= {}
64
+ options[:params].merge! :eid => eid, :embedded => true
65
+
66
+ id = "as_#{eid}-content"
67
+ url_options = {:controller => remote_controller.to_s, :action => 'index'}.merge(options[:params])
68
+
69
+ if controller.respond_to?(:render_component_into_view)
70
+ controller.send(:render_component_into_view, url_options)
71
+ else
72
+ content_tag(:div, {:id => id}) do
73
+ url = url_for(url_options)
74
+ link_to(remote_controller.to_s, url, {:remote => true, :id => id}) <<
75
+ if ActiveScaffold.js_framework == :prototype
76
+ javascript_tag("new Ajax.Updater('#{id}', '#{url}', {method: 'get', evalScripts: true});")
77
+ elsif ActiveScaffold.js_framework == :jquery
78
+ javascript_tag("$('##{id}').load('#{url}');")
79
+ end
80
+ end
81
+ end
82
+
83
+ else
84
+ options = args.first
85
+ if options.is_a?(Hash)
86
+ current_view = {:view => options[:partial], :is_template => false} if options[:partial]
87
+ current_view = {:view => options[:template], :is_template => !!options[:template]} if current_view.nil? && options[:template]
88
+ current_view[:locals] = options[:locals] if !current_view.nil? && options[:locals]
89
+ if current_view.present?
90
+ @view_stack ||= []
91
+ @view_stack << current_view
92
+ end
93
+ end
94
+ result = render_without_active_scaffold(*args, &block)
95
+ @view_stack.pop if current_view.present?
96
+ result
97
+ end
98
+ end
99
+ alias_method_chain :render, :active_scaffold
100
+
101
+
102
+ def partial_pieces(partial_path)
103
+ if partial_path.include?('/')
104
+ return File.dirname(partial_path), File.basename(partial_path)
105
+ else
106
+ return controller.class.controller_path, partial_path
107
+ end
108
+ end
109
+
110
+ # This is the template finder logic, keep it updated with however we find stuff in rails
111
+ # currently this very similar to the logic in ActionBase::Base.render for options file
112
+ # TODO: Work with rails core team to find a better way to check for this.
113
+ def template_exists?(template_name, lookup_overrides = false)
114
+ begin
115
+ method = 'find_template'
116
+ method << '_without_active_scaffold' unless lookup_overrides
117
+ self.view_paths.send(method, template_name, @template_format)
118
+ return true
119
+ rescue ActionView::MissingTemplate => e
120
+ return false
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,7 @@
1
+ module ActionView
2
+ class ActiveScaffoldResolver < FileSystemResolver
3
+ def build_path(name, prefix, partial, details)
4
+ super(name, '', partial, details)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ # Bugfix: building an sti model from an association fails
2
+ # https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6306-collection-associations-build-method-not-supported-for-sti
3
+ ActiveRecord::Reflection::AssociationReflection.class_eval do
4
+ def build_association(*opts)
5
+ col = klass.inheritance_column.to_sym
6
+ if !col.nil? && opts.first.is_a?(Hash) && (opts.first.symbolize_keys[col])
7
+ sti_model = opts.first.delete(col)
8
+ sti_model.to_s.camelize.constantize.new(*opts)
9
+ else
10
+ klass.new(*opts)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # Bugfix: Team.offset(1).limit(1) throws an error
2
+ ActiveRecord::Base.instance_eval do
3
+ def offset(*args, &block)
4
+ scoped.__send__(:offset, *args, &block)
5
+ rescue NoMethodError
6
+ if scoped.nil?
7
+ 'depends on :allow_nil'
8
+ else
9
+ raise
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class Array
2
+ # returns the value after the given value. wraps around. defaults to first element in array.
3
+ def after(value)
4
+ return nil unless include? value
5
+ self[(index(value).to_i + 1) % length]
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ class Object
2
+ def as_(key, options = {})
3
+ unless key.blank?
4
+ text = I18n.translate "#{key}", {:scope => [:active_scaffold], :default => key.is_a?(String) ? key : key.to_s.titleize}.merge(options)
5
+ # text = nil if text.include?('translation missing:')
6
+ end
7
+ text ||= key
8
+ text
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module ActionView
2
+ module Helpers
3
+ class InstanceTag
4
+ private
5
+ def datetime_selector_with_name(options, html_options)
6
+ options.merge!(:prefix => options[:name].gsub(/\[[^\[]*\]$/,'')) if options[:name]
7
+ datetime_selector_without_name(options, html_options)
8
+ end
9
+ alias_method_chain :datetime_selector, :name
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class ActionController::Routing::RouteSet
2
+ def generate_with_nil_id_awareness(*args)
3
+ args[0].delete(:id) if args[0][:id].nil?
4
+ generate_without_nil_id_awareness(*args)
5
+ end
6
+ alias_method_chain :generate, :nil_id_awareness
7
+ end
@@ -0,0 +1,26 @@
1
+ require 'active_scaffold/paginator'
2
+
3
+ class Paginator
4
+
5
+ # Total number of pages
6
+ def number_of_pages_with_infinite
7
+ number_of_pages_without_infinite unless infinite?
8
+ end
9
+ alias_method_chain :number_of_pages, :infinite
10
+
11
+ # Is this an "infinite" paginator
12
+ def infinite?
13
+ @count.nil?
14
+ end
15
+
16
+ class Page
17
+ # Checks to see if there's a page after this one
18
+ def next_with_infinite?
19
+ return true if @pager.infinite?
20
+ next_without_infinite?
21
+ end
22
+ alias_method_chain :next?, :infinite
23
+ end
24
+
25
+ end
26
+
@@ -0,0 +1,62 @@
1
+ module ActiveRecord
2
+ module Reflection
3
+ class AssociationReflection #:nodoc:
4
+ def reverse_for?(klass)
5
+ reverse_matches_for(klass).empty? ? false : true
6
+ end
7
+
8
+ attr_writer :reverse
9
+ def reverse
10
+ if @reverse.nil? and not self.options[:polymorphic]
11
+ reverse_matches = reverse_matches_for(self.class_name.constantize) rescue nil
12
+ # grab first association, or make a wild guess
13
+ @reverse = reverse_matches.blank? ? false : reverse_matches.first.name
14
+ end
15
+ @reverse
16
+ end
17
+
18
+ protected
19
+
20
+ def reverse_matches_for(klass)
21
+ reverse_matches = []
22
+
23
+ # stage 1 filter: collect associations that point back to this model and use the same primary_key_name
24
+ klass.reflect_on_all_associations.each do |assoc|
25
+ if self.options[:through]
26
+ # only iterate has_many :through associations
27
+ next unless assoc.options[:through]
28
+ next unless assoc.through_reflection.klass == self.through_reflection.klass
29
+ else
30
+ # skip over has_many :through associations
31
+ next if assoc.options[:through]
32
+ next unless assoc.options[:polymorphic] or assoc.class_name.constantize == self.active_record
33
+
34
+ case [assoc.macro, self.macro].find_all{|m| m == :has_and_belongs_to_many}.length
35
+ # if both are a habtm, then match them based on the join table
36
+ when 2
37
+ next unless assoc.options[:join_table] == self.options[:join_table]
38
+
39
+ # if only one is a habtm, they do not match
40
+ when 1
41
+ next
42
+
43
+ # otherwise, match them based on the primary_key_name
44
+ when 0
45
+ next unless assoc.primary_key_name.to_sym == self.primary_key_name.to_sym
46
+ end
47
+ end
48
+
49
+ reverse_matches << assoc
50
+ end
51
+
52
+ # stage 2 filter: name-based matching (association name vs self.active_record.to_s)
53
+ reverse_matches.find_all do |assoc|
54
+ self.active_record.to_s.underscore.include? assoc.name.to_s.pluralize.singularize
55
+ end if reverse_matches.length > 1
56
+
57
+ reverse_matches
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,34 @@
1
+ module ActionDispatch
2
+ module Routing
3
+ ACTIVE_SCAFFOLD_CORE_ROUTING = {
4
+ :collection => {:show_search => :get, :render_field => :get},
5
+ :member => {:row => :get, :update_column => :post, :render_field => :get}
6
+ }
7
+ ACTIVE_SCAFFOLD_ASSOCIATION_ROUTING = {
8
+ :collection => {:edit_associated => :get, :new_existing => :get, :add_existing => :post},
9
+ :member => {:edit_associated => :get, :add_association => :get, :destroy_existing => :delete}
10
+ }
11
+ class Mapper
12
+ module Base
13
+ def as_routes(options = {:association => true})
14
+ collection do
15
+ ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:collection].each {|name, type| send(type, name)}
16
+ end
17
+ member do
18
+ ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:member].each {|name, type| send(type, name)}
19
+ end
20
+ as_association_routes if options[:association]
21
+ end
22
+
23
+ def as_association_routes
24
+ collection do
25
+ ActionDispatch::Routing::ACTIVE_SCAFFOLD_ASSOCIATION_ROUTING[:collection].each {|name, type| send(type, name)}
26
+ end
27
+ member do
28
+ ActionDispatch::Routing::ACTIVE_SCAFFOLD_ASSOCIATION_ROUTING[:member].each {|name, type| send(type, name)}
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ # the ever-useful to_label method
2
+ class ActiveRecord::Base
3
+ def to_label
4
+ [:name, :label, :title, :to_s].each do |attribute|
5
+ return send(attribute).to_s if respond_to?(attribute)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,61 @@
1
+ # save and validation support for associations.
2
+ class ActiveRecord::Base
3
+ def associated_valid?(path = [])
4
+ return true if path.include?(self) # prevent recursion (if associated and parent are new records)
5
+ path << self
6
+ # using [].all? syntax to avoid a short-circuit
7
+ with_unsaved_associated { |a| [a.valid?, a.associated_valid?(path)].all? {|v| v == true} }
8
+ end
9
+
10
+ def save_associated
11
+ with_unsaved_associated { |a| a.save and a.save_associated }
12
+ end
13
+
14
+ def save_associated!
15
+ save_associated or raise(ActiveRecord::RecordNotSaved)
16
+ end
17
+
18
+ def no_errors_in_associated?
19
+ with_unsaved_associated {|a| a.errors.count == 0 and a.no_errors_in_associated?}
20
+ end
21
+
22
+ protected
23
+
24
+ # Provide an override to allow the model to restrict which associations are considered
25
+ # by ActiveScaffolds update mechanism. This allows the model to restrict things like
26
+ # Acts-As-Versioned versions associations being traversed.
27
+ #
28
+ # By defining the method :scaffold_update_nofollow returning an array of associations
29
+ # these associations will not be traversed.
30
+ # By defining the method :scaffold_update_follow returning an array of associations,
31
+ # only those associations will be traversed.
32
+ #
33
+ # Otherwise the default behaviour of traversing all associations will be preserved.
34
+ def associations_for_update
35
+ if self.respond_to?( :scaffold_update_nofollow )
36
+ self.class.reflect_on_all_associations.reject { |association| self.scaffold_update_nofollow.include?( association.name ) }
37
+ elsif self.respond_to?( :scaffold_update_follow )
38
+ self.class.reflect_on_all_associations.select { |association| self.scaffold_update_follow.include?( association.name ) }
39
+ else
40
+ self.class.reflect_on_all_associations
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ # yields every associated object that has been instantiated and is flagged as unsaved.
47
+ # returns false if any yield returns false.
48
+ # returns true otherwise, even when none of the associations have been instantiated. build wrapper methods accordingly.
49
+ def with_unsaved_associated
50
+ associations_for_update.all? do |association|
51
+ association_proxy = instance_variable_get("@#{association.name}")
52
+ if association_proxy
53
+ records = association_proxy
54
+ records = [records] unless records.is_a? Array # convert singular associations into collections for ease of use
55
+ records.select {|r| r.unsaved? and not r.readonly?}.all? {|r| yield r} # must use select instead of find_all, which Rails overrides on association proxies for db access
56
+ else
57
+ true
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,20 @@
1
+ # a simple (manual) unsaved? flag and method. at least it automatically reverts after a save!
2
+ class ActiveRecord::Base
3
+ # acts like a dirty? flag, manually thrown during update_record_from_params.
4
+ def unsaved=(val)
5
+ @unsaved = (val) ? true : false
6
+ end
7
+
8
+ # whether the unsaved? flag has been thrown
9
+ def unsaved?
10
+ @unsaved
11
+ end
12
+
13
+ # automatically unsets the unsaved flag
14
+ def save_with_unsaved_flag(*args)
15
+ result = save_without_unsaved_flag(*args)
16
+ self.unsaved = false
17
+ return result
18
+ end
19
+ alias_method_chain :save, :unsaved_flag
20
+ end
@@ -0,0 +1,46 @@
1
+ module ActionView
2
+ module Helpers
3
+ module FormOptionsHelper
4
+
5
+ # Return a full select and option tags for the given object and method, using usa_state_options_for_select to generate the list of option <tags>.
6
+ def usa_state_select(object, method, priority_states = nil, options = {}, html_options = {})
7
+ InstanceTag.new(object, method, self, options.delete(:object)).to_usa_state_select_tag(priority_states, options, html_options)
8
+ end
9
+
10
+
11
+ # Returns a string of option tags for the states in the United States. Supply a state name as +selected to
12
+ # have it marked as the selected option tag. Included also is the option to set a couple of +priority_states+
13
+ # in case you want to highligh a local area
14
+ # NOTE: Only the option tags are returned from this method, wrap it in a <select>
15
+ def usa_state_options_for_select(selected = nil, priority_states = nil)
16
+ state_options = ""
17
+ if priority_states
18
+ state_options += options_for_select(priority_states, selected)
19
+ state_options += "<option>-------------</option>\n"
20
+ end
21
+
22
+ if priority_states && priority_states.include?(selected)
23
+ state_options += options_for_select(USASTATES - priority_states, selected)
24
+ else
25
+ state_options += options_for_select(USASTATES, selected)
26
+ end
27
+
28
+ return state_options
29
+ end
30
+
31
+ USASTATES = [["Alabama", "AL"], ["Alaska", "AK"], ["Arizona", "AZ"], ["Arkansas", "AR"], ["California", "CA"], ["Colorado", "CO"], ["Connecticut", "CT"], ["Delaware", "DE"], ["District of Columbia", "DC"], ["Florida", "FL"], ["Georgia", "GA"], ["Hawaii", "HI"], ["Idaho", "ID"], ["Illinois", "IL"], ["Indiana", "IN"], ["Iowa", "IA"], ["Kansas", "KS"], ["Kentucky", "KY"], ["Louisiana", "LA"], ["Maine", "ME"], ["Maryland", "MD"], ["Massachusetts", "MA"], ["Michigan", "MI"], ["Minnesota", "MN"], ["Mississippi", "MS"], ["Missouri", "MO"], ["Montana", "MT"], ["Nebraska", "NE"], ["Nevada", "NV"], ["New Hampshire", "NH"], ["New Jersey", "NJ"], ["New Mexico", "NM"], ["New York", "NY"], ["North Carolina", "NC"], ["North Dakota", "ND"], ["Ohio", "OH"], ["Oklahoma", "OK"], ["Oregon", "OR"], ["Pennsylvania", "PA"], ["Rhode Island", "RI"], ["South Carolina", "SC"], ["South Dakota", "SD"], ["Tennessee", "TN"], ["Texas", "TX"], ["Utah", "UT"], ["Vermont", "VT"], ["Virginia", "VA"], ["Washington", "WA"], ["Wisconsin", "WI"], ["West Virginia", "WV"], ["Wyoming", "WY"]] unless const_defined?("USASTATES")
32
+
33
+ end
34
+
35
+ class InstanceTag #:nodoc:
36
+ include FormOptionsHelper
37
+
38
+ def to_usa_state_select_tag(priority_states, options, html_options)
39
+ html_options = html_options.stringify_keys
40
+ add_default_name_and_id(html_options)
41
+ value = value(object) if method(:value).arity > 0
42
+ content_tag("select", add_options(usa_state_options_for_select(value, priority_states), options, value), html_options)
43
+ end
44
+ end
45
+ end
46
+ end