alchemy_cms 4.6.1 → 5.0.0

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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +33 -1
  3. data/.github/workflows/stale.yml +1 -1
  4. data/.gitignore +20 -2
  5. data/.hound.yml +2 -1
  6. data/.prettierrc +6 -0
  7. data/.rubocop.yml +30 -9
  8. data/CHANGELOG.md +102 -1
  9. data/Gemfile +24 -22
  10. data/README.md +32 -20
  11. data/Rakefile +11 -8
  12. data/alchemy_cms.gemspec +6 -5
  13. data/app/assets/javascripts/alchemy/admin.js +1 -5
  14. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +2 -1
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -2
  16. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +17 -17
  17. data/app/assets/javascripts/alchemy/node_select.js +39 -0
  18. data/app/assets/javascripts/alchemy/templates/index.js +1 -0
  19. data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
  20. data/app/assets/stylesheets/alchemy/admin.scss +3 -2
  21. data/app/assets/stylesheets/alchemy/base.scss +0 -1
  22. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  23. data/app/assets/stylesheets/alchemy/forms.scss +5 -0
  24. data/app/assets/stylesheets/alchemy/navigation.scss +1 -0
  25. data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
  26. data/app/assets/stylesheets/alchemy/nodes.scss +1 -1
  27. data/app/assets/stylesheets/alchemy/sitemap.scss +5 -1
  28. data/app/assets/stylesheets/alchemy/tables.scss +1 -24
  29. data/app/assets/stylesheets/alchemy/tags.scss +2 -2
  30. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
  31. data/app/controllers/alchemy/admin/base_controller.rb +13 -33
  32. data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
  33. data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
  34. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
  35. data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
  36. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
  37. data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
  38. data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
  39. data/app/controllers/alchemy/admin/nodes_controller.rb +5 -4
  40. data/app/controllers/alchemy/admin/pages_controller.rb +51 -63
  41. data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
  42. data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
  43. data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
  44. data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
  45. data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
  46. data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
  47. data/app/controllers/alchemy/api/base_controller.rb +2 -2
  48. data/app/controllers/alchemy/api/contents_controller.rb +4 -4
  49. data/app/controllers/alchemy/api/elements_controller.rb +8 -8
  50. data/app/controllers/alchemy/api/nodes_controller.rb +37 -1
  51. data/app/controllers/alchemy/api/pages_controller.rb +14 -23
  52. data/app/controllers/alchemy/attachments_controller.rb +5 -5
  53. data/app/controllers/alchemy/base_controller.rb +10 -9
  54. data/app/controllers/alchemy/messages_controller.rb +16 -23
  55. data/app/controllers/alchemy/pages_controller.rb +13 -11
  56. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
  57. data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
  58. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
  59. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
  60. data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
  61. data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
  62. data/app/decorators/alchemy/element_editor.rb +39 -0
  63. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
  64. data/app/helpers/alchemy/admin/base_helper.rb +38 -35
  65. data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
  66. data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
  67. data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
  68. data/app/helpers/alchemy/admin/form_helper.rb +1 -1
  69. data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
  70. data/app/helpers/alchemy/admin/pages_helper.rb +4 -4
  71. data/app/helpers/alchemy/admin/pictures_helper.rb +4 -6
  72. data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
  73. data/app/helpers/alchemy/base_helper.rb +13 -8
  74. data/app/helpers/alchemy/elements_block_helper.rb +2 -31
  75. data/app/helpers/alchemy/elements_helper.rb +12 -58
  76. data/app/helpers/alchemy/pages_helper.rb +24 -174
  77. data/app/helpers/alchemy/url_helper.rb +4 -3
  78. data/app/mailers/alchemy/base_mailer.rb +1 -1
  79. data/app/mailers/alchemy/messages_mailer.rb +1 -1
  80. data/app/models/alchemy/attachment.rb +24 -19
  81. data/app/models/alchemy/base_record.rb +2 -5
  82. data/app/models/alchemy/content.rb +33 -38
  83. data/app/models/alchemy/content/factory.rb +24 -31
  84. data/app/models/alchemy/element.rb +45 -53
  85. data/app/models/alchemy/element/definitions.rb +4 -4
  86. data/app/models/alchemy/element/element_contents.rb +9 -6
  87. data/app/models/alchemy/element/element_essences.rb +4 -3
  88. data/app/models/alchemy/element/presenters.rb +3 -2
  89. data/app/models/alchemy/element_to_page.rb +1 -1
  90. data/app/models/alchemy/essence_boolean.rb +1 -3
  91. data/app/models/alchemy/essence_date.rb +2 -3
  92. data/app/models/alchemy/essence_file.rb +5 -5
  93. data/app/models/alchemy/essence_html.rb +1 -3
  94. data/app/models/alchemy/essence_link.rb +1 -3
  95. data/app/models/alchemy/essence_node.rb +18 -0
  96. data/app/models/alchemy/essence_page.rb +3 -16
  97. data/app/models/alchemy/essence_picture.rb +18 -17
  98. data/app/models/alchemy/essence_picture_view.rb +7 -6
  99. data/app/models/alchemy/essence_richtext.rb +1 -3
  100. data/app/models/alchemy/essence_select.rb +1 -3
  101. data/app/models/alchemy/essence_text.rb +0 -2
  102. data/app/models/alchemy/folded_page.rb +1 -0
  103. data/app/models/alchemy/language.rb +21 -35
  104. data/app/models/alchemy/language/code.rb +4 -4
  105. data/app/models/alchemy/legacy_page_url.rb +1 -1
  106. data/app/models/alchemy/message.rb +3 -3
  107. data/app/models/alchemy/node.rb +27 -4
  108. data/app/models/alchemy/page.rb +46 -127
  109. data/app/models/alchemy/page/fixed_attributes.rb +3 -2
  110. data/app/models/alchemy/page/page_elements.rb +35 -44
  111. data/app/models/alchemy/page/page_naming.rb +20 -70
  112. data/app/models/alchemy/page/page_natures.rb +7 -34
  113. data/app/models/alchemy/page/page_scopes.rb +23 -29
  114. data/app/models/alchemy/page/url_path.rb +0 -2
  115. data/app/models/alchemy/picture.rb +40 -30
  116. data/app/models/alchemy/picture/preprocessor.rb +26 -0
  117. data/app/models/alchemy/picture/transformations.rb +9 -7
  118. data/app/models/alchemy/picture/url.rb +9 -7
  119. data/app/models/alchemy/site.rb +6 -36
  120. data/app/models/alchemy/site/layout.rb +2 -2
  121. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  122. data/app/serializers/alchemy/content_serializer.rb +0 -3
  123. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  124. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  125. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  126. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  127. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  128. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  129. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  130. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  131. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  132. data/app/serializers/alchemy/node_serializer.rb +2 -0
  133. data/app/serializers/alchemy/page_tree_serializer.rb +9 -13
  134. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  135. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  136. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  137. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  138. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  139. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  140. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  141. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  142. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  143. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  144. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  145. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  146. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  147. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  148. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  149. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  150. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  151. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  152. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  153. data/app/views/alchemy/admin/layoutpages/index.html.erb +3 -3
  154. data/app/views/alchemy/admin/nodes/_form.html.erb +18 -15
  155. data/app/views/alchemy/admin/nodes/_node.html.erb +1 -5
  156. data/app/views/alchemy/admin/nodes/index.html.erb +3 -4
  157. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  158. data/app/views/alchemy/admin/pages/_form.html.erb +0 -1
  159. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  160. data/app/views/alchemy/admin/pages/_page.html.erb +11 -19
  161. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  162. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  163. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  164. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  165. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  166. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  167. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  168. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  169. data/app/views/alchemy/admin/pictures/index.html.erb +18 -3
  170. data/app/views/alchemy/admin/pictures/show.html.erb +1 -1
  171. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  172. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  173. data/app/views/alchemy/admin/resources/index.html.erb +21 -22
  174. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  175. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  176. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  177. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  178. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  179. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  180. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  181. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  182. data/app/views/alchemy/essences/_essence_file_view.html.erb +1 -1
  183. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  184. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  185. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  186. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  187. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  188. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  189. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  190. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  191. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  192. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  193. data/app/views/alchemy/pages/show.rss.builder +3 -2
  194. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  195. data/babel.config.js +12 -0
  196. data/bin/rails +5 -4
  197. data/config/alchemy/config.yml +23 -16
  198. data/config/brakeman.ignore +1 -1
  199. data/config/initializers/assets.rb +2 -1
  200. data/config/initializers/dragonfly.rb +2 -1
  201. data/config/initializers/mime_types.rb +1 -0
  202. data/config/initializers/mini_profiler.rb +3 -2
  203. data/config/initializers/simple_form.rb +6 -6
  204. data/config/locales/alchemy.en.yml +23 -8
  205. data/config/routes.rb +25 -24
  206. data/config/spring.rb +3 -2
  207. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  208. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  209. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  210. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  211. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  212. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  213. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  214. data/lib/alchemy/admin/locale.rb +3 -1
  215. data/lib/alchemy/admin/preview_url.rb +85 -0
  216. data/lib/alchemy/auth_accessors.rb +8 -7
  217. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  218. data/lib/alchemy/config.rb +3 -5
  219. data/lib/alchemy/configuration_methods.rb +3 -1
  220. data/lib/alchemy/controller_actions.rb +6 -5
  221. data/lib/alchemy/deprecation.rb +2 -1
  222. data/lib/alchemy/elements_finder.rb +5 -5
  223. data/lib/alchemy/engine.rb +23 -8
  224. data/lib/alchemy/errors.rb +0 -7
  225. data/lib/alchemy/essence.rb +17 -16
  226. data/lib/alchemy/filetypes.rb +5 -5
  227. data/lib/alchemy/forms/builder.rb +4 -4
  228. data/lib/alchemy/hints.rb +1 -1
  229. data/lib/alchemy/i18n.rb +2 -1
  230. data/lib/alchemy/install/tasks.rb +41 -0
  231. data/lib/alchemy/modules.rb +12 -12
  232. data/lib/alchemy/name_conversions.rb +5 -5
  233. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  234. data/lib/alchemy/page_layout.rb +15 -12
  235. data/lib/alchemy/paths.rb +1 -1
  236. data/lib/alchemy/permissions.rb +7 -6
  237. data/lib/alchemy/resource.rb +25 -15
  238. data/lib/alchemy/resources_helper.rb +12 -18
  239. data/lib/alchemy/routing_constraints.rb +1 -1
  240. data/lib/alchemy/seeder.rb +42 -14
  241. data/lib/alchemy/shell.rb +13 -10
  242. data/lib/alchemy/taggable.rb +1 -0
  243. data/lib/alchemy/tasks/tidy.rb +4 -3
  244. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  245. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  246. data/lib/alchemy/test_support/factories.rb +1 -1
  247. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  248. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  249. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  250. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  251. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  252. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  253. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  254. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  255. data/lib/alchemy/test_support/factories/language_factory.rb +21 -14
  256. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  257. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  258. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  259. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  260. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  261. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  262. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  263. data/lib/alchemy/tinymce.rb +15 -13
  264. data/lib/alchemy/upgrader.rb +8 -7
  265. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  266. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  267. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  268. data/lib/alchemy/version.rb +1 -1
  269. data/lib/alchemy_cms.rb +52 -50
  270. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  271. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  272. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  273. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  274. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  275. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  276. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  277. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  278. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  279. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  280. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  281. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  283. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  285. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  286. data/lib/generators/alchemy/install/install_generator.rb +169 -0
  287. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  288. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  289. data/lib/{rails/generators → generators}/alchemy/install/templates/menus.yml.tt +0 -0
  290. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  291. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +2 -2
  292. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  293. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  294. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  295. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  296. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +1 -1
  297. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +1 -1
  298. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  299. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  300. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  301. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  302. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  303. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  305. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  306. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  307. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  308. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  309. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  310. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  311. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  312. data/lib/tasks/alchemy/db.rake +3 -19
  313. data/lib/tasks/alchemy/install.rake +5 -48
  314. data/lib/tasks/alchemy/tidy.rake +9 -8
  315. data/lib/tasks/alchemy/upgrade.rake +18 -116
  316. data/package.json +45 -0
  317. data/package/admin.js +14 -0
  318. data/package/src/__tests__/i18n.spec.js +70 -0
  319. data/package/src/i18n.js +48 -0
  320. data/package/src/node_tree.js +72 -0
  321. data/package/src/translations.js +32 -0
  322. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  323. data/package/src/utils/__tests__/events.spec.js +38 -0
  324. data/package/src/utils/ajax.js +48 -0
  325. data/package/src/utils/events.js +16 -0
  326. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  327. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  328. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  329. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  330. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  331. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  332. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  333. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  334. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  335. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  336. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  337. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  338. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  339. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  340. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  341. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  342. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  343. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  344. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  345. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  346. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  347. metadata +112 -88
  348. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  349. data/app/assets/javascripts/alchemy/alchemy.node_tree.js +0 -66
  350. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  351. data/app/assets/javascripts/alchemy/alchemy.utils.js +0 -45
  352. data/app/helpers/alchemy/essences_helper.rb +0 -119
  353. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  354. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  355. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  356. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -37
  357. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  358. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  359. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  360. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  361. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  362. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  363. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  364. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  365. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  366. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  367. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  368. data/lib/alchemy/ssl_protection.rb +0 -34
  369. data/lib/alchemy/tasks/helpers.rb +0 -81
  370. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  371. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  372. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  373. data/lib/alchemy/upgrader/four_point_six.rb +0 -50
  374. data/lib/alchemy/upgrader/four_point_two.rb +0 -85
  375. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -43
  376. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -148
  377. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -28
  378. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  379. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  380. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  381. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  382. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  383. data/lib/tasks/alchemy/convert.rake +0 -97
  384. data/vendor/assets/javascripts/sortable/Sortable.min.js +0 -2
  385. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  386. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
