alchemy_cms 2.5.3.1 → 2.6.0.rc5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (331) hide show
  1. data/.gitignore +1 -1
  2. data/.travis.yml +5 -13
  3. data/Gemfile +6 -3
  4. data/README.md +3 -2
  5. data/alchemy_cms.gemspec +22 -22
  6. data/app/assets/fonts/alchemy-icons.eot +0 -0
  7. data/app/assets/fonts/alchemy-icons.svg +54 -0
  8. data/app/assets/fonts/alchemy-icons.ttf +0 -0
  9. data/app/assets/fonts/alchemy-icons.woff +0 -0
  10. data/app/assets/images/alchemy/icons.png +0 -0
  11. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +151 -0
  12. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +3 -2
  13. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +31 -0
  14. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +1 -1
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +98 -0
  16. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +23 -24
  17. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +27 -0
  18. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +11 -8
  19. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +32 -0
  20. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +46 -0
  21. data/app/assets/javascripts/alchemy/alchemy.js +8 -2
  22. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +5 -4
  23. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +49 -0
  24. data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +3 -0
  25. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +71 -0
  26. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +61 -0
  27. data/app/assets/javascripts/alchemy/alchemy.spinner.js.coffee +35 -0
  28. data/app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee +11 -0
  29. data/app/assets/javascripts/alchemy/alchemy.windows.js.coffee +278 -0
  30. data/app/assets/stylesheets/alchemy/admin.css.scss +2 -0
  31. data/app/assets/stylesheets/alchemy/archive.scss +109 -65
  32. data/app/assets/stylesheets/alchemy/base.scss +16 -188
  33. data/app/assets/stylesheets/alchemy/dashboard.scss +2 -2
  34. data/app/assets/stylesheets/alchemy/defaults.scss +2 -1
  35. data/app/assets/stylesheets/alchemy/elements.scss +58 -94
  36. data/app/assets/stylesheets/alchemy/errors.scss +2 -2
  37. data/app/assets/stylesheets/alchemy/{mixins.scss → extends.scss} +104 -80
  38. data/app/assets/stylesheets/alchemy/flash.scss +4 -6
  39. data/app/assets/stylesheets/alchemy/fonts.scss +46 -0
  40. data/app/assets/stylesheets/alchemy/form_elements.scss +46 -45
  41. data/app/assets/stylesheets/alchemy/frame.scss +20 -15
  42. data/app/assets/stylesheets/alchemy/icons.scss +22 -9
  43. data/app/assets/stylesheets/alchemy/jquery-ui.scss +476 -399
  44. data/app/assets/stylesheets/alchemy/login.scss +1 -1
  45. data/app/assets/stylesheets/alchemy/menubar.css.scss +1 -1
  46. data/app/assets/stylesheets/alchemy/notices.scss +5 -5
  47. data/app/assets/stylesheets/alchemy/pagination.scss +25 -13
  48. data/app/assets/stylesheets/alchemy/search.scss +29 -17
  49. data/app/assets/stylesheets/alchemy/sitemap.scss +41 -36
  50. data/app/assets/stylesheets/alchemy/tables.scss +102 -50
  51. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +18 -16
  52. data/app/assets/stylesheets/alchemy/toolbar.scss +84 -24
  53. data/app/assets/stylesheets/alchemy/upload.scss +14 -9
  54. data/app/assets/stylesheets/alchemy/variables.scss +1 -0
  55. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +18 -21
  56. data/app/controllers/alchemy/admin/attachments_controller.rb +29 -39
  57. data/app/controllers/alchemy/admin/base_controller.rb +3 -9
  58. data/app/controllers/alchemy/admin/clipboard_controller.rb +1 -1
  59. data/app/controllers/alchemy/admin/contents_controller.rb +1 -1
  60. data/app/controllers/alchemy/admin/dashboard_controller.rb +1 -1
  61. data/app/controllers/alchemy/admin/elements_controller.rb +3 -3
  62. data/app/controllers/alchemy/admin/essence_files_controller.rb +1 -1
  63. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +5 -5
  64. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  65. data/app/controllers/alchemy/admin/pages_controller.rb +18 -16
  66. data/app/controllers/alchemy/admin/pictures_controller.rb +11 -10
  67. data/app/controllers/alchemy/admin/resources_controller.rb +87 -14
  68. data/app/controllers/alchemy/admin/tags_controller.rb +3 -3
  69. data/app/controllers/alchemy/admin/trash_controller.rb +3 -3
  70. data/app/controllers/alchemy/admin/users_controller.rb +6 -11
  71. data/app/controllers/alchemy/attachments_controller.rb +8 -9
  72. data/app/controllers/alchemy/base_controller.rb +17 -10
  73. data/app/controllers/alchemy/pages_controller.rb +7 -19
  74. data/app/controllers/alchemy/passwords_controller.rb +15 -3
  75. data/app/controllers/alchemy/user_sessions_controller.rb +5 -4
  76. data/app/controllers/alchemy/users_controller.rb +1 -1
  77. data/app/helpers/alchemy/admin/attachments_helper.rb +2 -2
  78. data/app/helpers/alchemy/admin/base_helper.rb +62 -90
  79. data/app/helpers/alchemy/admin/elements_helper.rb +13 -5
  80. data/app/helpers/alchemy/admin/essences_helper.rb +3 -5
  81. data/app/helpers/alchemy/admin/pages_helper.rb +6 -3
  82. data/app/helpers/alchemy/admin/tags_helper.rb +60 -0
  83. data/app/helpers/alchemy/base_helper.rb +16 -20
  84. data/app/helpers/alchemy/elements_helper.rb +7 -11
  85. data/app/helpers/alchemy/essences_helper.rb +2 -2
  86. data/app/helpers/alchemy/pages_helper.rb +31 -69
  87. data/app/helpers/alchemy/url_helper.rb +11 -3
  88. data/app/models/alchemy/attachment.rb +73 -45
  89. data/app/models/alchemy/cell.rb +1 -1
  90. data/app/models/alchemy/content.rb +20 -9
  91. data/app/models/alchemy/element.rb +9 -7
  92. data/app/models/alchemy/page.rb +15 -248
  93. data/app/models/alchemy/page/cells.rb +71 -0
  94. data/app/models/alchemy/page/elements.rb +147 -0
  95. data/app/models/alchemy/page/naming.rb +90 -0
  96. data/app/models/alchemy/picture.rb +18 -13
  97. data/app/models/alchemy/tag.rb +1 -1
  98. data/app/models/alchemy/user.rb +38 -6
  99. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +14 -7
  100. data/app/views/alchemy/admin/attachments/_attachment.html.erb +17 -12
  101. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +3 -8
  102. data/app/views/alchemy/admin/attachments/_files_list.html.erb +20 -12
  103. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +11 -0
  104. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +31 -0
  105. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +4 -0
  106. data/app/views/alchemy/admin/attachments/edit.html.erb +8 -7
  107. data/app/views/alchemy/admin/attachments/index.html.erb +19 -12
  108. data/app/views/alchemy/admin/attachments/new.html.erb +2 -2
  109. data/app/views/alchemy/admin/attachments/show.html.erb +3 -0
  110. data/app/views/alchemy/admin/contents/_missing.html.erb +4 -4
  111. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  112. data/app/views/alchemy/admin/contents/new.html.erb +6 -3
  113. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  114. data/app/views/alchemy/admin/dashboard/_users.html.erb +1 -1
  115. data/app/views/alchemy/admin/dashboard/index.html.erb +3 -3
  116. data/app/views/alchemy/admin/dashboard/info.html.erb +16 -13
  117. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  118. data/app/views/alchemy/admin/elements/_element_foot.html.erb +4 -4
  119. data/app/views/alchemy/admin/elements/_element_head.html.erb +1 -7
  120. data/app/views/alchemy/admin/elements/_elements_select.html.erb +2 -2
  121. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +4 -4
  122. data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
  123. data/app/views/alchemy/admin/elements/create.js.erb +2 -2
  124. data/app/views/alchemy/admin/elements/fold.js.erb +3 -6
  125. data/app/views/alchemy/admin/elements/new.html.erb +1 -1
  126. data/app/views/alchemy/admin/elements/order.js.erb +1 -1
  127. data/app/views/alchemy/admin/elements/trash.js.erb +1 -1
  128. data/app/views/alchemy/admin/elements/update.js.erb +2 -2
  129. data/app/views/alchemy/admin/essence_files/edit.html.erb +4 -4
  130. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +17 -18
  131. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +2 -2
  132. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -0
  133. data/app/views/alchemy/admin/languages/_form.html.erb +12 -10
  134. data/app/views/alchemy/admin/languages/_language.html.erb +2 -1
  135. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  136. data/app/views/alchemy/admin/languages/index.html.erb +15 -15
  137. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +6 -6
  138. data/app/views/alchemy/admin/layoutpages/index.html.erb +41 -40
  139. data/app/views/alchemy/admin/pages/_contactform_links.html.erb +4 -4
  140. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +6 -6
  141. data/app/views/alchemy/admin/pages/_external_link.html.erb +2 -2
  142. data/app/views/alchemy/admin/pages/_file_link.html.erb +3 -3
  143. data/app/views/alchemy/admin/pages/_internal_link.html.erb +1 -1
  144. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
  145. data/app/views/alchemy/admin/pages/_page.html.erb +13 -13
  146. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +2 -4
  147. data/app/views/alchemy/admin/pages/_sitemap.html.erb +5 -0
  148. data/app/views/alchemy/admin/pages/configure.html.erb +7 -7
  149. data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
  150. data/app/views/alchemy/admin/pages/edit.html.erb +23 -30
  151. data/app/views/alchemy/admin/pages/index.html.erb +34 -23
  152. data/app/views/alchemy/admin/pages/new.html.erb +1 -1
  153. data/app/views/alchemy/admin/pages/sort.js.erb +1 -1
  154. data/app/views/alchemy/admin/partials/_flash_upload.html.erb +2 -3
  155. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -2
  156. data/app/views/alchemy/admin/partials/_search_form.html.erb +3 -3
  157. data/app/views/alchemy/admin/partials/_upload_form.html.erb +2 -2
  158. data/app/views/alchemy/admin/pictures/_archive.html.erb +7 -7
  159. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  160. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +6 -6
  161. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +4 -4
  162. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  163. data/app/views/alchemy/admin/pictures/_picture.html.erb +3 -8
  164. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +9 -14
  165. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +27 -25
  166. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +3 -1
  167. data/app/views/alchemy/admin/pictures/index.html.erb +49 -42
  168. data/app/views/alchemy/admin/pictures/new.html.erb +2 -2
  169. data/app/views/alchemy/admin/pictures/show.html.erb +11 -0
  170. data/app/views/alchemy/admin/resources/_boolean.html.erb +2 -2
  171. data/app/views/alchemy/admin/resources/_datetime.html.erb +2 -2
  172. data/app/views/alchemy/admin/resources/_form.html.erb +9 -8
  173. data/app/views/alchemy/admin/resources/_resource.html.erb +15 -21
  174. data/app/views/alchemy/admin/resources/_string.html.erb +2 -2
  175. data/app/views/alchemy/admin/resources/_table.html.erb +11 -13
  176. data/app/views/alchemy/admin/resources/_text.html.erb +2 -2
  177. data/app/views/alchemy/admin/resources/index.csv.erb +13 -0
  178. data/app/views/alchemy/admin/resources/index.html.erb +24 -15
  179. data/app/views/alchemy/admin/sites/index.html.erb +23 -0
  180. data/app/views/alchemy/admin/tags/_radio_tag.html.erb +1 -1
  181. data/app/views/alchemy/admin/tags/_tag.html.erb +2 -1
  182. data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
  183. data/app/views/alchemy/admin/tags/index.html.erb +16 -11
  184. data/app/views/alchemy/admin/tags/new.html.erb +3 -3
  185. data/app/views/alchemy/admin/trash/clear.js.coffee +1 -1
  186. data/app/views/alchemy/admin/users/_table.html.erb +12 -5
  187. data/app/views/alchemy/admin/users/_user.html.erb +16 -16
  188. data/app/views/alchemy/admin/users/index.html.erb +28 -16
  189. data/app/views/alchemy/breadcrumb/_page.html.erb +15 -0
  190. data/app/views/alchemy/breadcrumb/_spacer.html.erb +1 -0
  191. data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
  192. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -16
  193. data/app/views/alchemy/essences/_essence_file_view.html.erb +8 -9
  194. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +3 -6
  195. data/app/views/alchemy/essences/_essence_picture_tools.html.erb +9 -8
  196. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +0 -5
  197. data/app/views/alchemy/essences/_linkable_essence_tools.html.erb +2 -2
  198. data/app/views/alchemy/navigation/_link.html.erb +7 -7
  199. data/app/views/alchemy/navigation/_renderer.html.erb +29 -36
  200. data/app/views/alchemy/notifications/admin_user_created.de.text.erb +5 -1
  201. data/app/views/alchemy/notifications/admin_user_created.en.text.erb +5 -1
  202. data/app/views/alchemy/notifications/registered_user_created.de.text.erb +13 -0
  203. data/app/views/alchemy/notifications/registered_user_created.en.text.erb +13 -0
  204. data/app/views/alchemy/search/_result.html.erb +4 -6
  205. data/app/views/alchemy/search/_results.html.erb +4 -5
  206. data/app/views/alchemy/user_sessions/leave.html.erb +1 -1
  207. data/app/views/alchemy/user_sessions/new.html.erb +2 -2
  208. data/app/views/kaminari/_first_page.html.erb +11 -0
  209. data/app/views/kaminari/_gap.html.erb +1 -1
  210. data/app/views/kaminari/_last_page.html.erb +11 -0
  211. data/app/views/kaminari/_next_page.html.erb +2 -2
  212. data/app/views/kaminari/_page.html.erb +1 -1
  213. data/app/views/kaminari/_paginator.html.erb +2 -0
  214. data/app/views/kaminari/_prev_page.html.erb +2 -2
  215. data/app/views/layouts/alchemy/admin.html.erb +4 -5
  216. data/config/alchemy/config.yml +8 -12
  217. data/config/authorization_rules.rb +4 -3
  218. data/config/initializers/dragonfly.rb +20 -12
  219. data/config/locales/alchemy.de.yml +20 -15
  220. data/config/locales/alchemy.en.yml +15 -10
  221. data/config/locales/devise.de.yml +1 -0
  222. data/config/routes.rb +3 -3
  223. data/{spec/dummy/db/migrate/20121118000000_alchemy_two_point_four.rb → db/migrate/20130214233001_alchemy_two_point_five.rb} +50 -36
  224. data/db/migrate/20130221200514_migrate_attachments_to_dragonfly.rb +21 -0
  225. data/db/migrate/20130312205327_change_alchemy_users_role_to_roles.rb +11 -0
  226. data/lib/alchemy/capistrano.rb +10 -8
  227. data/lib/alchemy/errors.rb +7 -0
  228. data/lib/alchemy/filetypes.rb +33 -0
  229. data/lib/alchemy/i18n.rb +9 -1
  230. data/lib/alchemy/name_conversions.rb +28 -0
  231. data/lib/alchemy/page_layout.rb +5 -3
  232. data/lib/alchemy/resource.rb +132 -29
  233. data/lib/alchemy/resources_helper.rb +81 -12
  234. data/lib/alchemy/upgrader.rb +14 -276
  235. data/lib/alchemy/version.rb +1 -1
  236. data/lib/alchemy_cms.rb +17 -2
  237. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +1 -1
  238. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +1 -1
  239. data/lib/tasks/alchemy/convert.rake +39 -0
  240. data/lib/tasks/alchemy/install.rake +4 -6
  241. data/lib/tasks/alchemy/upgrade.rake +18 -1
  242. data/spec/controllers/admin/clipboard_controller_spec.rb +4 -4
  243. data/spec/controllers/admin/elements_controller_spec.rb +23 -23
  244. data/spec/controllers/admin/pages_controller_spec.rb +15 -0
  245. data/spec/controllers/admin/resources_controller_spec.rb +1 -11
  246. data/spec/controllers/admin/trash_controller_spec.rb +9 -9
  247. data/spec/controllers/attachments_controller_spec.rb +3 -3
  248. data/spec/controllers/elements_controller_spec.rb +2 -2
  249. data/spec/controllers/pages_controller_spec.rb +160 -129
  250. data/spec/controllers/pictures_controller_spec.rb +2 -2
  251. data/spec/controllers/user_sessions_controller_spec.rb +3 -3
  252. data/spec/controllers/users_controller_spec.rb +2 -2
  253. data/spec/dummy/app/models/event.rb +2 -2
  254. data/spec/dummy/app/models/location.rb +4 -0
  255. data/spec/dummy/app/views/layouts/application.html.erb +6 -42
  256. data/spec/dummy/config/routes.rb +1 -1
  257. data/spec/dummy/db/migrate/20121026104128_create_events.rb +0 -1
  258. data/{db/migrate/20121118000000_alchemy_two_point_four.rb → spec/dummy/db/migrate/20130214233001_alchemy_two_point_five.rb} +50 -36
  259. data/spec/dummy/db/migrate/20130221200514_migrate_attachments_to_dragonfly.rb +21 -0
  260. data/spec/dummy/db/migrate/20130312205327_change_alchemy_users_role_to_roles.rb +11 -0
  261. data/spec/dummy/db/migrate/20130328101418_create_locations.rb +9 -0
  262. data/spec/dummy/db/schema.rb +15 -6
  263. data/spec/factories.rb +4 -4
  264. data/spec/{integration → features}/admin/link_overlay_spec.rb +0 -0
  265. data/spec/{integration → features}/admin/modules_integration_spec.rb +1 -1
  266. data/spec/{integration → features}/admin/pages_controller_spec.rb +9 -4
  267. data/spec/{integration → features}/admin/picture_library_integration_spec.rb +5 -5
  268. data/spec/{integration → features}/admin/resources_integration_spec.rb +1 -1
  269. data/spec/{integration → features}/navigation_spec.rb +0 -0
  270. data/spec/{integration → features}/pages_controller_spec.rb +42 -112
  271. data/spec/{integration → features}/picture_security_spec.rb +2 -2
  272. data/spec/{integration → features}/security_spec.rb +7 -7
  273. data/spec/{integration → features}/translation_integration_spec.rb +0 -0
  274. data/spec/helpers/admin/base_helper_spec.rb +0 -50
  275. data/spec/helpers/admin/tags_helper_spec.rb +53 -0
  276. data/spec/helpers/base_helper_spec.rb +19 -3
  277. data/spec/helpers/pages_helper_spec.rb +92 -44
  278. data/spec/{url_helpers_spec.rb → helpers/picture_url_helpers_spec.rb} +7 -7
  279. data/spec/helpers/url_helper_spec.rb +92 -72
  280. data/spec/{config_spec.rb → libraries/config_spec.rb} +0 -0
  281. data/spec/libraries/resource_spec.rb +215 -76
  282. data/spec/libraries/resources_helper_spec.rb +70 -28
  283. data/spec/models/attachment_spec.rb +75 -9
  284. data/spec/models/clipboard_spec.rb +1 -1
  285. data/spec/models/element_spec.rb +7 -0
  286. data/spec/models/page_spec.rb +144 -25
  287. data/spec/models/picture_spec.rb +5 -5
  288. data/spec/models/resource_spec.rb +47 -10
  289. data/spec/models/user_spec.rb +115 -3
  290. data/spec/{routing_spec.rb → routing/routing_spec.rb} +8 -20
  291. data/spec/spec_helper.rb +5 -6
  292. data/spec/support/alchemy/specs_helpers.rb +1 -1
  293. data/spec/support/ci/install_phantomjs +1 -1
  294. data/spec/support/image with spaces.png +0 -0
  295. data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +18 -18
  296. data/vendor/assets/javascripts/jquery_plugins/{jquery.dialogextend.1_0_1.js → jquery.dialogextend.js} +25 -17
  297. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo.min.js +7 -0
  298. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +7 -7
  299. data/vendor/assets/javascripts/keymage.min.js +6 -0
  300. data/vendor/assets/javascripts/spin.min.js +1 -0
  301. metadata +122 -124
  302. data/app/assets/images/alchemy/ajax_loader.gif +0 -0
  303. data/app/assets/images/alchemy/gui/toggle.png +0 -0
  304. data/app/assets/images/alchemy/image_loader.gif +0 -0
  305. data/app/assets/images/alchemy/shading.png +0 -0
  306. data/app/assets/images/alchemy/tabs.gif +0 -0
  307. data/app/assets/javascripts/alchemy/alchemy.base.js +0 -172
  308. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +0 -47
  309. data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +0 -91
  310. data/app/assets/javascripts/alchemy/alchemy.growler.js +0 -46
  311. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +0 -60
  312. data/app/assets/javascripts/alchemy/alchemy.js_extensions.js +0 -15
  313. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +0 -97
  314. data/app/assets/javascripts/alchemy/alchemy.windows.js +0 -321
  315. data/app/models/alchemy/clipboard_spec.rb +0 -0
  316. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +0 -8
  317. data/app/views/alchemy/notifications/registered_user_created.text.erb +0 -11
  318. data/db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb +0 -21
  319. data/db/migrate/20121205155004_create_alchemy_sites.rb +0 -14
  320. data/db/migrate/20121211163003_add_public_to_alchemy_sites.rb +0 -6
  321. data/db/migrate/20121220102223_add_aliases_to_site.rb +0 -6
  322. data/db/migrate/20130110212411_create_alchemy_legacy_page_urls.rb +0 -11
  323. data/db/migrate/20130121092645_migrate_to_devise.rb +0 -24
  324. data/spec/alchemy_spec.rb +0 -7
  325. data/spec/dummy/db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb +0 -21
  326. data/spec/dummy/db/migrate/20121205155004_create_alchemy_sites.rb +0 -14
  327. data/spec/dummy/db/migrate/20121211163003_add_public_to_alchemy_sites.rb +0 -6
  328. data/spec/dummy/db/migrate/20121220102223_add_aliases_to_site.rb +0 -6
  329. data/spec/dummy/db/migrate/20130110212411_create_alchemy_legacy_page_urls.rb +0 -11
  330. data/spec/dummy/db/migrate/20130121092645_migrate_to_devise.rb +0 -24
  331. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo-1.4.2-min.js +0 -11
