alchemy_cms 3.2.1 → 3.3.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +28 -0
  3. data/.gitignore +2 -2
  4. data/.travis.yml +11 -3
  5. data/CHANGELOG.md +100 -0
  6. data/CONTRIBUTING.md +1 -1
  7. data/Gemfile +12 -1
  8. data/README.md +25 -7
  9. data/Rakefile +1 -3
  10. data/alchemy_cms.gemspec +7 -15
  11. data/app/assets/fonts/alchemy/icons.eot +0 -0
  12. data/app/assets/fonts/alchemy/icons.svg +28 -66
  13. data/app/assets/fonts/alchemy/icons.ttf +0 -0
  14. data/app/assets/fonts/alchemy/icons.woff +0 -0
  15. data/app/assets/images/alchemy/icons.png +0 -0
  16. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +10 -3
  17. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +15 -6
  18. data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +1 -1
  20. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +10 -4
  21. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +16 -22
  22. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +69 -32
  23. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +147 -83
  24. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +14 -14
  25. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +1 -1
  26. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +1 -1
  27. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +55 -0
  28. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +8 -1
  29. data/app/assets/javascripts/alchemy/alchemy.js +3 -1
  30. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +36 -31
  31. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +35 -29
  32. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +51 -5
  33. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +26 -10
  34. data/app/assets/javascripts/alchemy/{alchemy.windows.js.coffee → alchemy.trash_window.js.coffee} +1 -13
  35. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +15 -17
  36. data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +3 -3
  37. data/app/assets/stylesheets/alchemy/_extends.scss +1 -1
  38. data/app/assets/stylesheets/alchemy/_mixins.scss +27 -0
  39. data/app/assets/stylesheets/alchemy/_variables.scss +1 -0
  40. data/app/assets/stylesheets/alchemy/admin.scss +1 -0
  41. data/app/assets/stylesheets/alchemy/archive.scss +0 -57
  42. data/app/assets/stylesheets/alchemy/base.scss +1 -18
  43. data/app/assets/stylesheets/alchemy/buttons.scss +30 -25
  44. data/app/assets/stylesheets/alchemy/dialogs.scss +25 -9
  45. data/app/assets/stylesheets/alchemy/elements.scss +182 -126
  46. data/app/assets/stylesheets/alchemy/form_fields.scss +14 -8
  47. data/app/assets/stylesheets/alchemy/forms.scss +10 -1
  48. data/app/assets/stylesheets/alchemy/frame.scss +3 -10
  49. data/app/assets/stylesheets/alchemy/icon-font.scss +13 -6
  50. data/app/assets/stylesheets/alchemy/icons.scss +16 -0
  51. data/app/assets/stylesheets/alchemy/image_library.scss +269 -0
  52. data/app/assets/stylesheets/alchemy/selects.scss +1 -0
  53. data/app/assets/stylesheets/alchemy/sitemap.scss +12 -1
  54. data/app/assets/stylesheets/alchemy/toolbar.scss +2 -2
  55. data/app/assets/stylesheets/alchemy/upload.scss +97 -87
  56. data/app/assets/stylesheets/alchemy/welcome.sass +49 -0
  57. data/app/controllers/alchemy/admin/attachments_controller.rb +21 -29
  58. data/app/controllers/alchemy/admin/base_controller.rb +23 -4
  59. data/app/controllers/alchemy/admin/clipboard_controller.rb +0 -1
  60. data/app/controllers/alchemy/admin/contents_controller.rb +2 -4
  61. data/app/controllers/alchemy/admin/dashboard_controller.rb +4 -4
  62. data/app/controllers/alchemy/admin/elements_controller.rb +20 -11
  63. data/app/controllers/alchemy/admin/essence_files_controller.rb +2 -2
  64. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +10 -9
  65. data/app/controllers/alchemy/admin/languages_controller.rb +0 -1
  66. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -2
  67. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +0 -1
  68. data/app/controllers/alchemy/admin/pages_controller.rb +46 -29
  69. data/app/controllers/alchemy/admin/pictures_controller.rb +44 -55
  70. data/app/controllers/alchemy/admin/resources_controller.rb +8 -75
  71. data/app/controllers/alchemy/admin/tags_controller.rb +10 -8
  72. data/app/controllers/alchemy/admin/trash_controller.rb +0 -6
  73. data/app/controllers/alchemy/api/contents_controller.rb +0 -1
  74. data/app/controllers/alchemy/api/elements_controller.rb +0 -1
  75. data/app/controllers/alchemy/api/pages_controller.rb +4 -1
  76. data/app/controllers/alchemy/attachments_controller.rb +4 -5
  77. data/app/controllers/alchemy/base_controller.rb +6 -5
  78. data/app/controllers/alchemy/elements_controller.rb +1 -1
  79. data/app/controllers/alchemy/messages_controller.rb +9 -4
  80. data/app/controllers/alchemy/pages_controller.rb +133 -137
  81. data/app/controllers/alchemy/pictures_controller.rb +12 -10
  82. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +41 -0
  83. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +56 -0
  84. data/app/controllers/concerns/alchemy/locale_redirects.rb +38 -0
  85. data/app/controllers/concerns/alchemy/page_redirects.rb +80 -0
  86. data/app/controllers/concerns/alchemy/site_redirects.rb +22 -0
  87. data/app/helpers/alchemy/admin/attachments_helper.rb +1 -2
  88. data/app/helpers/alchemy/admin/base_helper.rb +36 -62
  89. data/app/helpers/alchemy/admin/contents_helper.rb +6 -80
  90. data/app/helpers/alchemy/admin/elements_helper.rb +36 -15
  91. data/app/helpers/alchemy/admin/essences_helper.rb +15 -8
  92. data/app/helpers/alchemy/admin/form_helper.rb +6 -10
  93. data/app/helpers/alchemy/admin/navigation_helper.rb +4 -7
  94. data/app/helpers/alchemy/admin/pages_helper.rb +14 -35
  95. data/app/helpers/alchemy/admin/pictures_helper.rb +12 -14
  96. data/app/helpers/alchemy/admin/tags_helper.rb +5 -7
  97. data/app/helpers/alchemy/base_helper.rb +9 -17
  98. data/app/helpers/alchemy/elements_block_helper.rb +5 -13
  99. data/app/helpers/alchemy/elements_helper.rb +6 -6
  100. data/app/helpers/alchemy/essences_helper.rb +3 -16
  101. data/app/helpers/alchemy/pages_helper.rb +32 -25
  102. data/app/helpers/alchemy/url_helper.rb +14 -16
  103. data/app/mailers/alchemy/messages.rb +0 -2
  104. data/app/models/alchemy.rb +0 -2
  105. data/app/models/alchemy/attachment.rb +45 -56
  106. data/app/models/alchemy/cell.rb +7 -8
  107. data/app/models/alchemy/content.rb +39 -24
  108. data/app/models/alchemy/content/factory.rb +27 -44
  109. data/app/models/alchemy/element.rb +101 -267
  110. data/app/models/alchemy/element/definitions.rb +9 -8
  111. data/app/models/alchemy/element/element_contents.rb +150 -0
  112. data/app/models/alchemy/element/element_essences.rb +109 -0
  113. data/app/models/alchemy/element/presenters.rb +18 -7
  114. data/app/models/alchemy/essence_date.rb +1 -2
  115. data/app/models/alchemy/essence_file.rb +10 -6
  116. data/app/models/alchemy/essence_html.rb +0 -1
  117. data/app/models/alchemy/essence_picture.rb +12 -4
  118. data/app/models/alchemy/essence_richtext.rb +6 -3
  119. data/app/models/alchemy/language.rb +48 -21
  120. data/app/models/alchemy/language/code.rb +1 -4
  121. data/app/models/alchemy/page.rb +33 -35
  122. data/app/models/alchemy/page/page_cells.rb +6 -10
  123. data/app/models/alchemy/page/page_elements.rb +130 -100
  124. data/app/models/alchemy/page/page_naming.rb +2 -3
  125. data/app/models/alchemy/page/page_natures.rb +50 -16
  126. data/app/models/alchemy/page/page_scopes.rb +7 -7
  127. data/app/models/alchemy/page/page_users.rb +3 -3
  128. data/app/models/alchemy/picture.rb +48 -33
  129. data/app/models/alchemy/picture/transformations.rb +8 -9
  130. data/app/models/alchemy/site.rb +19 -17
  131. data/app/models/alchemy/site/layout.rb +9 -9
  132. data/app/models/alchemy/tag.rb +0 -2
  133. data/app/models/alchemy/tree_node.rb +5 -4
  134. data/app/serializers/alchemy/attachment_serializer.rb +0 -1
  135. data/app/serializers/alchemy/base_serializer.rb +30 -0
  136. data/app/serializers/alchemy/cell_serializer.rb +0 -1
  137. data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -1
  138. data/app/serializers/alchemy/essence_date_serializer.rb +0 -1
  139. data/app/serializers/alchemy/essence_file_serializer.rb +0 -1
  140. data/app/serializers/alchemy/essence_html_serializer.rb +0 -1
  141. data/app/serializers/alchemy/essence_link_serializer.rb +0 -1
  142. data/app/serializers/alchemy/essence_picture_serializer.rb +0 -1
  143. data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -1
  144. data/app/serializers/alchemy/essence_select_serializer.rb +0 -1
  145. data/app/serializers/alchemy/essence_text_serializer.rb +0 -1
  146. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -1
  147. data/app/serializers/alchemy/page_serializer.rb +0 -1
  148. data/app/serializers/alchemy/page_tree_serializer.rb +90 -0
  149. data/app/serializers/alchemy/picture_serializer.rb +0 -1
  150. data/app/views/alchemy/_menubar.html.erb +3 -3
  151. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +11 -16
  152. data/app/views/alchemy/admin/attachments/_attachment.html.erb +9 -9
  153. data/app/views/alchemy/admin/attachments/_files_list.html.erb +7 -15
  154. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
  155. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +2 -2
  156. data/app/views/alchemy/admin/attachments/edit.html.erb +3 -3
  157. data/app/views/alchemy/admin/attachments/index.html.erb +10 -17
  158. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  159. data/app/views/alchemy/admin/clipboard/index.html.erb +3 -3
  160. data/app/views/alchemy/admin/clipboard/insert.js.erb +3 -3
  161. data/app/views/alchemy/admin/clipboard/remove.js.erb +2 -2
  162. data/app/views/alchemy/admin/contents/_missing.html.erb +5 -7
  163. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  164. data/app/views/alchemy/admin/contents/new.html.erb +2 -2
  165. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +6 -6
  166. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +2 -2
  167. data/app/views/alchemy/admin/dashboard/_users.html.erb +2 -2
  168. data/app/views/alchemy/admin/dashboard/help.html.erb +15 -15
  169. data/app/views/alchemy/admin/dashboard/index.html.erb +6 -6
  170. data/app/views/alchemy/admin/dashboard/info.html.erb +5 -5
  171. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  172. data/app/views/alchemy/admin/elements/_element.html.erb +52 -18
  173. data/app/views/alchemy/admin/elements/_element_footer.html.erb +11 -0
  174. data/app/views/alchemy/admin/elements/{_element_head.html.erb → _element_header.html.erb} +8 -8
  175. data/app/views/alchemy/admin/elements/_element_toolbar.html.erb +49 -0
  176. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +7 -6
  177. data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
  178. data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +1 -1
  179. data/app/views/alchemy/admin/elements/create.js.erb +13 -8
  180. data/app/views/alchemy/admin/elements/fold.js.erb +12 -7
  181. data/app/views/alchemy/admin/elements/index.html.erb +12 -8
  182. data/app/views/alchemy/admin/elements/list.html.erb +3 -3
  183. data/app/views/alchemy/admin/elements/new.html.erb +4 -4
  184. data/app/views/alchemy/admin/elements/order.js.erb +3 -4
  185. data/app/views/alchemy/admin/elements/publish.js.erb +15 -0
  186. data/app/views/alchemy/admin/elements/trash.js.erb +3 -3
  187. data/app/views/alchemy/admin/elements/update.js.erb +7 -8
  188. data/app/views/alchemy/admin/essence_files/edit.html.erb +16 -13
  189. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +3 -3
  190. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +8 -8
  191. data/app/views/alchemy/admin/languages/_form.html.erb +12 -3
  192. data/app/views/alchemy/admin/languages/_language.html.erb +8 -2
  193. data/app/views/alchemy/admin/languages/_table.html.erb +11 -5
  194. data/app/views/alchemy/admin/languages/index.html.erb +1 -1
  195. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +8 -8
  196. data/app/views/alchemy/admin/layoutpages/edit.html.erb +2 -2
  197. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -13
  198. data/app/views/alchemy/admin/leave.html.erb +5 -5
  199. data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +1 -1
  200. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +4 -4
  201. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
  202. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +9 -9
  203. data/app/views/alchemy/admin/pages/_external_link.html.erb +6 -6
  204. data/app/views/alchemy/admin/pages/_file_link.html.erb +6 -6
  205. data/app/views/alchemy/admin/pages/_form.html.erb +6 -6
  206. data/app/views/alchemy/admin/pages/_internal_link.html.erb +9 -11
  207. data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +3 -3
  208. data/app/views/alchemy/admin/pages/_locked_page.html.erb +4 -4
  209. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +2 -2
  210. data/app/views/alchemy/admin/pages/_page.html.erb +95 -80
  211. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +22 -22
  212. data/app/views/alchemy/admin/pages/_page_infos.html.erb +12 -0
  213. data/app/views/alchemy/admin/pages/_page_status.html.erb +7 -9
  214. data/app/views/alchemy/admin/pages/_sitemap.html.erb +35 -6
  215. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +0 -3
  216. data/app/views/alchemy/admin/pages/configure.html.erb +1 -1
  217. data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
  218. data/app/views/alchemy/admin/pages/edit.html.erb +39 -44
  219. data/app/views/alchemy/admin/pages/flush.js.erb +1 -1
  220. data/app/views/alchemy/admin/pages/fold.js.erb +2 -3
  221. data/app/views/alchemy/admin/pages/index.html.erb +15 -22
  222. data/app/views/alchemy/admin/pages/info.html.erb +8 -8
  223. data/app/views/alchemy/admin/pages/link.html.erb +3 -3
  224. data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
  225. data/app/views/alchemy/admin/pages/new.html.erb +4 -4
  226. data/app/views/alchemy/admin/pages/sort.js.erb +1 -2
  227. data/app/views/alchemy/admin/pages/unlock.js.erb +1 -1
  228. data/app/views/alchemy/admin/pages/update.js.erb +3 -3
  229. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +1 -1
  230. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
  231. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +1 -1
  232. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +9 -15
  233. data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -13
  234. data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +1 -1
  235. data/app/views/alchemy/admin/pictures/_archive.html.erb +14 -14
  236. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +30 -36
  237. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +5 -5
  238. data/app/views/alchemy/admin/pictures/{edit.html.erb → _form.html.erb} +7 -6
  239. data/app/views/alchemy/admin/pictures/_infos.html.erb +50 -0
  240. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  241. data/app/views/alchemy/admin/pictures/_picture.html.erb +17 -51
  242. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  243. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
  244. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +6 -6
  245. data/app/views/alchemy/admin/pictures/index.html.erb +28 -36
  246. data/app/views/alchemy/admin/pictures/show.html.erb +46 -9
  247. data/app/views/alchemy/admin/pictures/update.js.erb +6 -0
  248. data/app/views/alchemy/admin/resources/_form.html.erb +3 -3
  249. data/app/views/alchemy/admin/resources/_resource.html.erb +4 -4
  250. data/app/views/alchemy/admin/resources/_table.html.erb +5 -6
  251. data/app/views/alchemy/admin/resources/index.csv.erb +12 -10
  252. data/app/views/alchemy/admin/resources/index.html.erb +4 -4
  253. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  254. data/app/views/alchemy/admin/tags/_tag.html.erb +4 -4
  255. data/app/views/alchemy/admin/tags/edit.html.erb +5 -5
  256. data/app/views/alchemy/admin/tags/index.html.erb +8 -8
  257. data/app/views/alchemy/admin/tags/new.html.erb +2 -2
  258. data/app/views/alchemy/admin/trash/clear.js.erb +1 -1
  259. data/app/views/alchemy/admin/trash/index.html.erb +8 -6
  260. data/app/views/alchemy/admin/uploader/_button.html.erb +39 -0
  261. data/app/views/alchemy/admin/uploader/_setup.html.erb +13 -0
  262. data/app/views/alchemy/base/500.html.erb +4 -4
  263. data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
  264. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +3 -4
  265. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -1
  266. data/app/views/alchemy/essences/_essence_date_editor.html.erb +2 -6
  267. data/app/views/alchemy/essences/_essence_date_view.html.erb +1 -1
  268. data/app/views/alchemy/essences/_essence_file_editor.html.erb +9 -11
  269. data/app/views/alchemy/essences/_essence_file_view.html.erb +11 -5
  270. data/app/views/alchemy/essences/_essence_html_editor.html.erb +1 -1
  271. data/app/views/alchemy/essences/_essence_link_editor.html.erb +1 -1
  272. data/app/views/alchemy/essences/_essence_link_view.html.erb +1 -1
  273. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +47 -52
  274. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
  275. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +1 -1
  276. data/app/views/alchemy/essences/_essence_select_editor.html.erb +23 -13
  277. data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -1
  278. data/app/views/alchemy/essences/_essence_text_view.html.erb +1 -1
  279. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +29 -36
  280. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +5 -5
  281. data/app/views/alchemy/language_links/_language.html.erb +15 -9
  282. data/app/views/alchemy/messages/contact_form_mail.de.text.erb +1 -1
  283. data/app/views/alchemy/messages/contact_form_mail.en.text.erb +1 -1
  284. data/app/views/alchemy/messages/contact_form_mail.es.text.erb +1 -1
  285. data/app/views/alchemy/navigation/_link.html.erb +0 -1
  286. data/app/views/alchemy/pages/show.rss.builder +6 -4
  287. data/app/views/alchemy/welcome.html.erb +28 -0
  288. data/app/views/layouts/alchemy/admin.html.erb +14 -10
  289. data/bin/alchemy +3 -4
  290. data/bin/rspec +7 -0
  291. data/bin/spring +15 -0
  292. data/config/alchemy/config.yml +16 -17
  293. data/config/initializers/assets.rb +13 -0
  294. data/config/locales/alchemy.de.yml +27 -29
  295. data/config/locales/alchemy.en.yml +23 -29
  296. data/config/locales/alchemy.es.yml +23 -29
  297. data/config/locales/alchemy.fr.yml +19 -28
  298. data/config/locales/alchemy.nl.yml +19 -27
  299. data/config/locales/alchemy.ru.yml +19 -28
  300. data/config/routes.rb +53 -54
  301. data/config/spring.rb +2 -0
  302. data/db/migrate/20130827094554_alchemy_two_point_six.rb +1 -3
  303. data/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +6 -0
  304. data/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +5 -0
  305. data/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +7 -0
  306. data/lib/alchemy/auth_accessors.rb +1 -1
  307. data/lib/alchemy/cache_digests/template_tracker.rb +7 -13
  308. data/lib/alchemy/config.rb +5 -7
  309. data/lib/alchemy/configuration_methods.rb +11 -1
  310. data/lib/alchemy/controller_actions.rb +9 -12
  311. data/lib/alchemy/engine.rb +11 -28
  312. data/lib/alchemy/errors.rb +0 -1
  313. data/lib/alchemy/essence.rb +20 -20
  314. data/lib/alchemy/filetypes.rb +1 -3
  315. data/lib/alchemy/forms/builder.rb +0 -2
  316. data/lib/alchemy/hints.rb +1 -3
  317. data/lib/alchemy/i18n.rb +81 -53
  318. data/lib/alchemy/kaminari/scoped_pagination_url_helper.rb +0 -2
  319. data/lib/alchemy/locale.rb +0 -1
  320. data/lib/alchemy/logger.rb +1 -3
  321. data/lib/alchemy/modules.rb +3 -3
  322. data/lib/alchemy/mount_point.rb +0 -2
  323. data/lib/alchemy/name_conversions.rb +1 -3
  324. data/lib/alchemy/on_page_layout.rb +37 -23
  325. data/lib/alchemy/on_page_layout/callbacks_runner.rb +34 -0
  326. data/lib/alchemy/page_layout.rb +23 -24
  327. data/lib/alchemy/paths.rb +32 -0
  328. data/lib/alchemy/permissions.rb +20 -20
  329. data/lib/alchemy/picture_attributes.rb +0 -3
  330. data/lib/alchemy/resource.rb +66 -22
  331. data/lib/alchemy/resources_helper.rb +48 -11
  332. data/lib/alchemy/routing_constraints.rb +4 -5
  333. data/lib/alchemy/seeder.rb +1 -4
  334. data/lib/alchemy/shell.rb +12 -14
  335. data/lib/alchemy/tasks/helpers.rb +5 -7
  336. data/lib/alchemy/test_support/essence_shared_examples.rb +24 -24
  337. data/lib/alchemy/test_support/factories.rb +2 -146
  338. data/lib/alchemy/test_support/factories/attachment_factory.rb +9 -0
  339. data/lib/alchemy/test_support/factories/cell_factory.rb +9 -0
  340. data/lib/alchemy/test_support/factories/content_factory.rb +10 -0
  341. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +21 -0
  342. data/lib/alchemy/test_support/factories/element_factory.rb +21 -0
  343. data/lib/alchemy/test_support/factories/essence_file_factory.rb +8 -0
  344. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +8 -0
  345. data/lib/alchemy/test_support/factories/essence_text_factory.rb +7 -0
  346. data/lib/alchemy/test_support/factories/language_factory.rb +28 -0
  347. data/lib/alchemy/test_support/factories/page_factory.rb +45 -0
  348. data/lib/alchemy/test_support/factories/picture_factory.rb +10 -0
  349. data/lib/alchemy/test_support/factories/site_factory.rb +12 -0
  350. data/lib/alchemy/test_support/integration_helpers.rb +0 -3
  351. data/lib/alchemy/tinymce.rb +24 -35
  352. data/lib/alchemy/touching.rb +5 -6
  353. data/lib/alchemy/upgrader.rb +3 -5
  354. data/lib/alchemy/upgrader/tasks/available_contents_upgrader.rb +155 -0
  355. data/lib/alchemy/upgrader/tasks/nestable_elements_migration.rb +71 -0
  356. data/lib/alchemy/upgrader/tasks/three_point_two_task.rb +31 -0
  357. data/lib/alchemy/upgrader/three_point_three.rb +50 -0
  358. data/lib/alchemy/upgrader/three_point_two.rb +3 -32
  359. data/lib/alchemy/upgrader/three_point_zero.rb +0 -1
  360. data/lib/alchemy/version.rb +1 -1
  361. data/lib/rails/generators/alchemy/base.rb +1 -1
  362. data/lib/rails/generators/alchemy/elements/elements_generator.rb +1 -7
  363. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +5 -7
  364. data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +6 -8
  365. data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +6 -7
  366. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +4 -4
  367. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +3 -3
  368. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +3 -3
  369. data/lib/rails/generators/alchemy/essence/essence_generator.rb +2 -3
  370. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +1 -1
  371. data/lib/rails/generators/alchemy/install/files/alchemy.de.yml +2 -2
  372. data/lib/rails/generators/alchemy/install/files/alchemy.en.yml +2 -2
  373. data/lib/rails/generators/alchemy/install/files/alchemy.es.yml +3 -3
  374. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -1
  375. data/lib/rails/generators/alchemy/install/templates/elements.yml.tt +2 -2
  376. data/lib/rails/generators/alchemy/install/templates/page_layouts.yml.tt +1 -1
  377. data/lib/rails/generators/alchemy/module/module_generator.rb +1 -1
  378. data/lib/rails/templates/alchemy.rb +2 -2
  379. data/lib/tasks/alchemy/convert.rake +4 -8
  380. data/lib/tasks/alchemy/db.rake +2 -3
  381. data/lib/tasks/alchemy/install.rake +3 -4
  382. data/lib/tasks/alchemy/tidy.rake +4 -5
  383. data/lib/tasks/alchemy/upgrade.rake +2 -4
  384. data/spec/controllers/{admin → alchemy/admin}/attachments_controller_spec.rb +26 -44
  385. data/spec/controllers/{admin → alchemy/admin}/base_controller_spec.rb +14 -1
  386. data/spec/controllers/{admin → alchemy/admin}/clipboard_controller_spec.rb +3 -3
  387. data/spec/controllers/{admin → alchemy/admin}/contents_controller_spec.rb +4 -4
  388. data/spec/controllers/{admin → alchemy/admin}/dashboard_controller_spec.rb +11 -6
  389. data/spec/controllers/{admin → alchemy/admin}/elements_controller_spec.rb +54 -31
  390. data/spec/controllers/{admin → alchemy/admin}/essence_files_controller_spec.rb +8 -3
  391. data/spec/controllers/{admin → alchemy/admin}/essence_pictures_controller_spec.rb +3 -3
  392. data/spec/controllers/{admin → alchemy/admin}/languages_controller_spec.rb +13 -1
  393. data/spec/controllers/{admin → alchemy/admin}/layoutpages_controller_spec.rb +0 -6
  394. data/spec/controllers/{admin → alchemy/admin}/pages_controller_spec.rb +103 -35
  395. data/spec/controllers/{admin → alchemy/admin}/pictures_controller_spec.rb +133 -108
  396. data/spec/controllers/alchemy/admin/resources_controller_spec.rb +81 -0
  397. data/spec/controllers/{admin → alchemy/admin}/trash_controller_spec.rb +12 -13
  398. data/spec/controllers/alchemy/api/contents_controller_spec.rb +12 -13
  399. data/spec/controllers/alchemy/api/elements_controller_spec.rb +8 -9
  400. data/spec/controllers/alchemy/api/pages_controller_spec.rb +40 -7
  401. data/spec/controllers/{attachments_controller_spec.rb → alchemy/attachments_controller_spec.rb} +7 -7
  402. data/spec/controllers/alchemy/base_controller_spec.rb +106 -0
  403. data/spec/controllers/{elements_controller_spec.rb → alchemy/elements_controller_spec.rb} +4 -4
  404. data/spec/controllers/{messages_controller_spec.rb → alchemy/messages_controller_spec.rb} +14 -9
  405. data/spec/controllers/alchemy/on_page_layout_mixin_spec.rb +330 -0
  406. data/spec/controllers/{pages_controller_spec.rb → alchemy/pages_controller_spec.rb} +167 -89
  407. data/spec/controllers/{pictures_controller_spec.rb → alchemy/pictures_controller_spec.rb} +42 -20
  408. data/spec/dummy/app/models/dummy_user.rb +4 -0
  409. data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_view.html.erb +31 -0
  410. data/spec/dummy/app/views/alchemy/elements/_article_editor.html.erb +6 -10
  411. data/spec/dummy/app/views/alchemy/elements/_article_view.html.erb +9 -24
  412. data/spec/dummy/app/views/alchemy/elements/_bild_editor.html.erb +3 -0
  413. data/spec/dummy/app/views/alchemy/elements/_bild_view.html.erb +5 -0
  414. data/spec/dummy/app/views/alchemy/elements/_contactform_editor.html.erb +6 -0
  415. data/spec/dummy/app/views/alchemy/elements/_contactform_view.html.erb +16 -0
  416. data/spec/dummy/app/views/alchemy/elements/_download_editor.html.erb +3 -0
  417. data/spec/dummy/app/views/alchemy/elements/_download_view.html.erb +5 -0
  418. data/spec/dummy/app/views/alchemy/elements/_erb_element_editor.html.erb +3 -0
  419. data/spec/dummy/app/views/alchemy/elements/_erb_element_view.html.erb +5 -0
  420. data/spec/dummy/app/views/alchemy/elements/_header_editor.html.erb +3 -0
  421. data/spec/dummy/app/views/alchemy/elements/_header_view.html.erb +5 -0
  422. data/spec/dummy/app/views/alchemy/elements/_news_editor.html.erb +5 -0
  423. data/spec/dummy/app/views/alchemy/elements/_search_editor.html.erb +1 -0
  424. data/spec/dummy/app/views/alchemy/elements/_search_view.html.erb +4 -0
  425. data/spec/dummy/app/views/alchemy/elements/_slide_editor.html.erb +3 -0
  426. data/spec/dummy/app/views/alchemy/elements/_slide_view.html.erb +5 -0
  427. data/spec/dummy/app/views/alchemy/elements/_slider_editor.html.erb +2 -0
  428. data/spec/dummy/app/views/alchemy/elements/_slider_view.html.erb +4 -0
  429. data/spec/dummy/app/views/alchemy/elements/_text_editor.html.erb +3 -0
  430. data/spec/dummy/app/views/alchemy/elements/_text_view.html.erb +5 -0
  431. data/spec/dummy/app/views/alchemy/page_layouts/_standard.html.erb +1 -0
  432. data/spec/dummy/config/alchemy/elements.yml +10 -13
  433. data/spec/dummy/config/alchemy/page_layouts.yml +1 -1
  434. data/spec/dummy/config/initializers/alchemy.rb +1 -0
  435. data/spec/dummy/config/locales/kl.yml +2 -0
  436. data/spec/dummy/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +1 -0
  437. data/spec/dummy/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +1 -0
  438. data/spec/dummy/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +1 -0
  439. data/spec/dummy/db/schema.rb +10 -6
  440. data/spec/factories.rb +13 -0
  441. data/spec/features/admin/admin_layout_spec.rb +14 -0
  442. data/spec/features/admin/dashboard_spec.rb +1 -2
  443. data/spec/features/admin/edit_elements_feature_spec.rb +36 -0
  444. data/spec/features/admin/language_tree_feature_spec.rb +7 -8
  445. data/spec/features/admin/languages_features_spec.rb +65 -0
  446. data/spec/features/admin/legacy_page_url_management_spec.rb +3 -3
  447. data/spec/features/admin/link_overlay_spec.rb +16 -17
  448. data/spec/features/admin/locale_select_feature_spec.rb +1 -1
  449. data/spec/features/admin/modules_integration_spec.rb +0 -1
  450. data/spec/features/admin/navigation_feature_spec.rb +11 -2
  451. data/spec/features/admin/page_creation_feature_spec.rb +5 -5
  452. data/spec/features/admin/page_editing_feature_spec.rb +6 -6
  453. data/spec/features/admin/picture_library_integration_spec.rb +3 -3
  454. data/spec/features/admin/resources_integration_spec.rb +7 -12
  455. data/spec/features/admin/site_select_feature_spec.rb +1 -2
  456. data/spec/features/admin/tinymce_feature_spec.rb +0 -1
  457. data/spec/features/page_feature_spec.rb +57 -158
  458. data/spec/features/page_redirects_spec.rb +358 -0
  459. data/spec/features/picture_security_spec.rb +1 -7
  460. data/spec/fixtures/animated.gif +0 -0
  461. data/spec/helpers/{admin → alchemy/admin}/attachments_helper_spec.rb +0 -0
  462. data/spec/helpers/{admin → alchemy/admin}/base_helper_spec.rb +39 -29
  463. data/spec/helpers/{admin → alchemy/admin}/contents_helper_spec.rb +4 -23
  464. data/spec/helpers/{admin → alchemy/admin}/elements_helper_spec.rb +141 -5
  465. data/spec/helpers/{admin → alchemy/admin}/essences_helper_spec.rb +69 -8
  466. data/spec/helpers/{admin → alchemy/admin}/navigation_helper_spec.rb +43 -37
  467. data/spec/helpers/{admin → alchemy/admin}/pages_helper_spec.rb +6 -38
  468. data/spec/helpers/{admin → alchemy/admin}/pictures_helper_spec.rb +0 -1
  469. data/spec/helpers/{admin → alchemy/admin}/tags_helper_spec.rb +1 -3
  470. data/spec/helpers/{base_helper_spec.rb → alchemy/base_helper_spec.rb} +1 -2
  471. data/spec/helpers/{elements_block_helper_spec.rb → alchemy/elements_block_helper_spec.rb} +3 -3
  472. data/spec/helpers/{elements_helper_spec.rb → alchemy/elements_helper_spec.rb} +18 -19
  473. data/spec/helpers/alchemy/essences_helper_spec.rb +85 -0
  474. data/spec/helpers/{pages_helper_spec.rb → alchemy/pages_helper_spec.rb} +125 -39
  475. data/spec/helpers/alchemy/picture_url_helpers_spec.rb +78 -0
  476. data/spec/helpers/{url_helper_spec.rb → alchemy/url_helper_spec.rb} +66 -40
  477. data/spec/libraries/config_spec.rb +2 -3
  478. data/spec/libraries/controller_actions_spec.rb +18 -18
  479. data/spec/libraries/i18n_spec.rb +7 -0
  480. data/spec/libraries/page_layout_spec.rb +13 -7
  481. data/spec/libraries/paths_spec.rb +15 -0
  482. data/spec/libraries/permissions_spec.rb +6 -7
  483. data/spec/libraries/resource_spec.rb +48 -75
  484. data/spec/libraries/resources_helper_spec.rb +55 -6
  485. data/spec/libraries/shell_spec.rb +0 -4
  486. data/spec/libraries/template_tracker_spec.rb +4 -13
  487. data/spec/libraries/tinymce_spec.rb +53 -9
  488. data/spec/mailers/{messages_spec.rb → alchemy/messages_spec.rb} +0 -2
  489. data/spec/models/{attachment_spec.rb → alchemy/attachment_spec.rb} +43 -20
  490. data/spec/models/{cell_spec.rb → alchemy/cell_spec.rb} +2 -3
  491. data/spec/models/{content_spec.rb → alchemy/content_spec.rb} +179 -70
  492. data/spec/models/{element_spec.rb → alchemy/element_spec.rb} +315 -70
  493. data/spec/models/{element_to_page_spec.rb → alchemy/element_to_page_spec.rb} +0 -1
  494. data/spec/models/{essence_boolean_spec.rb → alchemy/essence_boolean_spec.rb} +0 -0
  495. data/spec/models/{essence_date_spec.rb → alchemy/essence_date_spec.rb} +2 -3
  496. data/spec/models/{essence_file_spec.rb → alchemy/essence_file_spec.rb} +2 -5
  497. data/spec/models/{essence_html_spec.rb → alchemy/essence_html_spec.rb} +1 -1
  498. data/spec/models/{essence_link_spec.rb → alchemy/essence_link_spec.rb} +0 -0
  499. data/spec/models/{essence_picture_spec.rb → alchemy/essence_picture_spec.rb} +101 -29
  500. data/spec/models/{essence_richtext_spec.rb → alchemy/essence_richtext_spec.rb} +7 -2
  501. data/spec/models/{essence_select_spec.rb → alchemy/essence_select_spec.rb} +0 -0
  502. data/spec/models/{essence_text_spec.rb → alchemy/essence_text_spec.rb} +4 -8
  503. data/spec/models/alchemy/language_spec.rb +243 -0
  504. data/spec/models/{legacy_page_url_spec.rb → alchemy/legacy_page_url_spec.rb} +1 -1
  505. data/spec/models/{message_spec.rb → alchemy/message_spec.rb} +0 -0
  506. data/spec/models/{page_spec.rb → alchemy/page_spec.rb} +460 -248
  507. data/spec/models/{picture_spec.rb → alchemy/picture_spec.rb} +118 -30
  508. data/spec/models/{site_spec.rb → alchemy/site_spec.rb} +19 -84
  509. data/spec/models/{tag_spec.rb → alchemy/tag_spec.rb} +1 -3
  510. data/spec/models/dummy_model_spec.rb +1 -2
  511. data/spec/requests/alchemy/admin/resources_requests_spec.rb +26 -0
  512. data/spec/requests/alchemy/admin/site_requests_spec.rb +19 -0
  513. data/spec/requests/alchemy/site_requests_spec.rb +18 -0
  514. data/spec/requests/alchemy/sitemap_spec.rb +56 -0
  515. data/spec/routing/api_routing_spec.rb +1 -1
  516. data/spec/routing/routing_spec.rb +121 -15
  517. data/spec/spec_helper.rb +2 -1
  518. data/spec/support/hint_examples.rb +1 -3
  519. data/spec/support/test_tweaks.rb +3 -3
  520. data/spec/support/transformation_examples.rb +6 -7
  521. data/spec/tasks/helpers_spec.rb +2 -4
  522. data/spec/views/admin/pictures/show_spec.rb +43 -0
  523. data/spec/views/essences/essence_boolean_editor_spec.rb +0 -1
  524. data/spec/views/essences/essence_boolean_view_spec.rb +2 -4
  525. data/spec/views/essences/essence_date_view_spec.rb +0 -1
  526. data/spec/views/essences/essence_file_editor_spec.rb +4 -6
  527. data/spec/views/essences/essence_file_view_spec.rb +56 -3
  528. data/spec/views/essences/essence_link_view_spec.rb +1 -1
  529. data/spec/views/essences/essence_picture_editor_spec.rb +80 -0
  530. data/spec/views/essences/essence_picture_view_spec.rb +0 -1
  531. data/spec/views/essences/essence_select_view_spec.rb +0 -1
  532. data/spec/views/essences/essence_text_view_spec.rb +0 -1
  533. data/vendor/assets/javascripts/handlebars.js +4608 -0
  534. data/vendor/assets/javascripts/tinymce/langs/de.js +19 -0
  535. data/vendor/assets/javascripts/tinymce/langs/es.js +19 -0
  536. data/vendor/assets/javascripts/tinymce/langs/fr.js +23 -4
  537. data/vendor/assets/javascripts/tinymce/langs/nl.js +22 -3
  538. data/vendor/assets/javascripts/tinymce/langs/ru.js +22 -3
  539. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -1
  540. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -1
  541. data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -1
  542. data/vendor/assets/javascripts/tinymce/tinymce.min.js +12 -13
  543. metadata +274 -256
  544. data/app/views/alchemy/admin/attachments/create.js.erb +0 -11
  545. data/app/views/alchemy/admin/attachments/new.html.erb +0 -14
  546. data/app/views/alchemy/admin/elements/_element_foot.html.erb +0 -36
  547. data/app/views/alchemy/admin/partials/_upload_form.html.erb +0 -67
  548. data/app/views/alchemy/admin/pictures/info.html.erb +0 -38
  549. data/app/views/alchemy/admin/pictures/new.html.erb +0 -16
  550. data/lib/alchemy/middleware/rescue_old_cookies.rb +0 -27
  551. data/spec/controllers/admin/resources_controller_spec.rb +0 -53
  552. data/spec/controllers/base_controller_spec.rb +0 -51
  553. data/spec/helpers/essences_helper_spec.rb +0 -156
  554. data/spec/helpers/picture_url_helpers_spec.rb +0 -35
  555. data/spec/libraries/on_page_layout_spec.rb +0 -112
  556. data/spec/models/language_spec.rb +0 -123