@@ -4,12 +4,10 @@ module Alchemy
4
4
  module Admin
5
5
  module PicturesHelper
6
6
  def preview_size(size)
7
- case size
8
- when 'small' then '80x60'
9
- when 'large' then '240x180'
10
- else
11
- '160x120'
12
- end
7
+ Alchemy::Picture::THUMBNAIL_SIZES.fetch(
8
+ size,
9
+ Alchemy::Picture::THUMBNAIL_SIZES[:medium]
10
+ )
13
11
  end
14
12
  end
15
13
  end
@@ -12,17 +12,18 @@ module Alchemy
12
12
  # A HTML string containing <tt><li></tt> tags
13
13
  #
14
14
  def render_tag_list(class_name)
15
- raise ArgumentError, 'Please provide a String as class_name' if class_name.nil?
15
+ raise ArgumentError, "Please provide a String as class_name" if class_name.nil?
16
+
16
17
  sorted_tags_from(class_name: class_name).map do |tag|
17
- content_tag('li', name: tag.name, class: filtered_by_tag?(tag) ? 'active' : nil) do
18
+ content_tag("li", name: tag.name, class: filtered_by_tag?(tag) ? "active" : nil) do
18
19
  link_to(
19
20
  "#{tag.name} (#{tag.taggings_count})",
20
21
  url_for(
21
22
  search_filter_params.except(:page, :tagged_with).merge(
22
- tagged_with: tags_for_filter(current: tag).presence
23
- )
23
+ tagged_with: tags_for_filter(current: tag).presence,
24
+ ),
24
25
  ),
