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,23 +1,23 @@
1
1
  module Alchemy
2
- class ElementsController < Alchemy::BaseController
2
+ class ElementsController < Alchemy::BaseController
3
3
 
4
- filter_access_to :show, :attribute_check => true, :model => Alchemy::Element, :load_method => :load_element
5
- layout false
4
+ filter_access_to :show, :attribute_check => true, :model => Alchemy::Element, :load_method => :load_element
5
+ layout false
6
6
 
7
- # Returns the element partial as HTML or as JavaScript that tries to replace a given +container_id+ with the partial content via jQuery.
8
- def show
9
- @page = @element.page
10
- respond_to do |format|
11
- format.html
12
- format.js
13
- end
14
- end
7
+ # Returns the element partial as HTML or as JavaScript that tries to replace a given +container_id+ with the partial content via jQuery.
8
+ def show
9
+ @page = @element.page
10
+ respond_to do |format|
11
+ format.html
12
+ format.js
13
+ end
14
+ end
15
15
 
16
- private
16
+ private
17
17
 
18
- def load_element
19
- @element = Element.find(params[:id])
20
- end
18
+ def load_element
19
+ @element = Element.find(params[:id])
20
+ end
21
21
 
22
- end
22
+ end
23
23
  end
@@ -38,76 +38,76 @@
38
38
  # Please have a look at the +alchemy/config/config.yml+ file for further Message settings.
39
39
 
40
40
  module Alchemy
41
- class MessagesController < Alchemy::BaseController
41
+ class MessagesController < Alchemy::BaseController
42
42
 
43
- before_filter :get_page, :except => :create
43
+ before_filter :get_page, :except => :create
44
44
 
45
- helper 'alchemy/pages'
45
+ helper 'alchemy/pages'
46
46
 
47
- def index#:nodoc:
48
- redirect_to show_page_path(:urlname => @page.urlname, :lang => multi_language? ? @page.language_code : nil)
49
- end
47
+ def index #:nodoc:
48
+ redirect_to show_page_path(:urlname => @page.urlname, :lang => multi_language? ? @page.language_code : nil)
49
+ end
50
50
 
51
- def new#:nodoc:
52
- @message = Message.new
53
- render :template => 'alchemy/pages/show', :layout => layout_for_page
54
- end
51
+ def new #:nodoc:
52
+ @message = Message.new
53
+ render :template => 'alchemy/pages/show', :layout => layout_for_page
54
+ end
55
55
 
56
- def create#:nodoc:
57
- @message = Message.new(params[:message])
58
- @message.ip = request.remote_ip
59
- @element = Element.find_by_id(@message.contact_form_id)
60
- @page = @element.page
61
- @root_page = @page.get_language_root
62
- if @message.valid?
63
- Messages.contact_form_mail(@message, mail_to, mail_from, subject).deliver
64
- redirect_to_success_page
65
- else
66
- render :template => 'alchemy/pages/show', :layout => layout_for_page
67
- end
68
- end
56
+ def create #:nodoc:
57
+ @message = Message.new(params[:message])
58
+ @message.ip = request.remote_ip
59
+ @element = Element.find_by_id(@message.contact_form_id)
60
+ @page = @element.page
61
+ @root_page = @page.get_language_root
62
+ if @message.valid?
63
+ Messages.contact_form_mail(@message, mail_to, mail_from, subject).deliver
64
+ redirect_to_success_page
65
+ else
66
+ render :template => 'alchemy/pages/show', :layout => layout_for_page
67
+ end
68
+ end
69
69
 
70
- private
70
+ private
71
71
 
72
- def mailer_config
73
- Alchemy::Config.get(:mailer)
74
- end
72
+ def mailer_config
73
+ Alchemy::Config.get(:mailer)
74
+ end
75
75
 
76
- def mail_to
77
- @element.ingredient("mail_to")
78
- rescue
79
- mailer_config[:mail_to]
80
- end
76
+ def mail_to
77
+ @element.ingredient("mail_to")
78
+ rescue
79
+ mailer_config[:mail_to]
80
+ end
81
81
 
82
- def mail_from
83
- @element.ingredient("mail_from")
84
- rescue
85
- mailer_config[:mail_from]
86
- end
82
+ def mail_from
83
+ @element.ingredient("mail_from")
84
+ rescue
85
+ mailer_config[:mail_from]
86
+ end
87
87
 
