alchemy_cms 2.5.3.1 → 2.6.0.rc5

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 (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
@@ -1,27 +1,93 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  module Alchemy
4
5
  describe Attachment do
6
+ let(:file) { File.new(File.expand_path('../../support/image with spaces.png', __FILE__)) }
7
+ let(:attachment) { Attachment.new(:file => file) }
5
8
 
6
- describe '#urlname' do
9
+ describe 'after create' do
10
+ before { attachment.save! }
7
11
 
8
- context "with url characters in the filename" do
9
- subject { Attachment.new(:filename => 'f#%&cking cute kitten pic.png') }
12
+ it "should have a humanized name" do
13
+ attachment.name.should == "image with spaces"
14
+ end
15
+
16
+ it "should have a valid file_name" do
17
+ attachment.file_name.should == "image-with-spaces.png"
18
+ end
19
+
20
+ after { attachment.destroy }
21
+ end
22
+
23
+ describe 'urlname sanitizing' do
24
+ it "should sanitize url characters in the filename" do
25
+ attachment.file_name = 'f#%&cking cute kitten pic.png'
26
+ attachment.save!
27
+ attachment.urlname.should == 'f-cking-cute-kitten-pic.png'
28
+ end
29
+
30
+ it "should sanitize lot of dots in the name" do
31
+ attachment.file_name = 'cute.kitten.pic.png'
32
+ attachment.save!
33
+ attachment.urlname.should == 'cute-kitten-pic.png'
34
+ end
35
+
36
+ it "should sanitize umlauts in the name" do
37
+ attachment.file_name = 'süßes katzenbild.png'
38
+ attachment.save!
39
+ attachment.urlname.should == 'suesses-katzenbild.png'
40
+ end
41
+
42
+ after { attachment.destroy }
43
+ end
10
44
 
11
- it "should escape as uri" do
12
- subject.urlname.should == 'f___cking_cute_kitten_pic.png'
45
+ describe 'validations' do
46
+
47
+ context "having a png, but only pdf allowed" do
48
+ before { Config.stub!(:get).and_return({'allowed_filetypes' => {'attachments' => ['pdf']}}) }
49
+
50
+ it "should not be valid" do
51
+ attachment.should_not be_valid
13
52
  end
14
53
  end
15
54
 
16
- context "with lot of dots in the name" do
17
- subject { Attachment.new(:filename => 'cute.kitten.pic.png') }
55
+ context "having a png and everything allowed" do
56
+ before { Config.stub!(:get).and_return({'allowed_filetypes' => {'attachments' => ['*']}}) }
18
57
 
19
- it "should convert dots in the name part into dashes" do
20
- subject.urlname.should == 'cute-kitten-pic.png'
58
+ it "should be valid" do
59
+ attachment.should be_valid
21
60
  end
22
61
  end
23
62
 
24
63
  end
25
64
 
65
+ context 'PNG image' do
66
+ subject { stub_model(Attachment, :file_name => 'kitten.png') }
67
+ its(:extension) { should == "png" }
68
+ end
69
+
70
+ describe 'css classes' do
71
+ context 'mp3 file' do
72
+ subject { stub_model(Attachment, :file_mime_type => 'audio/mpeg') }
73
+ its(:icon_css_class) { should == "audio" }
74
+ end
75
+
76
+ context 'png file' do
77
+ subject { stub_model(Attachment, :file_mime_type => 'image/png') }
78
+ its(:icon_css_class) { should == "image" }
79
+ end
80
+
81
+ context 'vcf file' do
82
+ subject { stub_model(Attachment, :file_mime_type => 'application/vcard') }
83
+ its(:icon_css_class) { should == "vcard" }
84
+ end
85
+
86
+ context 'zip file' do
87
+ subject { stub_model(Attachment, :file_mime_type => 'application/zip') }
88
+ its(:icon_css_class) { should == "archive" }
89
+ end
90
+ end
91
+
26
92
  end
27
93
  end
@@ -46,7 +46,7 @@ module Alchemy
46
46
 
47
47
  context "full clipboard" do
48
48
 
49
- before(:all) do
49
+ before do
50
50
  clipboard[:elements] = [{:id => 1}, {:id => 2}]
51
51
  clipboard[:pages] = [{:id => 2}, {:id => 3}]
52
52
  end
@@ -422,5 +422,12 @@ module Alchemy
422
422
 
423
423
  end
424
424
 
425
+ describe '#save_contents' do
426
+ it "should return true if attributes hash is nil" do
427
+ element = FactoryGirl.create(:element, create_contents_after_create: true)
428
+ element.save_contents(nil).should be_true
429
+ end
430
+ end
431
+
425
432
  end
426
433
  end
@@ -176,6 +176,16 @@ module Alchemy
176
176
  page.legacy_urls.should be_empty
177
177
  end
178
178
 
179
+ it "should not store legacy url twice for same urlname" do
180
+ page.urlname = 'new-urlname'
181
+ page.save!
182
+ page.urlname = 'my-testpage'
183
+ page.save!
184
+ page.urlname = 'another-urlname'
185
+ page.save!
186
+ page.legacy_urls.select { |u| u.urlname == 'my-testpage' }.size.should == 1
187
+ end
188
+
179
189
  end
180
190
 
181
191
  context "urlname has not changed" do
@@ -340,6 +350,7 @@ module Alchemy
340
350
  end
341
351
 
342
352
  describe "#elements_grouped_by_cells" do
353
+ let(:page) { FactoryGirl.create(:public_page, :do_not_autogenerate => false) }
343
354
 
344
355
  before do
345
356
  PageLayout.stub(:get).and_return({
@@ -352,16 +363,16 @@ module Alchemy
352
363
  'name' => "header",
353
364
  'elements' => ["header"]
354
365
  }])