@@ -0,0 +1,330 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Alchemy::PagesController, 'OnPageLayout mixin', type: :controller do
4
+ before(:all) do
5
+ ApplicationController.send(:extend, Alchemy::OnPageLayout)
6
+ end
7
+
8
+ let(:page) { create(:alchemy_page, :public, page_layout: 'standard') }
9
+
10
+ describe '.on_page_layout' do
11
+ context 'with :all as argument for page_layout' do
12
+ before do
13
+ ApplicationController.class_eval do
14
+ on_page_layout(:all) do
15
+ @on_all_layouts = @page.page_layout
16
+ end
17
+ end
18
+ end
19
+
20
+ context "for show action" do
21
+ %w(standard news).each do |page_layout|
22
+ it "runs callback on #{page_layout} layout" do
23
+ page = create(:alchemy_page, :public, page_layout: page_layout)
24
+ alchemy_get :show, urlname: page.urlname
25
+ expect(assigns(:on_all_layouts)).to eq(page_layout)
26
+ end
27
+ end
28
+ end
29
+
30
+ context "for index action" do
31
+ %w(standard news).each do |page_layout|
32
+ it "runs callback on #{page_layout} layout" do
33
+ create(:alchemy_page, :language_root, page_layout: page_layout)
34
+
35
+ alchemy_get :index
36
+ expect(assigns(:on_all_layouts)).to eq(page_layout)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ context 'with :standard as argument for page_layout' do
43
+ before do
44
+ ApplicationController.class_eval do
45
+ on_page_layout(:standard) do
46
+ @successful_for_standard = true
47
+ end
48
+ end
49
+ end
50
+
51
+ context 'and page having standard layout' do
52
+ context "for show action" do
53
+ let(:page) { create(:alchemy_page, :public, page_layout: 'standard') }
54
+
55
+ it 'runs the callback' do
56
+ alchemy_get :show, urlname: page.urlname
57
+ expect(assigns(:successful_for_standard)).to eq(true)
58
+ end
59
+ end
60
+
61
+ context "for index action" do
62
+ let!(:page) { create(:alchemy_page, :language_root, page_layout: 'standard') }
63
+
64
+ it 'runs the callback' do
65
+ alchemy_get :index
66
+ expect(assigns(:successful_for_standard)).to eq(true)
67
+ end
68
+ end
69
+ end
70
+
71
+ context 'and page not having standard layout' do
72
+ let(:page) { create(:alchemy_page, :public, page_layout: 'news') }
73
+
74
+ context "for show action" do
75
+ it "doesn't run the callback" do
76
+ alchemy_get :show, urlname: page.urlname
77
+ expect(assigns(:successful_for_standard)).to eq(nil)
78
+ end
79
+ end
80
+
81
+ context "for index action" do
82
+ let!(:page) { create(:alchemy_page, :language_root, page_layout: 'news') }
83
+
84
+ it "doesn't run the callback" do
85
+ alchemy_get :index
86
+ expect(assigns(:successful_for_standard)).to eq(nil)
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ context 'when defining two callbacks for different page layouts' do
93
+ context "for show action" do
94
+ before do
95
+ ApplicationController.class_eval do
96
+ on_page_layout(:standard) do
97
+ @urlname = @page.urlname
98
+ end
99
+
100
+ on_page_layout(:news) do
101
+ @urlname = @page.urlname
102
+ end
103
+ end
104
+ end
105
+
106
+ %w(standard news).each do |page_layout|
107
+ it "runs both callbacks for #{page_layout} layout" do
108
+ page = create(:alchemy_page, :public, page_layout: page_layout)
109
+
110
+ alchemy_get :show, urlname: page.urlname
111
+ expect(assigns(:urlname)).to eq(page.urlname)
112
+ end
113
+ end
114
+ end
115
+
116
+ context "for index action" do
117
+ before do
118
+ ApplicationController.class_eval do
119
+ on_page_layout(:standard) do
120
+ @page_layout = @page.page_layout
121
+ end
122
+
123
+ on_page_layout(:news) do
124
+ @page_layout = @page.page_layout
125
+ end
126
+ end
127
+ end
128
+
129
+ %w(standard news).each do |page_layout|
130
+ it "runs both callbacks on #{page_layout} layout" do
131
+ create(:alchemy_page, :language_root, page_layout: page_layout)
132
+
133
+ alchemy_get :index
134
+ expect(assigns(:page_layout)).to eq(page_layout)
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ context 'when defining two callbacks for the same page_layout' do
141
+ before do
142
+ ApplicationController.class_eval do
143
+ on_page_layout(:standard) do
144
+ @successful_for_standard_first = true
145
+ end
146
+
147
+ on_page_layout(:standard) do
148
+ @successful_for_standard_second = true
149
+ end
150
+ end
151
+ end
152
+
153
+ context "for show action" do
154
+ it 'runs both callbacks' do
155
+ alchemy_get :show, urlname: page.urlname
156
+ expect(assigns(:successful_for_standard_first)).to eq(true)
157
+ expect(assigns(:successful_for_standard_second)).to eq(true)
158
+ end
159
+ end
160
+
161
+ context "for index action" do
162
+ let!(:page) { create(:alchemy_page, :language_root, page_layout: 'standard') }
163
+
164
+ it 'runs both callbacks' do
165
+ alchemy_get :index
166
+ expect(assigns(:successful_for_standard_first)).to eq(true)
167
+ expect(assigns(:successful_for_standard_second)).to eq(true)
168
+ end
169
+ end
170
+ end
171
+
172
+ context 'when block is given' do
173
+ before do
174
+ ApplicationController.class_eval do
175
+ on_page_layout :standard do
176
+ @successful_for_callback_method = true
177
+ end
178
+ end
179
+ end
180
+
181
+ context 'for show action' do
182
+ it 'evaluates the given block' do
183
+ alchemy_get :show, urlname: page.urlname
184
+ expect(assigns(:successful_for_callback_method)).to eq(true)
185
+ end
186
+ end
187
+
188
+ context 'for index action' do
189
+ let!(:page) { create(:alchemy_page, :language_root, page_layout: 'standard') }
190
+
191
+ it 'evaluates the given block' do
192
+ alchemy_get :index
193
+ expect(assigns(:successful_for_callback_method)).to eq(true)
194
+ end
195
+ end
196
+ end
197
+
198
+ context 'when callback method name is given' do
199
+ before do
200
+ ApplicationController.class_eval do
201
+ on_page_layout :standard, :run_method
202
+
203
+ def run_method
204
+ @successful_for_callback_method = true
205
+ end
206
+ end
207
+ end
208
+
209
+ context 'for show action' do
210
+ it 'runs the given callback method' do
211
+ alchemy_get :show, urlname: page.urlname
212
+ expect(assigns(:successful_for_callback_method)).to eq(true)
213
+ end
214
+ end
215
+
216
+ context 'for index action' do
217
+ let!(:page) { create(:alchemy_page, :language_root, page_layout: 'standard') }
218
+
219
+ it 'runs the given callback method' do
220
+ alchemy_get :index
221
+ expect(assigns(:successful_for_callback_method)).to eq(true)
222
+ end
223
+ end
224
+ end
225
+
226
+ context 'when neither callback method name nor block given' do
227
+ it 'raises an ArgumentError' do
228
+ expect do
229
+ ApplicationController.class_eval do
230
+ on_page_layout :standard
231
+ end
232
+ end.to raise_error(ArgumentError)
233
+ end
234
+ end
235
+
236
+ context 'when passing two page_layouts for a callback' do
237
+ before do
238
+ ApplicationController.class_eval do
239
+ on_page_layout([:standard, :news]) do
240
+ @successful = @page.page_layout
241
+ end
242
+ end
243
+ end
244
+
245
+ %w(standard news).each do |page_layout|
246
+ it 'evaluates the given callback on both page_layouts for show action' do
247
+ page = create(:alchemy_page, :public, page_layout: page_layout)
248
+
249
+ alchemy_get :show, urlname: page.urlname
250
+ expect(assigns(:successful)).to eq(page_layout)
251
+ end
252
+ end
253
+
254
+ %w(standard news).each do |page_layout|
255
+ it 'evaluates the given callback on both page_layouts for index action' do
256
+ create(:alchemy_page, :language_root, page_layout: page_layout)
257
+
258
+ alchemy_get :index
259
+ expect(assigns(:successful)).to eq(page_layout)
260
+ end
261
+ end
262
+ end
263
+ end
264
+ end
265
+
266
+ RSpec.describe ApplicationController, 'OnPageLayout mixin', type: :controller do
267
+ before(:all) do
268
+ ApplicationController.send(:extend, Alchemy::OnPageLayout)
269
+ end
270
+
271
+ controller do
272
+ def index
273
+ @another_controller = true
274
+ render nothing: true
275
+ end
276
+ end
277
+
278
+ context 'in another controller' do
279
+ before do
280
+ ApplicationController.class_eval do
281
+ on_page_layout(:standard) do
282
+ @successful_for_another_controller = true
283
+ end
284
+ end
285
+ end
286
+
287
+ it 'callback does not run' do
288
+ get :index
289
+ expect(assigns(:another_controller)).to eq(true)
290
+ expect(assigns(:successful_for_another_controller)).to eq(nil)
291
+ end
292
+ end
293
+ end
294
+
295
+ RSpec.describe Alchemy::Admin::PagesController, 'OnPageLayout mixin', type: :controller do
296
+ before(:all) do
297
+ ApplicationController.send(:extend, Alchemy::OnPageLayout)
298
+ end
299
+
300
+ context 'in admin/pages_controller' do
301
+ before do
302
+ ApplicationController.class_eval do
303
+ on_page_layout(:standard) do
304
+ @successful_for_alchemy_admin_pages_controller = true
305
+ end
306
+ end
307
+ authorize_user(:as_admin)
308
+ end
309
+
310
+ context "for show action" do
311
+ let(:page) { create(:alchemy_page, page_layout: 'standard') }
312
+
313
+ it 'callback also runs' do
314
+ alchemy_get :show, id: page.id
315
+ expect(assigns(:successful_for_alchemy_admin_pages_controller)).to be(true)
316
+ end
317
+ end
318
+
319
+ context "for index action" do
320
+ it 'does not run callback' do
321
+ alchemy_get :index
322
+ expect(assigns(:successful_for_alchemy_admin_pages_controller)).to be(nil)
323
+ end
324
+ end
325
+ end
326
+
327
+ after(:all) do
328
+ Alchemy::OnPageLayout.instance_variable_set(:@callbacks, nil)
329
+ end
330
+ end
@@ -3,14 +3,149 @@ require 'spec_helper'
3
3
 
