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,45 +1,45 @@
1
1
  require File.join(File.dirname(__FILE__), '../middleware/flash_session_cookie')
2
2
 
3
3
  module Alchemy
4
- class Engine < Rails::Engine
5
-
6
- isolate_namespace Alchemy
7
-
8
- engine_name 'alchemy'
9
-
10
- config.mount_at = '/'
11
-
12
- # Enabling assets precompiling
13
- initializer 'alchemy.assets' do |app|
14
- app.config.assets.precompile += [
15
- "alchemy/alchemy.js",
16
- "alchemy/preview.js",
17
- "alchemy/alchemy.css",
18
- "alchemy/menubar.css",
19
- "alchemy/menubar.js",
20
- "alchemy/print.css",
21
- "alchemy/tinymce_content.css",
22
- "alchemy/tinymce_dialog.css",
23
- "tiny_mce/*"
24
- ]
25
- end
26
-
27
- initializer 'alchemy.flash_cookie' do |config|
28
- config.middleware.insert_after(
29
- 'ActionDispatch::Cookies',
30
- Alchemy::Middleware::FlashSessionCookie,
31
- ::Rails.configuration.session_options[:key]
32
- )
33
- end
34
-
35
- # filter sensitive information during logging
36
- initializer "alchemy.params.filter" do |app|
37
- app.config.filter_parameters += [:password, :password_confirmation]
38
- end
39
-
40
- initializer "alchemy.add_authorization_rules" do
41
- Alchemy::AuthEngine.get_instance.load(File.join(File.dirname(__FILE__), '../..', 'config/authorization_rules.rb'))
42
- end
43
-
44
- end
4
+ class Engine < Rails::Engine
5
+
6
+ isolate_namespace Alchemy
7
+
8
+ engine_name 'alchemy'
9
+
10
+ config.mount_at = '/'
11
+
12
+ # Enabling assets precompiling
13
+ initializer 'alchemy.assets' do |app|
14
+ app.config.assets.precompile += [
15
+ "alchemy/alchemy.js",
16
+ "alchemy/preview.js",
17
+ "alchemy/alchemy.css",
18
+ "alchemy/menubar.css",
19
+ "alchemy/menubar.js",
20
+ "alchemy/print.css",
21
+ "alchemy/tinymce_content.css",
22
+ "alchemy/tinymce_dialog.css",
23
+ "tiny_mce/*"
24
+ ]
25
+ end
26
+
27
+ initializer 'alchemy.flash_cookie' do |config|
28
+ config.middleware.insert_after(
29
+ 'ActionDispatch::Cookies',
30
+ Alchemy::Middleware::FlashSessionCookie,
31
+ ::Rails.configuration.session_options[:key]
32
+ )
33
+ end
34
+
35
+ # filter sensitive information during logging
36
+ initializer "alchemy.params.filter" do |app|
37
+ app.config.filter_parameters += [:password, :password_confirmation]
38
+ end
39
+
40
+ initializer "alchemy.add_authorization_rules" do
41
+ Alchemy::AuthEngine.get_instance.load(File.join(File.dirname(__FILE__), '../..', 'config/authorization_rules.rb'))
42
+ end
43
+
44
+ end
45
45
  end
@@ -30,28 +30,32 @@ module Alchemy #:nodoc:
30
30
  include Alchemy::Essence::InstanceMethods
31
31
  stampable
32
32
  validate :essence_validations, :on => :update
33
- has_many :contents, :as => :essence
34
-
33
+ has_many :contents, :as => :essence
34
+
35
35
  def acts_as_essence_class
36
36
  #{self.name}
37
37
  end
38
-
38
+
39
39
  def validation_column
40
40
  '#{validate_column}'
41
41
  end
42
-
42
+
43
43
  def ingredient_column
44
44
  '#{ingredient_column}'
45
45
  end
46
-
46
+
47
+ def ingredient
48
+ send('#{ingredient_column}')
49
+ end
50
+
47
51
  def preview_text_column
48
52
  '#{preview_text_column}'
49
53
  end
50
-
54
+
51
55
  def preview_text_method