@@ -54,7 +54,7 @@ module Alchemy
54
54
  end
55
55
 
56
56
  def self.translated_label_for(cell_name)
57
- I18n.t(cell_name, :scope => :cell_names)
57
+ I18n.t(cell_name, scope: 'cell_names', default: cell_name.to_s.humanize)
58
58
  end
59
59
 
60
60
  # Returns the cell definition defined in +config/alchemy/cells.yml+
@@ -25,12 +25,17 @@ module Alchemy
25
25
  #validates_uniqueness_of :name, :scope => :element_id
26
26
  validates_uniqueness_of :position, :scope => [:element_id, :essence_type]
27
27
 
28
+ # Essence scopes
29
+ scope :essence_booleans, where(:essence_type => "Alchemy::EssenceBoolean")
30
+ scope :essence_dates, where(:essence_type => "Alchemy::EssenceDate")
31
+ scope :essence_files, where(:essence_type => "Alchemy::EssenceFile")
32
+ scope :essence_htmls, where(:essence_type => "Alchemy::EssenceHtml")
33
+ scope :essence_links, where(:essence_type => "Alchemy::EssenceLink")
28
34
  scope :essence_pictures, where(:essence_type => "Alchemy::EssencePicture")
29
35
  scope :gallery_pictures, essence_pictures.where("#{self.table_name}.name LIKE 'essence_picture_%'")