4
4
  module Alchemy
5
5
  describe PagesController do
6
- let(:default_language) { Language.default }
7
- let(:default_language_root) { FactoryGirl.create(:language_root_page, language: default_language, name: 'Home', public: true) }
8
- let(:page) { FactoryGirl.create(:public_page, parent_id: default_language_root.id, page_layout: 'news', name: 'News', urlname: 'news', language: default_language, do_not_autogenerate: false) }
6
+ let(:default_language) { Language.default }
9
7
 
10
- before { allow(controller).to receive(:signup_required?).and_return(false) }
8
+ let(:default_language_root) do
9
+ create :alchemy_page, :language_root,
10
+ language: default_language,
11
+ name: 'Home',
12
+ public: true
13
+ end
14
+
15
+ let(:page) do
16
+ create :alchemy_page, :public,
17
+ parent_id: default_language_root.id,
18
+ page_layout: 'news',
19
+ name: 'News',
20
+ urlname: 'news',
21
+ language: default_language,
22
+ do_not_autogenerate: false
23
+ end
24
+
25
+ before do
26
+ allow(controller).to receive(:signup_required?).and_return(false)
27
+ end
28
+
29
+ describe "#index" do
30
+ before do
31
+ default_language_root
32
+ allow(Config).to receive(:get) do |arg|
33
+ arg == :redirect_index ? false : Config.parameter(arg)
34
+ end
35
+ end
36
+
37
+ it 'renders :show template' do
38
+ expect(alchemy_get(:index)).to render_template(:show)
39
+ end
40
+
41
+ context 'requesting nothing' do
42
+ it 'loads default language root page' do
43
+ alchemy_get :index
44
+ expect(assigns(:page)).to eq(default_language_root)
45
+ end
46
+
47
+ it 'sets @root_page to default language root' do
48
+ alchemy_get(:index)
49
+ expect(assigns(:root_page)).to eq(default_language_root)
50
+ end
51
+
52
+ context 'and the root page is not public' do
53
+ before do
54
+ default_language_root.update!(public: false)
55
+ end
56
+
57
+ context 'and redirect_to_public_child is set to false' do
58
+ before do
59
+ allow(Config).to receive(:get) do |arg|
60
+ arg == :redirect_to_public_child ? false : Config.parameter(arg)
61
+ end
62
+ end
63
+
64
+ it 'raises routing error (404)' do
65
+ expect {
66
+ alchemy_get :index
67
+ }.to raise_error(ActionController::RoutingError)
68
+ end
69
+ end
70
+
71
+ context 'and redirect_to_public_child is set to true' do
72
+ before do
73
+ allow(Config).to receive(:get) do |arg|
74
+ arg == :redirect_to_public_child ? true : Config.parameter(arg)
75
+ end
76
+ end
77
+
78
+ context 'that has a public child' do
79
+ let!(:public_child) do
80
+ create(:alchemy_page, :public, parent: default_language_root)
81
+ end
82
+
83
+ it 'loads this page' do
84
+ alchemy_get :index
85
+ expect(assigns(:page)).to eq(public_child)
86
+ end
87
+ end
88
+
89
+ context 'that has a non public child' do
90
+ let!(:non_public_child) do
91
+ create(:alchemy_page, parent: default_language_root)
92
+ end
93
+
94
+ context 'that has a public child' do
95
+ let!(:public_child) do
96
+ create(:alchemy_page, :public, parent: non_public_child)
97
+ end
98
+
99
+ it 'loads this page' do
100
+ alchemy_get :index
101
+ expect(assigns(:page)).to eq(public_child)
102
+ end
103
+ end
104
+
105
+ context 'that has a non public child' do
106
+ before do
107
+ create(:alchemy_page, parent: non_public_child)
108
+ end
109
+
110
+ it 'raises routing error (404)' do
111
+ expect {
112
+ alchemy_get :index
113
+ }.to raise_error(ActionController::RoutingError)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ context 'requesting non default locale' do
122
+ let!(:deutsch) do
123
+ create(:alchemy_language, name: 'Deutsch', code: 'de', default: false)
124
+ end
125
+
126
+ let!(:startseite) do
127
+ create :alchemy_page, :language_root,
128
+ language: deutsch, public: true, name: 'Startseite'
129
+ end
130
+
131
+ before do
132
+ allow(::I18n).to receive(:default_locale) { 'en' }
133
+ end
134
+
135
+ it 'loads the root page of that language' do
136
+ alchemy_get :index, locale: 'de'
137
+ expect(assigns(:page)).to eq(startseite)
138
+ end
139
+
140
+ it 'sets @root_page to root page of that language' do
141
+ alchemy_get :index, locale: 'de'
142
+ expect(assigns(:root_page)).to eq(startseite)
143
+ end
144
+ end
145
+ end
11
146
 