52
56
  '#{configuration[:preview_text_method]}'
53
57
  end
54
-
58
+
55
59
  EOV
56
60
  end
57
61
 
@@ -60,24 +64,24 @@ module Alchemy #:nodoc:
60
64
  module InstanceMethods
61
65
 
62
66
  # Essence Validations:
63
- #
67
+ #
64
68
  # Essence validations can be set inside the config/elements.yml file.
65
69
  # Currently supported validations are:
66
70
  # * presence
67
71
  # * format
68
72
  # * uniqueness
69
- #
73
+ #
70
74
  # If you want to validate the format you must additionally pass validate_format_as or validate_format_with:
71
- #
75
+ #
72
76
  # * validate_format_with has to be regex
73
77
  # * validate_format_as can be one of:
74
78
  # ** url
75
79
  # ** email
76
- #
80
+ #
77
81
  # Example:
78
- #
82
+ #
79
83
  # - name: person
80
- # contents:
84
+ # contents:
81
85
  # - name: name
82
86
  # type: EssenceText
83
87
  # validate: [presence]
@@ -89,44 +93,39 @@ module Alchemy #:nodoc:
89
93
  # type: EssenceText
90
94
  # validate: [format]
91
95
  # validate_format_with: '^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$'
92
- #
93
- def essence_validations
96
+ #
97
+ def essence_validations
94
98
  self.validation_errors ||= []
95
- return true if description.blank? || description['validate'].blank?
96
- description['validate'].each do |validation|
97
- if validation == 'presence' && ingredient.blank?
98
- self.validation_errors << :blank
99
- elsif validation == 'format'
100
- if description['validate_format_as'].blank? && !description['validate_format_with'].blank?
101
- matcher = Regexp.new(description['validate_format_with'])
102
- elsif !description['validate_format_as'].blank? && description['validate_format_with'].blank?
103
- case description['validate_format_as']
104
- when 'email'
105
- then matcher = Authlogic::Regex.email
106
- when 'url'
107
- then matcher = /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
108
- else
109
- raise "No validation format matcher found for #{description['validate_format_as']}"
110
- end
111
- else
112
- raise 'No validation format matcher given'
113
- end
114
- if ingredient.match(matcher).nil?
115
- self.validation_errors << :invalid
116
- end
117
- elsif validation == 'uniqueness' && !acts_as_essence_class.send("find_by_#{ingredient_column}", ingredient).blank?
118
- self.validation_errors << :taken
119
- end
120
- end
99
+ return true if description.blank? || description['validate'].blank?
100
+ description['validate'].each do |validation|
101
+ if validation == 'presence' && ingredient.blank?
102
+ self.validation_errors << :blank
103
+ elsif validation == 'format'
104
+ if description['validate_format_as'].blank? && !description['validate_format_with'].blank?
105
+ matcher = Regexp.new(description['validate_format_with'])
106
+ elsif !description['validate_format_as'].blank? && description['validate_format_with'].blank?
107
+ case description['validate_format_as']
108
+ when 'email'
109
+ then
110
+ matcher = Authlogic::Regex.email
111
+ when 'url'
112
+ then
113
+ matcher = /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
114
+ else
115
+ raise "No validation format matcher found for #{description['validate_format_as']}"
116
+ end
117
+ else
118
+ raise 'No validation format matcher given'
119
+ end
120
+ if ingredient.match(matcher).nil?
121
+ self.validation_errors << :invalid
122
+ end
123
+ elsif validation == 'uniqueness' && !acts_as_essence_class.send("find_by_#{ingredient_column}", ingredient).blank?
124
+ self.validation_errors << :taken
125
+ end
126
+ end
121
127
  self.validation_errors.each do |validation_error|
122
128
  self.errors.add(self.ingredient_column, validation_error)
123
- end
124
- end
125
-
126
- # Returns the value stored from the database column that is configured as ingredient column.
127
- def ingredient
128
- if self.respond_to?(ingredient_column)
129
- self.send(ingredient_column)
130
129
  end
131
130
  end
132
131
 
