alchemy_cms 2.1.12 → 2.2.rc1

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 (405) hide show
  1. data/.travis.yml +1 -1
  2. data/Gemfile +20 -16
  3. data/README.md +11 -7
  4. data/alchemy_cms.gemspec +31 -29
  5. data/app/assets/javascripts/alchemy/alchemy.base.js +234 -233
  6. data/app/assets/javascripts/alchemy/alchemy.buttons.js +26 -26
  7. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +32 -32
  8. data/app/assets/javascripts/alchemy/alchemy.dirty.js +78 -78
  9. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +103 -103
  10. data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +84 -84
  11. data/app/assets/javascripts/alchemy/alchemy.elements_window.js +88 -88
  12. data/app/assets/javascripts/alchemy/alchemy.file_progress.js +92 -0
  13. data/app/assets/javascripts/alchemy/alchemy.growler.js +23 -23
  14. data/app/assets/javascripts/alchemy/alchemy.html5.js +23 -0
  15. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +53 -52
  16. data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +33 -30
  17. data/app/assets/javascripts/alchemy/alchemy.js +2 -0
  18. data/app/assets/javascripts/alchemy/alchemy.js_extensions.js +14 -14
  19. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +181 -0
  20. data/app/assets/javascripts/alchemy/alchemy.menubar.js +48 -48
  21. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +39 -39
  22. data/app/assets/javascripts/alchemy/alchemy.preview.js +81 -83
  23. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +86 -86
  24. data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +23 -23
  25. data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +208 -353
  26. data/app/assets/javascripts/alchemy/alchemy.uploader.js +279 -0
  27. data/app/assets/javascripts/alchemy/alchemy.windows.js +268 -268
  28. data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +42 -42
  29. data/app/assets/stylesheets/alchemy/_defaults.scss +89 -89
  30. data/app/assets/stylesheets/alchemy/base.css.scss +790 -804
  31. data/app/assets/stylesheets/alchemy/buttons.css.scss +263 -264
  32. data/app/assets/stylesheets/alchemy/dashboard.css.scss +66 -66
  33. data/app/assets/stylesheets/alchemy/elements.css.scss +575 -564
  34. data/app/assets/stylesheets/alchemy/flash.css.scss +45 -45
  35. data/app/assets/stylesheets/alchemy/frame.css.scss +262 -262
  36. data/app/assets/stylesheets/alchemy/icons.css.scss +86 -86
  37. data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +706 -707
  38. data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +46 -27
  39. data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +107 -107
  40. data/app/assets/stylesheets/alchemy/login.css.scss +40 -38
  41. data/app/assets/stylesheets/alchemy/menubar.css.scss +84 -82
  42. data/app/assets/stylesheets/alchemy/modules.css.scss +9 -9
  43. data/app/assets/stylesheets/alchemy/pagination.css.scss +49 -49
  44. data/app/assets/stylesheets/alchemy/print.css +7 -7
  45. data/app/assets/stylesheets/alchemy/sitemap.css.scss +185 -154
  46. data/app/assets/stylesheets/alchemy/standard_set.css +205 -206
  47. data/app/assets/stylesheets/alchemy/tables.css.scss +94 -60
  48. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +34 -34
  49. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +177 -177
  50. data/app/assets/stylesheets/alchemy/upload.css.scss +68 -45
  51. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +222 -221
  52. data/app/controllers/alchemy/admin/attachments_controller.rb +100 -100
  53. data/app/controllers/alchemy/admin/base_controller.rb +116 -116
  54. data/app/controllers/alchemy/admin/clipboard_controller.rb +44 -44
  55. data/app/controllers/alchemy/admin/contents_controller.rb +55 -55
  56. data/app/controllers/alchemy/admin/dashboard_controller.rb +12 -11
  57. data/app/controllers/alchemy/admin/elements_controller.rb +109 -109
  58. data/app/controllers/alchemy/admin/essence_audios_controller.rb +8 -8
  59. data/app/controllers/alchemy/admin/essence_files_controller.rb +20 -20
  60. data/app/controllers/alchemy/admin/essence_flashes_controller.rb +8 -8
  61. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +81 -81
  62. data/app/controllers/alchemy/admin/essence_videos_controller.rb +8 -8
  63. data/app/controllers/alchemy/admin/languages_controller.rb +16 -4
  64. data/app/controllers/alchemy/admin/layoutpages_controller.rb +9 -9
  65. data/app/controllers/alchemy/admin/pages_controller.rb +249 -248
  66. data/app/controllers/alchemy/admin/pictures_controller.rb +105 -105
  67. data/app/controllers/alchemy/admin/resources_controller.rb +111 -166
  68. data/app/controllers/alchemy/admin/trash_controller.rb +18 -18
  69. data/app/controllers/alchemy/admin/users_controller.rb +69 -69
  70. data/app/controllers/alchemy/attachments_controller.rb +27 -27
  71. data/app/controllers/alchemy/base_controller.rb +159 -155
  72. data/app/controllers/alchemy/elements_controller.rb +16 -16
  73. data/app/controllers/alchemy/messages_controller.rb +59 -59
  74. data/app/controllers/alchemy/pages_controller.rb +194 -198
  75. data/app/controllers/alchemy/pictures_controller.rb +57 -57
  76. data/app/controllers/alchemy/user_sessions_controller.rb +70 -70
  77. data/app/helpers/alchemy/admin/attachments_helper.rb +7 -7
  78. data/app/helpers/alchemy/admin/base_helper.rb +425 -425
  79. data/app/helpers/alchemy/admin/contents_helper.rb +72 -72
  80. data/app/helpers/alchemy/admin/elements_helper.rb +108 -107
  81. data/app/helpers/alchemy/admin/essences_helper.rb +108 -108
  82. data/app/helpers/alchemy/admin/pages_helper.rb +42 -42
  83. data/app/helpers/alchemy/admin/pictures_helper.rb +26 -26
  84. data/app/helpers/alchemy/base_helper.rb +90 -90
  85. data/app/helpers/alchemy/elements_helper.rb +167 -168
  86. data/app/helpers/alchemy/essences_helper.rb +133 -133
  87. data/app/helpers/alchemy/pages_helper.rb +515 -526
  88. data/app/helpers/alchemy/pictures_helper.rb +19 -0
  89. data/app/mailers/alchemy/messages.rb +13 -13
  90. data/app/mailers/alchemy/notifications.rb +19 -19
  91. data/app/models/alchemy.rb +3 -3
  92. data/app/models/alchemy/attachment.rb +52 -78
  93. data/app/models/alchemy/cell.rb +48 -48
  94. data/app/models/alchemy/content.rb +196 -196
  95. data/app/models/alchemy/element.rb +500 -490
  96. data/app/models/alchemy/essence_audio.rb +7 -7
  97. data/app/models/alchemy/essence_date.rb +10 -10
  98. data/app/models/alchemy/essence_file.rb +7 -7
  99. data/app/models/alchemy/essence_flash.rb +6 -6
  100. data/app/models/alchemy/essence_html.rb +9 -9
  101. data/app/models/alchemy/essence_picture.rb +17 -17
  102. data/app/models/alchemy/essence_richtext.rb +53 -53
  103. data/app/models/alchemy/essence_text.rb +21 -21
  104. data/app/models/alchemy/essence_video.rb +7 -7
  105. data/app/models/alchemy/folded_page.rb +3 -3
  106. data/app/models/alchemy/language.rb +91 -91
  107. data/app/models/alchemy/language/code.rb +14 -14
  108. data/app/models/alchemy/message.rb +48 -45
  109. data/app/models/alchemy/page.rb +555 -558
  110. data/app/models/alchemy/picture.rb +100 -99
  111. data/app/models/alchemy/user.rb +76 -74
  112. data/app/models/alchemy/user_session.rb +8 -8
  113. data/app/sweepers/alchemy/content_sweeper.rb +15 -15
  114. data/app/sweepers/alchemy/pages_sweeper.rb +50 -50
  115. data/app/sweepers/alchemy/pictures_sweeper.rb +14 -14
  116. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +23 -23
  117. data/app/views/alchemy/admin/attachments/_attachment.html.erb +56 -56
  118. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +15 -15
  119. data/app/views/alchemy/admin/attachments/_files_list.html.erb +16 -16
  120. data/app/views/alchemy/admin/attachments/create.js.erb +2 -2
  121. data/app/views/alchemy/admin/attachments/destroy.js.erb +3 -3
  122. data/app/views/alchemy/admin/attachments/edit.html.erb +10 -10
  123. data/app/views/alchemy/admin/attachments/index.html.erb +14 -14
  124. data/app/views/alchemy/admin/attachments/new.html.erb +9 -9
  125. data/app/views/alchemy/admin/clipboard/index.html.erb +21 -21
  126. data/app/views/alchemy/admin/clipboard/insert.js.erb +5 -5
  127. data/app/views/alchemy/admin/contents/_missing.html.erb +1 -1
  128. data/app/views/alchemy/admin/contents/create.js.erb +33 -33
  129. data/app/views/alchemy/admin/contents/destroy.js.erb +5 -5
  130. data/app/views/alchemy/admin/contents/new.html.erb +13 -13
  131. data/app/views/alchemy/admin/contents/order.js.erb +2 -2
  132. data/app/views/alchemy/admin/dashboard/index.html.erb +96 -92
  133. data/app/views/alchemy/admin/elements/_add_content.html.erb +12 -12
  134. data/app/views/alchemy/admin/elements/_element.html.erb +3 -3
  135. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +28 -28
  136. data/app/views/alchemy/admin/elements/_picture_editor.html.erb +21 -21
  137. data/app/views/alchemy/admin/elements/create.js.erb +32 -32
  138. data/app/views/alchemy/admin/elements/index.html.erb +2 -2
  139. data/app/views/alchemy/admin/elements/new.html.erb +31 -31
  140. data/app/views/alchemy/admin/elements/order.js.erb +3 -3
  141. data/app/views/alchemy/admin/elements/trash.js.erb +13 -13
  142. data/app/views/alchemy/admin/elements/update.js.erb +6 -6
  143. data/app/views/alchemy/admin/essence_files/assign.js.erb +6 -6
  144. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +32 -32
  145. data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +1 -1
  146. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +1 -1
  147. data/app/views/alchemy/admin/essence_pictures/update.js.erb +11 -11
  148. data/app/views/alchemy/admin/languages/_form.html.erb +51 -45
  149. data/app/views/alchemy/admin/languages/_language.html.erb +45 -45
  150. data/app/views/alchemy/admin/languages/_table.html.erb +25 -25
  151. data/app/views/alchemy/admin/layoutpages/index.html.erb +35 -35
  152. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +42 -42
  153. data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
  154. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +27 -27
  155. data/app/views/alchemy/admin/pages/_page.html.erb +112 -112
  156. data/app/views/alchemy/admin/pages/_sitemap.html.erb +1 -1
  157. data/app/views/alchemy/admin/pages/configure.html.erb +71 -69
  158. data/app/views/alchemy/admin/pages/configure_external.html.erb +38 -38
  159. data/app/views/alchemy/admin/pages/destroy.js.erb +10 -10
  160. data/app/views/alchemy/admin/pages/edit.html.erb +165 -165
  161. data/app/views/alchemy/admin/pages/fold.js.erb +2 -2
  162. data/app/views/alchemy/admin/pages/index.html.erb +66 -66
  163. data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
  164. data/app/views/alchemy/admin/pages/new.html.erb +40 -40
  165. data/app/views/alchemy/admin/pages/sort.js.erb +4 -4
  166. data/app/views/alchemy/admin/pages/unlock.js.erb +6 -6
  167. data/app/views/alchemy/admin/pages/update.js.erb +19 -19
  168. data/app/views/alchemy/admin/partials/_flash.html.erb +2 -2
  169. data/app/views/alchemy/admin/partials/_flash_notices.html.erb +1 -1
  170. data/app/views/alchemy/admin/partials/_flash_upload.html.erb +38 -0
  171. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -15
  172. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +8 -8
  173. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +35 -35
  174. data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -14
  175. data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +6 -6
  176. data/app/views/alchemy/admin/partials/_upload_form.html.erb +56 -118
  177. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +11 -11
  178. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +71 -71
  179. data/app/views/alchemy/admin/pictures/_picture.html.erb +32 -32
  180. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +26 -26
  181. data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +6 -6
  182. data/app/views/alchemy/admin/pictures/create.js.erb +7 -7
  183. data/app/views/alchemy/admin/pictures/index.html.erb +67 -67
  184. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +5 -4
  185. data/app/views/alchemy/admin/resources/_form.html.erb +25 -19
  186. data/app/views/alchemy/admin/resources/_resource.html.erb +37 -36
  187. data/app/views/alchemy/admin/resources/_table.html.erb +17 -17
  188. data/app/views/alchemy/admin/resources/destroy.js.erb +1 -1
  189. data/app/views/alchemy/admin/resources/index.html.erb +14 -14
  190. data/app/views/alchemy/admin/trash/index.html.erb +20 -20
  191. data/app/views/alchemy/admin/users/_table.html.erb +52 -52
  192. data/app/views/alchemy/admin/users/_user.html.erb +35 -36
  193. data/app/views/alchemy/admin/users/index.html.erb +26 -27
  194. data/app/views/alchemy/base/error_notice.html.erb +2 -2
  195. data/app/views/alchemy/base/update.js.erb +1 -1
  196. data/app/views/alchemy/elements/_contactform_view.html.erb +76 -76
  197. data/app/views/alchemy/elements/_download_view.html.erb +1 -1
  198. data/app/views/alchemy/elements/_editor_not_found.html.erb +3 -3
  199. data/app/views/alchemy/elements/_searchresult_view.html.erb +2 -2
  200. data/app/views/alchemy/elements/_sitemap_editor.html.erb +1 -1
  201. data/app/views/alchemy/essences/_essence_audio_view.html.erb +13 -13
  202. data/app/views/alchemy/essences/_essence_date_editor.html.erb +10 -10
  203. data/app/views/alchemy/essences/_essence_file_editor.html.erb +62 -62
  204. data/app/views/alchemy/essences/_essence_file_view.html.erb +8 -8
  205. data/app/views/alchemy/essences/_essence_flash_view.html.erb +19 -19
  206. data/app/views/alchemy/essences/_essence_html_editor.html.erb +6 -6
  207. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +73 -73
  208. data/app/views/alchemy/essences/_essence_picture_view.html.erb +34 -34
  209. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +7 -7
  210. data/app/views/alchemy/essences/_essence_text_editor.html.erb +8 -8
  211. data/app/views/alchemy/navigation/_image_link.html.erb +12 -12
  212. data/app/views/alchemy/navigation/_link.html.erb +13 -13
  213. data/app/views/alchemy/navigation/_renderer.html.erb +17 -17
  214. data/app/views/alchemy/page_layouts/_layout_footer.html.erb +1 -1
  215. data/app/views/alchemy/page_layouts/_layout_header.html.erb +1 -1
  216. data/app/views/alchemy/pages/show.rss.builder +14 -14
  217. data/app/views/alchemy/search/_result.html.erb +7 -7
  218. data/app/views/alchemy/user_sessions/leave.html.erb +9 -9
  219. data/app/views/alchemy/user_sessions/login.html.erb +39 -39
  220. data/app/views/alchemy/user_sessions/logout.html.erb +1 -1
  221. data/app/views/layouts/alchemy/admin.html.erb +81 -81
  222. data/app/views/layouts/alchemy/login.html.erb +36 -36
  223. data/app/views/layouts/alchemy/pages.html.erb +48 -27
  224. data/bin/alchemy +136 -134
  225. data/config/alchemy/config.yml +13 -9
  226. data/config/locales/alchemy.de.yml +24 -30
  227. data/config/locales/alchemy.en.yml +11 -28
  228. data/config/routes.rb +146 -146
  229. data/db/migrate/20100607193638_create_essence_pictures.rb +3 -3
  230. data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +1 -1
  231. data/db/migrate/20101109151812_create_languages.rb +3 -3
  232. data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +3 -3
  233. data/db/migrate/20110224105120_change_pages_visible_default.rb +3 -3
  234. data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +2 -2
  235. data/db/migrate/20110414163140_remove_display_name_from_elements.rb +3 -3
  236. data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +2 -2
  237. data/db/migrate/20110529130500_add_cell_id_to_elements.rb +3 -3
  238. data/db/migrate/20110530102804_change_pages_page_layout_column.rb +3 -3
  239. data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +1 -1
  240. data/db/migrate/20111116125112_namespace_alchemy_models.rb +21 -21
  241. data/lib/alchemy/auth_engine.rb +5 -5
  242. data/lib/alchemy/capistrano.rb +64 -64
  243. data/lib/alchemy/config.rb +47 -44
  244. data/lib/alchemy/engine.rb +41 -41
  245. data/lib/alchemy/essence.rb +50 -51
  246. data/lib/alchemy/i18n.rb +48 -48
  247. data/lib/alchemy/modules.rb +30 -30
  248. data/lib/alchemy/mount_point.rb +6 -6
  249. data/lib/alchemy/page_layout.rb +94 -93
  250. data/lib/alchemy/resource.rb +82 -0
  251. data/lib/alchemy/resources_helper.rb +56 -0
  252. data/lib/alchemy/scoped_pagination_url_helper.rb +8 -8
  253. data/lib/alchemy/seeder.rb +88 -88
  254. data/lib/alchemy/tinymce.rb +49 -49
  255. data/lib/alchemy/upgrader.rb +103 -103
  256. data/lib/alchemy/version.rb +1 -1
  257. data/lib/alchemy_cms.rb +26 -27
  258. data/lib/extensions/action_view.rb +1 -1
  259. data/lib/extensions/array.rb +3 -3
  260. data/lib/extensions/hash.rb +3 -3
  261. data/lib/middleware/flash_session_cookie.rb +1 -1
  262. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +24 -24
  263. data/lib/rails/generators/alchemy/elements/elements_generator.rb +7 -7
  264. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +17 -17
  265. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +6 -6
  266. data/lib/rails/generators/alchemy/plugin/templates/authorization_rules.rb +8 -8
  267. data/lib/rails/generators/alchemy/scaffold/files/pages.html.erb +7 -7
  268. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +36 -36
  269. data/lib/rails/templates/alchemy.rb +1 -1
  270. data/lib/tasks/ferret.rake +2 -2
  271. data/lib/tasks/fleximage.rake +32 -32
  272. data/lib/tasks/install.rake +12 -12
  273. data/lib/tasks/upgrade.rake +4 -4
  274. data/spec/controllers/admin/clipboard_controller_spec.rb +43 -43
  275. data/spec/controllers/admin/contents_controller_spec.rb +22 -22
  276. data/spec/controllers/admin/elements_controller_spec.rb +13 -13
  277. data/spec/controllers/admin/languages_controller_spec.rb +31 -0
  278. data/spec/controllers/admin/pages_controller_spec.rb +10 -41
  279. data/spec/controllers/admin/resources_controller_spec.rb +19 -0
  280. data/spec/controllers/admin/trash_controller_spec.rb +11 -11
  281. data/spec/controllers/base_controller_spec.rb +46 -46
  282. data/spec/controllers/pages_controller_spec.rb +102 -92
  283. data/spec/dummy/app/controllers/admin/events_controller.rb +3 -0
  284. data/spec/dummy/app/controllers/errors_controller.rb +5 -0
  285. data/spec/dummy/app/models/event.rb +3 -0
  286. data/spec/dummy/config.ru +1 -1
  287. data/spec/dummy/config/application.rb +3 -0
  288. data/spec/dummy/config/authorization_rules.rb +7 -0
  289. data/spec/dummy/config/environments/development.rb +8 -1
  290. data/spec/dummy/config/environments/production.rb +1 -1
  291. data/spec/dummy/config/environments/test.rb +5 -2
  292. data/spec/dummy/config/routes.rb +9 -1
  293. data/spec/dummy/db/schema.rb +47 -35
  294. data/spec/dummy/public/404.html +19 -7
  295. data/spec/dummy/public/404.html.bak +26 -0
  296. data/spec/dummy/public/422.html +19 -7
  297. data/spec/dummy/public/500.html +19 -7
  298. data/spec/dummy/script/rails +2 -2
  299. data/spec/factories.rb +76 -76
  300. data/spec/helpers/admin/base_helper_spec.rb +21 -21
  301. data/spec/helpers/admin/contents_helper_spec.rb +14 -14
  302. data/spec/helpers/admin/elements_helper_spec.rb +40 -40
  303. data/spec/helpers/admin/essences_helper_spec.rb +7 -7
  304. data/spec/helpers/elements_helper_spec.rb +154 -154
  305. data/spec/helpers/essences_helper_spec.rb +10 -10
  306. data/spec/helpers/pages_helper_spec.rb +369 -372
  307. data/spec/helpers/pictures_helper_spec.rb +14 -0
  308. data/spec/helpers/url_helpers_spec.rb +29 -34
  309. data/spec/integration/admin/pages_controller_spec.rb +50 -50
  310. data/spec/integration/admin/resources_integration_spec.rb +100 -0
  311. data/spec/integration/navigation_spec.rb +1 -1
  312. data/spec/integration/pages_controller_spec.rb +205 -207
  313. data/spec/integration/security_spec.rb +47 -47
  314. data/spec/javascripts/alchemy/link_overlay_spec.js.coffee +42 -0
  315. data/spec/javascripts/alchemy_integration_spec.coffee +12 -0
  316. data/spec/javascripts/fixtures/select.html +3 -0
  317. data/spec/javascripts/helpers/.gitkeep +0 -0
  318. data/spec/javascripts/helpers/jasmine-jquery-1.3.1.js +289 -0
  319. data/spec/javascripts/helpers/mock-ajax.js +207 -0
  320. data/spec/javascripts/helpers/test_responses/test_responses.js +1 -0
  321. data/spec/javascripts/spec.css +3 -0
  322. data/spec/javascripts/spec.js +2 -0
  323. data/spec/libraries/resource_spec.rb +122 -0
  324. data/spec/libraries/resources_helper_spec.rb +105 -0
  325. data/spec/models/content_spec.rb +67 -67
  326. data/spec/models/element_spec.rb +133 -133
  327. data/spec/models/essence_picture_spec.rb +5 -5
  328. data/spec/models/essence_richtext_spec.rb +4 -4
  329. data/spec/models/language_spec.rb +89 -89
  330. data/spec/models/page_spec.rb +436 -506
  331. data/spec/models/picture_spec.rb +34 -34
  332. data/spec/models/user_spec.rb +2 -2
  333. data/spec/page_layout_spec.rb +24 -20
  334. data/spec/routing_spec.rb +253 -253
  335. data/spec/spec_helper.rb +51 -50
  336. data/spec/support/alchemy/controller_hacks.rb +25 -25
  337. data/spec/support/alchemy/specs_helpers.rb +25 -25
  338. data/spec/support/integration_spec_helper.rb +24 -0
  339. data/vendor/assets/javascripts/jquery_plugins/jquery.html5uploader.js +271 -0
  340. data/vendor/assets/javascripts/jquery_plugins/jquery.in-place-edit.js +86 -85
  341. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +380 -377
  342. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +285 -279
  343. data/vendor/assets/javascripts/swfupload/SWFObject License.txt +3 -3
  344. data/vendor/assets/javascripts/swfupload/swfupload.cookies.js +47 -47
  345. data/vendor/assets/javascripts/swfupload/swfupload.js +612 -612
  346. data/vendor/assets/javascripts/swfupload/swfupload.queue.js +93 -93
  347. data/vendor/assets/javascripts/swfupload/swfupload.speed.js +337 -337
  348. data/vendor/assets/javascripts/swfupload/swfupload.swfobject.js +706 -102
  349. data/vendor/assets/javascripts/tiny_mce/license.txt +6 -6
  350. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +97 -97
  351. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +386 -376
  352. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +30 -30
  353. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +45 -45
  354. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +20 -17
  355. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +12 -12
  356. data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +183 -173
  357. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +4 -4
  358. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +7 -7
  359. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +3 -3
  360. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +282 -280
  361. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +15 -15
  362. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +204 -204
  363. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +435 -435
  364. data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +24 -22
  365. data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +144 -136
  366. data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +184 -168
  367. data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +62 -46
  368. data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +17 -16
  369. data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +56 -47
  370. data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +67 -54
  371. data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +852 -1
  372. data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +79 -69
  373. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +48 -48
  374. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +28 -28
  375. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +317 -317
  376. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +248 -246
  377. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +246 -246
  378. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +146 -146
  379. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +31 -31
  380. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -1
  381. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -1
  382. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -1
  383. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
  384. data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +53 -46
  385. data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +57 -45
  386. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +182 -47
  387. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +399 -92
  388. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +891 -187
  389. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +102 -24
  390. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +377 -78
  391. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +452 -77
  392. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +167 -45
  393. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +399 -92
  394. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +890 -190
  395. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +33 -7
  396. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +15 -4
  397. data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +18 -15
  398. data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +46 -46
  399. data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +124 -124
  400. data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +112 -112
  401. data/vendor/assets/javascripts/tiny_mce/utils/validate.js +213 -213
  402. metadata +102 -115
  403. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +0 -216
  404. data/lib/tasks/routes.rake +0 -29
  405. data/spec/integration/admin/resources_spec.rb +0 -19