355
- @page = FactoryGirl.create(:public_page, :do_not_autogenerate => false)
356
366
  end
357
367
 
358
368
  it "should return elements grouped by cell" do
359
- @page.elements_grouped_by_cells.keys.first.should be_instance_of(Cell)
360
- @page.elements_grouped_by_cells.values.first.first.should be_instance_of(Element)
369
+ elements = page.elements_grouped_by_cells
370
+ elements.keys.first.should be_instance_of(Cell)
371
+ elements.values.first.first.should be_instance_of(Element)
361
372
  end
362
373
 
363
374
  it "should only include elements beeing in a cell " do
364
- @page.elements_grouped_by_cells.keys.should_not include(nil)
375
+ page.elements_grouped_by_cells.keys.should_not include(nil)
365
376
  end
366
377
 
367
378
  end
@@ -410,35 +421,54 @@ module Alchemy
410
421
 
411
422
  end
412
423
 
413
- describe "validations" do
424
+ describe "Validations: " do
414
425
 
415
- context "saving a normal content page" do
426
+ context "Creating a normal content page" do
416
427
 
417
- it "should be possible to save when its urlname already exists in the scope of global pages" do
418
- contentpage = FactoryGirl.create(:page, :urlname => "existing_twice")
419
- global_with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice", :layoutpage => true)
420
- contentpage.title = "new Title"
421
- contentpage.save.should == true
422
- end
428
+ let(:contentpage) { FactoryGirl.build(:page) }
423
429
 
424
- end
425
-
426
- context "creating a normal content page" do
427
-
428
- before do
429
- @contentpage = FactoryGirl.build(:page)
430
+ context "when its urlname exists as global page" do
431
+ it "it should be possible to save." do
432
+ contentpage.urlname = "existing_twice"
433
+ global_with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice", :layoutpage => true)
434
+ contentpage.should be_valid
435
+ end
430
436
  end
431
437
 
432
438
  it "should validate the page_layout" do
433
- @contentpage.page_layout = nil
434
- @contentpage.save
435
- @contentpage.should have(1).error_on(:page_layout)
439
+ contentpage.page_layout = nil
440
+ contentpage.save
441
+ contentpage.should have(1).error_on(:page_layout)
436
442
  end
437
443
 
438
444
  it "should validate the parent_id" do
439
- @contentpage.parent_id = nil
440
- @contentpage.save
441
- @contentpage.should have(1).error_on(:parent_id)
445
+ contentpage.parent_id = nil
446
+ contentpage.save
447
+ contentpage.should have(1).error_on(:parent_id)
448
+ end
449
+
450
+ it "should validate the uniqueness of urlname" do
451
+ with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
452
+ contentpage.urlname = 'existing_twice'
453
+ contentpage.should_not be_valid
454
+ end
455
+
456
+ context "with url_nesting set to true" do
457
+ before { Config.stub!(:get).and_return(true) }
458
+
459
+ it "should only validate urlname dependent of parent" do
460
+ other_parent = FactoryGirl.create(:page, parent_id: Page.root.id)
461
+ with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
462
+ contentpage.urlname = 'existing_twice'
463
+ contentpage.parent_id = other_parent.id
464
+ contentpage.should be_valid
465
+ end
466
+
467
+ it "should validate urlname dependent of parent" do
468
+ with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
469
+ contentpage.urlname = 'existing_twice'
470
+ contentpage.should_not be_valid
471
+ end
442
472
  end