@@ -167,9 +166,9 @@ module Alchemy #:nodoc:
167
166
  respond_to?(:link_target) && link_target == 'blank'
168
167
  end
169
168
 
170
- def partial_name
171
- self.class.name.split('::').last.underscore
172
- end
169
+ def partial_name
170
+ self.class.name.split('::').last.underscore
171
+ end
173
172
 
174
173
  end
175
174
 
@@ -1,54 +1,54 @@
1
1
  module Alchemy
2
- class I18n
2
+ class I18n
3
3
 
4
- # A I18n Proxy for Alchemy translations
5
- #
6
- # Instead of having to translate strings and defining a default value:
7
- #
8
- # Alchemy::I18n.t("Hello World!", :default => 'Hello World!')
9
- #
10
- # We define this method to define the value only once:
11
- #
12
- # Alchemy::I18n.t("Hello World!")
13
- #
14
- # Note that interpolation still works:
15
- #
16
- # Alchemy::I18n.t("Hello %{world}!", :world => @world)
17
- #
18
- # === Notes
19
- #
20
- # All translations are scoped into the +alchemy+ namespace.
21
- # Even scopes are scoped into the +alchemy+ namespace.
22
- #
23
- # So a call for t('hello', :scope => :world) has to be translated like this:
24
- #
25
- # de:
26
- # alchemy:
27
- # world:
28
- # hello: Hallo
29
- #
30
- def self.t(msg, *args)
31
- options = args.extract_options!
32
- options[:default] = options[:default] ? options[:default] : msg.to_s.humanize
33
- scope = ['alchemy']
34
- case options[:scope].class.name
35
- when "Array"
36
- scope += options[:scope]
37
- when "String"
38
- scope << options[:scope]
39
- when "Symbol"
40
- scope << options[:scope] unless options[:scope] == :alchemy
41
- end
42
- ::I18n.t(msg, options.merge(:scope => scope))
43
- end
4
+ # A I18n Proxy for Alchemy translations
5
+ #
6
+ # Instead of having to translate strings and defining a default value:
7
+ #
8
+ # Alchemy::I18n.t("Hello World!", :default => 'Hello World!')
9
+ #
10
+ # We define this method to define the value only once:
11
+ #
12
+ # Alchemy::I18n.t("Hello World!")
13
+ #
14
+ # Note that interpolation still works:
15
+ #
16
+ # Alchemy::I18n.t("Hello %{world}!", :world => @world)
17
+ #
18
+ # === Notes
19
+ #
20
+ # All translations are scoped into the +alchemy+ namespace.
21
+ # Even scopes are scoped into the +alchemy+ namespace.
22
+ #
23
+ # So a call for t('hello', :scope => :world) has to be translated like this:
24
+ #
25
+ # de:
26
+ # alchemy:
27
+ # world:
28
+ # hello: Hallo
29
+ #
30
+ def self.t(msg, *args)
31
+ options = args.extract_options!
32
+ options[:default] = options[:default] ? options[:default] : msg.to_s.humanize
33
+ scope = ['alchemy']
34
+ case options[:scope].class.name
35
+ when "Array"
36
+ scope += options[:scope]
37
+ when "String"
38
+ scope << options[:scope]
39
+ when "Symbol"
40
+ scope << options[:scope] unless options[:scope] == :alchemy
41
+ end
42
+ ::I18n.t(msg, options.merge(:scope => scope))
43
+ end
44
44
 
45
- def self.available_locales
46
- translation_files.collect { |f| f.match(/.{2}\.yml$/).to_s.gsub(/\.yml/, '') }.uniq
47
- end
45
+ def self.available_locales
46
+ translation_files.collect { |f| f.match(/.{2}\.yml$/).to_s.gsub(/\.yml/, '') }.uniq
47
+ end
48
48
 
49
- def self.translation_files
50
- Rails.application.config.i18n.load_path.select { |p| p.split('/').last.match(/alchemy/) }
51
- end
49
+ def self.translation_files
50
+ Rails.application.config.i18n.load_path.select { |p| p.split('/').last.match(/alchemy/) }
51
+ end
52
52
 
53
- end
53
+ end
54
54
  end