@@ -1,46 +1,46 @@
1
1
  module Alchemy
2
- module Admin
3
- module PagesHelper
2
+ module Admin
3
+ module PagesHelper
4
4
 
5
- def tinymce_javascript_tags
6
- init = Alchemy::Tinymce.init
7
- if init.is_a?(Hash)
8
- init = HashWithIndifferentAccess.new(init)
9
- init = init.keys.sort.collect(&:to_s).sort.collect do |key|
10
- [key, init[key]]
11
- end
12
- end
13
- init = init.collect { |key, value| "#{key} : #{value.to_json}" }.join(', ')
14
-
15
- setup = "init.setup = #{Alchemy::Tinymce.setup};" if Alchemy::Tinymce.setup
16
- return "
17
- <script type='text/javascript'>
18
- jQuery(function(){
19
- if (typeof(Alchemy) !== 'object') { Alchemy = {}; };
20
- Alchemy.Tinymce = {
21
- init : function(callback) {
22
- var init = { #{init} };
23
- init.mode = 'specific_textareas';
24
- init.editor_selector = 'tinymce';
25
- init.plugins = '#{Alchemy::Tinymce.plugins.join(',')}';
26
- init.language = '#{::I18n.locale}';
27
- init.init_instance_callback = function(inst) {
28
- jQuery('#' + inst.editorId).prev('.essence_richtext_loader').hide();
29
- }
30
- if (callback)
31
- init.oninit = callback;
32
- #{setup}
33
- tinymce.init(init);
34
- },
35
- addEditor : function(dom_id) {
36
- tinymce.execCommand('mceAddControl', true, dom_id);
37
- }
38
- };
39
- Alchemy.Tinymce.init();
40
- });
41
- </script>".html_safe
42
- end
5
+ def tinymce_javascript_tags
6
+ init = Alchemy::Tinymce.init
7
+ if init.is_a?(Hash)
8
+ init = HashWithIndifferentAccess.new(init)
9
+ init = init.keys.sort.collect(&:to_s).sort.collect do |key|
10
+ [key, init[key]]
11
+ end
12
+ end
13
+ init = init.collect { |key, value| "#{key} : #{value.to_json}" }.join(', ')
43
14
 
44
- end
45
- end
15
+ setup = "init.setup = #{Alchemy::Tinymce.setup};" if Alchemy::Tinymce.setup
16
+ return "
17
+ <script type='text/javascript'>
18
+ jQuery(function(){
19
+ if (typeof(Alchemy) !== 'object') { Alchemy = {}; };
20
+ Alchemy.Tinymce = {
21
+ init : function(callback) {
22
+ var init = { #{init} };
23
+ init.mode = 'specific_textareas';
24
+ init.editor_selector = 'tinymce';
25
+ init.plugins = '#{Alchemy::Tinymce.plugins.join(',')}';
26
+ init.language = '#{::I18n.locale}';
27
+ init.init_instance_callback = function(inst) {
28
+ jQuery('#' + inst.editorId).prev('.essence_richtext_loader').hide();
29
+ }
30
+ if (callback)
31
+ init.oninit = callback;
32
+ #{setup}
33
+ tinymce.init(init);
34
+ },
35
+ addEditor : function(dom_id) {
36
+ tinymce.execCommand('mceAddControl', true, dom_id);
37
+ }
38
+ };
39
+ Alchemy.Tinymce.init();
40
+ });
41
+ </script>".html_safe
42
+ end
43
+
44
+ end
45
+ end
46
46
  end
@@ -1,30 +1,30 @@
1
1
  module Alchemy
2
- module Admin
3
- module PicturesHelper
2
+ module Admin
3
+ module PicturesHelper
4
4
 
5
- def create_or_assign_url(picture_to_assign, options)
6
- if @content.nil?
7
- {
8
- :controller => :contents,
9
- :action => :create,
10
- :picture_id => picture_to_assign.id,
11
- :content => {
12
- :essence_type => "Alchemy::EssencePicture",
13
- :element_id => @element.id
14
- },
15
- :options => options
16
- }
17
- else
18
- {
19
- :controller => :essence_pictures,
20
- :action => :assign,
21
- :picture_id => picture_to_assign.id,
22
- :id => @content.id,
23
- :options => options
24
- }
25
- end
26
- end
5
+ def create_or_assign_url(picture_to_assign, options)
6
+ if @content.nil?
7
+ {
8
+ :controller => :contents,
9
+ :action => :create,
10
+ :picture_id => picture_to_assign.id,
11
+ :content => {
12
+ :essence_type => "Alchemy::EssencePicture",
13
+ :element_id => @element.id
14
+ },
15
+ :options => options
16
+ }
17
+ else
18
+ {
19
+ :controller => :essence_pictures,
20
+ :action => :assign,
21
+ :picture_id => picture_to_assign.id,
22
+ :id => @content.id,
23
+ :options => options
24
+ }
25
+ end
26
+ end
27
27
 
28
- end
29
- end
28
+ end
29
+ end
30
30
  end
@@ -1,103 +1,103 @@
1
1
  module Alchemy
2
- module BaseHelper
2
+ module BaseHelper
3
3
 
4
- # An alias for truncate.
5
- # Left here for downwards compatibilty.
6
- def shorten(text, length)
7
- text.truncate(:length => length)
8
- end
4
+ # An alias for truncate.
5
+ # Left here for downwards compatibilty.
6
+ def shorten(text, length)
7
+ text.truncate(:length => length)
8
+ end
9
9
 
10
- # Returns @current_language set in the action (e.g. Page.show)
11
- def current_language
12
- if @current_language.nil?
13
- warning('@current_language is not set')
14
- return nil
15
- else
16
- @current_language
17
- end
18
- end
10
+ # Returns @current_language set in the action (e.g. Page.show)
11
+ def current_language
12
+ if @current_language.nil?
13
+ warning('@current_language is not set')
14
+ return nil
15
+ else
16
+ @current_language
17
+ end
18
+ end
19
19
 
20
- def parse_sitemap_name(page)
21
- if multi_language?
22
- pathname = "/#{session[:language_code]}/#{page.urlname}"
23
- else
24
- pathname = "/#{page.urlname}"
25
- end
26
- pathname
27
- end
20
+ def parse_sitemap_name(page)
21
+ if multi_language?
22
+ pathname = "/#{session[:language_code]}/#{page.urlname}"
23
+ else
24
+ pathname = "/#{page.urlname}"
25
+ end
26
+ pathname
27
+ end
28
28
 
29
- # Logs a message in the Rails logger (warn level) and optionally displays an error message to the user.
30
- def warning(message, text = nil)
31
- logger.warn %(\n
32
- ++++ WARNING: #{message}! from: #{caller.first}\n
33
- )
34
- unless text.nil?
35
- warning = content_tag('p', :class => 'content_editor_error') do
36
- render_icon('warning') + text
37
- end
38
- return warning
39
- end
40
- end
29
+ # Logs a message in the Rails logger (warn level) and optionally displays an error message to the user.
30
+ def warning(message, text = nil)
31
+ logger.warn %(\n
32
+ ++++ WARNING: #{message}! from: #{caller.first}\n
33
+ )
34
+ unless text.nil?
35
+ warning = content_tag('p', :class => 'content_editor_error') do
36
+ render_icon('warning') + text
37
+ end
38
+ return warning
39
+ end
40
+ end
41
41
 
42
- # Taken from tinymce_hammer plugin
43
- def append_class_name options, class_name #:nodoc:
44
- key = options.has_key?('class') ? 'class' : :class
45
- unless options[key].to_s =~ /(^|\s+)#{class_name}(\s+|$)/
46
- options[key] = "#{options[key]} #{class_name}".strip
47
- end
48
- options
49
- end
42
+ # Taken from tinymce_hammer plugin
43
+ def append_class_name options, class_name #:nodoc:
44
+ key = options.has_key?('class') ? 'class' : :class
45
+ unless options[key].to_s =~ /(^|\s+)#{class_name}(\s+|$)/
46
+ options[key] = "#{options[key]} #{class_name}".strip
47
+ end
48
+ options
49
+ end
50
50
 
51
- # Returns an icon
52
- def render_icon(icon_class)
53
- content_tag('span', '', :class => "icon #{icon_class}")
54
- end
51
+ # Returns an icon
52
+ def render_icon(icon_class)
53
+ content_tag('span', '', :class => "icon #{icon_class}")
54
+ end
55
55
 
56
- # Returns an array of all pages in the same branch from current.
57
- # I.e. used to find the active page in navigation.
58
- def breadcrumb(current)
59
- return [] if current.nil?
60
- result = Array.new
61
- result << current
62
- while current = current.parent
63
- result << current
64
- end
65
- return result.reverse
66
- end
56
+ # Returns an array of all pages in the same branch from current.
57
+ # I.e. used to find the active page in navigation.
58
+ def breadcrumb(current)
59
+ return [] if current.nil?
60
+ result = Array.new
61
+ result << current
62
+ while current = current.parent
63
+ result << current
64
+ end
65
+ return result.reverse
66
+ end
67
67
 
68
- # Returns a hash with urlname for each url level.
69
- # I.e.: +{:level1 => 'company', :level2 => 'history'}+
70
- def params_for_nested_url(page = nil)
71
- page ||= @page
72
- raise ArgumentError if page.nil?
73
- nested_urL_params = {}
74
- page_bread_crumb = breadcrumb(page)
75
- urlnames = page_bread_crumb[2..page_bread_crumb.length-2].collect(&:urlname)
76
- urlnames.each_with_index do |urlname, i|
77
- nested_urL_params["level#{i+1}"] = urlname
78
- end
79
- nested_urL_params.symbolize_keys
80
- end
68
+ # Returns a hash with urlname for each url level.
69
+ # I.e.: +{:level1 => 'company', :level2 => 'history'}+
70
+ def params_for_nested_url(page = nil)
71
+ page ||= @page
72
+ raise ArgumentError if page.nil?
73
+ nested_urL_params = {}
74
+ page_bread_crumb = breadcrumb(page)
75
+ urlnames = page_bread_crumb[2..page_bread_crumb.length-2].collect(&:urlname)
76
+ urlnames.each_with_index do |urlname, i|
77
+ nested_urL_params["level#{i+1}"] = urlname
78
+ end
79
+ nested_urL_params.symbolize_keys
80
+ end
81
81
 
82
- # Returns the Alchemy configuration.
83
- #
84
- # *DO NOT REMOVE THIS HERE.*
85
- #
86
- # We need this, if an external engine or app includes this module into actionview.
87
- #
88
- def configuration(name)
89
- Alchemy::Config.get(name)
90
- end
82
+ # Returns the Alchemy configuration.
83
+ #
84
+ # *DO NOT REMOVE THIS HERE.*
85
+ #
86
+ # We need this, if an external engine or app includes this module into actionview.
87
+ #
88
+ def configuration(name)
89
+ Alchemy::Config.get(name)
90
+ end
91
91
 
92
- # Returns true if Alchemy is in multi language mode
93
- #
94
- # *DO NOT REMOVE THIS HERE.*
95
- #
96
- # We need this, if an external engine or app includes this module into actionview.
97
- #
98
- def multi_language?
99
- Alchemy::Language.published.count > 1
100
- end
92
+ # Returns true if Alchemy is in multi language mode
93
+ #
94
+ # *DO NOT REMOVE THIS HERE.*
95
+ #
96
+ # We need this, if an external engine or app includes this module into actionview.
97
+ #
98
+ def multi_language?
99
+ Alchemy::Language.published.count > 1
100
+ end
101
101
 
102
- end
102
+ end
103
103
  end
@@ -1,180 +1,179 @@
1
1
  module Alchemy
2
- module ElementsHelper
2
+ module ElementsHelper
3
3
 
4
- include Alchemy::EssencesHelper
4
+ include Alchemy::EssencesHelper
5
5
 
6
- # Renders all elements from current page.
7
- #
8
- # === Options are:
9
- #
10
- # :only => [] # A list of element names to be rendered only. Very useful if you want to render a specific element type in a special html part (e.g.. <div>) of your page and all other elements in another part.
11
- # :except => [] # A list of element names to be rendered. The opposite of the only option.
12
- # :from_page # The Alchemy::Page.page_layout string from which the elements are rendered from, or you even pass a Page object.
13
- # :from_cell # The Cell object from which the elements are rendered from.
14
- # :count # The amount of elements to be rendered (begins with first element found)
15
- # :fallback => { # You can use the fallback option as an override. So you can take elements from a glo´bal laout page and only if the user adds an element on current page the local one gets rendered.
16
- # :for => 'ELEMENT_NAME', # The name of the element the fallback is for
17
- # :with => 'ELEMENT_NAME', # (OPTIONAL) the name of element to fallback with
18
- # :from => 'PAGE_LAYOUT' # The page_layout name from the global page the fallback elements lie on. I.E 'left_column'
19
- # } #
20
- # :sort_by => Content#name # A Content name to sort the elements by
21
- # :reverse => boolean # Reverse the rendering order
22
- # :random => boolean # Randomize the output of elements
23
- #
24
- # === Note:
25
- # This helper also stores all pages where elements gets rendered on, so we can sweep them later if caching expires!
26
- #
27
- def render_elements(options = {})
28
- default_options = {
29
- :except => [],
30
- :only => [],
31
- :from_page => "",
32
- :from_cell => nil,
33
- :count => nil,
34
- :offset => nil,
35
- :locals => {},
36
- :render_format => "html",
37
- :fallback => nil
38
- }
39
- options = default_options.merge(options)
40
- if options[:from_page].blank?
41
- page = @page
42
- else
43
- if options[:from_page].class == Page
44
- page = options[:from_page]
45
- else
46
- page = Page.where(:page_layout => options[:from_page]).with_language(session[:language_id]).all
47
- end
48
- end
49
- if page.blank?
50
- warning('Page is nil')
51
- return ""
52
- else
53
- show_non_public = configuration(:cache_pages) ? false : defined?(current_user)
54
- if page.class == Array
55
- all_elements = page.collect { |p| p.find_elements(options, show_non_public) }.flatten
56
- else
57
- all_elements = page.find_elements(options, show_non_public)
58
- end
59
- unless options[:sort_by].blank?
60
- all_elements = all_elements.sort_by { |e| e.contents.detect { |c| c.name == options[:sort_by] }.ingredient }
61
- end
62
- all_elements.reverse! if options[:reverse_sort] || options[:reverse]
63
- element_string = ""
64
- if options[:fallback]
65
- unless all_elements.detect { |e| e.name == options[:fallback][:for] }
66
- if from = Page.where(:page_layout => options[:fallback][:from]).with_language(session[:language_id]).first
67
- all_elements += from.elements.named(options[:fallback][:with].blank? ? options[:fallback][:for] : options[:fallback][:with])
68
- end
69
- end
70
- end
71
- all_elements.each_with_index do |element, i|
72
- element_string += render_element(element, :view, options, i+1)
73
- end
74
- element_string.html_safe
75
- end
76
- end
6
+ # Renders all elements from current page.
7
+ #
8
+ # === Options are:
9
+ #
10
+ # :only => [] # A list of element names to be rendered only. Very useful if you want to render a specific element type in a special html part (e.g.. <div>) of your page and all other elements in another part.
11
+ # :except => [] # A list of element names to be rendered. The opposite of the only option.
12
+ # :from_page # The Alchemy::Page.page_layout string from which the elements are rendered from, or you even pass a Page object.
13
+ # :from_cell # The Cell object from which the elements are rendered from.
14
+ # :count # The amount of elements to be rendered (begins with first element found)
15
+ # :fallback => { # You can use the fallback option as an override. So you can take elements from a glo´bal laout page and only if the user adds an element on current page the local one gets rendered.
16
+ # :for => 'ELEMENT_NAME', # The name of the element the fallback is for
17
+ # :with => 'ELEMENT_NAME', # (OPTIONAL) the name of element to fallback with
18
+ # :from => 'PAGE_LAYOUT' # The page_layout name from the global page the fallback elements lie on. I.E 'left_column'
19
+ # } #
20
+ # :sort_by => Content#name # A Content name to sort the elements by
21
+ # :reverse => boolean # Reverse the rendering order
22
+ # :random => boolean # Randomize the output of elements
23
+ #
24
+ # === Note:
25
+ # This helper also stores all pages where elements gets rendered on, so we can sweep them later if caching expires!
26
+ #
27
+ def render_elements(options = {})
28
+ default_options = {
29
+ :except => [],
30
+ :only => [],
31
+ :from_page => "",
32
+ :from_cell => nil,
33
+ :count => nil,
34
+ :offset => nil,
35
+ :locals => {},
36
+ :render_format => "html",
37
+ :fallback => nil
38
+ }
39
+ options = default_options.merge(options)
40
+ if options[:from_page].blank?
41
+ page = @page
42
+ else
43
+ if options[:from_page].class == Page
44
+ page = options[:from_page]
45
+ else
46
+ page = Page.where(:page_layout => options[:from_page]).with_language(session[:language_id]).all
47
+ end
48
+ end
49
+ if page.blank?
50
+ warning('Page is nil')
51
+ return ""
52
+ else
53
+ show_non_public = configuration(:cache_pages) ? false : defined?(current_user)
54
+ if page.class == Array
55
+ all_elements = page.collect { |p| p.find_elements(options, show_non_public) }.flatten
56
+ else
57
+ all_elements = page.find_elements(options, show_non_public)
58
+ end
59
+ unless options[:sort_by].blank?
60
+ all_elements = all_elements.sort_by { |e| e.contents.detect { |c| c.name == options[:sort_by] }.ingredient }
61
+ end
62
+ all_elements.reverse! if options[:reverse_sort] || options[:reverse]
63
+ element_string = ""
64
+ if options[:fallback]
65
+ unless all_elements.detect { |e| e.name == options[:fallback][:for] }
66
+ if from = Page.where(:page_layout => options[:fallback][:from]).with_language(session[:language_id]).first
67
+ all_elements += from.elements.named(options[:fallback][:with].blank? ? options[:fallback][:for] : options[:fallback][:with])
68
+ end
69
+ end
70
+ end
71
+ all_elements.each_with_index do |element, i|
72
+ element_string += render_element(element, :view, options, i+1)
73
+ end
74
+ element_string.html_safe
75
+ end
76
+ end
77
77
 
78
- # This helper renders the Element partial for either the view or the editor part.
79
- # Generate element partials with ./script/generate elements
80
- def render_element(element, part = :view, options = {}, i = 1)
81
- begin
82
- if element.blank?
83
- warning('Element is nil')
84
- render :partial => "alchemy/elements/#{part}_not_found", :locals => {:name => 'nil'}
85
- else
86
- default_options = {
87
- :shorten_to => nil,
88
- :render_format => "html"
89
- }
90
- options = default_options.merge(options)
91
- element.store_page(@page) if part == :view
92
- path1 = "#{Rails.root}/app/views/elements/"
93
- path2 = "#{Rails.root}/vendor/plugins/alchemy/app/views/elements/"
94
- partial_name = "_#{element.name.underscore}_#{part}.html.erb"
95
- locals = options.delete(:locals)
96
- render(
97
- :partial => "alchemy/elements/#{element.name.underscore}_#{part}.#{options[:render_format]}.erb",
98
- :locals => {
99
- :element => element,
100
- :options => options,
101
- :counter => i
102
- }.merge(locals || {})
103
- )
104
- end
105
- rescue ActionView::MissingTemplate
106
- warning(%(
107
- Element #{part} partial not found for #{element.name}.\n
108
- Looking for #{partial_name}, but not found
109
- neither in #{path1}
110
- nor in #{path2}
111
- Use rails generate alchemy:elements to generate them.
112
- Maybe you still have old style partial names? (like .rhtml). Then please rename them in .html.erb'
113
- ))
114
- render :partial => "alchemy/elements/#{part}_not_found", :locals => {:name => element.name, :error => "Element #{part} partial not found. Use rails generate alchemy:elements to generate them."}
115
- end
116
- end
78
+ # This helper renders the Element partial for either the view or the editor part.
79
+ # Generate element partials with ./script/generate elements
80
+ def render_element(element, part = :view, options = {}, i = 1)
81
+ begin
82
+ if element.blank?
83
+ warning('Element is nil')
84
+ render :partial => "alchemy/elements/#{part}_not_found", :locals => {:name => 'nil'}
85
+ else
86
+ default_options = {
87
+ :shorten_to => nil
88
+ }
89
+ options = default_options.merge(options)
90
+ element.store_page(@page) if part == :view
91
+ path1 = "#{Rails.root}/app/views/elements/"
92
+ path2 = "#{Rails.root}/vendor/plugins/alchemy/app/views/elements/"
93
+ partial_name = "_#{element.name.underscore}_#{part}.html.erb"
94
+ locals = options.delete(:locals)
95
+ render(
96
+ :partial => "alchemy/elements/#{element.name.underscore}_#{part}",
97
+ :locals => {
98
+ :element => element,
99
+ :options => options,
100
+ :counter => i
101
+ }.merge(locals || {})
102
+ )
103
+ end
104
+ rescue ActionView::MissingTemplate
105
+ warning(%(
106
+ Element #{part} partial not found for #{element.name}.\n
107
+ Looking for #{partial_name}, but not found
108
+ neither in #{path1}
109
+ nor in #{path2}
110
+ Use rails generate alchemy:elements to generate them.
111
+ Maybe you still have old style partial names? (like .rhtml). Then please rename them in .html.erb'
112
+ ))
113
+ render :partial => "alchemy/elements/#{part}_not_found", :locals => {:name => element.name, :error => "Element #{part} partial not found. Use rails generate alchemy:elements to generate them."}
114
+ end
115
+ end
117
116
 
118
- # Returns all public elements found by Element.name.
119
- # Pass a count to return only an limited amount of elements.
120
- def all_elements_by_name(name, options = {})
121
- warning('options[:language] option not allowed any more in all_elements_by_name helper') unless options[:language].blank?
122
- default_options = {
123
- :count => :all,
124
- :from_page => :all
125
- }
126
- options = default_options.merge(options)
127
- if options[:from_page] == :all
128
- elements = Element.find_all_by_name_and_public(name, true, :limit => options[:count] == :all ? nil : options[:count])
129
- elsif options[:from_page].class == String
130
- page = Page.find_by_page_layout_and_language_id(options[:from_page], session[:language_id])
131
- return [] if page.blank?
132
- elements = page.elements.find_all_by_name_and_public(name, true, :limit => options[:count] == :all ? nil : options[:count])
133
- else
134
- elements = options[:from_page].elements.find_all_by_name_and_public(name, true, :limit => options[:count] == :all ? nil : options[:count])
135
- end
136
- end
117
+ # Returns all public elements found by Element.name.
118
+ # Pass a count to return only an limited amount of elements.
119
+ def all_elements_by_name(name, options = {})
120
+ warning('options[:language] option not allowed any more in all_elements_by_name helper') unless options[:language].blank?
121
+ default_options = {
122
+ :count => :all,
123
+ :from_page => :all
124
+ }
125
+ options = default_options.merge(options)
126
+ if options[:from_page] == :all
127
+ elements = Element.find_all_by_name_and_public(name, true, :limit => options[:count] == :all ? nil : options[:count])
128
+ elsif options[:from_page].class == String
129
+ page = Page.find_by_page_layout_and_language_id(options[:from_page], session[:language_id])
130
+ return [] if page.blank?
131
+ elements = page.elements.find_all_by_name_and_public(name, true, :limit => options[:count] == :all ? nil : options[:count])
132
+ else
133
+ elements = options[:from_page].elements.find_all_by_name_and_public(name, true, :limit => options[:count] == :all ? nil : options[:count])
134
+ end
135
+ end
137
136
 
138
- # Returns the public element found by Element.name from the given public Page, either by Page.id or by Page.urlname
139
- def element_from_page(options = {})
140
- default_options = {
141
- :page_urlname => "",
142
- :page_id => nil,
143
- :element_name => ""
144
- }
145
- options = default_options.merge(options)
146
- if options[:page_id].blank?
147
- page = Page.find_by_urlname_and_public(options[:page_urlname], true)
148
- else
149
- page = Page.find_by_id_and_public(options[:page_id], true)
150
- end
151
- return "" if page.blank?
152
- element = page.elements.find_by_name_and_public(options[:element_name], true)
153
- return element
154
- end
137
+ # Returns the public element found by Element.name from the given public Page, either by Page.id or by Page.urlname
138
+ def element_from_page(options = {})
139
+ default_options = {
140
+ :page_urlname => "",
141
+ :page_id => nil,
142
+ :element_name => ""
143
+ }
144
+ options = default_options.merge(options)
145
+ if options[:page_id].blank?
146
+ page = Page.find_by_urlname_and_public(options[:page_urlname], true)
147
+ else
148
+ page = Page.find_by_id_and_public(options[:page_id], true)
149
+ end
150
+ return "" if page.blank?
151
+ element = page.elements.find_by_name_and_public(options[:element_name], true)
152
+ return element
153
+ end
155
154
 
156
- # Renders all element partials from given cell.
157
- def render_cell_elements(cell)
158
- return warning("No cell given.") if cell.blank?
159
- render_elements({:from_cell => cell})
160
- end
155
+ # Renders all element partials from given cell.
156
+ def render_cell_elements(cell)
157
+ return warning("No cell given.") if cell.blank?
158
+ render_elements({:from_cell => cell})
159
+ end
161
160
 
162
- # Returns a string for the id attribute of a html element for the given element
163
- def element_dom_id(element)
164
- return "" if element.nil?
165
- "#{element.name}_#{element.id}"
166
- end
161
+ # Returns a string for the id attribute of a html element for the given element
162
+ def element_dom_id(element)
163
+ return "" if element.nil?
164
+ "#{element.name}_#{element.id}"
165
+ end
167
166
 
168
- # Renders the data-alchemy-element HTML attribut used for the preview window hover effect.
169
- def element_preview_code(element)
170
- return "" if element.nil?
171
- " data-alchemy-element='#{element.id}'" if @preview_mode && element.page == @page
172
- end
167
+ # Renders the data-alchemy-element HTML attribut used for the preview window hover effect.
168
+ def element_preview_code(element)
169
+ return "" if element.nil?
170
+ " data-alchemy-element='#{element.id}'" if @preview_mode && element.page == @page
171
+ end
173
172
 
174
- # Returns the full url containing host, page and anchor for the given element
175
- def full_url_for_element(element)
176
- "http://" + request.env["HTTP_HOST"] + "/" + element.page.urlname + "##{element.name}_#{element.id}"
177
- end
173
+ # Returns the full url containing host, page and anchor for the given element
174
+ def full_url_for_element(element)
175
+ "http://" + request.env["HTTP_HOST"] + "/" + element.page.urlname + "##{element.name}_#{element.id}"
176
+ end
178
177
 
179
- end
178
+ end
180
179
  end