active_scaffold-sequel 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (318) hide show
  1. data/CHANGELOG +179 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +36 -0
  4. data/app/assets/images/active_scaffold/add.gif +0 -0
  5. data/app/assets/images/active_scaffold/arrow_down.gif +0 -0
  6. data/app/assets/images/active_scaffold/arrow_up.gif +0 -0
  7. data/app/assets/images/active_scaffold/close.gif +0 -0
  8. data/app/assets/images/active_scaffold/close_touch.png +0 -0
  9. data/app/assets/images/active_scaffold/config.png +0 -0
  10. data/app/assets/images/active_scaffold/cross.png +0 -0
  11. data/app/assets/images/active_scaffold/gears.png +0 -0
  12. data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
  13. data/app/assets/images/active_scaffold/indicator.gif +0 -0
  14. data/app/assets/images/active_scaffold/magnifier.png +0 -0
  15. data/app/assets/javascripts/active_scaffold.js.erb +19 -0
  16. data/app/assets/javascripts/jquery/active_scaffold.js +1057 -0
  17. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +24 -0
  18. data/app/assets/javascripts/jquery/draggable_lists.js +27 -0
  19. data/app/assets/javascripts/jquery/jquery.editinplace.js +743 -0
  20. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +7 -0
  21. data/app/assets/javascripts/prototype/active_scaffold.js +1052 -0
  22. data/app/assets/javascripts/prototype/dhtml_history.js +870 -0
  23. data/app/assets/javascripts/prototype/form_enhancements.js +117 -0
  24. data/app/assets/javascripts/prototype/rico_corner.js +370 -0
  25. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +7 -0
  26. data/app/assets/stylesheets/active_scaffold-ie.css +35 -0
  27. data/app/assets/stylesheets/active_scaffold.css.scss +14 -0
  28. data/app/assets/stylesheets/active_scaffold_colors.css.scss +395 -0
  29. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
  30. data/app/assets/stylesheets/active_scaffold_images.css.scss +43 -0
  31. data/app/assets/stylesheets/active_scaffold_layout.css +912 -0
  32. data/app/assets/stylesheets/blue-theme.css +74 -0
  33. data/config/locales/de.yml +114 -0
  34. data/config/locales/en.yml +118 -0
  35. data/config/locales/es.yml +120 -0
  36. data/config/locales/fr.yml +121 -0
  37. data/config/locales/hu.yml +74 -0
  38. data/config/locales/ja.yml +73 -0
  39. data/config/locales/ru.yml +123 -0
  40. data/frontends/default/views/_action_group.html.erb +24 -0
  41. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  42. data/frontends/default/views/_base_form.html.erb +51 -0
  43. data/frontends/default/views/_create_form.html.erb +8 -0
  44. data/frontends/default/views/_create_form_on_list.html.erb +6 -0
  45. data/frontends/default/views/_field_search.html.erb +32 -0
  46. data/frontends/default/views/_form.html.erb +24 -0
  47. data/frontends/default/views/_form_association.html.erb +15 -0
  48. data/frontends/default/views/_form_association_footer.html.erb +47 -0
  49. data/frontends/default/views/_form_attribute.html.erb +20 -0
  50. data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
  51. data/frontends/default/views/_form_messages.html.erb +5 -0
  52. data/frontends/default/views/_horizontal_subform.html.erb +28 -0
  53. data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
  54. data/frontends/default/views/_horizontal_subform_header.html.erb +11 -0
  55. data/frontends/default/views/_horizontal_subform_record.html.erb +38 -0
  56. data/frontends/default/views/_human_conditions.html.erb +1 -0
  57. data/frontends/default/views/_list.html.erb +18 -0
  58. data/frontends/default/views/_list_actions.html.erb +15 -0
  59. data/frontends/default/views/_list_calculations.html.erb +16 -0
  60. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  61. data/frontends/default/views/_list_header.html.erb +10 -0
  62. data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
  63. data/frontends/default/views/_list_messages.html.erb +30 -0
  64. data/frontends/default/views/_list_pagination.html.erb +11 -0
  65. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  66. data/frontends/default/views/_list_record.html.erb +14 -0
  67. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  68. data/frontends/default/views/_list_with_header.html.erb +36 -0
  69. data/frontends/default/views/_messages.html.erb +10 -0
  70. data/frontends/default/views/_render_field.js.erb +20 -0
  71. data/frontends/default/views/_row.html.erb +6 -0
  72. data/frontends/default/views/_search.html.erb +34 -0
  73. data/frontends/default/views/_search_attribute.html.erb +10 -0
  74. data/frontends/default/views/_show.html.erb +8 -0
  75. data/frontends/default/views/_show_columns.html.erb +15 -0
  76. data/frontends/default/views/_update_actions.html.erb +9 -0
  77. data/frontends/default/views/_update_form.html.erb +6 -0
  78. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  79. data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
  80. data/frontends/default/views/action_confirmation.html.erb +13 -0
  81. data/frontends/default/views/add_existing.js.erb +18 -0
  82. data/frontends/default/views/add_existing_form.html.erb +5 -0
  83. data/frontends/default/views/create.html.erb +5 -0
  84. data/frontends/default/views/delete.html.erb +13 -0
  85. data/frontends/default/views/destroy.js.erb +24 -0
  86. data/frontends/default/views/edit_associated.js.erb +12 -0
  87. data/frontends/default/views/field_search.html.erb +5 -0
  88. data/frontends/default/views/form_messages.js.erb +1 -0
  89. data/frontends/default/views/list.html.erb +1 -0
  90. data/frontends/default/views/on_action_update.js.erb +13 -0
  91. data/frontends/default/views/on_create.js.erb +47 -0
  92. data/frontends/default/views/on_mark_all.js.erb +12 -0
  93. data/frontends/default/views/on_update.js.erb +31 -0
  94. data/frontends/default/views/refresh_list.js.erb +1 -0
  95. data/frontends/default/views/render_field.js.erb +1 -0
  96. data/frontends/default/views/search.html.erb +5 -0
  97. data/frontends/default/views/show.html.erb +5 -0
  98. data/frontends/default/views/update.html.erb +8 -0
  99. data/frontends/default/views/update_column.js.erb +16 -0
  100. data/frontends/default/views/update_row.js.erb +1 -0
  101. data/lib/active_scaffold/actions/common_search.rb +25 -0
  102. data/lib/active_scaffold/actions/core.rb +197 -0
  103. data/lib/active_scaffold/actions/create.rb +148 -0
  104. data/lib/active_scaffold/actions/delete.rb +76 -0
  105. data/lib/active_scaffold/actions/field_search.rb +82 -0
  106. data/lib/active_scaffold/actions/list.rb +196 -0
  107. data/lib/active_scaffold/actions/mark.rb +75 -0
  108. data/lib/active_scaffold/actions/nested.rb +245 -0
  109. data/lib/active_scaffold/actions/search.rb +48 -0
  110. data/lib/active_scaffold/actions/show.rb +61 -0
  111. data/lib/active_scaffold/actions/subform.rb +23 -0
  112. data/lib/active_scaffold/actions/update.rb +150 -0
  113. data/lib/active_scaffold/active_record_permissions.rb +136 -0
  114. data/lib/active_scaffold/attribute_params.rb +208 -0
  115. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +39 -0
  116. data/lib/active_scaffold/bridges/ancestry.rb +5 -0
  117. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +67 -0
  118. data/lib/active_scaffold/bridges/calendar_date_select.rb +24 -0
  119. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +107 -0
  120. data/lib/active_scaffold/bridges/cancan.rb +15 -0
  121. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +31 -0
  122. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +10 -0
  123. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +45 -0
  124. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +17 -0
  125. data/lib/active_scaffold/bridges/carrierwave.rb +12 -0
  126. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +358 -0
  127. data/lib/active_scaffold/bridges/country_helper.rb +9 -0
  128. data/lib/active_scaffold/bridges/date_picker/ext.rb +45 -0
  129. data/lib/active_scaffold/bridges/date_picker/helper.rb +180 -0
  130. data/lib/active_scaffold/bridges/date_picker.rb +23 -0
  131. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +34 -0
  132. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +10 -0
  133. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +27 -0
  134. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +16 -0
  135. data/lib/active_scaffold/bridges/dragonfly.rb +9 -0
  136. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +48 -0
  137. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +57 -0
  138. data/lib/active_scaffold/bridges/file_column/form_ui.rb +34 -0
  139. data/lib/active_scaffold/bridges/file_column/list_ui.rb +26 -0
  140. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  141. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  142. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  143. data/lib/active_scaffold/bridges/file_column.rb +11 -0
  144. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +27 -0
  145. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +16 -0
  146. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +36 -0
  147. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +24 -0
  148. data/lib/active_scaffold/bridges/paperclip.rb +12 -0
  149. data/lib/active_scaffold/bridges/record_select/helpers.rb +86 -0
  150. data/lib/active_scaffold/bridges/record_select.rb +11 -0
  151. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +20 -0
  152. data/lib/active_scaffold/bridges/semantic_attributes.rb +5 -0
  153. data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
  154. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +46 -0
  155. data/lib/active_scaffold/bridges/tiny_mce.rb +17 -0
  156. data/lib/active_scaffold/bridges.rb +61 -0
  157. data/lib/active_scaffold/config/base.rb +71 -0
  158. data/lib/active_scaffold/config/core.rb +219 -0
  159. data/lib/active_scaffold/config/create.rb +44 -0
  160. data/lib/active_scaffold/config/delete.rb +33 -0
  161. data/lib/active_scaffold/config/field_search.rb +76 -0
  162. data/lib/active_scaffold/config/form.rb +48 -0
  163. data/lib/active_scaffold/config/list.rb +196 -0
  164. data/lib/active_scaffold/config/mark.rb +35 -0
  165. data/lib/active_scaffold/config/nested.rb +42 -0
  166. data/lib/active_scaffold/config/search.rb +73 -0
  167. data/lib/active_scaffold/config/show.rb +32 -0
  168. data/lib/active_scaffold/config/subform.rb +35 -0
  169. data/lib/active_scaffold/config/update.rb +41 -0
  170. data/lib/active_scaffold/configurable.rb +29 -0
  171. data/lib/active_scaffold/constraints.rb +170 -0
  172. data/lib/active_scaffold/data_structures/action_columns.rb +140 -0
  173. data/lib/active_scaffold/data_structures/action_link.rb +179 -0
  174. data/lib/active_scaffold/data_structures/action_links.rb +185 -0
  175. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  176. data/lib/active_scaffold/data_structures/bridge.rb +22 -0
  177. data/lib/active_scaffold/data_structures/column.rb +389 -0
  178. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  179. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  180. data/lib/active_scaffold/data_structures/nested_info.rb +130 -0
  181. data/lib/active_scaffold/data_structures/set.rb +57 -0
  182. data/lib/active_scaffold/data_structures/sorting.rb +172 -0
  183. data/lib/active_scaffold/engine.rb +4 -0
  184. data/lib/active_scaffold/extensions/action_controller_rendering.rb +22 -0
  185. data/lib/active_scaffold/extensions/action_view_rendering.rb +115 -0
  186. data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
  187. data/lib/active_scaffold/extensions/array.rb +7 -0
  188. data/lib/active_scaffold/extensions/cache_association.rb +16 -0
  189. data/lib/active_scaffold/extensions/localize.rb +10 -0
  190. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
  191. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
  192. data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
  193. data/lib/active_scaffold/extensions/routing_mapper.rb +48 -0
  194. data/lib/active_scaffold/extensions/to_label.rb +8 -0
  195. data/lib/active_scaffold/extensions/unsaved_associated.rb +60 -0
  196. data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
  197. data/lib/active_scaffold/extensions/usa_state.rb +46 -0
  198. data/lib/active_scaffold/finder.rb +372 -0
  199. data/lib/active_scaffold/helpers/association_helpers.rb +48 -0
  200. data/lib/active_scaffold/helpers/controller_helpers.rb +88 -0
  201. data/lib/active_scaffold/helpers/form_column_helpers.rb +321 -0
  202. data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -0
  203. data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
  204. data/lib/active_scaffold/helpers/list_column_helpers.rb +340 -0
  205. data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
  206. data/lib/active_scaffold/helpers/search_column_helpers.rb +267 -0
  207. data/lib/active_scaffold/helpers/show_column_helpers.rb +50 -0
  208. data/lib/active_scaffold/helpers/view_helpers.rb +342 -0
  209. data/lib/active_scaffold/marked_model.rb +38 -0
  210. data/lib/active_scaffold/paginator.rb +136 -0
  211. data/lib/active_scaffold/responds_to_parent.rb +70 -0
  212. data/lib/active_scaffold/version.rb +9 -0
  213. data/lib/active_scaffold.rb +368 -0
  214. data/lib/active_scaffold_env.rb +11 -0
  215. data/lib/generators/active_scaffold/USAGE +29 -0
  216. data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
  217. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  218. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
  219. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  220. data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
  221. data/public/blank.html +33 -0
  222. data/shoulda_macros/macros.rb +136 -0
  223. data/test/bridges/active_scaffold_dependent_protect_test.rb +34 -0
  224. data/test/bridges/bridge_test.rb +90 -0
  225. data/test/bridges/company.rb +81 -0
  226. data/test/bridges/paperclip_test.rb +68 -0
  227. data/test/bridges/tiny_mce_test.rb +27 -0
  228. data/test/bridges/unobtrusive_date_picker_test.rb +49 -0
  229. data/test/bridges/validation_reflection_test.rb +57 -0
  230. data/test/config/base_test.rb +15 -0
  231. data/test/config/core_test.rb +58 -0
  232. data/test/config/create_test.rb +58 -0
  233. data/test/config/delete_test.rb +33 -0
  234. data/test/config/field_search_test.rb +47 -0
  235. data/test/config/list_test.rb +129 -0
  236. data/test/config/nested_test.rb +62 -0
  237. data/test/config/search_test.rb +60 -0
  238. data/test/config/show_test.rb +43 -0
  239. data/test/config/subform_test.rb +17 -0
  240. data/test/config/update_test.rb +40 -0
  241. data/test/const_mocker.rb +36 -0
  242. data/test/data_structures/action_columns_test.rb +113 -0
  243. data/test/data_structures/action_link_test.rb +78 -0
  244. data/test/data_structures/action_links_test.rb +78 -0
  245. data/test/data_structures/actions_test.rb +25 -0
  246. data/test/data_structures/association_column_test.rb +42 -0
  247. data/test/data_structures/column_test.rb +185 -0
  248. data/test/data_structures/columns_test.rb +69 -0
  249. data/test/data_structures/error_message_test.rb +28 -0
  250. data/test/data_structures/set_test.rb +86 -0
  251. data/test/data_structures/sorting_test.rb +126 -0
  252. data/test/data_structures/standard_column_test.rb +24 -0
  253. data/test/data_structures/virtual_column_test.rb +23 -0
  254. data/test/extensions/active_record_test.rb +45 -0
  255. data/test/extensions/array_test.rb +12 -0
  256. data/test/helpers/form_column_helpers_test.rb +31 -0
  257. data/test/helpers/list_column_helpers_test.rb +42 -0
  258. data/test/helpers/pagination_helpers_test.rb +59 -0
  259. data/test/misc/active_record_permissions_test.rb +154 -0
  260. data/test/misc/attribute_params_test.rb +146 -0
  261. data/test/misc/configurable_test.rb +96 -0
  262. data/test/misc/constraints_test.rb +193 -0
  263. data/test/misc/finder_test.rb +92 -0
  264. data/test/misc/lang_test.rb +11 -0
  265. data/test/mock_app/app/controllers/application_controller.rb +10 -0
  266. data/test/mock_app/app/helpers/application_helper.rb +3 -0
  267. data/test/mock_app/config/boot.rb +110 -0
  268. data/test/mock_app/config/database.yml +16 -0
  269. data/test/mock_app/config/environment.rb +43 -0
  270. data/test/mock_app/config/environments/development.rb +17 -0
  271. data/test/mock_app/config/environments/production.rb +28 -0
  272. data/test/mock_app/config/environments/test.rb +28 -0
  273. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  274. data/test/mock_app/config/initializers/inflections.rb +10 -0
  275. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  276. data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
  277. data/test/mock_app/config/initializers/session_store.rb +15 -0
  278. data/test/mock_app/config/locales/en.yml +5 -0
  279. data/test/mock_app/config/routes.rb +43 -0
  280. data/test/mock_app/db/test.sqlite3 +1 -0
  281. data/test/mock_app/public/blank.html +33 -0
  282. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  283. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  284. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  285. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  286. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  287. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  288. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  289. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  290. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  291. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  292. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
  293. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  294. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
  295. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  296. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  297. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  298. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +848 -0
  299. data/test/model_stub.rb +55 -0
  300. data/test/run_all.rb +8 -0
  301. data/test/test_helper.rb +39 -0
  302. data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  303. data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  304. data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
  305. data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  306. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  307. data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  308. data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  309. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  310. data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  311. data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
  312. data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
  313. data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
  314. data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
  315. data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
  316. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1276 -0
  317. data/vendor/assets/stylesheets/jquery-ui.css +568 -0
  318. metadata +502 -0