12
147
  context 'an author' do
13
- let(:unpublic) { create(:page, parent: default_language_root) }
148
+ let(:unpublic) { create(:alchemy_page, parent: default_language_root) }
14
149
 
15
150
  before { authorize_user(:as_author) }
16
151
 
@@ -56,9 +191,9 @@ module Alchemy
56
191
  describe "url nesting" do
57
192
  render_views
58
193
 
59
- let(:catalog) { FactoryGirl.create(:public_page, name: "Catalog", urlname: 'catalog', parent: default_language_root, language: default_language, visible: true) }
60
- let(:products) { FactoryGirl.create(:public_page, name: "Products", urlname: 'products', parent: catalog, language: default_language, visible: true) }
61
- let(:product) { FactoryGirl.create(:public_page, name: "Screwdriver", urlname: 'screwdriver', parent: products, language: default_language, do_not_autogenerate: false, visible: true) }
194
+ let(:catalog) { create(:alchemy_page, :public, name: "Catalog", urlname: 'catalog', parent: default_language_root, language: default_language, visible: true) }
195
+ let(:products) { create(:alchemy_page, :public, name: "Products", urlname: 'products', parent: catalog, language: default_language, visible: true) }
196
+ let(:product) { create(:alchemy_page, :public, name: "Screwdriver", urlname: 'screwdriver', parent: products, language: default_language, do_not_autogenerate: false, visible: true) }
62
197
 