@@ -1,38 +1,38 @@
1
1
  module Alchemy
2
- module Modules
2
+ module Modules
3
3
 
4
- @@alchemy_modules = YAML.load_file(File.join(File.dirname(__FILE__), '../..', 'config/alchemy', 'modules.yml'))
4
+ @@alchemy_modules = YAML.load_file(File.join(File.dirname(__FILE__), '../..', 'config/alchemy', 'modules.yml'))
5
5
 
6
- def self.included(base)
7
- base.send :helper_method, :alchemy_modules, :module_definition_for
8
- end
6
+ def self.included(base)
7
+ base.send :helper_method, :alchemy_modules, :module_definition_for
8
+ end
9
9
 
10
- def alchemy_modules
11
- @@alchemy_modules
12
- end
10
+ def alchemy_modules
11
+ @@alchemy_modules
12
+ end
13
13
 
14
- def module_definition_for(name)
15
- if name.is_a? String
16
- alchemy_modules.detect{ |p| p["name"] == name }
17
- elsif name.is_a? Hash
18
- alchemy_modules.detect do |alchemy_module|
19
- alchemy_module.stringify_keys!
20
- name.symbolize_keys!
21
- module_navi = alchemy_module["navigation"].stringify_keys
22
- if module_navi["sub_navigation"]
23
- module_navi["sub_navigation"].map(&:stringify_keys).detect do |subnavi|
24
- subnavi["controller"].gsub(/^\//, '') == name[:controller] && subnavi["action"] == name[:action]
25
- end
26
- end
27
- end
28
- else
29
- raise "Could not find module definition for #{name}"
30
- end
31
- end
14
+ def module_definition_for(name)
15
+ if name.is_a? String
16
+ alchemy_modules.detect { |p| p["name"] == name }
17
+ elsif name.is_a? Hash
18
+ alchemy_modules.detect do |alchemy_module|
19
+ alchemy_module.stringify_keys!
20
+ name.symbolize_keys!
21
+ module_navi = alchemy_module["navigation"].stringify_keys
22
+ if module_navi["sub_navigation"]
23
+ module_navi["sub_navigation"].map(&:stringify_keys).detect do |subnavi|
24
+ subnavi["controller"].gsub(/^\//, '') == name[:controller] && subnavi["action"] == name[:action]
25
+ end
26
+ end
27
+ end
28
+ else
29
+ raise "Could not find module definition for #{name}"
30
+ end
31
+ end
32
32
 
33
- def self.register_module(module_definition)
34
- @@alchemy_modules << module_definition.stringify_keys
35
- end
33
+ def self.register_module(module_definition)
34
+ @@alchemy_modules << module_definition.stringify_keys
35
+ end
36
36
 
37
- end
37
+ end
38
38
  end
@@ -1,10 +1,10 @@
1
1
  module Alchemy
2
2
 
3
- # Returns alchemys mount point in current rails app.
4
- def self.mount_point
5
- alchemy_routes = Rails.application.routes.named_routes[:alchemy]
6
- raise "Alchemy not mounted! Please mount Alchemy::Engine in your config/routes.rb file." if alchemy_routes.nil?
7
- alchemy_routes.path.gsub(/^\/$/, '')
8
- end
3
+ # Returns alchemys mount point in current rails app.
4
+ def self.mount_point
5
+ alchemy_routes = Rails.application.routes.named_routes[:alchemy]
6
+ raise "Alchemy not mounted! Please mount Alchemy::Engine in your config/routes.rb file." if alchemy_routes.nil?
7
+ alchemy_routes.path.spec.to_s.gsub(/^\/$/, '')
8
+ end
9
9
 
10
10
  end
@@ -1,107 +1,108 @@
1
1
  module Alchemy
2
- class PageLayout
2
+ class PageLayout
3
3
 
4
- def self.included(base)
5
- get_layouts
6
- end
4
+ def self.included(base)
5
+ get_layouts
6
+ end
7
7
 
8
- def self.element_names_for(page_layout)
9
- layout_description = get(page_layout)
10
- if layout_description.blank?
11
- puts "\n+++ Warning: No Layout Description for #{page_layout} found! in page_layouts.yml\n"
12
- return []
13
- else
14
- layout_description["elements"]
15
- end
16
- end
8
+ def self.element_names_for(page_layout)
9
+ layout_description = get(page_layout)
10
+ if layout_description.blank?
11
+ puts "\n+++ Warning: No Layout Description for #{page_layout} found! in page_layouts.yml\n"
12
+ return []
13
+ else
14
+ layout_description["elements"]
15
+ end
16
+ end
17
17
 
18
- # Returns the page_layout.yml file. Tries to first load from config/alchemy and if not found from vendor/plugins/alchemy/config/alchemy.
19
- def self.get_layouts
20
- @@definitions ||= read_layouts_file
21
- end
18
+ # Returns the page_layout.yml file. Tries to first load from config/alchemy and if not found from vendor/plugins/alchemy/config/alchemy.
19
+ def self.get_layouts
20
+ @@definitions ||= read_layouts_file
21
+ end
22
22
 
23
- # Add additional pagelayout definitions. I.E. from your module.
24
- # Call +Alchemy::PageLayout.add(your_layout_definition)+ in your engine.rb file.
25
- # You can pass a single layout definition as Hash, or a collection of pagelayouts as Array.
26
- # Example Pagelayout definitions can be found in the +page_layouts.yml+ from the standard set.
27
- def self.add(page_layout)
28
- get_layouts
29
- if page_layout.is_a?(Array)
30
- @@definitions += page_layout
31
- elsif page_layout.is_a?(Hash)
32
- @@definitions << page_layout
33
- else
34
- raise TypeError
35
- end
36
- end
23
+ # Add additional pagelayout definitions. I.E. from your module.
24
+ # Call +Alchemy::PageLayout.add(your_layout_definition)+ in your engine.rb file.
25
+ # You can pass a single layout definition as Hash, or a collection of pagelayouts as Array.
26
+ # Example Pagelayout definitions can be found in the +page_layouts.yml+ from the standard set.
27
+ def self.add(page_layout)
28
+ get_layouts
29
+ if page_layout.is_a?(Array)
30
+ @@definitions += page_layout
31
+ elsif page_layout.is_a?(Hash)
32
+ @@definitions << page_layout
33
+ else
34
+ raise TypeError
35
+ end
36
+ end
37
37
 
38
- # Returns the page_layout description found by name in page_layouts.yml
39
- def self.get(name)
40
- return {} if name.blank?
41
- get_layouts.detect{ |a| a["name"].downcase == name.downcase }
42
- end
38
+ # Returns the page_layout description found by name in page_layouts.yml
39
+ def self.get(name)
40
+ return {} if name.blank?
41
+ get_layouts.detect { |a| a["name"].downcase == name.downcase }
42
+ end
43
43
 
44
- def self.get_all_by_attributes(attributes)
45
- return [] if attributes.blank?
46
- if attributes.class.name == 'Hash'
47
- layouts = []
48
- attributes.stringify_keys.each do |key, value|
49
- result = get_layouts.select{ |a| a[key].to_s.downcase == value.to_s.downcase if a.has_key?(key) }
50
- layouts += result unless result.empty?
51
- end
52
- return layouts
53
- else
54
- return []
55
- end
56
- end
44
+ def self.get_all_by_attributes(attributes)
45
+ return [] if attributes.blank?
46
+ if attributes.class.name == 'Hash'
47
+ layouts = []
48
+ attributes.stringify_keys.each do |key, value|
49
+ result = get_layouts.select { |a| a[key].to_s.downcase == value.to_s.downcase if a.has_key?(key) }
50
+ layouts += result unless result.empty?
51
+ end
52
+ return layouts
53
+ else
54
+ return []
55
+ end
56
+ end
57
57
 
58
- # Returns page layouts ready for Rails' select form helper.
59
- def self.get_layouts_for_select(language_id, layoutpage = false)
60
- layouts_for_select = [ [ Alchemy::I18n.t("Please choose"), "" ] ]
61
- selectable_layouts(language_id, layoutpage).each do |layout|
62
- display_name = Alchemy::I18n.t("page_layout_names.#{layout['name']}", :default => layout['name'].camelize)
63
- layouts_for_select << [display_name, layout["name"]]
64
- end
65
- layouts_for_select
66
- end
58
+ # Returns page layouts ready for Rails' select form helper.
59
+ def self.get_layouts_for_select(language_id, layoutpage = false)
60
+ layouts_for_select = [[Alchemy::I18n.t("Please choose"), ""]]
61
+ selectable_layouts(language_id, layoutpage).each do |layout|
62
+ display_name = Alchemy::I18n.t("page_layout_names.#{layout['name']}", :default => layout['name'].camelize)
63
+ layouts_for_select << [display_name, layout["name"]]
64
+ end
65
+ layouts_for_select
66
+ end
67
67
 
68
- def self.selectable_layouts(language_id, layoutpage = false)
69
- get_layouts.select do |layout|
70
- used = layout["unique"] && has_a_page_this_layout?(layout["name"], language_id)
71
- if layoutpage
72
- layout["layoutpage"] == true && !used
73
- else
74
- layout["layoutpage"] != true && !used
75
- end
76
- end
77
- end
68
+ def self.selectable_layouts(language_id, layoutpage = false)
69
+ get_layouts.select do |layout|
70
+ next if layout["hide"]
71
+ used = layout["unique"] && has_a_page_this_layout?(layout["name"], language_id)
72
+ if layoutpage
73
+ layout["layoutpage"] == true && !used
74
+ else
75
+ layout["layoutpage"] != true && !used
76
+ end
77
+ end
78
+ end
78
79
 
79
- def self.get_page_layout_names
80
- a = []
81
- get_layouts.each{ |l| a << l.keys.first }
82
- a
83
- end
80
+ def self.get_page_layout_names
81
+ a = []
82
+ get_layouts.each { |l| a << l.keys.first }
83
+ a
84
+ end
84
85
 
85
- def self.has_a_page_this_layout?(layout, language_id)
86
- Page.where({:page_layout => layout, :language_id => language_id}).any?
87
- end
86
+ def self.has_a_page_this_layout?(layout, language_id)
87
+ Page.where({:page_layout => layout, :language_id => language_id}).any?
88
+ end
88
89
 
89
- # Reads the layout definitions from +config/alchemy/page_layouts.yml+.
90
- # If this can not be found, it takes the default one from Alchemys standard set.
91
- def self.read_layouts_file
92
- if File.exists? "#{Rails.root}/config/alchemy/page_layouts.yml"
93
- layouts = YAML.load_file "#{Rails.root}/config/alchemy/page_layouts.yml"
94
- end
95
- if !layouts
96
- if File.exists? File.join(File.dirname(__FILE__), "../../config/alchemy/page_layouts.yml")
97
- layouts = YAML.load_file File.join(File.dirname(__FILE__), "../../config/alchemy/page_layouts.yml")
98
- end
99
- end
100
- if !layouts
101
- raise LoadError, "Could not find page_layouts.yml file! Please run: rails generate alchemy:scaffold"
102
- end
103
- layouts
104
- end
90
+ # Reads the layout definitions from +config/alchemy/page_layouts.yml+.
91
+ # If this can not be found, it takes the default one from Alchemys standard set.
92
+ def self.read_layouts_file
93
+ if File.exists? "#{Rails.root}/config/alchemy/page_layouts.yml"
94
+ layouts = YAML.load_file "#{Rails.root}/config/alchemy/page_layouts.yml"
95
+ end
96
+ if !layouts
97
+ if File.exists? File.join(File.dirname(__FILE__), "../../config/alchemy/page_layouts.yml")
98
+ layouts = YAML.load_file File.join(File.dirname(__FILE__), "../../config/alchemy/page_layouts.yml")
99
+ end
100
+ end
101
+ if !layouts
102
+ raise LoadError, "Could not find page_layouts.yml file! Please run: rails generate alchemy:scaffold"
103
+ end
104
+ layouts
105
+ end
105
106
 
106
- end
107
+ end
107
108
  end