443
473
 
444
474
  end
@@ -763,7 +793,7 @@ module Alchemy
763
793
  end
764
794
 
765
795
  describe "#publish!" do
766
- let(:page) { stub_model(Page, public: false, name: "page", parent_id: 1, urlname: "page", language: stub_model(Language), page_layout: "bla") }
796
+ let(:page) { FactoryGirl.create(:page) }
767
797
  before { page.publish! }
768
798
 
769
799
  it "sets public attribute to true" do
@@ -771,5 +801,94 @@ module Alchemy
771
801
  end
772
802
  end
773
803
 
804
+ describe 'urlname updating' do
805
+ let(:parentparent) { FactoryGirl.create(:page, name: 'parentparent', visible: true) }
806
+ let(:parent) { FactoryGirl.create(:page, parent_id: parentparent.id, name: 'parent', visible: true) }
807
+ let(:page) { FactoryGirl.create(:page, parent_id: parent.id, name: 'page', visible: true) }
808
+ let(:invisible) { FactoryGirl.create(:page, parent_id: page.id, name: 'invisible', visible: false) }
809
+ let(:contact) { FactoryGirl.create(:page, parent_id: invisible.id, name: 'contact', visible: true) }
810
+
811
+ context "with activated url_nesting" do
812
+ before { Config.stub!(:get).and_return(true) }
813
+
814
+ it "should store all parents urlnames delimited by slash" do
815
+ page.urlname.should == 'parentparent/parent/page'
816
+ end
817
+
818
+ it "should not include the root page" do
819
+ page.urlname.should_not =~ /root/
820
+ end
821
+
822
+ it "should not include the language root page" do
823
+ page.urlname.should_not =~ /startseite/
824
+ end
825
+
826
+ it "should not include invisible pages" do
827
+ contact.urlname.should_not =~ /invisible/
828
+ end
829
+
830
+ context "after changing my urlname" do
831
+ it "should update urlnames of descendants" do
832
+ page
833
+ parentparent.urlname = 'new-urlname'
834
+ parentparent.save!
835
+ page.reload
836
+ page.urlname.should == 'new-urlname/parent/page'
837
+ end
838
+
839
+ it "should create a legacy url" do
840
+ page.stub!(:slug).and_return('foo')
841
+ page.update_urlname!
842
+ page.legacy_urls.should_not be_empty
843
+ page.legacy_urls.collect(&:urlname).should include('parentparent/parent/page')
844
+ end
845
+ end
846
+
847
+ context "after updating my visibility" do
848
+ it "should update urlnames of descendants" do
849
+ page
850
+ parentparent.visible = false
851
+ parentparent.save!
852
+ page.reload
853
+ page.urlname.should == 'parent/page'
854
+ end
855
+ end
856
+ end
857
+
858
+ context "with disabled url_nesting" do
859
+ before { Config.stub!(:get).and_return(false) }
860
+
861
+ it "should only store my urlname" do
862
+ page.urlname.should == 'page'
863
+ end
864
+ end
865
+ end
866
+
867
+ describe '#slug' do
868
+ context "with parents path saved in urlname" do
869
+ let(:page) { FactoryGirl.build(:page, urlname: 'root/parent/my-name')}
870
+
871
+ it "should return the last part of the urlname" do
872
+ page.slug.should == 'my-name'
873
+ end
874
+ end
875
+
876
+ context "with single urlname" do
877
+ let(:page) { FactoryGirl.build(:page, urlname: 'my-name')}
878
+
879
+ it "should return the last part of the urlname" do
880
+ page.slug.should == 'my-name'
881
+ end
882
+ end
883
+
884
+ context "with nil as urlname" do
885
+ let(:page) { FactoryGirl.build(:page, urlname: nil)}
886
+
887
+ it "should return nil" do
888
+ page.slug.should be_nil
889
+ end
890
+ end
891
+ end
892
+
774
893
  end
775
894
  end
@@ -52,21 +52,21 @@ module Alchemy
52
52
  it "should return a humanized version of original filename" do
53
53
  pic = stub_model(Picture, :image_file_name => 'cute_kitten.JPG')
54
54
  pic.stub(:image_file).and_return(OpenStruct.new({:ext => 'jpg'}))
55
- pic.humanized_name.should == "Cute kitten"
55
+ pic.humanized_name.should == "cute kitten"
56
56
  end
57
57
 
58
58
  it "should not remove incidents of suffix from filename" do
59
59
  pic = stub_model(Picture, :image_file_name => 'cute_kitten_mo.jpgi.JPG')