63
198
  before do
64
199
  allow(Alchemy.user_class).to receive(:admins).and_return(OpenStruct.new(count: 1))
@@ -91,47 +226,11 @@ module Alchemy
91
226
  end
92
227
  end
93
228
 
94
- describe '#redirect_to_public_child' do
95
- let(:root_page) { FactoryGirl.create(:language_root_page, public: false) }
96
- let(:page) { FactoryGirl.create(:page, parent_id: root_page.id) }
97
- let(:public_page) { FactoryGirl.create(:public_page, parent_id: page.id) }
98
-
99
- before { controller.instance_variable_set("@page", root_page) }
100
-
101
- context 'as guest user' do
102
- context "with unpublished and published pages in page tree" do
103
- before do
104
- public_page
105
- root_page.reload
106
- end
107
-
108
- it "should redirect to first public child" do
109
- expect(controller).to receive(:redirect_page)
110
- controller.send(:redirect_to_public_child)
111
- expect(controller.instance_variable_get('@page')).to eq(public_page)
112
- end
113
- end
114
-
115
- context "with only unpublished pages in page tree" do
116
- before do
117
- page
118
- root_page.reload
119
- end
120
-
121
- it "should raise not found error" do
122
- expect {
123
- controller.send(:redirect_to_public_child)
124
- }.to raise_error(ActionController::RoutingError)
125
- end
126
- end
127
- end
128
- end
129
-
130
229
  describe 'Redirecting to legacy page urls' do
