alchemy_cms 2.1.beta1 → 2.1.beta5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (555) hide show
  1. data/.gitignore +2 -1
  2. data/.rspec +2 -2
  3. data/.travis.yml +2 -1
  4. data/Gemfile +8 -9
  5. data/README.md +10 -10
  6. data/Rakefile +0 -1
  7. data/alchemy_cms.gemspec +7 -9
  8. data/app/assets/images/alchemy/icons.png +0 -0
  9. data/app/assets/javascripts/alchemy/alchemy.base.js +8 -2
  10. data/app/assets/javascripts/alchemy/{alchemy.dragndrop.js → alchemy.dragndrop.js.erb} +3 -3
  11. data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +1 -1
  12. data/app/assets/javascripts/alchemy/alchemy.growler.js +3 -3
  13. data/app/assets/javascripts/alchemy/alchemy.js +10 -15
  14. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +6 -2
  15. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +1 -1
  16. data/app/assets/javascripts/alchemy/alchemy.preview.js +1 -1
  17. data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +38 -0
  18. data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +360 -0
  19. data/app/assets/javascripts/alchemy/alchemy.windows.js +32 -17
  20. data/app/assets/javascripts/alchemy/preview.js +1 -0
  21. data/{vendor → app}/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +0 -0
  22. data/{vendor → app}/assets/javascripts/tiny_mce/plugins/alchemy_link/langs/de.js +0 -0
  23. data/{vendor → app}/assets/javascripts/tiny_mce/plugins/alchemy_link/langs/en.js +0 -0
  24. data/{vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.erb → app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss} +15 -33
  25. data/app/assets/stylesheets/alchemy/_defaults.scss +4 -16
  26. data/app/assets/stylesheets/alchemy/alchemy.css +2 -2
  27. data/app/assets/stylesheets/alchemy/base.css.scss +161 -205
  28. data/app/assets/stylesheets/alchemy/elements.css.scss +15 -8
  29. data/app/assets/stylesheets/alchemy/{jquery-ui.alchemy.css → jquery-ui.alchemy.css.scss} +41 -45
  30. data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +14 -10
  31. data/app/assets/stylesheets/alchemy/{tinymce_content.css → tinymce_content.css.scss} +7 -6
  32. data/app/assets/stylesheets/alchemy/{tinymce_dialog.css → tinymce_dialog.css.scss} +7 -7
  33. data/app/controllers/alchemy/admin/attachments_controller.rb +131 -0
  34. data/app/controllers/alchemy/admin/base_controller.rb +118 -0
  35. data/app/controllers/alchemy/admin/clipboard_controller.rb +46 -0
  36. data/app/controllers/alchemy/admin/contents_controller.rb +55 -0
  37. data/app/controllers/alchemy/admin/dashboard_controller.rb +15 -0
  38. data/app/controllers/alchemy/admin/elements_controller.rb +123 -0
  39. data/app/controllers/alchemy/admin/essence_audios_controller.rb +12 -0
  40. data/app/controllers/alchemy/admin/essence_files_controller.rb +27 -0
  41. data/app/controllers/alchemy/admin/essence_flashes_controller.rb +12 -0
  42. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +91 -0
  43. data/app/controllers/alchemy/admin/essence_videos_controller.rb +12 -0
  44. data/app/controllers/alchemy/admin/languages_controller.rb +7 -0
  45. data/app/controllers/alchemy/admin/layoutpages_controller.rb +13 -0
  46. data/app/controllers/alchemy/admin/pages_controller.rb +253 -0
  47. data/app/controllers/alchemy/admin/pictures_controller.rb +139 -0
  48. data/app/controllers/alchemy/admin/resources_controller.rb +132 -0
  49. data/app/controllers/alchemy/admin/trash_controller.rb +24 -0
  50. data/app/controllers/alchemy/admin/users_controller.rb +81 -0
  51. data/app/controllers/alchemy/attachments_controller.rb +30 -0
  52. data/app/controllers/alchemy/base_controller.rb +137 -0
  53. data/app/controllers/alchemy/elements_controller.rb +18 -0
  54. data/app/controllers/alchemy/messages_controller.rb +115 -0
  55. data/app/controllers/alchemy/pages_controller.rb +169 -0
  56. data/app/controllers/alchemy/pictures_controller.rb +62 -0
  57. data/app/controllers/alchemy/user_sessions_controller.rb +80 -0
  58. data/app/helpers/alchemy/admin/attachments_helper.rb +11 -0
  59. data/app/helpers/alchemy/admin/base_helper.rb +423 -0
  60. data/app/helpers/alchemy/admin/contents_helper.rb +75 -0
  61. data/app/helpers/alchemy/admin/elements_helper.rb +118 -0
  62. data/app/helpers/alchemy/admin/essences_helper.rb +78 -0
  63. data/app/helpers/alchemy/admin/pages_helper.rb +46 -0
  64. data/app/helpers/alchemy/admin/pictures_helper.rb +30 -0
  65. data/app/helpers/alchemy/base_helper.rb +65 -0
  66. data/app/helpers/alchemy/elements_helper.rb +173 -0
  67. data/app/helpers/alchemy/essences_helper.rb +101 -0
  68. data/app/helpers/alchemy/pages_helper.rb +550 -0
  69. data/app/mailers/alchemy/messages.rb +17 -0
  70. data/app/mailers/alchemy/notifications.rb +25 -0
  71. data/app/models/alchemy.rb +7 -0
  72. data/app/models/alchemy/attachment.rb +82 -0
  73. data/app/models/alchemy/cell.rb +61 -0
  74. data/app/models/alchemy/content.rb +163 -0
  75. data/app/models/alchemy/element.rb +479 -0
  76. data/app/models/alchemy/essence_audio.rb +19 -0
  77. data/app/models/alchemy/essence_date.rb +22 -0
  78. data/app/models/alchemy/essence_file.rb +19 -0
  79. data/app/models/alchemy/essence_flash.rb +17 -0
  80. data/app/models/alchemy/essence_html.rb +21 -0
  81. data/app/models/alchemy/essence_picture.rb +29 -0
  82. data/app/models/alchemy/essence_richtext.rb +63 -0
  83. data/app/models/alchemy/essence_text.rb +40 -0
  84. data/app/models/alchemy/essence_video.rb +19 -0
  85. data/app/models/alchemy/folded_page.rb +5 -0
  86. data/app/models/alchemy/language.rb +90 -0
  87. data/app/models/alchemy/message.rb +71 -0
  88. data/app/models/alchemy/page.rb +548 -0
  89. data/app/models/alchemy/picture.rb +100 -0
  90. data/app/models/alchemy/user.rb +72 -0
  91. data/app/models/alchemy/user_session.rb +12 -0
  92. data/app/sweepers/alchemy/content_sweeper.rb +22 -0
  93. data/app/sweepers/alchemy/pages_sweeper.rb +49 -0
  94. data/app/sweepers/alchemy/pictures_sweeper.rb +23 -0
  95. data/app/views/{admin → alchemy/admin}/attachments/_archive_overlay.html.erb +6 -6
  96. data/app/views/{admin → alchemy/admin}/attachments/_attachment.html.erb +14 -14
  97. data/app/views/{admin → alchemy/admin}/attachments/_file_to_assign.html.erb +0 -0
  98. data/app/views/alchemy/admin/attachments/_files_list.html.erb +25 -0
  99. data/app/views/{admin → alchemy/admin}/attachments/create.js.erb +0 -0
  100. data/app/views/{admin → alchemy/admin}/attachments/destroy.js.erb +0 -0
  101. data/app/views/{admin → alchemy/admin}/attachments/edit.html.erb +2 -2
  102. data/app/views/alchemy/admin/attachments/index.html.erb +18 -0
  103. data/app/views/{admin → alchemy/admin}/attachments/new.html.erb +3 -3
  104. data/app/views/{admin → alchemy/admin}/clipboard/clear.js.erb +1 -1
  105. data/app/views/alchemy/admin/clipboard/index.html.erb +19 -0
  106. data/app/views/alchemy/admin/clipboard/insert.js.erb +14 -0
  107. data/app/views/alchemy/admin/clipboard/remove.js.erb +10 -0
  108. data/app/views/{admin → alchemy/admin}/contents/_missing.html.erb +4 -4
  109. data/app/views/{admin → alchemy/admin}/contents/create.js.erb +10 -10
  110. data/app/views/{admin → alchemy/admin}/contents/destroy.js.erb +0 -0
  111. data/app/views/{admin → alchemy/admin}/contents/new.html.erb +1 -1
  112. data/app/views/{admin → alchemy/admin}/contents/order.js.erb +0 -0
  113. data/app/views/alchemy/admin/dashboard/index.html.erb +96 -0
  114. data/app/views/{admin → alchemy/admin}/elements/_add_content.html.erb +2 -2
  115. data/app/views/{admin → alchemy/admin}/elements/_element.html.erb +3 -3
  116. data/app/views/{admin → alchemy/admin}/elements/_element_foot.html.erb +8 -8
  117. data/app/views/{admin → alchemy/admin}/elements/_element_head.html.erb +4 -4
  118. data/app/views/{admin → alchemy/admin}/elements/_elements_select.html.erb +2 -2
  119. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +30 -0
  120. data/app/views/{admin → alchemy/admin}/elements/_picture_editor.html.erb +3 -3
  121. data/app/views/{admin → alchemy/admin}/elements/create.js.erb +2 -2
  122. data/app/views/{admin → alchemy/admin}/elements/destroy.js.erb +1 -1
  123. data/app/views/{admin → alchemy/admin}/elements/fold.js.erb +2 -2
  124. data/app/views/{admin → alchemy/admin}/elements/index.html.erb +1 -10
  125. data/app/views/{admin → alchemy/admin}/elements/list.js.erb +2 -2
  126. data/app/views/alchemy/admin/elements/new.html.erb +41 -0
  127. data/app/views/{admin → alchemy/admin}/elements/order.js.erb +1 -1
  128. data/app/views/{admin → alchemy/admin}/elements/trash.js.erb +1 -1
  129. data/app/views/{admin → alchemy/admin}/elements/update.js.erb +1 -1
  130. data/app/views/{admin → alchemy/admin}/essence_files/assign.js.erb +1 -1
  131. data/app/views/{admin → alchemy/admin}/essence_files/edit.html.erb +23 -23
  132. data/app/views/{admin → alchemy/admin}/essence_pictures/assign.js.erb +2 -2
  133. data/app/views/{admin → alchemy/admin}/essence_pictures/crop.html.erb +15 -6
  134. data/app/views/{admin → alchemy/admin}/essence_pictures/destroy.js.erb +1 -1
  135. data/app/views/{admin → alchemy/admin}/essence_pictures/edit.html.erb +11 -11
  136. data/app/views/{admin → alchemy/admin}/essence_pictures/save_link.js.erb +0 -0
  137. data/app/views/{admin → alchemy/admin}/essence_pictures/update.js.erb +2 -2
  138. data/app/views/alchemy/admin/languages/_language.html.erb +36 -0
  139. data/app/views/{admin → alchemy/admin}/layoutpages/_layoutpage.html.erb +18 -18
  140. data/app/views/alchemy/admin/layoutpages/index.html.erb +65 -0
  141. data/app/views/{admin → alchemy/admin}/pages/_contactform_links.html.erb +6 -6
  142. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +38 -0
  143. data/app/views/{admin → alchemy/admin}/pages/_external_link.html.erb +9 -9
  144. data/app/views/{admin → alchemy/admin}/pages/_file_link.html.erb +13 -13
  145. data/app/views/{admin → alchemy/admin}/pages/_internal_link.html.erb +8 -8
  146. data/app/views/{admin → alchemy/admin}/pages/_new_page_form.html.erb +6 -6
  147. data/app/views/{admin → alchemy/admin}/pages/_page.html.erb +25 -25
  148. data/app/views/{admin → alchemy/admin}/pages/_page_for_links.html.erb +6 -6
  149. data/app/views/{admin → alchemy/admin}/pages/_page_infos.html.erb +3 -3
  150. data/app/views/{admin → alchemy/admin}/pages/_page_status.html.erb +4 -4
  151. data/app/views/{admin → alchemy/admin}/pages/_sitemap.html.erb +21 -21
  152. data/app/views/alchemy/admin/pages/configure.html.erb +71 -0
  153. data/app/views/{admin → alchemy/admin}/pages/configure_external.html.erb +9 -9
  154. data/app/views/{admin → alchemy/admin}/pages/destroy.js.erb +2 -2
  155. data/app/views/alchemy/admin/pages/edit.html.erb +181 -0
  156. data/app/views/alchemy/admin/pages/flush.js.erb +2 -0
  157. data/app/views/{admin → alchemy/admin}/pages/fold.js.erb +0 -0
  158. data/app/views/alchemy/admin/pages/index.html.erb +104 -0
  159. data/app/views/{admin → alchemy/admin}/pages/link.html.erb +4 -4
  160. data/app/views/alchemy/admin/pages/locked.html.erb +3 -0
  161. data/app/views/{admin → alchemy/admin}/pages/new.html.erb +8 -8
  162. data/app/views/{admin → alchemy/admin}/pages/show.html.erb +0 -0
  163. data/app/views/{admin → alchemy/admin}/pages/sort.js.erb +0 -0
  164. data/app/views/{admin → alchemy/admin}/pages/unlock.js.erb +1 -1
  165. data/app/views/{admin → alchemy/admin}/pages/update.js.erb +5 -5
  166. data/app/views/{admin → alchemy/admin}/partials/_flash.html.erb +0 -0
  167. data/app/views/{admin → alchemy/admin}/partials/_flash_notices.html.erb +1 -1
  168. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +14 -0
  169. data/app/views/alchemy/admin/partials/_pagination_links.html.erb +5 -0
  170. data/app/views/{admin → alchemy/admin}/partials/_remote_pagination_links.html.erb +2 -2
  171. data/app/views/{admin → alchemy/admin}/partials/_remote_search_form.html.erb +2 -2
  172. data/app/views/{admin → alchemy/admin}/partials/_search_form.html.erb +6 -7
  173. data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +8 -0
  174. data/app/views/alchemy/admin/partials/_upload_form.html.erb +129 -0
  175. data/app/views/{admin → alchemy/admin}/pictures/_archive_overlay.html.erb +3 -3
  176. data/app/views/{admin → alchemy/admin}/pictures/_filter_and_size_bar.html.erb +15 -15
  177. data/app/views/{admin → alchemy/admin}/pictures/_picture.html.erb +7 -7
  178. data/app/views/{admin → alchemy/admin}/pictures/_picture_to_assign.html.erb +2 -2
  179. data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +14 -0
  180. data/app/views/{admin → alchemy/admin}/pictures/archive_overlay.js.erb +0 -0
  181. data/app/views/{admin → alchemy/admin}/pictures/create.js.erb +3 -3
  182. data/app/views/{admin → alchemy/admin}/pictures/flush.js.erb +0 -0
  183. data/app/views/alchemy/admin/pictures/index.html.erb +83 -0
  184. data/app/views/{admin → alchemy/admin}/pictures/new.html.erb +3 -3
  185. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +1 -0
  186. data/app/views/{admin → alchemy/admin}/pictures/update.js.erb +0 -0
  187. data/app/views/alchemy/admin/resources/_form.html.erb +20 -0
  188. data/app/views/alchemy/admin/resources/_resource.html.erb +35 -0
  189. data/app/views/alchemy/admin/resources/_table.html.erb +23 -0
  190. data/app/views/alchemy/admin/resources/destroy.js.erb +1 -0
  191. data/app/views/{admin/languages → alchemy/admin/resources}/edit.html.erb +0 -0
  192. data/app/views/alchemy/admin/resources/index.html.erb +19 -0
  193. data/app/views/{admin/languages → alchemy/admin/resources}/new.html.erb +0 -0
  194. data/app/views/{admin → alchemy/admin}/trash/clear.js.erb +1 -1
  195. data/app/views/{admin → alchemy/admin}/trash/index.html.erb +4 -4
  196. data/app/views/alchemy/admin/users/_table.html.erb +54 -0
  197. data/app/views/{admin → alchemy/admin}/users/_user.html.erb +14 -12
  198. data/app/views/{admin → alchemy/admin}/users/edit.html.erb +0 -0
  199. data/app/views/alchemy/admin/users/index.html.erb +41 -0
  200. data/app/views/{admin → alchemy/admin}/users/new.html.erb +1 -1
  201. data/app/views/{attachments → alchemy/attachments}/show.html.erb +0 -0
  202. data/app/views/alchemy/base/500.html.erb +5 -0
  203. data/app/views/alchemy/base/error_notice.js.erb +2 -0
  204. data/app/views/alchemy/base/permission_denied.js.erb +2 -0
  205. data/app/views/alchemy/{redirect.js.erb → base/redirect.js.erb} +0 -0
  206. data/app/views/alchemy/{remote_errors.js.erb → base/remote_errors.js.erb} +0 -0
  207. data/app/views/alchemy/{update.js.erb → base/update.js.erb} +0 -0
  208. data/app/views/{elements → alchemy/elements}/_article_editor.html.erb +0 -0
  209. data/app/views/{elements → alchemy/elements}/_article_view.html.erb +1 -1
  210. data/app/views/{elements → alchemy/elements}/_bild_editor.html.erb +0 -0
  211. data/app/views/{elements → alchemy/elements}/_bild_text_editor.html.erb +0 -0
  212. data/app/views/{elements → alchemy/elements}/_bild_text_view.html.erb +1 -1
  213. data/app/views/{elements → alchemy/elements}/_bild_view.html.erb +1 -1
  214. data/app/views/{elements → alchemy/elements}/_claim_editor.html.erb +0 -0
  215. data/app/views/{elements → alchemy/elements}/_claim_view.html.erb +0 -0
  216. data/app/views/{elements → alchemy/elements}/_contactform_editor.html.erb +0 -0
  217. data/app/views/{elements → alchemy/elements}/_contactform_view.html.erb +0 -0
  218. data/app/views/{elements → alchemy/elements}/_editor_not_found.html.erb +1 -1
  219. data/app/views/{elements → alchemy/elements}/_footnote_editor.html.erb +0 -0
  220. data/app/views/{elements → alchemy/elements}/_footnote_view.html.erb +0 -0
  221. data/app/views/{elements → alchemy/elements}/_header_editor.html.erb +0 -0
  222. data/app/views/{elements → alchemy/elements}/_header_view.html.erb +1 -1
  223. data/app/views/{elements → alchemy/elements}/_headline_editor.html.erb +0 -0
  224. data/app/views/{elements → alchemy/elements}/_headline_view.html.erb +0 -0
  225. data/app/views/{elements → alchemy/elements}/_image_mosaic_editor.html.erb +0 -0
  226. data/app/views/{elements → alchemy/elements}/_image_mosaic_view.html.erb +1 -1
  227. data/app/views/{elements → alchemy/elements}/_intro_editor.html.erb +0 -0
  228. data/app/views/{elements → alchemy/elements}/_intro_image_text_editor.html.erb +0 -0
  229. data/app/views/{elements → alchemy/elements}/_intro_image_text_view.html.erb +1 -1
  230. data/app/views/{elements → alchemy/elements}/_intro_view.html.erb +0 -0
  231. data/app/views/{elements → alchemy/elements}/_news_editor.html.erb +0 -0
  232. data/app/views/{elements → alchemy/elements}/_news_view.html.erb +0 -0
  233. data/app/views/alchemy/elements/_searchresult_editor.html.erb +1 -0
  234. data/app/views/alchemy/elements/_searchresult_view.html.erb +4 -0
  235. data/app/views/alchemy/elements/_sitemap_editor.html.erb +3 -0
  236. data/app/views/{elements → alchemy/elements}/_sitemap_view.html.erb +2 -2
  237. data/app/views/{elements → alchemy/elements}/_sitename_editor.html.erb +0 -0
  238. data/app/views/{elements → alchemy/elements}/_sitename_view.html.erb +0 -0
  239. data/app/views/{elements → alchemy/elements}/_subheadline_editor.html.erb +0 -0
  240. data/app/views/{elements → alchemy/elements}/_subheadline_view.html.erb +0 -0
  241. data/app/views/{elements → alchemy/elements}/_text_editor.html.erb +0 -0
  242. data/app/views/{elements → alchemy/elements}/_text_view.html.erb +0 -0
  243. data/app/views/{elements → alchemy/elements}/_view_not_found.html.erb +0 -0
  244. data/app/views/alchemy/elements/show.html.erb +6 -0
  245. data/app/views/{elements → alchemy/elements}/show.js.erb +1 -1
  246. data/app/views/alchemy/essences/_essence_audio_editor.html.erb +1 -0
  247. data/app/views/{essences → alchemy/essences}/_essence_audio_view.html.erb +0 -0
  248. data/app/views/{essences → alchemy/essences}/_essence_date_editor.html.erb +0 -0
  249. data/app/views/{essences → alchemy/essences}/_essence_date_view.html.erb +0 -0
  250. data/app/views/{essences → alchemy/essences}/_essence_file_editor.html.erb +9 -9
  251. data/app/views/{essences → alchemy/essences}/_essence_file_view.html.erb +1 -1
  252. data/app/views/alchemy/essences/_essence_flash_editor.html.erb +1 -0
  253. data/app/views/{essences → alchemy/essences}/_essence_flash_view.html.erb +0 -0
  254. data/app/views/{essences → alchemy/essences}/_essence_html_editor.html.erb +0 -0
  255. data/app/views/{essences → alchemy/essences}/_essence_html_view.html.erb +0 -0
  256. data/app/views/{essences → alchemy/essences}/_essence_picture_editor.html.erb +8 -8
  257. data/app/views/{essences → alchemy/essences}/_essence_picture_tools.html.erb +11 -11
  258. data/app/views/{essences → alchemy/essences}/_essence_picture_view.html.erb +2 -4
  259. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +11 -0
  260. data/app/views/{essences → alchemy/essences}/_essence_richtext_view.html.erb +0 -0
  261. data/app/views/{essences → alchemy/essences}/_essence_text_editor.html.erb +6 -6
  262. data/app/views/{essences → alchemy/essences}/_essence_text_view.html.erb +0 -0
  263. data/app/views/alchemy/essences/_essence_video_editor.html.erb +1 -0
  264. data/app/views/{essences → alchemy/essences}/_essence_video_view.html.erb +1 -1
  265. data/app/views/{messages → alchemy/messages}/contact_form_mail.html.erb +0 -0
  266. data/app/views/{messages → alchemy/messages}/contact_form_mail.text.erb +0 -0
  267. data/app/views/{messages → alchemy/messages}/new.html.erb +0 -0
  268. data/app/views/{navigation → alchemy/navigation}/_image_link.html.erb +0 -0
  269. data/app/views/{navigation → alchemy/navigation}/_link.html.erb +1 -1
  270. data/app/views/{navigation → alchemy/navigation}/_renderer.html.erb +0 -0
  271. data/app/views/alchemy/notifications/admin_user_created.text.erb +13 -0
  272. data/app/views/alchemy/notifications/registered_user_created.text.erb +10 -0
  273. data/app/views/{page_layouts → alchemy/page_layouts}/_contact.html.erb +0 -0
  274. data/app/views/{page_layouts → alchemy/page_layouts}/_external.html.erb +0 -0
  275. data/app/views/{page_layouts → alchemy/page_layouts}/_intro.html.erb +0 -0
  276. data/app/views/{page_layouts → alchemy/page_layouts}/_layout_footer.html.erb +0 -0
  277. data/app/views/{page_layouts → alchemy/page_layouts}/_layout_header.html.erb +0 -0
  278. data/app/views/{page_layouts → alchemy/page_layouts}/_news.html.erb +0 -0
  279. data/app/views/{_newsletter_layout.html.erb → alchemy/page_layouts/_newsletter_layout.html.erb} +0 -0
  280. data/app/views/{page_layouts → alchemy/page_layouts}/_search.html.erb +0 -0
  281. data/app/views/{page_layouts → alchemy/page_layouts}/_standard.html.erb +0 -0
  282. data/app/views/{pages → alchemy/pages}/show.html.erb +0 -0
  283. data/app/views/{pages → alchemy/pages}/show.rss.builder +0 -0
  284. data/app/views/{pages → alchemy/pages}/sitemap.xml.erb +0 -0
  285. data/app/views/{pictures → alchemy/pictures}/show.gif.flexi +0 -0
  286. data/app/views/{pictures → alchemy/pictures}/show.jpg.flexi +0 -0
  287. data/app/views/{pictures → alchemy/pictures}/show.png.flexi +0 -0
  288. data/app/views/{pictures → alchemy/pictures}/thumbnail.png.flexi +0 -0
  289. data/app/views/{pictures → alchemy/pictures}/zoom.png.flexi +0 -0
  290. data/app/views/alchemy/search/_result.html.erb +9 -0
  291. data/app/views/alchemy/user_sessions/leave.html.erb +11 -0
  292. data/app/views/alchemy/user_sessions/login.html.erb +47 -0
  293. data/app/views/alchemy/user_sessions/logout.html.erb +3 -0
  294. data/app/views/alchemy/user_sessions/signup.html.erb +14 -0
  295. data/app/views/layouts/{alchemy.html.erb → alchemy/admin.html.erb} +23 -17
  296. data/app/views/layouts/alchemy/login.html.erb +37 -0
  297. data/app/views/layouts/alchemy/pages.html.erb +29 -0
  298. data/app/views/layouts/{sitemap.xml.erb → alchemy/sitemap.xml.erb} +0 -0
  299. data/config/alchemy/config.yml +2 -80
  300. data/config/alchemy/modules.yml +70 -0
  301. data/config/alchemy/page_layouts.yml +2 -0
  302. data/config/authorization_rules.rb +32 -39
  303. data/config/locales/alchemy.de.yml +789 -0
  304. data/config/locales/alchemy.en.yml +587 -0
  305. data/config/routes.rb +144 -142
  306. data/db/migrate/20111116125112_namespace_models.rb +23 -0
  307. data/lib/alchemy/auth_engine.rb +7 -0
  308. data/lib/alchemy/capistrano.rb +4 -1
  309. data/lib/alchemy/engine.rb +39 -25
  310. data/lib/alchemy/essence.rb +5 -1
  311. data/lib/alchemy/i18n.rb +47 -0
  312. data/lib/alchemy/modules.rb +38 -0
  313. data/lib/alchemy/page_layout.rb +98 -56
  314. data/lib/alchemy/seeder.rb +60 -110
  315. data/lib/alchemy/tinymce.rb +2 -2
  316. data/lib/alchemy/version.rb +3 -3
  317. data/lib/alchemy_cms.rb +23 -23
  318. data/lib/rails/generators/alchemy/elements/elements_generator.rb +1 -1
  319. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +1 -1
  320. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +2 -2
  321. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +1 -1
  322. data/lib/rails/generators/alchemy/plugin/plugin_generator.rb +0 -1
  323. data/lib/rails/generators/alchemy/scaffold/files/pages.html.erb +1 -1
  324. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +34 -34
  325. data/lib/tasks/install.rake +2 -9
  326. data/lib/tasks/upgrade.rake +69 -208
  327. data/spec/controllers/admin/clipboard_controller_spec.rb +33 -35
  328. data/spec/controllers/admin/contents_controller_spec.rb +5 -5
  329. data/spec/controllers/admin/elements_controller_spec.rb +22 -0
  330. data/spec/controllers/admin/trash_controller_spec.rb +5 -5
  331. data/spec/controllers/base_controller_spec.rb +67 -0
  332. data/spec/controllers/pages_controller_spec.rb +6 -6
  333. data/spec/dummy/config/application.rb +1 -8
  334. data/spec/dummy/config/routes.rb +2 -57
  335. data/spec/dummy/db/schema.rb +27 -27
  336. data/spec/factories.rb +8 -8
  337. data/spec/helpers/{alchemy_helper_spec.rb → admin/base_helper_spec.rb} +8 -1
  338. data/spec/helpers/admin/contents_helper_spec.rb +25 -0
  339. data/spec/helpers/admin/elements_helper_spec.rb +31 -3
  340. data/spec/helpers/admin/essences_helper_spec.rb +27 -0
  341. data/spec/helpers/elements_helper_spec.rb +99 -21
  342. data/spec/helpers/essences_helper_spec.rb +1 -18
  343. data/spec/helpers/pages_helper_spec.rb +212 -26
  344. data/spec/integration/admin/pages_controller_spec.rb +56 -0
  345. data/spec/integration/navigation_spec.rb +1 -1
  346. data/spec/integration/pages_controller_spec.rb +85 -68
  347. data/spec/integration/security_spec.rb +49 -22
  348. data/spec/models/content_spec.rb +3 -3
  349. data/spec/models/element_spec.rb +19 -11
  350. data/spec/models/essence_richtext_spec.rb +2 -2
  351. data/spec/models/language_spec.rb +36 -7
  352. data/spec/models/page_spec.rb +57 -13
  353. data/spec/models/user_spec.rb +1 -1
  354. data/spec/page_layout_spec.rb +13 -3
  355. data/spec/routing_spec.rb +12 -8
  356. data/spec/spec_helper.rb +8 -9
  357. data/spec/support/controller_hacks.rb +37 -0
  358. data/vendor/assets/javascripts/swfupload/SWFObject License.txt +4 -0
  359. data/vendor/assets/javascripts/swfupload/swfupload.cookies.js +53 -0
  360. data/vendor/assets/javascripts/swfupload/swfupload.js +1 -1
  361. data/vendor/assets/javascripts/swfupload/{queue.js → swfupload.queue.js} +97 -97
  362. data/vendor/assets/javascripts/swfupload/swfupload.speed.js +342 -0
  363. data/vendor/assets/javascripts/swfupload/swfupload.swfobject.js +111 -0
  364. data/vendor/assets/javascripts/tiny_mce/license.txt +504 -504
  365. data/vendor/assets/javascripts/tiny_mce/plugins/autoresize/editor_plugin.js +1 -1
  366. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +110 -110
  367. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  368. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  369. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  370. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  371. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  372. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  373. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  374. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  375. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +387 -387
  376. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +36 -36
  377. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +51 -51
  378. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +26 -26
  379. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +21 -21
  380. data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +180 -180
  381. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +16 -16
  382. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +25 -25
  383. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +13 -13
  384. data/vendor/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -1
  385. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +319 -319
  386. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +27 -27
  387. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +237 -237
  388. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +484 -450
  389. data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +32 -32
  390. data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +158 -158
  391. data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +188 -188
  392. data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +52 -52
  393. data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +26 -26
  394. data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +55 -51
  395. data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +74 -74
  396. data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -1
  397. data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +80 -80
  398. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +73 -73
  399. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +43 -43
  400. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +363 -355
  401. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +329 -329
  402. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +251 -251
  403. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +153 -153
  404. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +56 -56
  405. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
  406. data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +57 -57
  407. data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +47 -47
  408. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +50 -50
  409. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +117 -117
  410. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +214 -214
  411. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +24 -0
  412. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +105 -0
  413. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
  414. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +48 -48
  415. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +117 -117
  416. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +217 -217
  417. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +7 -7
  418. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -5
  419. data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +25 -25
  420. data/vendor/assets/javascripts/tiny_mce/tiny_mce.js +1 -1
  421. data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +70 -70
  422. data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +210 -210
  423. data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +161 -161
  424. data/vendor/assets/javascripts/tiny_mce/utils/validate.js +252 -252
  425. metadata +432 -465
  426. data/app/controllers/admin/attachments_controller.rb +0 -136
  427. data/app/controllers/admin/clipboard_controller.rb +0 -43
  428. data/app/controllers/admin/contents_controller.rb +0 -60
  429. data/app/controllers/admin/elements_controller.rb +0 -134
  430. data/app/controllers/admin/essence_audios_controller.rb +0 -10
  431. data/app/controllers/admin/essence_files_controller.rb +0 -25
  432. data/app/controllers/admin/essence_flashes_controller.rb +0 -10
  433. data/app/controllers/admin/essence_pictures_controller.rb +0 -84
  434. data/app/controllers/admin/essence_videos_controller.rb +0 -10
  435. data/app/controllers/admin/languages_controller.rb +0 -64
  436. data/app/controllers/admin/layoutpages_controller.rb +0 -12
  437. data/app/controllers/admin/pages_controller.rb +0 -251
  438. data/app/controllers/admin/pictures_controller.rb +0 -143
  439. data/app/controllers/admin/trash_controller.rb +0 -28
  440. data/app/controllers/admin/users_controller.rb +0 -73
  441. data/app/controllers/admin_controller.rb +0 -76
  442. data/app/controllers/alchemy_controller.rb +0 -245
  443. data/app/controllers/attachments_controller.rb +0 -28
  444. data/app/controllers/elements_controller.rb +0 -16
  445. data/app/controllers/messages_controller.rb +0 -113
  446. data/app/controllers/pages_controller.rb +0 -150
  447. data/app/controllers/pictures_controller.rb +0 -63
  448. data/app/helpers/admin/attachments_helper.rb +0 -7
  449. data/app/helpers/admin/elements_helper.rb +0 -112
  450. data/app/helpers/admin/pages_helper.rb +0 -38
  451. data/app/helpers/admin/pictures_helper.rb +0 -26
  452. data/app/helpers/alchemy_helper.rb +0 -379
  453. data/app/helpers/contents_helper.rb +0 -69
  454. data/app/helpers/elements_helper.rb +0 -170
  455. data/app/helpers/essences_helper.rb +0 -167
  456. data/app/helpers/layout_helper.rb +0 -37
  457. data/app/helpers/pages_helper.rb +0 -503
  458. data/app/mailers/messages.rb +0 -15
  459. data/app/mailers/notifications.rb +0 -23
  460. data/app/models/attachment.rb +0 -80
  461. data/app/models/cell.rb +0 -59
  462. data/app/models/content.rb +0 -145
  463. data/app/models/element.rb +0 -476
  464. data/app/models/essence_audio.rb +0 -17
  465. data/app/models/essence_date.rb +0 -20
  466. data/app/models/essence_file.rb +0 -17
  467. data/app/models/essence_flash.rb +0 -15
  468. data/app/models/essence_html.rb +0 -19
  469. data/app/models/essence_picture.rb +0 -27
  470. data/app/models/essence_richtext.rb +0 -61
  471. data/app/models/essence_text.rb +0 -38
  472. data/app/models/essence_video.rb +0 -17
  473. data/app/models/folded_page.rb +0 -3
  474. data/app/models/language.rb +0 -83
  475. data/app/models/message.rb +0 -69
  476. data/app/models/page.rb +0 -545
  477. data/app/models/picture.rb +0 -98
  478. data/app/models/user.rb +0 -70
  479. data/app/models/user_session.rb +0 -10
  480. data/app/sweepers/content_sweeper.rb +0 -20
  481. data/app/sweepers/pages_sweeper.rb +0 -47
  482. data/app/sweepers/pictures_sweeper.rb +0 -21
  483. data/app/views/_contact.html.erb +0 -3
  484. data/app/views/_intro.html.erb +0 -3
  485. data/app/views/_news.html.erb +0 -3
  486. data/app/views/_search.html.erb +0 -3
  487. data/app/views/_standard.html.erb +0 -1
  488. data/app/views/admin/attachments/_files_list.html.erb +0 -24
  489. data/app/views/admin/attachments/index.html.erb +0 -30
  490. data/app/views/admin/clipboard/index.html.erb +0 -19
  491. data/app/views/admin/clipboard/insert.js.erb +0 -14
  492. data/app/views/admin/clipboard/remove.js.erb +0 -10
  493. data/app/views/admin/elements/_new_element_form.html.erb +0 -25
  494. data/app/views/admin/elements/new.html.erb +0 -33
  495. data/app/views/admin/index.html.erb +0 -102
  496. data/app/views/admin/infos.html.erb +0 -5
  497. data/app/views/admin/languages/_form.html.erb +0 -34
  498. data/app/views/admin/languages/_language.html.erb +0 -35
  499. data/app/views/admin/languages/destroy.js.erb +0 -1
  500. data/app/views/admin/languages/index.html.erb +0 -41
  501. data/app/views/admin/layoutpages/index.html.erb +0 -75
  502. data/app/views/admin/leave.html.erb +0 -11
  503. data/app/views/admin/login.html.erb +0 -46
  504. data/app/views/admin/logout.html.erb +0 -5
  505. data/app/views/admin/pages/_create_language_form.html.erb +0 -43
  506. data/app/views/admin/pages/configure.html.erb +0 -71
  507. data/app/views/admin/pages/edit.html.erb +0 -185
  508. data/app/views/admin/pages/flush.js.erb +0 -2
  509. data/app/views/admin/pages/index.html.erb +0 -108
  510. data/app/views/admin/pages/locked.html.erb +0 -3
  511. data/app/views/admin/partials/_mainnavigation_entry.html.erb +0 -27
  512. data/app/views/admin/partials/_pagination_links.html.erb +0 -5
  513. data/app/views/admin/partials/_per_page_links.html.erb +0 -17
  514. data/app/views/admin/partials/_sub_navigation.html.erb +0 -14
  515. data/app/views/admin/partials/_upload_form.html.erb +0 -119
  516. data/app/views/admin/pictures/_pictures_list.html.erb +0 -12
  517. data/app/views/admin/pictures/index.html.erb +0 -89
  518. data/app/views/admin/pictures/show_in_window.html.erb +0 -1
  519. data/app/views/admin/signup.html.erb +0 -16
  520. data/app/views/admin/users/_table.html.erb +0 -54
  521. data/app/views/admin/users/index.html.erb +0 -41
  522. data/app/views/alchemy/error_notice.js.erb +0 -1
  523. data/app/views/alchemy/permission_denied.js.erb +0 -2
  524. data/app/views/elements/_searchresult_editor.html.erb +0 -1
  525. data/app/views/elements/_searchresult_view.html.erb +0 -49
  526. data/app/views/elements/_sitemap_editor.html.erb +0 -3
  527. data/app/views/elements/show.html.erb +0 -6
  528. data/app/views/essences/_essence_audio_editor.html.erb +0 -1
  529. data/app/views/essences/_essence_flash_editor.html.erb +0 -1
  530. data/app/views/essences/_essence_richtext_editor.html.erb +0 -9
  531. data/app/views/essences/_essence_video_editor.html.erb +0 -1
  532. data/app/views/layouts/login.html.erb +0 -59
  533. data/app/views/layouts/pages.html.erb +0 -29
  534. data/app/views/notifications/admin_user_created.text.erb +0 -13
  535. data/app/views/notifications/registered_user_created.text.erb +0 -10
  536. data/app/views/page_layouts/_newsletter_layout.html.erb +0 -1
  537. data/config/initializers/authorization.rb +0 -4
  538. data/config/initializers/fast_gettext.rb +0 -3
  539. data/config/locales/de.yml +0 -377
  540. data/config/locales/en.yml +0 -371
  541. data/lib/alchemy/controller.rb +0 -79
  542. data/lib/rails/generators/alchemy/plugin/templates/gettext.rb +0 -2
  543. data/lib/tasks/gettext.rake +0 -120
  544. data/lib/translation_extras/alchemy_core_modules.rb +0 -11
  545. data/locale/alchemy.pot +0 -1749
  546. data/locale/de/alchemy.po +0 -1795
  547. data/locale/en/alchemy.po +0 -1745
  548. data/locale/missing_translations.rb +0 -4
  549. data/locale/model_attributes.rb +0 -56
  550. data/spec/helpers/contents_helper_spec.rb +0 -27
  551. data/vendor/assets/javascripts/jquery-1.6.2.min.js +0 -18
  552. data/vendor/assets/javascripts/jquery-ui-custom-1.8.16.min.js +0 -550
  553. data/vendor/assets/javascripts/swfupload/fileprogress.js +0 -203
  554. data/vendor/assets/javascripts/swfupload/handlers.js +0 -171
  555. data/vendor/assets/javascripts/tiny_mce/jquery.tinymce.js +0 -1