25
- remote: request.xhr?
26
+ remote: request.xhr?,
26
27
  )
27
28
  end
28
29
  end.join.html_safe
@@ -43,13 +44,13 @@ module Alchemy
43
44
  tags_from_params - Array(current.name)
44
45
  else
45
46
  tags_from_params.push(current.name)
46
- end.uniq.join(',')
47
+ end.uniq.join(",")
47
48
  end
48
49
 
49
50
  # Returns tags from params
50
51
  # @returns [Array]
51
52
  def tags_from_params
52
- search_filter_params[:tagged_with].to_s.split(',')
53
+ search_filter_params[:tagged_with].to_s.split(",")
53
54
  end
54
55
 
55
56
  def sorted_tags_from(class_name:)
@@ -27,16 +27,16 @@ module Alchemy
27
27
  #
28
28
  # @return [String]
29
29
  def render_icon(icon_class, options = {})
30
- options = {style: 'solid'}.merge(options)
30
+ options = {style: "solid"}.merge(options)
31
31
  classes = [
32
32
  "icon fa-fw",
33
33
  "fa-#{icon_class}",
34
34
  "fa#{options[:style].first}",
35
35
  options[:size] ? "fa-#{options[:size]}" : nil,
36
36
  options[:transform] ? "fa-#{options[:transform]}" : nil,
37
- options[:class]
37
+ options[:class],
38
38
  ].compact