131
230
  context 'Request a page with legacy url' do
132
- let(:page) { FactoryGirl.create(:public_page, name: 'New page name') }
133
- let(:second_page) { FactoryGirl.create(:public_page, name: 'Second Page') }
134
- let(:legacy_page) { FactoryGirl.create(:public_page, name: 'Legacy Url') }
231
+ let(:page) { create(:alchemy_page, :public, name: 'New page name') }
232
+ let(:second_page) { create(:alchemy_page, :public, name: 'Second Page') }
233
+ let(:legacy_page) { create(:alchemy_page, :public, name: 'Legacy Url') }
135
234
  let!(:legacy_url) { LegacyPageUrl.create(urlname: 'legacy-url', page: page) }
136
235
  let(:legacy_url2) { LegacyPageUrl.create(urlname: 'legacy-url', page: second_page) }
137
236
  let(:legacy_url3) { LegacyPageUrl.create(urlname: 'index.php?id=2', page: second_page) }
@@ -197,6 +296,27 @@ module Alchemy
197
296
  end
198
297
  end
199
298
 
299
+ context 'in an environment with multiple languages' do
300
+ let(:klingon) { create(:alchemy_language, :klingon) }
301
+
302
+ context 'having two pages with the same url names in different languages' do
303
+ render_views
304
+
305
+ let!(:klingon_page) { create(:alchemy_page, :public, language: klingon, name: "same-name", do_not_autogenerate: false) }
306
+ let!(:english_page) { create(:alchemy_page, :public, language: default_language, name: "same-name") }
307
+
308
+ before do
309
+ # Set a text in an essence rendered on the page so we can match against that
310
+ klingon_page.essence_texts.first.update_column(:body, 'klingon page')
311
+ end
312
+
313
+ it 'renders the page related to its language' do
314
+ alchemy_get :show, {urlname: "same-name", locale: klingon_page.language_code}
315
+ expect(response.body).to have_content("klingon page")
316
+ end
317
+ end
318
+ end
319
+
200
320
  describe '#page_etag' do