@@ -1,15 +0,0 @@
1
- class Messages < ActionMailer::Base
2
-
3
- default :from => Alchemy::Config.get(:mailer)[:mail_from]
4
-
5
- def contact_form_mail(message, mail_to, mail_from, subject)
6
- @message = message
7
- mail(
8
- :from => mail_from,
9
- :to => mail_to,
10
- :reply_to => message.email,
11
- :subject => subject
12
- )
13
- end
14
-
15
- end
@@ -1,23 +0,0 @@
1
- class Notifications < ActionMailer::Base
2
-
3
- default :from => Alchemy::Config.get(:mailer)[:mail_from]
4
-
5
- def registered_user_created(user)
6
- @user = user
7
- @url = login_url
8
- mail(
9
- :to => user.email,
10
- :subject => I18n.t("alchemy.mailer.new_user_mail.subject")
11
- )
12
- end
13
-
14
- def admin_user_created(user)
15
- @user = user
16
- @url = admin_url
17
- mail(
18
- :to => user.email,
19
- :subject => _("Your Alchemy Login")
20
- )
21
- end
22
-
23
- end
@@ -1,80 +0,0 @@
1
- class Attachment < ActiveRecord::Base
2
-
3
- stampable
4
-
5
- has_attachment(
6
- :storage => :file_system,
7
- :file_system_path => 'uploads/attachments',
8
- :size => 0.kilobytes..1000.megabytes
9
- )
10
- validates_as_attachment
11
-
12
- def name
13
- read_attribute(:name).split('.').first
14
- end
15
-
16
- def extension
17
- filename.split(".").last
18
- end
19
- alias_method :suffix, :extension
20
-
21
- def icon_css_class
22
- case content_type
23
- when "application/x-flash-video"
24
- then "video"
25
- when "video/x-flv"
26
- then "video"
27
- when "video/mp4"
28
- then "video"
29
- when "video/mpeg"
30
- then "video"
31
- when "video/quicktime"
32
- then "video"
33
- when "video/x-msvideo"
34
- then "video"
35
- when "video/x-ms-wmv"
36
- then "video"
37
- when "application/zip"
38
- then "archive"
39
- when "application/x-rar"
40
- then "archive"
41
- when "audio/mpeg"
42
- then "audio"
43
- when "audio/mp4"
44
- then "audio"
45
- when "audio/wav"
46
- then "audio"
47
- when "audio/x-wav"
48
- then "audio"
49
- when "application/x-shockwave-flash"
50
- then "flash"
51
- when "image/gif"
52
- then "image"
53
- when "image/jpeg"
54
- then "image"
55
- when "image/png"
56
- then "image"
57
- when "image/tiff"
58
- then "image"
59
- when "image/x-psd"
60
- then "psd"
61
- when "text/plain"
62
- then "text"
63
- when "application/rtf"
64
- then "rtf"
65
- when "application/pdf"
66
- then "pdf"
67
- when "application/msword"
68
- then "word"
69
- when "application/vnd.ms-excel"
70
- then "excel"
71
- when "text/x-vcard"
72
- then "vcard"
73
- when "application/vcard"
74
- then "vcard"
75
- else
76
- "file"
77
- end
78
- end
79
-
80
- end
data/app/models/cell.rb DELETED
@@ -1,59 +0,0 @@
1
- # A cell is a group of elements that are rendered inside a specific area on your page_layout.
2
- # Think of it like a column, or section in your layout. I.e. a header or right column.
3
- #
4
- # Elements are displayed in tabs inside the elements window in page edit view.
5
- # Every cell is a list of elements with the position scoped to +cell_id+ and +page_id+.
6
- #
7
- # Define cells inside a +cells.yml+ file located in the +config/alchermy+ folder of your project.
8
- #
9
- # Render cells with the +render_cell+ helper
10
- #
11
- # Views for cells are inside the +app/views/cells+ folder in you project.
12
- #
13
- class Cell < ActiveRecord::Base
14
-
15
- belongs_to :page
16
- has_many :elements, :dependent => :destroy, :order => :position
17
-
18
- def self.definitions
19
- cell_yml = File.join(Rails.root, 'config', 'alchemy', 'cells.yml')
20
- YAML.load_file(cell_yml) if File.exist?(cell_yml)
21
- end
22
-
23
- def self.definition_for(cellname)
24
- return nil if cellname.blank?
25
- definitions.detect { |c| c['name'] == cellname }
26
- end
27
-
28
- def self.all_definitions_for(cellnames)
29
- definitions.select { |c| cellnames.include? c['name'] }
30
- end
31
-
32
- def self.all_element_definitions_for(cellnames)
33
- element_names = []
34
- all_definitions_for(cellnames).each do |cell|
35
- element_names += cell['elements']
36
- end
37
- Element.all_definitions_for(element_names.uniq)
38
- end
39
-
40
- def self.definitions_for_element(element_name)
41
- return [] if definitions.blank?
42
- definitions.select { |d| d['elements'].include?(element_name) }
43
- end
44
-
45
- def self.names_for_element(element_name)
46
- definitions = definitions_for_element(element_name)
47
- return nil if definitions.blank?
48
- definitions.collect { |d| d['name'] }
49
- end
50
-
51
- def name_for_label
52
- self.class.translated_label_for(self.name)
53
- end
54
-
55
- def self.translated_label_for(cell_name)
56
- I18n.t("alchemy.cell_names.#{cell_name}", :default => cell_name.camelcase)
57
- end
58
-
59
- end
@@ -1,145 +0,0 @@
1
- class Content < ActiveRecord::Base
2
-
3
- belongs_to :essence, :polymorphic => true, :dependent => :destroy
4
- belongs_to :element
5
- stampable :stamper_class_name => :user
6
- acts_as_list
7
-
8
- def scope_condition
9
- "element_id = '#{element_id}' AND essence_type = '#{essence_type}'"
10
- end
11
-
12
- validates_uniqueness_of :position, :scope => [:element_id, :essence_type]
13
-
14
- # Creates a new Content as descriped in the elements.yml file
15
- def self.create_from_scratch(element, essences_hash)
16
- if essences_hash[:name].blank? && !essences_hash[:essence_type].blank?
17
- essences_of_same_type = element.contents.find_all_by_essence_type(essences_hash[:essence_type])
18
- description = {
19
- 'type' => essences_hash[:essence_type],
20
- 'name' => "#{essences_hash[:essence_type].underscore}_#{essences_of_same_type.length + 1}"
21
- }
22
- else
23
- description = element.content_description_for(essences_hash[:name])
24
- description = element.available_content_description_for(essences_hash[:name]) if description.blank?
25
- end
26
- raise "No description found in elements.yml for #{essences_hash.inspect} and #{element.inspect}" if description.blank?
27
- essence_class = ObjectSpace.const_get(description['type'])
28
- content = self.new(:name => description['name'], :element_id => element.id)
29
- if description['type'] == "EssenceRichtext" || description['type'] == "EssenceText"
30
- essence = essence_class.create(:do_not_index => !description['do_not_index'].nil?)
31
- else
32
- essence = essence_class.create
33
- end
34
- if essence
35
- content.essence = essence
36
- content.save
37
- else
38
- content = nil
39
- end
40
- return content
41
- end
42
-
43
- # Settings from the elements.yml definition
44
- def settings
45
- return {} if description.blank?
46
- settings = description['settings']
47
- return {} if settings.blank?
48
- settings.symbolize_keys
49
- end
50
-
51
- # makes a copy of source and copies the polymorphic associated essence
52
- def self.copy(source, differences = {})
53
- differences[:position] = nil
54
- differences[:id] = nil
55
- attributes = source.attributes.merge(differences)
56
- content = self.create!(attributes.except("id"))
57
- new_essence = content.essence.clone
58
- new_essence.save
59
- content.essence_id = new_essence.id
60
- content
61
- end
62
-
63
- # Returns my description hash from elements.yml
64
- # Returns the description from available_contents if my own description is blank
65
- def description
66
- if self.element.blank?
67
- logger.warn("\n+++++++++++ Warning: Content with id #{self.id} is missing its Element\n")
68
- return nil
69
- else
70
- desc = self.element.content_description_for(self.name)
71
- if desc.blank?
72
- desc = self.element.available_content_description_for(self.name)
73
- else
74
- return desc
75
- end
76
- end
77
- end
78
-
79
- # Gets the ingredient from essence
80
- def ingredient
81
- return nil if self.essence.nil?
82
- self.essence.ingredient
83
- end
84
-
85
- # Calls essence.save_ingredient. Called from ElementController#update for each content in element.
86
- # Adding errors if essence validation fails.
87
- def save_essence(params, options = {})
88
- if essence.save_ingredient(params, options)
89
- return true
90
- else
91
- errors.add(:base, :essence_validation_failed)
92
- return false
93
- end
94
- end
95
-
96
- def essence_validation_failed?
97
- !essence.essence_errors.blank?
98
- end
99
-
100
- def has_validations?
101
- return false if description.blank?
102
- !description['validate'].blank?
103
- end
104
-
105
- # Returns a string to be passed to Rails form field tags to ensure we have same params layout everywhere.
106
- #
107
- # Example:
108
- # ========
109
- # <%= text_field_tag content.form_field_name, content.ingredient %>
110
- #
111
- # Options:
112
- # ========
113
- # You can pass an Essence column_name. Default is self.essence.ingredient_column
114
- #
115
- # Example:
116
- # =======
117
- # <%= text_field_tag content.form_field_name(:link), content.ingredient %>
118
- #
119
- def form_field_name(essence_column = self.essence.ingredient_column)
120
- "contents[content_#{self.id}][#{essence_column}]"
121
- end
122
-
123
- def form_field_id(essence_column = self.essence.ingredient_column)
124
- "contents_content_#{self.id}_#{essence_column}"
125
- end
126
-
127
- # Returns the translated name for displaying in labels, etc.
128
- def name_for_label
129
- self.class.translated_label_for(self.name, self.element.name)
130
- end
131
-
132
- # Translates a name from string. Optional: pass an element_name to namespacing.
133
- def self.translated_label_for(content_name, element_name = nil)
134
- if element_name.blank?
135
- I18n.t("alchemy.content_names.#{content_name}", :default => content_name.capitalize)
136
- else
137
- I18n.t("alchemy.content_names.#{element_name}.#{content_name}", :default => ["alchemy.content_names.#{content_name}".to_sym, content_name.capitalize])
138
- end
139
- end
140
-
141
- def linked?
142
- essence && !essence.link.blank?
143
- end
144
-
145
- end
@@ -1,476 +0,0 @@
1
- class Element < ActiveRecord::Base
2
-
3
- # All Elements inside a cell are a list. All Elements not in cell are in the cell_id.nil list.
4
- acts_as_list :scope => [:page_id, :cell_id]
5
- stampable :stamper_class_name => :user
6
-
7
- has_many :contents, :order => :position, :dependent => :destroy
8
- belongs_to :cell
9
- belongs_to :page
10
- has_and_belongs_to_many :to_be_sweeped_pages, :class_name => 'Page', :uniq => true
11
-
12
- validates_uniqueness_of :position, :scope => [:page_id, :cell_id]
13
- validates_presence_of :name, :on => :create, :message => N_("Please choose an element.")
14
-
15
- attr_accessor :create_contents_after_create
16
- after_create :create_contents, :unless => Proc.new { |m| m.create_contents_after_create == false }
17
-
18
- # TODO: add a trashed column to elements table
19
- scope :trashed, where(:page_id => nil).order('updated_at DESC')
20
- scope :not_trashed, where('`elements`.`page_id` IS NOT NULL')
21
- scope :published, where(:public => true)
22
- scope :named, lambda { |names| where(arel_table[:name].in(names)) }
23
- scope :excluded, lambda { |names| where(arel_table[:name].not_in(names)) }
24
-
25
- # Returns next Element on self.page or nil. Pass a Element.name to get next of this kind.
26
- def next(name = nil)
27
- if name.nil?
28
- find_conditions = ["public = 1 AND page_id = ? AND position > ?", self.page.id, self.position]
29
- else
30
- find_conditions = ["public = 1 AND page_id = ? AND name = ? AND position > ?", self.page.id, name, self.position]
31
- end
32
- self.class.where(find_conditions).order("position ASC").limit(1)
33
- end
34
-
35
- # Returns previous Element on self.page or nil. Pass a Element.name to get previous of this kind.
36
- def prev(name = nil)
37
- if name.nil?
38
- find_conditions = ["public = 1 AND page_id = ? AND position < ?", self.page.id, self.position]
39
- else
40
- find_conditions = ["public = 1 AND page_id = ? AND name = ? AND position < ?", self.page.id, name, self.position]
41
- end
42
- self.class.where(find_conditions).order("position DESC").limit(1)
43
- end
44
-
45
- # Stores the page into `to_be_sweeped_pages` (Pages that have to be sweeped after updating element).
46
- def store_page(page)
47
- return true if page.nil?
48
- unless self.to_be_sweeped_pages.include? page
49
- self.to_be_sweeped_pages << page
50
- self.save
51
- end
52
- end
53
-
54
- # nullifies the page_id aka. trashs it.
55
- def trash
56
- self.attributes = {
57
- :page_id => nil,
58
- :cell_id => nil,
59
- :folded => true,
60
- :public => false
61
- }
62
- # If we validate the element, it will not get trashed if another element with same postion is already trashed.
63
- # And we cannot remove the position, because it will not be reordered in the list if its position is nil.
64
- self.remove_from_list
65
- end
66
-
67
- def trashed?
68
- page_id.nil?
69
- end
70
-
71
- def content_by_name(name)
72
- self.contents.find_by_name(name)
73
- end
74
-
75
- def content_by_type(essence_type)
76
- self.contents.find_by_essence_type(essence_type)
77
- end
78
-
79
- def all_contents_by_name(name)
80
- self.contents.find_all_by_name(name)
81
- end
82
-
83
- def all_contents_by_type(essence_type)
84
- self.contents.find_all_by_essence_type(essence_type)
85
- end
86
-
87
- # Returns the content that is marked as rss title.
88
- #
89
- # Mark a content as rss title in your +elements.yml+ file:
90
- #
91
- # - name: news
92
- # contents:
93
- # - name: headline
94
- # type: EssenceText
95
- # rss_title: true
96
- #
97
- def content_for_rss_title
98
- rss_title = content_descriptions.detect { |c| c['rss_title'] }
99
- contents.find_by_name(rss_title['name'])
100
- end
101
-
102
- # Returns the content that is marked as rss description.
103
- #
104
- # Mark a content as rss description in your +elements.yml+ file:
105
- #
106
- # - name: news
107
- # contents:
108
- # - name: body
109
- # type: EssenceRichtext
110
- # rss_description: true
111
- #
112
- def content_for_rss_description
113
- rss_title = content_descriptions.detect { |c| c['rss_description'] }
114
- contents.find_by_name(rss_title['name'])
115
- end
116
-
117
- # Inits a new element for page as described in /config/alchemy/elements.yml from element_name
118
- def self.new_from_scratch(attributes)
119
- attributes.stringify_keys!
120
- return Element.new if attributes['name'].blank?
121
- element_descriptions = Element.descriptions
122
- return if element_descriptions.blank?
123
- element_scratch = element_descriptions.select{ |m| m["name"] == attributes['name'].split('#').first }.first
124
- element = Element.new(
125
- element_scratch.except('contents', 'available_contents', 'display_name').merge({
126
- :page_id => attributes['page_id']
127
- })
128
- )
129
- element
130
- end
131
-
132
- # Inits a new element for page as described in /config/alchemy/elements.yml from element_name and saves it
133
- def self.create_from_scratch(attributes)
134
- element = Element.new_from_scratch(attributes)
135
- element.save if element
136
- return element
137
- end
138
-
139
- # pastes a element from the clipboard in the session to page
140
- def self.paste_from_clipboard(page_id, element, method, position)
141
- copy = self.copy(element, :page_id => page_id)
142
- copy.insert_at(position)
143
- if method == "move" && copy.valid?
144
- element.destroy
145
- end
146
- copy
147
- end
148
-
149
- # Returns the descriptions from elements.yml file.
150
- # Alchemy comes with its own elements.yml file. As so called standard set.
151
- # Place a elements.yml file inside your apps config/alchemy folder to define
152
- # your own set of elements
153
- def self.descriptions
154
- if File.exists? "#{Rails.root}/config/alchemy/elements.yml"
155
- element_definitions = YAML.load_file( "#{Rails.root}/config/alchemy/elements.yml" )
156
- end
157
- if !element_definitions
158
- if File.exists?(File.join(File.dirname(__FILE__), "../../config/alchemy/elements.yml"))
159
- element_definitions = YAML.load_file( File.join(File.dirname(__FILE__), "../../config/alchemy/elements.yml") )
160
- end
161
- end
162
- if !element_definitions
163
- raise LoadError, "Could not find elements.yml file! Please run: rails generate alchemy:scaffold"
164
- end
165
- element_definitions
166
- end
167
-
168
- def self.definitions
169
- self.descriptions
170
- end
171
-
172
- # Returns the array with the hashes for all element contents in the elements.yml file
173
- def content_descriptions
174
- return nil if description.blank?
175
- description['contents']
176
- end
177
-
178
- # Returns the array with the hashes for all element available_contents in the elements.yml file
179
- def available_content_descriptions
180
- return nil if description.blank?
181
- description['available_contents']
182
- end
183
-
184
- # Returns the description for given content_name
185
- def content_description_for(content_name)
186
- if content_descriptions.blank?
187
- logger.warn("\n+++++++++++ Warning: Element #{self.name} is missing the content description for #{content_name}\n")
188
- return nil
189
- else
190
- content_descriptions.detect { |d| d['name'] == content_name }
191
- end
192
- end
193
-
194
- # Returns the description for given content_name inside the available_contents
195
- def available_content_description_for(content_name)
196
- return nil if available_content_descriptions.blank?
197
- available_content_descriptions.detect { |d| d['name'] == content_name }
198
- end
199
-
200
- # returns the description of the element with my name in element.yml
201
- def description
202
- self.class.descriptions.detect{ |d| d['name'] == self.name }
203
- end
204
- alias_method :definition, :description
205
-
206
- # Human name for displaying in selectboxes and element editor views.
207
- # The name is beeing translated from elements name value as described in config/alchemy/elements.yml
208
- #
209
- # Translate the name in your config/locales language file. Example:
210
- #
211
- # de:
212
- # element_names:
213
- # contactform: 'Kontakt Formular'
214
- #
215
- # If no translation is found the capitalized name is used!
216
- #
217
- def display_name
218
- return name.capitalize if description.blank?
219
- I18n.t(description['name'], :scope => 'alchemy.element_names', :default => name.capitalize)
220
- end
221
-
222
- # Gets the preview text from the first Content found in the +elements.yml+ Element description file.
223
- # You can flag a Content as +take_me_for_preview+ to take this as preview.
224
- def preview_text(maxlength = 30)
225
- return "" if description.blank?
226
- my_contents = description["contents"]
227
- return "" if my_contents.blank?
228
- content_flagged_as_preview = my_contents.select{ |a| a["take_me_for_preview"] }.first
229
- if content_flagged_as_preview.blank?
230
- content_to_take_as_preview = my_contents.first
231
- else
232
- content_to_take_as_preview = content_flagged_as_preview
233
- end
234
- preview_content = self.contents.select{ |content| content.name == content_to_take_as_preview["name"] }.first
235
- return "" if preview_content.blank? || preview_content.essence.blank?
236
- text = preview_content.essence.preview_text(maxlength)
237
- text.size > maxlength ? "#{text[0..maxlength]}..." : text
238
- end
239
-
240
- # Generates a preview text containing Element#display_name and Element#preview_text.
241
- # It is displayed inside the head of the Element in the Elements.list overlay window from the Alchemy Admin::Page#edit view.
242
- #
243
- # === Example
244
- #
245
- # A Element described as:
246
- #
247
- # - name: funky_element
248
- # display_name: Funky Element
249
- # contents:
250
- # - name: headline
251
- # type: EssenceText
252
- # - name: text
253
- # type EssenceRichtext
254
- # take_me_for_preview: true
255
- #
256
- # With "I want to tell you a funky story" as stripped_body for the EssenceRichtext Content produces:
257
- #
258
- # Funky Element: I want to tell ...
259
- #
260
- # Options:
261
- #
262
- # maxlength(integer). [Default 30] : Length of characters after the text will be cut off.
263
- #
264
- def display_name_with_preview_text(maxlength = 30)
265
- "#{display_name}: #{preview_text(maxlength)}"
266
- end
267
-
268
- def dom_id
269
- "#{name}_#{id}"
270
- end
271
-
272
- # List all elements by from page_layout
273
- def self.elements_for_layout(layout)
274
- element_descriptions = Element.descriptions
275
- elements = []
276
- page_layout = Alchemy::PageLayout.get(layout)
277
- layout_elements = page_layout["elements"]
278
- return element_descriptions if layout_elements == "all"
279
- element_descriptions.each do |element|
280
- if layout_elements.include?(element["name"])
281
- elements << element
282
- end
283
- end
284
- return elements
285
- end
286
-
287
- def self.get_from_clipboard(clipboard)
288
- return nil if clipboard.blank?
289
- self.find_by_id(clipboard[:element_id])
290
- end
291
-
292
- def self.all_from_clipboard(clipboard)
293
- return [] if clipboard.nil?
294
- self.find_all_by_id(clipboard.collect { |i| i[:id] })
295
- end
296
-
297
- def self.all_from_clipboard_for_page(clipboard, page)
298
- return [] if clipboard.nil? || page.nil?
299
- allowed_elements = self.all_for_page(page)
300
- clipboard_elements = self.all_from_clipboard(clipboard)
301
- allowed_element_names = allowed_elements.collect { |e| e['name'] }
302
- clipboard_elements.select { |ce| allowed_element_names.include?(ce.name) }
303
- end
304
-
305
- # returns the collection of available essence_types that can be created for this element depending on its description in elements.yml
306
- def available_contents
307
- description['available_contents']
308
- end
309
-
310
- # Returns the contents ingredient for passed content name.
311
- def ingredient(name)
312
- content = content_by_name(name)
313
- return nil if content.blank?
314
- content.ingredient
315
- end
316
-
317
- def has_ingredient?(name)
318
- !self.ingredient(name).blank?
319
- end
320
-
321
- def save_contents(params)
322
- contents.each do |content|
323
- unless content.save_essence(params[:contents]["content_#{content.id}"], :public => !params["public"].nil?)
324
- errors.add(:base, :essence_validation_failed)
325
- end
326
- end
327
- return errors.blank?
328
- end
329
-
330
- def essences
331
- return [] if contents.blank?
332
- contents.collect(&:essence)
333
- end
334
-
335
- # Returns all essence_errors in the format:
336
- #
337
- # {
338
- # essence.content.name => [error_message_for_validation_1, error_message_for_validation_2]
339
- # }
340
- #
341
- # Get translated error messages with Element#essence_error_messages
342
- #
343
- def essence_errors
344
- essence_errors = {}
345
- essences.each do |essence|
346
- unless essence.essence_errors.blank?
347
- essence_errors[essence.content.name] = essence.essence_errors
348
- end
349
- end
350
- essence_errors
351
- end
352
-
353
- # Essence validation errors messages are translated via I18n.
354
- # Inside your translation file add translations like:
355
- #
356
- # alchemy:
357
- # content_validations:
358
- # name_of_the_element:
359
- # name_of_the_content:
360
- # validation_error_type: Error Message
361
- #
362
- # validation_error_type has to be one of:
363
- #
364
- # * blank
365
- # * taken
366
- # * wrong_format
367
- #
368
- # Example:
369
- #
370
- # de:
371
- # alchemy:
372
- # content_validations:
373
- # contact:
374
- # email:
375
- # wrong_format: 'Die Email hat nicht das richtige Format'
376
- #
377
- def essence_error_messages
378
- messages = []
379
- essence_errors.each do |content_name, errors|
380
- errors.each do |error|
381
- messages << I18n.t(
382
- "alchemy.content_validations.#{self.name}.#{content_name}.#{error}",
383
- :default => [
384
- "alchemy.content_validations.fields.#{content_name}.#{error}".to_sym,
385
- "alchemy.content_validations.errors.#{error}".to_sym
386
- ]
387
- ) % {:field => Content.translated_label_for(content_name)}
388
- end
389
- end
390
- messages
391
- end
392
-
393
- def contents_with_errors
394
- contents.select(&:essence_validation_failed?)
395
- end
396
-
397
- def has_validations?
398
- !contents.detect(&:has_validations?).blank?
399
- end
400
-
401
- def rtf_contents
402
- contents.select { |content| content.essence_type == 'EssenceRichtext' }
403
- end
404
- alias_method :richtext_contents, :rtf_contents
405
-
406
- # The name of the cell the element could be placed in.
407
- def belonging_cellnames(page)
408
- cellnames = Cell.names_for_element(name)
409
- if cellnames.blank? || !page.has_cells?
410
- return ['for_other_elements']
411
- else
412
- return cellnames
413
- end
414
- end
415
-
416
- private
417
-
418
- # List all elements for page_layout
419
- def self.all_for_page(page)
420
- raise TypeError if page.class != Page
421
- # if page_layout has cells, collect elements from cells and group them by cellname
422
- page_layout = Alchemy::PageLayout.get(page.page_layout)
423
- if page_layout.blank?
424
- logger.warn "\n++++++\nWARNING! Could not find page_layout description for page: #{page.name}\n++++++++\n"
425
- return []
426
- end
427
- elements_for_layout = []
428
- elements_for_layout += all_definitions_for(page_layout['elements'])
429
- return [] if elements_for_layout.blank?
430
- # all unique elements from this layout
431
- unique_elements = elements_for_layout.select{ |m| m["unique"] == true }
432
- elements_already_on_the_page = page.elements
433
- # delete all elements from the elements that could be placed that are unique and already and the page
434
- unique_elements.each do |unique_element|
435
- elements_already_on_the_page.each do |already_placed_element|
436
- if already_placed_element.name == unique_element["name"]
437
- elements_for_layout.delete(unique_element)
438
- end
439
- end
440
- end
441
- return elements_for_layout
442
- end
443
-
444
- def self.all_definitions_for(element_names)
445
- return [] if element_names.blank?
446
- if element_names.to_s == "all"
447
- return element_descriptions
448
- else
449
- return definitions.select { |e| element_names.include? e['name'] }
450
- end
451
- end
452
-
453
- # makes a copy of source and makes copies of the contents from source
454
- def self.copy(source, differences = {})
455
- attributes = source.attributes.except("id").merge(differences)
456
- element = self.create!(attributes.merge(:create_contents_after_create => false, :id => nil, :position => nil))
457
- source.contents.each do |content|
458
- new_content = Content.copy(content, :element_id => element.id)
459
- new_content.move_to_bottom
460
- end
461
- element
462
- end
463
-
464
- # creates the contents for this element as described in the elements.yml
465
- def create_contents
466
- contents = []
467
- if description["contents"].blank?
468
- logger.warn "\n++++++\nWARNING! Could not find any content descriptions for element: #{self.name}\n++++++++\n"
469
- else
470
- description["contents"].each do |content_hash|
471
- contents << Content.create_from_scratch(self, content_hash.symbolize_keys)
472
- end
473
- end
474
- end
475
-
476
- end