60
60
  pic.stub(:image_file).and_return(OpenStruct.new({:ext => 'jpg'}))
61
- pic.humanized_name.should == "Cute kitten mo.jpgi"
62
- pic.humanized_name.should_not == "Cute kitten moi"
61
+ pic.humanized_name.should == "cute kitten mo.jpgi"
62
+ pic.humanized_name.should_not == "cute kitten moi"
63
63
  end
64
64
 
65
65
  context "image has no suffix" do
66
66
  it "should return humanized name" do
67
67
  pic = stub_model(Picture, :image_file_name => 'cute_kitten')
68
68
  pic.stub(:suffix).and_return("")
69
- pic.humanized_name.should == "Cute kitten"
69
+ pic.humanized_name.should == "cute kitten"
70
70
  end
71
71
  end
72
72
 
@@ -116,7 +116,7 @@ module Alchemy
116
116
 
117
117
  describe '.recent' do
118
118
 
119
- before(:all) do
119
+ before do
120
120
  now = Time.now
121
121
  @recent = Picture.create!(:image_file => image_file)
122
122
  @old_picture = Picture.create!(:image_file => image_file)
@@ -44,9 +44,9 @@ module Alchemy
44
44
  end
45
45
  end
46
46
 
47
- describe "#model_name" do
47
+ describe "#resource_name" do
48
48
  it "should return the model name (singularized and as a string)" do
49
- resource.model_name.should == "event"
49
+ resource.resource_name.should == "event"
50
50
  end
51
51
  end
52
52
 
@@ -94,28 +94,65 @@ module Alchemy
94
94
 
95
95
  context "when resource_relations defined as class-method in the model" do
96
96
  before do
97
+ ::ActiveSupport::Deprecation.silenced = true
97
98
  Event.class_eval do
98
99
  def self.resource_relations
99
100
  {
100
- :location_id => {:attr_method => "location#name", :attr_type => :string},
101
- :organizer_id => {:attr_method => "organizer#name", :attr_type => :string}
101
+ :location => {:attr_method => "location#name", :attr_type => :string}
102
102
  }
103
103
  end
104
104
  end
105
105
  end
106
+
107
+ it "should contain model_association from ActiveRecord::Reflections" do
108
+ relation = resource.resource_relations[:location_id]
109
+ relation.keys.should include(:model_association)
110
+ relation[:model_association].class.should be(ActiveRecord::Reflection::AssociationReflection)
111
+ end
112
+
113
+ it "should skip default alchemy model associations" do
114
+ resource.model_associations.collect(&:name).should_not include(*resource.class.const_get(:DEFAULT_SKIPPED_ASSOCIATIONS).map(&:to_sym))
115
+ end
116
+
117
+ it "should add _id to relation key" do
118
+ resource.resource_relations[:location_id].should_not be_nil
119
+ end
120
+
121
+ it "should store the relation name" do
122
+ relation = resource.resource_relations[:location_id]
123
+ relation.keys.should include(:name)
124
+ relation[:name].should == 'location'
125
+ end
126
+
127
+ context "with old hash delimited attr_method style" do
128
+ it "should show deprecation warnings" do
129
+ ActiveSupport::Deprecation.should_receive(:warn)
130
+ resource.resource_relations
131
+ end
132
+
133
+ it "should return the last part as attr_method" do
134
+ resource.resource_relations[:location_id][:attr_method].should == 'name'
135
+ end
136
+ end
137
+
138
+ context "#attributes" do
139
+ it "should contain the relation" do
140
+ resource.attributes.detect { |a| a[:name] == 'location_id' }.keys.should include(:relation)
141
+ end
142
+
143
+ it "should have the relation column type as type" do
144
+ resource.attributes.detect { |a| a[:name] == "location_id" }[:type].should == :string
145
+ end
146
+ end
147
+
106
148
  after do
149
+ ::ActiveSupport::Deprecation.silenced = false
107
150
  Event.class_eval do
108
151
  class << self
109
152
  undef :resource_relations
110
153
  end
111
154
  end
112
155
  end
113
- it "should use the attribute location#name instead of location_id" do
114
- resource.attributes.detect { |a| a[:name] == "location#name" }.should == {:name => "location#name", :type => :string}
115
- end
116
- it "should use the attribute organizer#name instead of organizer_id" do
117
- resource.attributes.detect { |a| a[:name] == "organizer#name" }.should == {:name => "organizer#name", :type => :string}
118
- end
119
156
  end
120
157
 
121
158
  context "when resource_relation is not defined" do