201
321
  subject { controller.send(:page_etag) }
202
322
 
@@ -219,47 +339,5 @@ module Alchemy
219
339
  end
220
340
  end
221
341
  end
222
-
223
- describe '#cache_page?' do
224
- subject { controller.send(:cache_page?) }
225
-
226
- before do
227
- Rails.application.config.action_controller.perform_caching = true
228
- controller.instance_variable_set('@page', page)
229
- end
230
-
231
- it 'returns true when everthing is alright' do
232
- expect(subject).to be true
233
- end
234
-
235
- it 'returns false when the Rails app does not perform caching' do
236
- Rails.application.config.action_controller.perform_caching = false
237
- expect(subject).to be false
238
- end
239
-
240
- it 'returns false when there is no page' do
241
- controller.instance_variable_set('@page', nil)
242
- expect(subject).to be false
243
- end
244
-
245
- it 'returns false when caching is deactivated in the Alchemy config' do
246
- allow(Alchemy::Config).to receive(:get).with(:cache_pages).and_return(false)
247
- expect(subject).to be false
248
- end
249
-
250
- it 'returns false when the page layout is set to cache = false' do
251
- page_layout = PageLayout.get('news')
252
- page_layout['cache'] = false
253
- allow(PageLayout).to receive(:get).with('news').and_return(page_layout)
254
- expect(subject).to be false
255
- end
256
-
257
- it 'returns false when the page layout is set to searchresults = true' do
258
- page_layout = PageLayout.get('news')
259
- page_layout['searchresults'] = true
260
- allow(PageLayout).to receive(:get).with('news').and_return(page_layout)
261
- expect(subject).to be false
262
- end
263
- end
264
342
  end
265
343
  end