30
- scope :essence_texts, where(:essence_type => "Alchemy::EssenceText")
31
36
  scope :essence_richtexts, where(:essence_type => "Alchemy::EssenceRichtext")
32
37
  scope :essence_selects, where(:essence_type => "Alchemy::EssenceSelect")
33
- scope :essence_booleans, where(:essence_type => "Alchemy::EssenceBoolean")
38
+ scope :essence_texts, where(:essence_type => "Alchemy::EssenceText")
34
39
 
35
40
  class << self
36
41
 
@@ -97,17 +102,21 @@ module Alchemy
97
102
  #
98
103
  # alchemy:
99
104
  # content_names:
100
- # foo: Bar
105
+ # foo: Bar
101
106
  #
102
107
  # Optionally you can scope your content name to an element:
103
108
  #
104
109
  # alchemy:
105
110
  # content_names:
106
- # article:
107
- # foo: Baz
111
+ # article:
112
+ # foo: Baz
108
113
  #
109
114
  def translated_label_for(content_name, element_name = nil)
110
- Alchemy::I18n.t("content_names.#{element_name}.#{content_name}", :default => ["content_names.#{content_name}".to_sym, content_name.capitalize])
115
+ I18n.t(
116
+ content_name,
117
+ scope: "content_names.#{element_name}",
118
+ default: I18n.t("content_names.#{content_name}", default: content_name.humanize)
119
+ )
111
120
  end