@@ -0,0 +1,368 @@
1
+ unless Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR >= 1
2
+ raise "This version of ActiveScaffold requires Rails 3.1 or higher. Please use an earlier version."
3
+ end
4
+
5
+ begin
6
+ require 'render_component'
7
+ rescue LoadError
8
+ end
9
+
10
+
11
+ require 'active_scaffold/version'
12
+ require 'active_scaffold/engine' unless defined? ACTIVE_SCAFFOLD_PLUGIN
13
+ require 'json' # for js_config
14
+
15
+ module ActiveScaffold
16
+ require 'active_scaffold/paginator'
17
+ require 'active_scaffold/responds_to_parent'
18
+ require 'active_scaffold/active_record_permissions'
19
+
20
+ autoload :AttributeParams, 'active_scaffold/attribute_params'
21
+ autoload :Configurable, 'active_scaffold/configurable'
22
+ autoload :Constraints, 'active_scaffold/constraints'
23
+ autoload :Finder, 'active_scaffold/finder'
24
+ autoload :MarkedModel, 'active_scaffold/marked_model'
25
+ autoload :Bridges, 'active_scaffold/bridges'
26
+
27
+ mattr_accessor :stylesheets
28
+ self.stylesheets = []
29
+ mattr_accessor :javascripts
30
+ self.javascripts = []
31
+
32
+ def self.autoload_subdir(dir, mod=self, root = File.dirname(__FILE__))
33
+ Dir["#{root}/active_scaffold/#{dir}/*.rb"].each { |file|
34
+ basename = File.basename(file, ".rb")
35
+ mod.module_eval {
36
+ autoload basename.camelcase.to_sym, "active_scaffold/#{dir}/#{basename}"
37
+ }
38
+ }
39
+ end
40
+
41
+ module Actions
42
+ ActiveScaffold.autoload_subdir('actions', self)
43
+ end
44
+
45
+ module Config
46
+ ActiveScaffold.autoload_subdir('config', self)
47
+ end
48
+
49
+ module DataStructures
50
+ ActiveScaffold.autoload_subdir('data_structures', self)
51
+ end
52
+
53
+ module Helpers
54
+ ActiveScaffold.autoload_subdir('helpers', self)
55
+ end
56
+
57
+ class ControllerNotFound < RuntimeError; end
58
+ class DependencyFailure < RuntimeError; end
59
+ class MalformedConstraint < RuntimeError; end
60
+ class RecordNotAllowed < SecurityError; end
61
+ class ActionNotAllowed < SecurityError; end
62
+ class ReverseAssociationRequired < RuntimeError; end
63
+
64
+ def self.included(base)
65
+ base.extend(ClassMethods)
66
+ base.module_eval do
67
+ # TODO: these should be in actions/core
68
+ before_filter :handle_user_settings
69
+ before_filter :check_input_device
70
+ end
71
+
72
+ base.helper_method :touch_device?
73
+ base.helper_method :hover_via_click?
74
+ end
75
+
76
+ def self.set_defaults(&block)
77
+ ActiveScaffold::Config::Core.configure &block
78
+ end
79
+
80
+ def active_scaffold_config
81
+ self.class.active_scaffold_config
82
+ end
83
+
84
+ def active_scaffold_config_for(klass)
85
+ self.class.active_scaffold_config_for(klass)
86
+ end
87
+
88
+ def active_scaffold_session_storage(id = nil)
89
+ id ||= params[:eid] || "#{params[:controller]}#{"_#{nested.parent_id}" if nested?}"
90
+ session_index = "as:#{id}"
91
+ session[session_index] ||= {}
92
+ session[session_index]
93
+ end
94
+
95
+ # at some point we need to pass the session and params into config. we'll just take care of that before any particular action occurs by passing those hashes off to the UserSettings class of each action.
96
+ def handle_user_settings
97
+ if self.class.uses_active_scaffold?
98
+ active_scaffold_config.actions.each do |action_name|
99
+ conf_instance = active_scaffold_config.send(action_name) rescue next
100
+ next if conf_instance.class::UserSettings == ActiveScaffold::Config::Base::UserSettings # if it hasn't been extended, skip it
101
+ active_scaffold_session_storage[action_name] ||= {}
102
+ conf_instance.user = conf_instance.class::UserSettings.new(conf_instance, active_scaffold_session_storage[action_name], params)
103
+ end
104
+ end
105
+ end
106
+
107
+ def check_input_device
108
+ if request.env["HTTP_USER_AGENT"] && request.env["HTTP_USER_AGENT"][/(iPhone|iPod|iPad)/i]
109
+ session[:input_device_type] = 'TOUCH'
110
+ session[:hover_supported] = false
111
+ else
112
+ session[:input_device_type] = 'MOUSE'
113
+ session[:hover_supported] = true
114
+ end if session[:input_device_type].nil?
115
+ end
116
+
117
+ def touch_device?
118
+ session[:input_device_type] == 'TOUCH'
119
+ end
120
+
121
+ def hover_via_click?
122
+ session[:hover_supported] == false
123
+ end
124
+
125
+ def self.js_framework=(framework)
126
+ @@js_framework = framework
127
+ end
128
+
129
+ def self.js_framework
130
+ @@js_framework ||= if defined? Jquery
131
+ :jquery
132
+ elsif defined? PrototypeRails
133
+ :prototype
134
+ end
135
+ end
136
+
137
+ def self.js_config=(config)
138
+ @@js_config = config
139
+ end
140
+
141
+ def self.js_config
142
+ @@js_config ||= {:scroll_on_close => true}
143
+ end
144
+
145
+ # exclude bridges you do not need
146
+ # name of bridge subdir should be used to exclude it
147
+ # eg
148
+ # ActiveScaffold.exclude_bridges = [:cancan, :ancestry]
149
+ # if you are using Activescaffold as a gem add to initializer
150
+ # if you are using Activescaffold as a plugin add to active_scaffold_env.rb
151
+ def self.exclude_bridges=(bridges)
152
+ @@exclude_bridges = bridges
153
+ end
154
+
155
+ def self.exclude_bridges
156
+ @@exclude_bridges ||= []
157
+ end
158
+
159
+ def self.root
160
+ File.dirname(__FILE__) + "/.."
161
+ end
162
+
163
+ module ClassMethods
164
+ def active_scaffold(model_id = nil, &block)
165
+ # initialize bridges here
166
+ ActiveScaffold::Bridges.run_all
167
+
168
+ # converts Foo::BarController to 'bar' and FooBarsController to 'foo_bar' and AddressController to 'address'
169
+ model_id = self.to_s.split('::').last.sub(/Controller$/, '').pluralize.singularize.underscore unless model_id
170
+
171
+ # run the configuration
172
+ @active_scaffold_config = ActiveScaffold::Config::Core.new(model_id)
173
+ @active_scaffold_config_block = block
174
+ self.links_for_associations
175
+
176
+ @active_scaffold_frontends = []
177
+ if active_scaffold_config.frontend.to_sym != :default
178
+ active_scaffold_custom_frontend_path = File.join(ActiveScaffold::Config::Core.plugin_directory, 'frontends', active_scaffold_config.frontend.to_s , 'views')
179
+ @active_scaffold_frontends << active_scaffold_custom_frontend_path
180
+ end
181
+ active_scaffold_default_frontend_path = File.join(ActiveScaffold::Config::Core.plugin_directory, 'frontends', 'default' , 'views')
182
+ @active_scaffold_frontends << active_scaffold_default_frontend_path
183
+ @active_scaffold_custom_paths = []
184
+
185
+ self.active_scaffold_superclasses_blocks.each {|superblock| self.active_scaffold_config.configure &superblock}
186
+ self.active_scaffold_config.sti_children = nil # reset sti_children if set in parent block
187
+ self.active_scaffold_config.configure &block if block_given?
188
+ self.active_scaffold_config._configure_sti unless self.active_scaffold_config.sti_children.nil?
189
+ self.active_scaffold_config._load_action_columns
190
+
191
+ # include the rest of the code into the controller: the action core and the included actions
192
+ module_eval do
193
+ include ActiveScaffold::Finder
194
+ include ActiveScaffold::Constraints
195
+ include ActiveScaffold::AttributeParams
196
+ include ActiveScaffold::Actions::Core
197
+ active_scaffold_config.actions.each do |mod|
198
+ name = mod.to_s.camelize
199
+ include "ActiveScaffold::Actions::#{name}".constantize
200
+
201
+ # sneak the action links from the actions into the main set
202
+ if link = active_scaffold_config.send(mod).link rescue nil
203
+ if link.is_a? Array
204
+ link.each {|current| active_scaffold_config.action_links.add_to_group(current, active_scaffold_config.send(mod).action_group)}
205
+ elsif link.is_a? ActiveScaffold::DataStructures::ActionLink
206
+ active_scaffold_config.action_links.add_to_group(link, active_scaffold_config.send(mod).action_group)
207
+ end
208
+ end
209
+ end
210
+ end
211
+ self.append_view_path active_scaffold_paths
212
+ self._add_sti_create_links if self.active_scaffold_config.add_sti_create_links?
213
+ end
214
+
215
+ def parent_prefixes
216
+ @parent_prefixes ||= super << 'active_scaffold_overrides' << ''
217
+ end
218
+
219
+ # To be called after include action modules
220
+ def _add_sti_create_links
221
+ new_action_link = active_scaffold_config.action_links.collection['new']
222
+ unless new_action_link.nil? || active_scaffold_config.sti_children.empty?
223
+ active_scaffold_config.action_links.collection.delete('new')
224
+ active_scaffold_config.sti_children.each do |child|
225
+ new_sti_link = Marshal.load(Marshal.dump(new_action_link)) # deep clone
226
+ new_sti_link.label = child.to_s.camelize.constantize.model_name.human
227
+ new_sti_link.parameters = {:parent_sti => controller_path}
228
+ new_sti_link.controller = Proc.new { active_scaffold_controller_for(child.to_s.camelize.constantize).controller_path }
229
+ active_scaffold_config.action_links.collection.create.add(new_sti_link)
230
+ end
231
+ end
232
+ end
233
+
234
+ # Create the automatic column links. Note that this has to happen when configuration is *done*, because otherwise the Nested module could be disabled. Actually, it could still be disabled later, couldn't it?
235
+ def links_for_associations
236
+ return unless active_scaffold_config.actions.include? :list and active_scaffold_config.actions.include? :nested
237
+ active_scaffold_config.columns.each do |column|
238
+ next unless column.link.nil? and column.autolink?
239
+ #lazy load of action_link, cause it was really slowing down app in dev mode
240
+ #and might lead to trouble cause of cyclic constantization of controllers
241
+ #and might be unnecessary cause it is done before columns are configured
242
+ column.set_link(Proc.new {|col| link_for_association(col)})
243
+ end
244
+ end
245
+
246
+ def active_scaffold_controller_for_column(column, options = {})
247
+ begin
248
+ if options.include?(:controller)
249
+ "#{options[:controller].to_s.camelize}Controller".constantize
250
+ else
251
+ active_scaffold_controller_for(column.association.associated_class)
252
+ end
253
+ rescue ActiveScaffold::ControllerNotFound
254
+ nil
255
+ end
256
+ end
257
+
258
+ def link_for_association(column, options = {})
259
+ controller = active_scaffold_controller_for_column(column, options)
260
+
261
+ unless controller.nil?
262
+ options.reverse_merge! :label => column.label, :position => :after, :type => :member, :controller => controller.controller_path, :column => column
263
+ options[:parameters] ||= {}
264
+ options[:parameters].reverse_merge! :parent_scaffold => controller_path, :association => column.association[:name]
265
+ if column.plural_association?
266
+ # note: we can't create nested scaffolds on :through associations because there's no reverse association.
267
+
268
+ ActiveScaffold::DataStructures::ActionLink.new('index', options) #unless column.through_association?
269
+ else
270
+ actions = [:create, :update, :show]
271
+ actions = controller.active_scaffold_config.actions
272
+ column.actions_for_association_links.delete :new unless actions.include? :create
273
+ column.actions_for_association_links.delete :edit unless actions.include? :update
274
+ column.actions_for_association_links.delete :show unless actions.include? :show
275
+ ActiveScaffold::DataStructures::ActionLink.new(nil, options.merge(:html_options => {:class => column.name}))
276
+ end
277
+ end
278
+ end
279
+
280
+ def link_for_association_as_scope(scope, options = {})
281
+ options.reverse_merge! :label => scope, :position => :after, :type => :member, :controller => controller_path
282
+ options[:parameters] ||= {}
283
+ options[:parameters].reverse_merge! :parent_scaffold => controller_path, :named_scope => scope
284
+ ActiveScaffold::DataStructures::ActionLink.new('index', options)
285
+ end
286
+
287
+ def add_active_scaffold_path(path)
288
+ @active_scaffold_paths = nil # Force active_scaffold_paths to rebuild
289
+ @active_scaffold_custom_paths << path
290
+ end
291
+
292
+ def active_scaffold_paths
293
+ return @active_scaffold_paths unless @active_scaffold_paths.nil?
294
+
295
+ @active_scaffold_paths = []
296
+ @active_scaffold_paths.concat @active_scaffold_custom_paths unless @active_scaffold_custom_paths.nil?
297
+ @active_scaffold_paths.concat @active_scaffold_frontends unless @active_scaffold_frontends.nil?
298
+ @active_scaffold_paths
299
+ end
300
+
301
+ def active_scaffold_config
302
+ if @active_scaffold_config.nil?
303
+ self.superclass.active_scaffold_config if self.superclass.respond_to? :active_scaffold_config
304
+ else
305
+ @active_scaffold_config
306
+ end
307
+ end
308
+
309
+ def active_scaffold_config_block
310
+ @active_scaffold_config_block
311
+ end
312
+
313
+ def active_scaffold_superclasses_blocks
314
+ blocks = []
315
+ klass = self.superclass
316
+ while klass.respond_to? :active_scaffold_superclasses_blocks
317
+ blocks << klass.active_scaffold_config_block
318
+ klass = klass.superclass
319
+ end
320
+ blocks.compact.reverse
321
+ end
322
+
323
+ def active_scaffold_config_for(klass)
324
+ begin
325
+ controller = active_scaffold_controller_for(klass)
326
+ rescue ActiveScaffold::ControllerNotFound
327
+ config = ActiveScaffold::Config::Core.new(klass)
328
+ config._load_action_columns
329
+ config
330
+ else
331
+ controller.active_scaffold_config
332
+ end
333
+ end
334
+
335
+ # Tries to find a controller for the given ActiveRecord model.
336
+ # Searches in the namespace of the current controller for singular and plural versions of the conventional "#{model}Controller" syntax.
337
+ # You may override this method to customize the search routine.
338
+ def active_scaffold_controller_for(klass)
339
+ controller_namespace = self.to_s.split('::')[0...-1].join('::') + '::'
340
+ error_message = []
341
+ [controller_namespace, ''].each do |namespace|
342
+ ["#{klass.to_s.underscore.pluralize}", "#{klass.to_s.underscore.pluralize.singularize}"].each do |controller_name|
343
+ begin
344
+ controller = "#{namespace}#{controller_name.camelize}Controller".constantize
345
+ rescue NameError => error
346
+ # Only rescue NameError associated with the controller constant not existing - not other compile errors
347
+ if error.message["uninitialized constant #{controller}"]
348
+ error_message << "#{namespace}#{controller_name.camelize}Controller"
349
+ next
350
+ else
351
+ raise
352
+ end
353
+ end
354
+ raise ActiveScaffold::ControllerNotFound, "#{controller} missing ActiveScaffold", caller unless controller.uses_active_scaffold?
355
+ raise ActiveScaffold::ControllerNotFound, "ActiveScaffold on #{controller} is not for #{klass} model.", caller unless controller.active_scaffold_config.model.to_s == klass.to_s
356
+ return controller
357
+ end
358
+ end
359
+ raise ActiveScaffold::ControllerNotFound, "Could not find " + error_message.join(" or "), caller
360
+ end
361
+
362
+ def uses_active_scaffold?
363
+ !active_scaffold_config.nil?
364
+ end
365
+ end
366
+ end
367
+
368
+ require 'active_scaffold_env'
@@ -0,0 +1,11 @@
1
+ # TODO: clean up extensions. some could be organized for autoloading, and others could be removed entirely.
2
+ Dir["#{File.dirname __FILE__}/active_scaffold/extensions/*.rb"].each { |file| require file }
3
+
4
+ ActionController::Base.send(:include, ActiveScaffold)
5
+ ActionController::Base.send(:include, ActiveScaffold::RespondsToParent)
6
+ ActionController::Base.send(:include, ActiveScaffold::Helpers::ControllerHelpers)
7
+ ActionView::Base.send(:include, ActiveScaffold::Helpers::ViewHelpers)
8
+
9
+ ActionController::Base.class_eval {include ActiveScaffold::ModelPermissions::ModelUserAccess::Controller}
10
+ Sequel::Model.class_eval {include ActiveScaffold::ModelPermissions::ModelUserAccess::Model}
11
+ Sequel::Model.class_eval {include ActiveScaffold::ModelPermissions::Permissions}
@@ -0,0 +1,29 @@
1
+ Description:
2
+ Scaffolds an entire resource, from model and migration to controller,
3
+ along with a full test suite and configured to use active_scaffold.
4
+ The resource is ready to use as a starting point for your RESTful,
5
+ resource-oriented application.
6
+
7
+ Pass the name of the model (in singular form), either CamelCased or
8
+ under_scored, as the first argument, and an optional list of attribute
9
+ pairs.
10
+
11
+ Attribute pairs are field:type arguments specifying the
12
+ model's attributes. Timestamps are added by default, so you don't have to
13
+ specify them by hand as 'created_at:datetime updated_at:datetime'.
14
+
15
+ You don't have to think up every attribute up front, but it helps to
16
+ sketch out a few so you can start working with the resource immediately.
17
+
18
+ For example, 'active_scaffold post title:string body:text published:boolean'
19
+ gives you a model with those three attributes, a controller configured to use active_scaffold,
20
+ as well as a resources :posts with additional active_scaffold routes
21
+ declaration in config/routes.rb.
22
+
23
+ If you want to remove all the generated files, run
24
+ 'rails destroy active_scaffold ModelName'.
25
+
26
+ Examples:
27
+ `rails generate active_scaffold post`
28
+ `rails generate active_scaffold post title:string body:text published:boolean`
29
+ `rails generate active_scaffold purchase order_id:integer amount:decimal`
@@ -0,0 +1,20 @@
1
+ require 'rails/generators/rails/resource/resource_generator'
2
+ #require 'generators/active_scaffold_controller/active_scaffold_controller_generator'
3
+
4
+ module Rails
5
+ module Generators
6
+ class ActiveScaffoldGenerator < ResourceGenerator #metagenerator
7
+ remove_hook_for :resource_controller
8
+ remove_class_option :actions
9
+
10
+ def add_resource_route
11
+ route_config = class_path.collect{|namespace| "namespace :#{namespace} do " }.join(" ")
12
+ route_config << "resources :#{file_name.pluralize} do as_routes end"
13
+ route_config << " end" * class_path.size
14
+ route route_config
15
+ end
16
+
17
+ invoke "active_scaffold_controller"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ Description:
2
+ Stubs out a active_scaffolded controller. Pass the model name,
3
+ either CamelCased or under_scored.
4
+ The controller name is retrieved as a pluralized version of the model
5
+ name.
6
+
7
+ To create a controller within a module, specify the model name as a
8
+ path like 'parent_module/controller_name'.
9
+
10
+ This generates a controller class in app/controllers and invokes helper,
11
+ template engine and test framework generators.
12
+
13
+ Example:
14
+ `rails generate active_scaffold_controller CreditCard`
15
+
16
+ Credit card controller with URLs like /credit_card/debit.
17
+ Controller: app/controllers/credit_cards_controller.rb
18
+ Functional Test: test/functional/credit_cards_controller_test.rb
19
+ Helper: app/helpers/credit_cards_helper.rb
@@ -0,0 +1,29 @@
1
+ #require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator'
2
+
3
+ module Rails
4
+ module Generators
5
+ class ActiveScaffoldControllerGenerator < NamedBase #metagenerator
6
+ include ResourceHelpers
7
+
8
+ def self.source_root
9
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
10
+ end
11
+
12
+ check_class_collision :suffix => "Controller"
13
+
14
+ class_option :orm, :banner => "NAME", :type => :string, :required => true,
15
+ :desc => "ORM to generate the controller for"
16
+
17
+ def create_controller_files
18
+ template 'controller.rb', File.join('app/controllers', class_path, "#{controller_file_name}_controller.rb")
19
+ template 'helper.rb', File.join('app/helpers', class_path, "#{controller_file_name}_helper.rb")
20
+ end
21
+
22
+ hook_for :test_framework, :as => :scaffold
23
+
24
+ def create_view_root_folder
25
+ empty_directory File.join("app/views", controller_file_path)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,4 @@
1
+ class <%= controller_class_name %>Controller < ApplicationController
2
+ active_scaffold :<%= class_name.demodulize.underscore %> do |conf|
3
+ end
4
+ end
@@ -0,0 +1,2 @@
1
+ module <%= controller_class_name %>Helper
2
+ end
data/public/blank.html ADDED
@@ -0,0 +1,33 @@
1
+ <!--
2
+ Copyright (c) 2005, Brad Neuberg, bkn3@columbia.edu
3
+ http://codinginparadise.org
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the "Software"),
7
+ to deal in the Software without restriction, including without limitation
8
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
+ and/or sell copies of the Software, and to permit persons to whom the
10
+ Software is furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
20
+ OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
21
+ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ -->
23
+
24
+ <html>
25
+ <script language="JavaScript">
26
+ function pageLoaded() {
27
+ window.parent.dhtmlHistory.iframeLoaded(window.location);
28
+ }
29
+ </script>
30
+ <body onload="pageLoaded()">
31
+ <h1>blank.html - Needed for Internet Explorer's hidden IFrame</h1>
32
+ </body>
33
+ </html>
@@ -0,0 +1,136 @@
1
+ class ActiveSupport::TestCase
2
+ def self.should_have_columns_in(action, *columns)
3
+ should "have #{columns.to_sentence} columns in #{action}" do
4
+ assert_equal columns, column_names(action)
5
+ end
6
+ end
7
+
8
+ def self.should_include_columns_in(action, *columns)
9
+ should "include #{columns.to_sentence} columns in #{action}" do
10
+ action_columns = column_names(action)
11
+ columns.each do |column|
12
+ assert action_columns.include?(column.to_sym), "#{column} is not included in #{action}"
13
+ end
14
+ end
15
+ end
16
+
17
+ def self.should_not_include_columns_in(action, *columns)
18
+ should "not include #{columns.to_sentence} columns in #{action}" do
19
+ action_columns = column_names(action)
20
+ columns.each do |column|
21
+ assert !action_columns.include?(column.to_sym), "#{column} is included in #{action}"
22
+ end
23
+ end
24
+ end
25
+
26
+ def self.should_render_as_form_ui(column_name, form_ui)
27
+ should "render column #{column_name} as #{form_ui} form_ui", :before => lambda{
28
+ @rendered_columns = []
29
+ @controller.view_context_class.any_instance.expects(:"active_scaffold_input_#{form_ui}").at_least_once.with {|column, options|
30
+ @rendered_columns << column.name
31
+ true
32
+ }
33
+ } do
34
+ assert_equal form_ui, @controller.active_scaffold_config.columns[column_name].form_ui
35
+ assert @rendered_columns.include?(column_name)
36
+ end
37
+ end
38
+
39
+ def self.should_render_with_options_for_select(column_name, *options)
40
+ should "render column #{column_name} with options for select" do
41
+ converting_sort = lambda{|a,b| a.to_s <=> b.to_s}
42
+ assert_equal options.sort(&converting_sort), @controller.active_scaffold_config.columns[column_name].options[:options].sort(&converting_sort)
43
+ end
44
+ end
45
+
46
+ def self.should_render_as_form_override(column_name)
47
+ should "render column #{column_name} as form override" do
48
+ column = @controller.active_scaffold_config.columns[column_name]
49
+ assert @response.template.override_form_field?(column)
50
+ assert_template :partial => "_#{column_name}_form_column", :count => 0
51
+ end
52
+ end
53
+
54
+ def self.should_render_as_form_partial_override(column_name)
55
+ should "render column #{column_name} as form partial override" do
56
+ assert_template :partial => "_#{column_name}_form_column"
57
+ end
58
+ end
59
+
60
+ def self.should_render_as_form_hidden(column_name)
61
+ should "render column #{column_name} as form hidden", :before => lambda{
62
+ @rendered_columns = []
63
+ @controller.view_context_class.any_instance.expects(:"hidden_field").at_least_once.with {|object, method, options|
64
+ @rendered_columns << method
65
+ true
66
+ }
67
+ } do
68
+ assert_template :partial => "_form_hidden_attribute"
69
+ assert @rendered_columns.include?(column_name)
70
+ end
71
+ end
72
+
73
+ def self.should_render_as_list_ui(column_name, list_ui)
74
+ should "render column #{column_name} as #{list_ui} list_ui", :before => lambda{
75
+ @rendered_columns = []
76
+ @controller.view_context_class.any_instance.expects(:"active_scaffold_column_#{list_ui}").at_least_once.with {|column, options|
77
+ @rendered_columns << column.name
78
+ true
79
+ }
80
+ } do
81
+ assert_equal list_ui, @controller.active_scaffold_config.columns[column_name].list_ui
82
+ assert @rendered_columns.include?(column_name)
83
+ end
84
+ end
85
+
86
+ def self.should_render_as_field_override(column_name)
87
+ should "render column #{column_name} as field override" do
88
+ column = @controller.active_scaffold_config.columns[column_name]
89
+ assert @response.template.override_form_field?(column)
90
+ assert_template :partial => "_#{column_name}_column", :count => 0
91
+ end
92
+ end
93
+
94
+ def self.should_render_as_field_partial_override(column_name)
95
+ should "render column #{column_name} as field partial override" do
96
+ assert_template :partial => "_#{column_name}_column"
97
+ end
98
+ end
99
+
100
+ def self.should_render_as_inplace_edit(column_name)
101
+ should "render column #{column_name} as inplace edit", :before => lambda{
102
+ @column = @controller.active_scaffold_config.columns[column_name]
103
+ @rendered_columns = []
104
+ method = @column.list_ui == :checkbox ? :format_column_checkbox : :active_scaffold_inplace_edit
105
+ @controller.view_context_class.any_instance.expects(method).at_least_once.with {|model, column, options|
106
+ @rendered_columns << column.name
107
+ true
108
+ }
109
+ } do
110
+ assert @column.inplace_edit
111
+ assert @rendered_columns.include?(column_name)
112
+ end
113
+ end
114
+
115
+ def self.should_respond_to_parent_redirecting_to(description, &block)
116
+ should_respond_to_parent("redirecting to #{description}") { "document.location.href = \"#{instance_eval(&block)}\"" }
117
+ end
118
+
119
+ def self.should_respond_to_parent(description = nil, &block)
120
+ should "respond to parent #{description}" do
121
+ script = block ? instance_eval(&block) : /.*/
122
+ script = script.is_a?(Regexp) ? script.source : Regexp.quote(script)
123
+ script = script.gsub('\n', '\\\\\\n').
124
+ gsub(/['"]/, '\\\\\\\\\&').
125
+ gsub('</script>','</scr"+"ipt>')
126
+ assert_select 'script[type=text/javascript]', Regexp.new('.*' + Regexp.quote("with(window.parent) { setTimeout(function() { window.eval('") + script + Regexp.quote("'); if (typeof(loc) !== 'undefined') loc.replace('about:blank'); }, 1) };") + '.*')
127
+ end
128
+ end
129
+
130
+ private
131
+ def column_names(action)
132
+ columns = []
133
+ @controller.active_scaffold_config.send(action).columns.each(:flatten => true) {|col| columns << col.name}
134
+ columns
135
+ end
136
+ end