88
- def subject
89
- @element.ingredient("subject")
90
- rescue
91
- mailer_config[:subject]
92
- end
88
+ def subject
89
+ @element.ingredient("subject")
90
+ rescue
91
+ mailer_config[:subject]
92
+ end
93
93
 
94
- def redirect_to_success_page
95
- if @element.ingredient("success_page")
96
- urlname = @element.ingredient("success_page")
97
- elsif mailer_config[:forward_to_page] && mailer_config[:mail_success_page]
98
- urlname = Page.find_by_urlname(mailer_config[:mail_success_page]).urlname
99
- else
100
- flash[:notice] = t(:success, :scope => 'contactform.messages')
101
- urlname = Page.language_root_for(session[:language_id]).urlname
102
- end
103
- redirect_to show_page_path(:urlname => urlname, :lang => multi_language? ? session[:language_code] : nil)
104
- end
94
+ def redirect_to_success_page
95
+ if @element.ingredient("success_page")
96
+ urlname = @element.ingredient("success_page")
97
+ elsif mailer_config[:forward_to_page] && mailer_config[:mail_success_page]
98
+ urlname = Page.find_by_urlname(mailer_config[:mail_success_page]).urlname
99
+ else
100
+ flash[:notice] = t(:success, :scope => 'contactform.messages')
101
+ urlname = Page.language_root_for(session[:language_id]).urlname
102
+ end
103
+ redirect_to show_page_path(:urlname => urlname, :lang => multi_language? ? session[:language_code] : nil)
104
+ end
105
105
 
106
- def get_page
107
- @page = Page.find_by_page_layout_and_language_id(mailer_config[:page_layout_name], session[:language_id])
108
- raise "Page for page_layout #{mailer_config[:page_layout_name]} not found" if @page.blank?
109
- @root_page = @page.get_language_root
110
- end
106
+ def get_page
107
+ @page = Page.find_by_page_layout_and_language_id(mailer_config[:page_layout_name], session[:language_id])
108
+ raise "Page for page_layout #{mailer_config[:page_layout_name]} not found" if @page.blank?
109
+ @root_page = @page.get_language_root
110
+ end
111
111
 
112
- end
112
+ end
113
113
  end
@@ -1,200 +1,196 @@
1
1
  module Alchemy