112
121
 
113
122
  # Returns all content descriptions from elements.yml
@@ -261,10 +270,12 @@ module Alchemy
261
270
  end
262
271
  end
263
272
 
273
+ # Returns the default value from content description
274
+ # If the value is a symbol it gets passed through i18n inside the +alchemy.default_content_texts+ scope
264
275
  def default_text(default)
265
- return if default.nil?
266
- if default.is_a? Symbol
267
- I18n.t(default, :scope => :default_content_texts)
276
+ case default
277
+ when Symbol
278
+ I18n.t(default, scope: :default_content_texts)
268
279
  else
269
280
  default
270
281
  end
@@ -326,14 +326,15 @@ module Alchemy
326
326
  # Translate the name in your config/locales language file. Example:
327
327
  #
328
328
  # de:
329
- # element_names:
330
- # contactform: 'Kontakt Formular'
329
+ # alchemy:
330
+ # element_names:
331
+ # contactform: 'Kontakt Formular'
331
332
  #
332
- # If no translation is found the capitalized name is used!
333
+ # If no translation is found a humanized name is used.
333
334
  #
334
335
  def display_name
335
- return name.capitalize if description.blank?
336
- I18n.t(description['name'], :scope => :element_names)
336
+ return name.humanize if description.blank?
337
+ I18n.t(description['name'], scope: 'element_names', default: description['name'].to_s.humanize)
337
338
  end