39
- content_tag('i', nil, class: classes)
39
+ content_tag("i", nil, class: classes)
40
40
  end
41
41
 
42
42
  # Returns a div with an icon and the passed content
@@ -64,19 +64,24 @@ module Alchemy
64
64
  # @param [Symbol] style The style of this flash. Valid values are +:notice+ (default), +:warn+ and +:error+
65
65
  #
66
66
  def render_flash_notice(notice, style = :notice)
67
- render('alchemy/admin/partials/flash', flash_type: style, message: notice)
67
+ render("alchemy/admin/partials/flash", flash_type: style, message: notice)
68
68
  end
69
69
 
70
70
  # Checks if the given argument is a String or a Page object.
71
71
  # If a String is given, it tries to find the page via page_layout
72
72
  # Logs a warning if no page is given.
73
73
  def page_or_find(page)
74
+ unless Language.current
75
+ warning("No default language set up")
76
+ return nil
77
+ end
78
+
74
79
  if page.is_a?(String)
75
80
  page = Language.current.pages.find_by(page_layout: page)
76
81
  end
77
82
  if page.blank?
78
83
  warning("No Page found for #{page.inspect}")
79
- return
84
+ nil
80
85
  else
81
86
  page
82
87
  end
@@ -88,9 +93,9 @@ module Alchemy
88
93
  # @return [String] The FontAwesome icon name
89
94
  def message_icon_class(message_type)
90
95
  case message_type.to_s
91
- when 'warning', 'warn', 'alert' then 'exclamation'
92
- when 'notice' then 'check'
93
- when 'error' then 'bug'
96
+ when "warning", "warn", "alert" then "exclamation"
97
+ when "notice" then "check"
98
+ when "error" then "bug"
94
99
  else
95
100
  message_type
96
101
  end
@@ -33,7 +33,7 @@ module Alchemy
33
33
  helpers.render(content, {
34
34
  content: content,
35
35
  options: options,
36
- html_options: html_options
36
+ html_options: html_options,
37
37
  })
38
38
  end
39
39
 
@@ -62,15 +62,6 @@ module Alchemy
62
62
  end
63
63
  end
64
64
 