2
- class PagesController < Alchemy::BaseController
3
-
4
- # We need to include this helper because we need the breadcrumb method.
5
- # And we cannot define the breadcrump method as helper_method, because rspec does not see helper_methods.
6
- # Not the best solution, but's working.
7
- # Anyone with a better idea please provide a patch.
8
- include Alchemy::BaseHelper
9
-
10
- before_filter :render_page_or_redirect, :only => [:show, :sitemap]
11
- before_filter :perform_search, :only => :show, :if => proc { configuration(:ferret) }
12
-
13
- filter_access_to :show, :attribute_check => true, :model => Alchemy::Page, :load_method => :load_page
14
-
15
- caches_action(
16
- :show,
17
- :cache_path => proc { show_page_url(:urlname => params[:urlname], :lang => multi_language? ? params[:lang] : nil) },
18
- :if => proc {
19
- if Alchemy::Config.get(:cache_pages)
20
- page = Page.contentpages.find_by_urlname_and_language_id_and_public(
21
- params[:urlname],
22
- session[:language_id],
23
- true,
24
- :select => 'page_layout, language_id, urlname'
25
- )
26
- if page
27
- pagelayout = PageLayout.get(page.page_layout)
28
- pagelayout['cache'].nil? || pagelayout['cache']
29
- end
30
- else
31
- false
32
- end
33
- },
34
- :layout => false
35
- )
36
-
37
- layout :layout_for_page
38
-
39
- # Showing page from params[:urlname]
40
- # @page is fetched via before filter
41
- # @root_page is fetched via before filter
42
- # @language fetched via before_filter in alchemy_controller
43
- # querying for search results if any query is present via before_filter
44
- def show
45
- respond_to do |format|
46
- format.html { render }
47
- format.rss {
48
- if @page.contains_feed?
49
- render :action => "show.rss.builder", :layout => false
50
- else
51
- render :xml => { :error => 'Not found' }, :status => 404
52
- end
53
- }
54
- end
55
- end
56
-
57
- # Renders a Google conform sitemap in xml
58
- def sitemap
59
- @pages = Page.find_all_by_sitemap_and_public(true, true)
60
- respond_to do |format|
61
- format.xml { render :layout => "sitemap" }
62
- end
63
- end
64
-
65
- protected
66
-
67
- def load_page
68
- # we need this, because of a dec_auth bug (it calls this method after the before_filter again).
69
- return @page if @page
70
- if params[:urlname].blank?
71
- @page = Page.language_root_for(Language.get_default.id)
72
- else
73
- @page = Page.contentpages.find_by_urlname_and_language_id(params[:urlname], session[:language_id])
74
- # try to find the page in another language
75
- if @page.nil?
76
- @page = Page.contentpages.find_by_urlname(params[:urlname])
77
- else
78
- return @page
79
- end
80
- end
81
- end
82
-
83
- def render_page_or_redirect
84
- @page ||= load_page
85
- if User.admins.count == 0 && @page.nil?
86
- redirect_to signup_path
87
- elsif @page.blank?
88
- render_404
89
- elsif multi_language? && params[:lang].blank?
90
- redirect_page(:lang => session[:language_code])
91
- elsif multi_language? && params[:urlname].blank? && !params[:lang].blank? && configuration(:redirect_index)
92
- redirect_page(:lang => params[:lang])
93
- elsif configuration(:redirect_to_public_child) && !@page.public?
94
- redirect_to_public_child
95
- elsif params[:urlname].blank? && configuration(:redirect_index)
96
- redirect_page
97
- elsif !multi_language? && !params[:lang].blank?
98
- redirect_page
99
- elsif configuration(:url_nesting) && url_levels.any? && !levels_are_in_page_branch?
100
- render_404
101
- elsif configuration(:url_nesting) && should_be_nested? && !url_levels.any?
102
- redirect_page(params_for_nested_url)
103
- elsif !configuration(:url_nesting) && url_levels.any?
104
- redirect_page
105
- elsif @page.has_controller?
106
- redirect_to main_app.url_for(@page.controller_and_action)
107
- else
108
- # setting the language to page.language to be sure it's correct
109
- set_language_from(@page.language_id)
110
- if params[:urlname].blank?
111
- @root_page = @page
112
- else
113
- @root_page = Page.language_root_for(session[:language_id])
114
- end
115
- end
116
- end
117
-
118
- # Performs a search on EssenceRichtext and EssenceText for params['query'].
119
- # Only performing the search when ferret is enabled in the alchemy/config.yml and
120
- # a Page gets found where the searchresults can be rendered. This Page gets found
121
- # when a page_layout is marked for rendering searchresults:
122
- # 'searchresults: true' in alchemy/page_layouts.yml
123
- def perform_search
124
- searchresult_page_layouts = PageLayout.get_all_by_attributes({:searchresults => true})
125
- if searchresult_page_layouts.any?
126
- @search_result_page = Page.find_by_page_layout_and_public_and_language_id(searchresult_page_layouts.first["name"], true, session[:language_id])
127
- if !params[:query].blank? && @search_result_page
128
- @search_results = []
129
- %w(Alchemy::EssenceText Alchemy::EssenceRichtext).each do |e|
130
- @search_results += e.constantize.includes(:contents => {:element => :page}).find_with_ferret(
131
- "*#{params[:query]}*",
132
- {:limit => :all},
133
- {:conditions => [
134
- 'alchemy_pages.public = ? AND alchemy_pages.layoutpage = ? AND alchemy_pages.restricted = ?',
135
- true, false, false
136
- ]}
137
- )
138
- end
139
- return @search_results.sort{ |y, x| x.ferret_score <=> y.ferret_score } if @search_results.any?
140
- end
141
- end
142
- end
143
-
144
- def find_first_public(page)
145
- if page.public == true
146
- return page
147
- end
148
- page.children.each do |child|
149
- result = find_first_public(child)
150
- if result != nil
151
- return result
152
- end
153
- end
154
- return nil
155
- end
156
-
157
- def redirect_to_public_child
158
- @page = find_first_public(@page)
159
- if @page.blank?
160
- render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
161
- else
162
- redirect_page
163
- end
164
- end
165
-
166
- def redirect_page(options={})
167
- defaults = {
168
- :lang => (multi_language? ? @page.language_code : nil),
169
- :urlname => @page.urlname
170
- }
171
- options = defaults.merge(options)
172
- redirect_to show_page_path(options.merge(additional_params)), :status => 301
173
- end
174
-
175
- def additional_params
176
- params.clone.delete_if do |key, value|
177
- ["action", "controller", "urlname", "lang", "level1", "level2", "level3"].include?(key)
178
- end
179
- end
180
-
181
- def render_404
182
- render(:file => "#{Rails.root}/public/404.html", :status => 404, :layout => false)
183
- end
184
-
185
- def url_levels
186
- params.keys.grep(/^level[1-3]$/)
187
- end
188
-
189
- def levels_are_in_page_branch?
190
- nested_urlnames = breadcrumb(@page).collect(&:urlname)
191
- level_names = params.select { |k, v| url_levels.include?(k) }.map(&:second)
192
- level_names & nested_urlnames == level_names
193
- end
194
-
195
- def should_be_nested?
196
- !params_for_nested_url.blank?
197
- end
198
-
199
- end
2
+ class PagesController < Alchemy::BaseController
3
+
4
+ # We need to include this helper because we need the breadcrumb method.
5
+ # And we cannot define the breadcrump method as helper_method, because rspec does not see helper_methods.
6
+ # Not the best solution, but's working.
7
+ # Anyone with a better idea please provide a patch.
8
+ include Alchemy::BaseHelper
9
+
10
+ before_filter :render_page_or_redirect, :only => [:show, :sitemap]
11
+ before_filter :perform_search, :only => :show, :if => proc { configuration(:ferret) }
12
+
13
+ filter_access_to :show, :attribute_check => true, :model => Alchemy::Page, :load_method => :load_page
14
+
15
+ caches_action(
16
+ :show,
17
+ :cache_path => proc { show_page_url(:urlname => params[:urlname], :lang => multi_language? ? params[:lang] : nil) },
18
+ :if => proc {
19
+ if Alchemy::Config.get(:cache_pages)
20
+ page = Page.find_by_urlname_and_language_id_and_public(
21
+ params[:urlname],
22
+ session[:language_id],
23
+ true,
24
+ :select => 'page_layout, language_id, urlname'
25
+ )
26
+ if page
27
+ pagelayout = PageLayout.get(page.page_layout)
28
+ pagelayout['cache'].nil? || pagelayout['cache']
29
+ end
30
+ else
31
+ false
32
+ end
33
+ },
34
+ :layout => false
35
+ )
36
+
37
+ layout :layout_for_page
38
+
39
+ # Showing page from params[:urlname]
40
+ # @page is fetched via before filter
41
+ # @root_page is fetched via before filter
42
+ # @language fetched via before_filter in alchemy_controller
43
+ # querying for search results if any query is present via before_filter
44
+ def show
45
+ respond_to do |format|
46
+ format.html { render }
47
+ format.rss {
48
+ if @page.contains_feed?
49
+ render :action => "show", :layout => false, :handlers => [:builder]
50
+ else
51
+ render :xml => {:error => 'Not found'}, :status => 404
52
+ end
53
+ }
54
+ end
55
+ end
56
+
57
+ # Renders a Google conform sitemap in xml
58
+ def sitemap
59
+ @pages = Page.find_all_by_sitemap_and_public(true, true)
60
+ respond_to do |format|
61
+ format.xml { render :layout => "sitemap" }
62
+ end
63
+ end
64
+
65
+ protected
66
+
67
+ def load_page
68
+ # we need this, because of a dec_auth bug (it calls this method after the before_filter again).
69
+ return @page if @page
70
+ if params[:urlname].blank?
71
+ @page = Page.language_root_for(Language.get_default.id)
72
+ else
73
+ @page = Page.find_by_urlname_and_language_id(params[:urlname], session[:language_id])
74
+ # try to find the page in another language
75
+ if @page.nil?
76
+ @page = Page.find_by_urlname(params[:urlname])
77
+ else
78
+ return @page
79
+ end
80
+ end
81
+ end
82
+
83
+ def render_page_or_redirect
84
+ @page ||= load_page
85
+ if User.admins.count == 0 && @page.nil?
86
+ redirect_to signup_path
87
+ elsif @page.blank?
88
+ raise_not_found_error
89
+ elsif multi_language? && params[:lang].blank?
90
+ redirect_page(:lang => session[:language_code])
91
+ elsif multi_language? && params[:urlname].blank? && !params[:lang].blank? && configuration(:redirect_index)
92
+ redirect_page(:lang => params[:lang])
93
+ elsif configuration(:redirect_to_public_child) && !@page.public?
94
+ redirect_to_public_child
95
+ elsif params[:urlname].blank? && configuration(:redirect_index)
96
+ redirect_page
97
+ elsif !multi_language? && !params[:lang].blank?
98
+ redirect_page
99
+ elsif configuration(:url_nesting) && url_levels.any? && !levels_are_in_page_branch?
100
+ raise_not_found_error
101
+ elsif configuration(:url_nesting) && should_be_nested? && !url_levels.any?
102
+ redirect_page(params_for_nested_url)
103
+ elsif !configuration(:url_nesting) && url_levels.any?
104
+ redirect_page
105
+ elsif @page.has_controller?
106
+ redirect_to main_app.url_for(@page.controller_and_action)
107
+ else
108
+ # setting the language to page.language to be sure it's correct
109
+ set_language_from(@page.language_id)
110
+ if params[:urlname].blank?
111
+ @root_page = @page
112
+ else
113
+ @root_page = Page.language_root_for(session[:language_id])
114
+ end
115
+ end
116
+ end
117
+
118
+ # Performs a search on EssenceRichtext and EssenceText for params['query'].
119
+ # Only performing the search when ferret is enabled in the alchemy/config.yml and
120
+ # a Page gets found where the searchresults can be rendered. This Page gets found
121
+ # when a page_layout is marked for rendering searchresults:
122
+ # 'searchresults: true' in alchemy/page_layouts.yml
123
+ def perform_search
124
+ searchresult_page_layouts = PageLayout.get_all_by_attributes({:searchresults => true})
125
+ if searchresult_page_layouts.any?
126
+ @search_result_page = Page.find_by_page_layout_and_public_and_language_id(searchresult_page_layouts.first["name"], true, session[:language_id])
127
+ if !params[:query].blank? && @search_result_page
128
+ @search_results = []
129
+ %w(Alchemy::EssenceText Alchemy::EssenceRichtext).each do |e|
130
+ @search_results += e.constantize.includes(:contents => {:element => :page}).find_with_ferret(
131
+ "*#{params[:query]}*",
132
+ {:limit => :all},
133
+ {:conditions => [
134
+ 'alchemy_pages.public = ? AND alchemy_pages.layoutpage = ? AND alchemy_pages.restricted = ?',
135
+ true, false, false
136
+ ]}
137
+ )
138
+ end
139
+ return @search_results.sort { |y, x| x.ferret_score <=> y.ferret_score } if @search_results.any?
140
+ end
141
+ end
142
+ end
143
+
144
+ def find_first_public(page)
145
+ if page.public == true
146
+ return page
147
+ end
148
+ page.children.each do |child|
149
+ result = find_first_public(child)
150
+ if result != nil
151
+ return result
152
+ end
153
+ end
154
+ return nil
155
+ end
156
+
157
+ def redirect_to_public_child
158
+ @page = find_first_public(@page)
159
+ if @page.blank?
160
+ raise_not_found_error
161
+ else
162
+ redirect_page
163
+ end
164
+ end
165
+
166
+ def redirect_page(options={})
167
+ defaults = {
168
+ :lang => (multi_language? ? @page.language_code : nil),
169
+ :urlname => @page.urlname
170
+ }
171
+ options = defaults.merge(options)
172
+ redirect_to show_page_path(additional_params.merge(options)), :status => 301
173
+ end
174
+
175
+ def additional_params
176
+ params.each do |key, value|
177
+ params[key] = nil if ["action", "controller", "urlname", "lang", "level1", "level2", "level3"].include?(key)
178
+ end
179
+ end
180
+
181
+ def url_levels
182
+ params.keys.grep(/^level[1-3]$/)
183
+ end
184
+
185
+ def levels_are_in_page_branch?
186
+ nested_urlnames = breadcrumb(@page).collect(&:urlname)
187
+ level_names = params.select { |k, v| url_levels.include?(k) }.map(&:second)
188
+ level_names & nested_urlnames == level_names
189
+ end
190
+
191
+ def should_be_nested?
192
+ !params_for_nested_url.blank?
193
+ end
194
+
195
+ end
200
196
  end