alchemy_cms 2.1.beta1 → 2.1.beta5

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 (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