65
- # Block-level helper class for element editors.
66
- # @deprecated
67
- class ElementEditorHelper < BlockHelper
68
- def edit(name, *args)
69
- helpers.render_essence_editor_by_name(element, name.to_s, *args)
70
- end
71
- deprecate :edit, deprecator: Alchemy::Deprecation
72
- end
73
-
74
65
  # Block-level helper for element views. Constructs a DOM element wrapping
75
66
  # your content element and provides a block helper object you can use for
76
67
  # concise access to Alchemy's various helpers.
@@ -116,7 +107,7 @@ module Alchemy
116
107
  tag: :div,
117
108
  id: element_dom_id(element),
118
109
  class: element.name,
119
- tags_formatter: ->(tags) { tags.join(" ") }
110
+ tags_formatter: ->(tags) { tags.join(" ") },
120
111
  }.merge(options)
121
112
 
122
113
  # capture inner template block
@@ -140,25 +131,5 @@ module Alchemy
140
131
  # that's it!
141
132
  output
142
133
  end
143
-
144
- # Block-level helper for element editors. Provides a block helper object
145
- # you can use for concise access to Alchemy's various helpers.
146
- #
147
- # === Example:
148
- #
149
- # <%= element_editor_for(element) do |el| %>
150
- # <%= el.edit :title %>
151
- # <%= el.edit :body %>
152
- # <%= el.edit :target_url %>
153
- # <% end %>
154
- #
155
- # @param [Alchemy::Element] element
156
- # The element to display.
157
- #
158
- def element_editor_for(element)
159
- capture do
160
- yield ElementEditorHelper.new(self, element: element) if block_given?
161
- end
162
- end
163
134
  end
164
135
  end
@@ -6,7 +6,6 @@ module Alchemy
6
6
  # The most important helper for frontend developers is the {#render_elements} helper.
7
7
  #
8
8
  module ElementsHelper
9
- include Alchemy::EssencesHelper
10
9
  include Alchemy::UrlHelper
11
10
  include Alchemy::ElementsBlockHelper
12
11
 
@@ -92,19 +91,9 @@ module Alchemy
92
91
  def render_elements(options = {})
93
92
  options = {
94
93
  from_page: @page,
95
- render_format: 'html'
94
+ render_format: "html",
96
95
  }.update(options)
97
96
 
98
- if options[:sort_by]
99
- Alchemy::Deprecation.warn "options[:sort_by] has been removed without replacement. " \
100
- "Please implement your own element sorting by passing a custom finder instance to options[:finder]."
101
- end
102
-
103
- if options[:from_cell]
104
- Alchemy::Deprecation.warn "options[:from_cell] has been removed without replacement. " \
105
- "Please `render element.nested_elements` instead."
106
- end
107
-
108
97
  finder = options[:finder] || Alchemy::ElementsFinder.new(options)
109
98
  elements = finder.elements(page: options[:from_page])
110
99
 
@@ -159,21 +148,10 @@ module Alchemy
159
148
  # @note If the view partial is not found
160
149
  # <tt>alchemy/elements/_view_not_found.html.erb</tt> gets rendered.
161
150
  #
162
- def render_element(*args)
163
- if args.length == 4
164
- element, _part, options, counter = *args
165
- Alchemy::Deprecation.warn "passing a `part` parameter as second argument to `render_element` has been removed without replacement. " \
166
- "You can safely remove it."
167
- else
168
- element, options, counter = *args
169
- end
170
-
171
- options ||= {}
172
- counter ||= 1
173
-
151
+ def render_element(element, options = {}, counter = 1)
174
152
  if element.nil?
175
- warning('Element is nil')
176
- render "alchemy/elements/view_not_found", {name: 'nil'}
153
+ warning("Element is nil")
154
+ render "alchemy/elements/view_not_found", {name: "nil"}
177
155
  return
178
156
  end
179
157
 
@@ -182,7 +160,7 @@ module Alchemy
182
160
  render element, {
183
161
  element: element,
184
162
  counter: counter,
185
- options: options
163
+ options: options,
186
164
  }.merge(options.delete(:locals) || {})
187
165
  rescue ActionView::MissingTemplate => e