338
339
 
339
340
  # Gets the preview text from the first Content found in the +elements.yml+ Element description file.
@@ -402,9 +403,10 @@ module Alchemy
402
403
  self.ingredient(name).present?
403
404
  end
404
405
 
405
- def save_contents(params)
406
+ def save_contents(contents_attributes)
407
+ return true if contents_attributes.nil?
406
408
  contents.each do |content|
407
- unless content.update_essence(params[:contents]["content_#{content.id}"])
409
+ unless content.update_essence(contents_attributes["content_#{content.id}"])
408
410
  errors.add(:base, :essence_validation_failed)
409
411
  end
410
412
  end
@@ -1,8 +1,6 @@
1
- # encoding: UTF-8
2
1
  module Alchemy
3
2
  class Page < ActiveRecord::Base
4
3
 
5
- RESERVED_URLNAMES = %w(admin messages new)
6
4
  DEFAULT_ATTRIBUTES_FOR_COPY = {
7
5
  :do_not_autogenerate => true,
8
6
  :do_not_sweep => true,
@@ -45,36 +43,20 @@ module Alchemy
45
43
  stampable(:stamper_class_name => 'Alchemy::User')
46
44
 
47
45
  has_many :folded_pages
48
- has_many :cells, :dependent => :destroy
49
- has_many :elements, :order => :position
50
- has_many :contents, :through => :elements
51
46
  has_many :legacy_urls, :class_name => 'Alchemy::LegacyPageUrl'
52
- has_and_belongs_to_many :to_be_sweeped_elements, :class_name => 'Alchemy::Element', :uniq => true, :join_table => 'alchemy_elements_alchemy_pages'
53
47
  belongs_to :language
54
48
 
55
49
  validates_presence_of :language, :on => :create, :unless => :root
56
- validates_presence_of :name
57
50
  validates_presence_of :page_layout, :unless => :systempage?
58
51
  validates_presence_of :parent_id, :if => proc { Page.count > 1 }
59
- validates_length_of :urlname, :minimum => 3, :if => :urlname_entered?
60
- validates_uniqueness_of :urlname, :scope => [:language_id, :layoutpage], :if => :urlname_entered?
61
- validates :urlname, :exclusion => {:in => RESERVED_URLNAMES}
62
52
 
63
- attr_accessor :do_not_autogenerate
64
53
  attr_accessor :do_not_sweep
65
54
  attr_accessor :do_not_validate_language
66
55
 
67
- before_validation :set_url_name, :unless => proc { |page| page.systempage? || page.redirects_to_external? }
68
- before_save :set_title, :unless => proc { |page| page.systempage? || page.redirects_to_external? || !page.title.blank? }
69
56
  before_save :set_language_code, :unless => :systempage?
70
- before_save :set_restrictions_to_child_pages, :if => proc { |page| !page.systempage? && page.restricted_changed? }
71
- before_save :inherit_restricted_status, :if => proc { |page| !page.systempage? && page.parent && page.parent.restricted? }
72
- after_create :create_cells, :unless => :systempage?
73
- after_create :autogenerate_elements, :unless => proc { |page| page.systempage? || page.do_not_autogenerate }
74
- after_update :trash_not_allowed_elements, :if => :page_layout_changed?
75
- after_update :autogenerate_elements, :if => :page_layout_changed?
76
- after_update :create_legacy_url, :if => proc { |page| page.urlname_changed? && !page.redirects_to_external? }
77
- after_destroy { elements.each {|el| el.destroy unless el.trashed? } }
57
+ before_save :set_restrictions_to_child_pages, :if => :restricted_changed?, :unless => :systempage?
58
+ before_save :inherit_restricted_status, :if => proc { parent && parent.restricted? }, :unless => :systempage?
59
+ after_update :create_legacy_url, :if => :urlname_changed?, :unless => :redirects_to_external?
78
60
 
79
61
  scope :language_roots, where(:language_root => true)
80
62
  scope :layoutpages, where(:layoutpage => true)
@@ -101,6 +83,11 @@ module Alchemy
101
83
  # TODO: add this as default_scope
102
84
  #default_scope { from_current_site }
103
85
 
86
+ # Concerns
87
+ include Naming
88
+ include Cells
89
+ include Elements
90
+
104
91
  # Class methods
105
92
  #
106
93
  class << self
@@ -142,44 +129,6 @@ module Alchemy
142
129
  end
143
130
  end
144
131
 
145
- # Copy page cells
146
- #
147
- # @param source [Alchemy::Page]
148
- # @param target [Alchemy::Page]
149
- # @return [Array]
150
- #
151
- def copy_cells(source, target)
152
- new_cells = []
153
- source.cells.each do |cell|
154
- new_cells << Cell.create(:name => cell.name, :page_id => target.id)
155
- end
156
- new_cells
157
- end
158
-
159
- # Copy page elements
160
- #
161
- # @param source [Alchemy::Page]
162
- # @param target [Alchemy::Page]
163
- # @return [Array]
164
- #
165
- def copy_elements(source, target)
166
- new_elements = []
167
- source.elements.not_trashed.each do |element|
168
- # detect cell for element
169
- if element.cell
170
- cell = target.cells.detect { |c| c.name == element.cell.name }
171
- else
172
- cell = nil
173
- end
174
- # if cell is nil also pass nil to element.cell_id
175
- new_element = Element.copy(element, :page_id => target.id, :cell_id => (cell.blank? ? nil : cell.id))
176
- # move element to bottom of the list
177
- new_element.move_to_bottom
178
- new_elements << new_element
179
- end
180
- new_elements
181
- end
182
-
183
132
  def layout_root_for(language_id)
184
133
  where({:parent_id => Page.root.id, :layoutpage => true, :language_id => language_id}).limit(1).first
185
134
  end
@@ -216,12 +165,10 @@ module Alchemy
216
165
  end
217
166
 
218
167
  def link_target_options
219
- options = [
220
- [I18n.t('default', :scope => :link_target_options), '']
221
- ]
168
+ options = [[I18n.t(:default, scope: 'link_target_options'), '']]
222
169
  link_target_options = Config.get(:link_target_options)
223
170
  link_target_options.each do |option|
224
- options << [I18n.t(option, :scope => :link_target_options), option]
171
+ options << [I18n.t(option, scope: 'link_target_options', default: option.to_s.humanize), option]
225
172
  end
226
173
  options
227
174
  end
@@ -231,79 +178,6 @@ module Alchemy
231
178
  # Instance methods
232
179
  #
233
180
 
234
- # Finds selected elements from page.
235
- #
236
- # Returns only public elements by default.
237
- # Pass true as second argument to get all elements.
238
- #
239
- # === Options are:
240
- #
241
- # :only => Array of element names # Returns only elements with given names
242
- # :except => Array of element names # Returns all elements except the ones with given names
243
- # :count => Integer # Limit the count of returned elements
244
- # :offset => Integer # Starts with an offset while returning elements
245
- # :random => Boolean # Return elements randomly shuffled
246
- # :from_cell => Cell or String # Return elements from given cell
247
- #
248
- def find_selected_elements(options = {}, show_non_public = false)
249
- if options[:from_cell].class.name == 'Alchemy::Cell'
250
- elements = options[:from_cell].elements
251
- elsif !options[:from_cell].blank? && options[:from_cell].class.name == 'String'
252
- cell = cells.find_by_name(options[:from_cell])
253
- if cell
254
- elements = cell.elements
255
- else
256
- warn("Cell with name `#{options[:from_cell]}` could not be found!")
257
- # Returns an empty relation. Can be removed with the release of Rails 4
258
- elements = self.elements.where('1 = 0')
259
- end
260
- else
261
- elements = self.elements.not_in_cell
262
- end
263
- if !options[:only].blank?
264
- elements = elements.named(options[:only])
265
- elsif !options[:except].blank?
266
- elements = elements.excluded(options[:except])
267
- end
268
- elements = elements.reverse_order if options[:reverse_sort] || options[:reverse]
269
- elements = elements.offset(options[:offset]).limit(options[:count])
270
- elements = elements.order("RAND()") if options[:random]
271
- show_non_public ? elements : elements.published
272
- end
273
-
274
- # What is this? A Kind of proxy method? Why not rendering the elements directly if you already have them????
275
- def find_elements(options = {}, show_non_public = false)
276
- if !options[:collection].blank? && options[:collection].is_a?(Array)
277
- return options[:collection]
278
- else
279
- find_selected_elements(options, show_non_public)
280
- end
281
- end
282
-
283
- # Returns all elements that should be feeded via rss.
284
- #
285
- # Define feedable elements in your +page_layouts.yml+:
286
- #
287
- # - name: news
288
- # feed: true
289
- # feed_elements: [element_name, element_2_name]
290
- #
291
- def feed_elements
292
- elements.find_all_by_name(definition['feed_elements'])
293
- end
294
-
295
- def elements_grouped_by_cells
296
- elements.not_trashed.in_cell.group_by(&:cell)
297
- end
298
-
299
- def element_names_from_cells
300
- cell_definitions.collect { |c| c['elements'] }.flatten.uniq
301
- end
302
-
303
- def element_names_not_in_cell
304
- layout_description['elements'].uniq - element_names_from_cells
305
- end
306
-
307
181
  # Finds the previous page on the same structure level. Otherwise it returns nil.
308
182
  # Options:
309
183
  # => :restricted => boolean (standard: nil) - next restricted page (true), skip restricted pages (false), ignore restriction (nil)
@@ -328,29 +202,6 @@ module Alchemy
328
202
  end
329
203
  alias_method :next_page, :next
330
204
 
331
- def name_entered?
332
- !self.name.blank?
333
- end
334
-
335
- def urlname_entered?
336
- !self.urlname.blank?
337
- end
338
-
339
- def set_url_name
340
- self.urlname = convert_url_name((self.urlname.blank? ? self.name : self.urlname))
341
- end
342
-
343
- def set_title
344
- self.title = self.name
345
- end
346
-
347
- def show_in_navigation?
348
- if visible?
349
- return true
350
- end
351
- return false
352
- end
353
-
354
205
  def lock(user)
355
206
  self.locked = true
356
207
  self.locked_by = user.id
@@ -364,10 +215,6 @@ module Alchemy
364
215
  self.save
365
216
  end
366
217
 
367
- def public_elements
368
- self.elements.select { |m| m.public? }
369
- end
370
-
371
218
  # Returns the name of the creator of this page.
372
219
  def creator
373
220
  @page_creator ||= User.find_by_id(creator_id)
@@ -405,10 +252,6 @@ module Alchemy
405
252
  folded_page.folded
406
253
  end
407
254
 
408
- def elements_by_type type
409
- elements.select { |m| type.include? m.name }
410
- end
411
-
412
255
  # Returns a Hash of attributes describing the status of the Page.
413
256
  #
414
257
  def status
@@ -451,12 +294,6 @@ module Alchemy
451
294
  end
452
295
  alias_method :definition, :layout_description
453
296
 
454
- def cell_definitions
455
- cell_names = self.layout_description['cells']
456
- return [] if cell_names.blank?
457
- Cell.all_definitions_for(cell_names)
458
- end
459
-
460
297
  # Returns translated name of the pages page_layout value.
461
298
  # Page layout names are defined inside the config/alchemy/page_layouts.yml file.
462
299
  # Translate the name in your config/locales language yml file.
@@ -464,10 +301,6 @@ module Alchemy
464
301
  I18n.t(self.page_layout, :scope => :page_layout_names)
465
302
  end
466
303
 
467
- def renamed?
468
- self.name_was != self.name || self.urlname_was != self.urlname
469
- end
470
-
471
304
  def changed_publicity?
472
305
  self.public_was != self.public
473
306
  end
@@ -491,19 +324,14 @@ module Alchemy
491
324
  definition["redirects_to_external"]
492
325
  end
493
326
 
327
+ # Returns the first published child
494
328
  def first_public_child
495
- self.children.where(:public => true).limit(1).first
329
+ children.published.first
496
330
  end
497
331
 
498
332
  # Gets the language_root page for page
499
333
  def get_language_root
500
- return self if self.language_root
501
- page = self
502
- while page.parent do
503
- page = page.parent
504
- break if page.language_root?
505
- end
506
- return page
334
+ self_and_ancestors.where(:language_root => true).first
507
335
  end
508
336
 
509
337
  def copy_children_to(new_parent)
@@ -518,15 +346,6 @@ module Alchemy
518
346
  end
519
347
  end
520
348
 
521
- # Returns true or false if the page has a page_layout that has cells.
522
- def can_have_cells?
523
- !definition['cells'].blank?
524
- end
525
-
526
- def has_cells?
527
- cells.any?
528
- end
529
-
530
349
  def locker_name
531
350
  return I18n.t('unknown') if self.locker.nil?
532
351
  self.locker.name
@@ -541,7 +360,7 @@ module Alchemy
541
360
  rootpage? || (self.parent_id == Page.root.id && !self.language_root?)
542
361
  end
543
362
 
544
- # Overwrites the cache_key method so it uses the published_at attribute instead of updated_at.
363
+ # Overwrites the cache_key method.
545
364
  def cache_key(request = nil)
546
365
  "alchemy/pages/#{id}"
547
366
  end
@@ -578,66 +397,14 @@ module Alchemy
578
397
  pages.order(order_direction).limit(1).first
579
398
  end
580
399
 
581
- # Converts the given nbame into an url friendly string
582
- # Names shorter than 3 will be filled with dashes, so it does not collidate with the language code.
583
- def convert_url_name(name)
584
- url_name = name.gsub(/[äÄ]/, 'ae').gsub(/[üÜ]/, 'ue').gsub(/[öÖ]/, 'oe').parameterize
585
- url_name = ('-' * (3 - url_name.length)) + url_name if url_name.length < 3
586
- return url_name
587
- end
588
-
589
- # Looks in the page_layout descripion, if there are elements to autogenerate.
590
- #
591
- # And if so, it generates them.
592
- #
593
- # If the page has cells, it looks if there are elements to generate.
594
- #
595
- def autogenerate_elements
596
- elements_already_on_page = self.elements.available.collect(&:name)
597
- elements = self.layout_description["autogenerate"]
598
- if elements.present?
599
- elements.each do |element|
600
- next if elements_already_on_page.include?(element)
601
- Element.create_from_scratch(attributes_for_element_name(element))
602
- end
603
- end
604
- end
605
-
606
- # Returns a hash of attributes for given element name
607
- def attributes_for_element_name(element)
608
- if self.has_cells? && (cell_definition = cell_definitions.detect { |c| c['elements'].include?(element) })
609
- cell = self.cells.find_by_name(cell_definition['name'])
610
- if cell
611
- return {:page_id => self.id, :cell_id => cell.id, :name => element}
612
- else
613
- raise "Cell not found for page #{self.inspect}"
614
- end
615
- else
616
- return {:page_id => self.id, :name => element}
617
- end
618
- end
619
-
620
400
  def set_language_code
621
401
  return false if self.language.blank?
622
402
  self.language_code = self.language.code
623
403
  end
624
404
 
625
- def create_cells
626
- return false if !can_have_cells?
627
- definition['cells'].each do |cellname|
628
- cells.create({:name => cellname})
629
- end
630
- end
631
-
632
- # Trashes all elements that are not allowed for this page_layout.
633
- def trash_not_allowed_elements
634
- elements.select { |e| !definition['elements'].include?(e.name) }.map(&:trash)
635
- end
636
-
637
405
  # Stores the old urlname in a LegacyPageUrl
638
406
  def create_legacy_url
639
- legacy_url = legacy_urls.new(:urlname => urlname_was)
640
- legacy_url.save!
407
+ legacy_urls.find_or_create_by_urlname(:urlname => urlname_was)
641
408
  end
642
409
 
643
410
  end