188
166
  warning(%(
@@ -195,23 +173,20 @@ module Alchemy
195
173
  # Returns a string for the id attribute of a html element for the given element
196
174
  def element_dom_id(element)
197
175
  return "" if element.nil?
176
+
198
177
  "#{element.name}_#{element.id}".html_safe
199
178
  end
200
179
 
201
180
  # Renders the HTML tag attributes required for preview mode.
202
181
  def element_preview_code(element)
203
- if respond_to?(:tag_options)
204
- tag_options(element_preview_code_attributes(element))
205
- else
206
- # Rails 5.1 uses TagBuilder
207
- tag_builder.tag_options(element_preview_code_attributes(element))
208
- end
182
+ tag_builder.tag_options(element_preview_code_attributes(element))
209
183
  end
210
184
 
211
185
  # Returns a hash containing the HTML tag attributes required for preview mode.
212
186
  def element_preview_code_attributes(element)
213
187
  return {} unless element.present? && @preview_mode && element.page == @page
214
- { 'data-alchemy-element' => element.id }
188
+
189
+ { "data-alchemy-element" => element.id }
215
190
  end
216
191
 
217
192
  # Returns the element's tags information as a string. Parameters and options
@@ -223,12 +198,7 @@ module Alchemy
223
198
  # HTML tag attributes containing the element's tag information.
224
199
  #
225
200
  def element_tags(element, options = {})
226
- if respond_to?(:tag_options)
227
- tag_options(element_tags_attributes(element, options))
228
- else
229
- # Rails 5.1 uses TagBuilder
230
- tag_builder.tag_options(element_tags_attributes(element, options))
231
- end
201
+ tag_builder.tag_options(element_tags_attributes(element, options))
232
202
  end
233
203
 
234
204
  # Returns the element's tags information as an attribute hash.
@@ -244,28 +214,12 @@ module Alchemy
244
214
  #
245
215
  def element_tags_attributes(element, options = {})
246
216
  options = {
247
- formatter: lambda { |tags| tags.join(' ') }
217
+ formatter: lambda { |tags| tags.join(" ") },
248
218
  }.merge(options)
249
219
 
250
220
  return {} if !element.taggable? || element.tag_list.blank?
251
- { 'data-element-tags' => options[:formatter].call(element.tag_list) }
252
- end
253
-
254
- # Sort given elements by content.
255
- # @deprecated
256
- # @param [Array] elements - The elements you want to sort
257
- # @param [String] content_name - The name of the content you want to sort by
258
- # @param [Boolean] reverse - Reverse the sorted elements order
259
- #
260
- # @return [Array]
261
- def sort_elements_by_content(elements, content_name, reverse = false)
262
- Alchemy::Deprecation.warn "options[:sort_by] is deprecated. Please implement your own element sorting."
263
- sorted_elements = elements.sort_by do |element|
264
- content = element.content_by_name(content_name)
265
- content ? content.ingredient.to_s : ''
266
- end
267
221
 
268
- reverse ? sorted_elements.reverse : sorted_elements
222
+ { "data-element-tags" => options[:formatter].call(element.tag_list) }
269
223
  end
270
224
  end
271
225
  end
@@ -25,18 +25,19 @@ module Alchemy
25
25
  #
26
26
  def language_links(options = {})
27
27
  options = {
28
- linkname: 'name',
28
+ linkname: "name",
29
29
  show_title: true,
30
- spacer: '',
31
- reverse: false
30
+ spacer: "",
31
+ reverse: false,
32
32
  }.merge(options)
33
- languages = Language.on_current_site.published.with_root_page.order("name #{options[:reverse] ? 'DESC' : 'ASC'}")
33
+ languages = Language.on_current_site.published.with_root_page.order("name #{options[:reverse] ? "DESC" : "ASC"}")
34
34
  return nil if languages.count < 2
35
+
35
36
  render(
36
37
  partial: "alchemy/language_links/language",
37
38
  collection: languages,
38
39
  spacer_template: "alchemy/language_links/spacer",
39
- locals: {languages: languages, options: options}
40
+ locals: { languages: languages, options: options },
40
41
  )
41
42
  end
42
43
 
@@ -50,7 +51,7 @@ module Alchemy
50
51
  render @page, page: @page
51
52
  rescue ActionView::MissingTemplate
52
53
  warning("PageLayout: '#{@page.page_layout}' not found. Rendering standard page_layout.")
53
- render 'alchemy/page_layouts/standard', page: @page
54
+ render "alchemy/page_layouts/standard", page: @page
54
55
  end
55
56
 
56
57
  # Renders a partial for current site
@@ -72,182 +73,37 @@ module Alchemy
72
73
  ""
73
74
  end
74
75
 
75
- # Renders the navigation.
76
- # @deprecated
77
- #
78
- # It produces a html <ul><li></li></ul> structure with all necessary classes so you can produce every navigation the web uses today.
79
- # I.E. dropdown-navigations, simple mainnavigations or even complex nested ones.
80
- #
81
- # === HTML output:
82
- #
83
- # <ul class="navigation level_1">
84
- # <li class="first home"><a href="/home" class="active" title="Homepage" lang="en" data-page-id="1">Homepage</a></li>
85
- # <li class="contact"><a href="/contact" title="Contact" lang="en" data-page-id="2">Contact</a></li>
86
- # <li class="last imprint"><a href="/imprint" title="Imprint" lang="en" data-page-id="3">Imprint</a></li>
87
- # </ul>
88
- #
89
- # As you can see: Everything you need.
90
- #
91
- # Not pleased with the way Alchemy produces the navigation structure?
92
- #
93
- # Then feel free to overwrite the partials (_renderer.html.erb and _link.html.erb) found in +views/navigation/+ or pass different partials via the options +:navigation_partial+ and +:navigation_link_partial+.
94
- #
95
- # === Passing HTML classes and ids to the renderer
96
- #
97
- # A second hash can be passed as html_options to the navigation renderer partial.
98
- #
99
- # ==== Example:
100
- #
101
- # <%= render_navigation({from_page: 'subnavi'}, {class: 'navigation', id: 'subnavigation'}) %>
102
- #
103
- #
104
- # @option options submenu [Boolean] (false)
105
- # Do you want a nested <ul> <li> structure for the deeper levels of your navigation, or not?
106
- # Used to display the subnavigation within the mainnaviagtion. I.e. for dropdown menues.
107
- #
108
- # @option options all_sub_menues [Boolean] (false)
109
- # Renders the whole page tree.
110
- #
111
- # @option options from_page [Alchemy::Page] (@root_page)
112
- # Do you want to render a navigation from a different page then the current page?
113
- # Then pass an Page instance or a Alchemy::PageLayout name as string.
114
- #
115
- # @option options spacer [String] (nil)
116
- # A spacer for the entries can be passed.
117
- # Simple string, or even a complex html structure.
118
- # I.e: "<span class='spacer'>|</spacer>".
119
- #
120
- # @option options navigation_partial [String] ("navigation/renderer")
121
- # Pass a different partial to be taken for the navigation rendering.
122
- # Alternatively you could override the +app/views/alchemy/navigation/renderer+ partial in your app.
123
- #
124
- # @option options navigation_link_partial [String] ("navigation/link")
125
- # Alchemy places an <a> html link in <li> tags.
126
- # The tag automatically has an active css class if necessary.
127
- # So styling is everything. But maybe you don't want this.
128
- # So feel free to make you own partial and pass the filename here.
129
- # Alternatively you could override the +app/views/alchemy/navigation/link+ partial in your app.
130
- #
131
- # @option options show_nonactive [Boolean] (false)
132
- # Commonly Alchemy only displays the submenu of the active page (if submenu: true).
133
- # If you want to display all child pages then pass true (together with submenu: true of course).
134
- # I.e. for css-driven drop down menues.
135
- #
136
- # @option options show_title [Boolean] (true)
137
- # For our beloved SEOs :)
138
- # Appends a title attribute to all links and places the +page.title+ content into it.
139
- #
140
- # @option options restricted_only [Boolean] (false)
141
- # Render only restricted pages. I.E for members only navigations.
142
- #
143
- # @option options reverse [Boolean] (false)
144
- # Reverse the output of the pages
145
- #
146
- # @option options reverse_children [Boolean] (false)
147
- # Like reverse option, but only reverse the children of the first level
148
- #
149
- # @option options deepness [Fixnum] (nil)
150
- # Show only pages up to this depth.
151
- #
152
- def render_navigation(options = {}, html_options = {})
153
- options = {
154
- submenu: false,
155
- all_sub_menues: false,
156
- from_page: @root_page || Language.current_root_page,
157
- spacer: nil,
158
- navigation_partial: 'alchemy/navigation/renderer',
159
- navigation_link_partial: 'alchemy/navigation/link',
160
- show_nonactive: false,
161
- restricted_only: false,
162
- show_title: true,
163
- reverse: false,
164
- reverse_children: false
165
- }.merge(options)
166
- page = page_or_find(options[:from_page])
167
- return nil if page.blank?
168
- pages = page.children.accessible_by(current_ability, :see)
169
- pages = pages.restricted if options.delete(:restricted_only)
170
- if depth = options[:deepness]
171
- pages = pages.where('depth <= ?', depth)
172
- end
173
- if options[:reverse]
174
- pages.reverse!
175
- end
176
- render options[:navigation_partial],
177
- options: options,
178
- pages: pages,
179
- html_options: html_options
180
- end
181
- deprecate render_navigation: 'Create a menu and use render_menu instead', deprecator: Alchemy::Deprecation
182
-
183
76
  # Renders a menu partial
184
77
  #
185
78
  # Menu partials are placed in the `app/views/alchemy/menus` folder
186
79
  # Use the `rails g alchemy:menus` generator to create the partials
187
80
  #
188
- # @param [String] - Name of the menu
81
+ # @param [String] - Type of the menu
189
82
  # @param [Hash] - A set of options available in your menu partials
190
- def render_menu(name, options = {})
191
- root_node = Alchemy::Node.roots.find_by(name: name, site: Alchemy::Site.current)
83
+ def render_menu(menu_type, options = {})
84
+ root_node = Alchemy::Node.roots.find_by(
85
+ menu_type: menu_type,
86
+ language: Alchemy::Language.current,
87
+ )
192
88
  if root_node.nil?
193
- warning("Menu with name #{name} not found!")
89
+ warning("Menu with type #{menu_type} not found!")
194
90
  return
195
91
  end
196
92
 
197
- options = {
198
- node_partial_name: "#{root_node.view_folder_name}/node"
199
- }.merge(options)
200
-
201
- render(root_node.to_partial_path, menu: root_node, node: root_node, options: options)
93
+ render("alchemy/menus/#{menu_type}/wrapper", menu: root_node, options: options)
202
94
  rescue ActionView::MissingTemplate => e
203
95
  warning <<~WARN
204
- Menu partial not found for #{name}.
96
+ Menu partial not found for #{menu_type}.
205
97
  #{e}
206
98
  WARN
207
99
  end
208
100
 
209
- # Renders navigation the children and all siblings of the given page (standard is the current page).
210
- #
211
- # Use this helper if you want to render the subnavigation independent from the mainnavigation. I.E. to place it in a different area on your website.
212
- #
213
- # This helper passes all its options to the the render_navigation helper.
214
- #
215
- # === Options:
216
- #
217
- # from_page: @page # The page to render the navigation from
218
- # submenu: true # Shows the nested children
219
- # level: 2 # Normally there is no need to change the level parameter, just in a few special cases
220
- #
221
- def render_subnavigation(options = {}, html_options = {})
222
- default_options = {
223
- from_page: @page,
224
- submenu: true,
225
- level: 2
226
- }
227
- options = default_options.merge(options)
228
- if !options[:from_page].nil?
229
- while options[:from_page].level > options[:level]
230
- options[:from_page] = options[:from_page].parent
231
- end
232
- render_navigation(options, html_options)
233
- else
234
- return nil
235
- end
236
- end
237
- deprecate :render_subnavigation, deprecator: Alchemy::Deprecation
238
-
239
101
  # Returns true if page is in the active branch
240
102
  def page_active?(page)
241
103
  @_page_ancestors ||= Page.ancestors_for(@page)
242
104
  @_page_ancestors.include?(page)
243
105
  end
244
106
 
245
- # Returns +'active'+ if the given external page is in the current url path or +nil+.
246
- def external_page_css_class(page)
247
- return nil if !page.definition['redirects_to_external']
248
- request.path.split('/').delete_if(&:blank?).first == page.urlname.gsub(/^\//, '') ? 'active' : nil
249
- end
250
-
251
107
  # Returns page links in a breadcrumb beginning from root to current page.
252
108
  #
253
109
  # === Options:
@@ -264,11 +120,11 @@ module Alchemy
264
120
  page: @page,
265
121
  restricted_only: false,
266
122
  reverse: false,
267
- link_active_page: false
123
+ link_active_page: false,
268
124
  }.merge(options)
269
125
 
270
- pages = Page.
271
- ancestors_for(options[:page]).
126
+ pages = options[:page].
127
+ self_and_ancestors.contentpages.
272
128
  accessible_by(current_ability, :see)
273
129
 
274
130
  if options.delete(:restricted_only)
@@ -276,7 +132,7 @@ module Alchemy
276
132
  end
277
133
 
278
134
  if options.delete(:reverse)
279
- pages = pages.reorder('lft DESC')
135
+ pages = pages.reorder("lft DESC")
280
136
  end
281
137
 
282
138
  if options[:without].present?
@@ -284,7 +140,7 @@ module Alchemy
284
140
  pages = pages.where.not(id: without.try(:collect, &:id) || without.id)
285
141
  end
286
142
 
287
- render 'alchemy/breadcrumb/wrapper', pages: pages, options: options
143
+ render "alchemy/breadcrumb/wrapper", pages: pages, options: options
288
144
  end
289
145
 
290
146
  # Returns current page title
@@ -296,10 +152,11 @@ module Alchemy
296
152
  #
297
153
  def page_title(options = {})
298
154
  return "" if @page.title.blank?
155
+
299
156
  options = {
300
157
  prefix: "",
301
158
  suffix: "",
302
- separator: ""
159
+ separator: "",
303
160
  }.update(options)
304
161
  title_parts = [options[:prefix]]
305
162
  if response.status == 200
@@ -320,14 +177,7 @@ module Alchemy
320
177
  end
321
178
 
322
179
  def meta_robots
323
- "#{@page.robot_index? ? '' : 'no'}index, #{@page.robot_follow? ? '' : 'no'}follow"
324
- end
325
-
326
- # @deprecated
327
- def render_cell(name, _options = {})
328
- render_elements(only: name, fixed: true)
180
+ "#{@page.robot_index? ? "" : "no"}index, #{@page.robot_follow? ? "" : "no"}follow"
329
181
  end
330
- deprecate render_cell: 'Use render_elements(only: <cell-name>, fixed: true) instead',
331
- deprecator: Alchemy::Deprecation
332
182
  end
333
183
  end