alchemy_cms 4.6.7 → 5.0.0.beta1

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 (384) 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 +31 -10
  8. data/CHANGELOG.md +89 -32
  9. data/Gemfile +24 -22
  10. data/README.md +31 -19
  11. data/Rakefile +10 -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/node-select.scss +43 -0
  25. data/app/assets/stylesheets/alchemy/nodes.scss +1 -1
  26. data/app/assets/stylesheets/alchemy/sitemap.scss +5 -1
  27. data/app/assets/stylesheets/alchemy/tables.scss +1 -24
  28. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +3 -3
  29. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +7 -7
  30. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
  31. data/app/controllers/alchemy/admin/base_controller.rb +16 -42
  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 +50 -62
  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 +36 -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 +3 -3
  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 +2 -1
  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 +21 -19
  81. data/app/models/alchemy/base_record.rb +2 -5
  82. data/app/models/alchemy/content/factory.rb +24 -31
  83. data/app/models/alchemy/content.rb +33 -38
  84. data/app/models/alchemy/element/definitions.rb +4 -4
  85. data/app/models/alchemy/element/element_contents.rb +9 -6
  86. data/app/models/alchemy/element/element_essences.rb +4 -3
  87. data/app/models/alchemy/element/presenters.rb +3 -2
  88. data/app/models/alchemy/element.rb +46 -54
  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 +4 -4
  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 +17 -16
  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/code.rb +4 -4
  104. data/app/models/alchemy/language.rb +21 -35
  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 +28 -5
  108. data/app/models/alchemy/page/fixed_attributes.rb +3 -2
  109. data/app/models/alchemy/page/page_elements.rb +35 -44
  110. data/app/models/alchemy/page/page_naming.rb +20 -70
  111. data/app/models/alchemy/page/page_natures.rb +7 -34
  112. data/app/models/alchemy/page/page_scopes.rb +23 -29
  113. data/app/models/alchemy/page/url_path.rb +0 -2
  114. data/app/models/alchemy/page.rb +47 -128
  115. data/app/models/alchemy/picture/transformations.rb +9 -7
  116. data/app/models/alchemy/picture/url.rb +5 -5
  117. data/app/models/alchemy/picture.rb +19 -28
  118. data/app/models/alchemy/site/layout.rb +2 -2
  119. data/app/models/alchemy/site.rb +6 -36
  120. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  121. data/app/serializers/alchemy/content_serializer.rb +0 -3
  122. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  123. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  124. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  125. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  126. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  127. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  128. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  129. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  130. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  131. data/app/serializers/alchemy/node_serializer.rb +2 -0
  132. data/app/serializers/alchemy/page_tree_serializer.rb +9 -13
  133. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  134. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  135. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  136. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  137. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  138. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  139. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  140. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  141. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  142. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  143. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  144. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  145. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  146. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  147. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  148. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  149. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  150. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  151. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  152. data/app/views/alchemy/admin/layoutpages/index.html.erb +3 -3
  153. data/app/views/alchemy/admin/nodes/_form.html.erb +18 -15
  154. data/app/views/alchemy/admin/nodes/_node.html.erb +1 -5
  155. data/app/views/alchemy/admin/nodes/index.html.erb +3 -4
  156. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  157. data/app/views/alchemy/admin/pages/_form.html.erb +0 -1
  158. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  159. data/app/views/alchemy/admin/pages/_page.html.erb +11 -19
  160. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  161. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  162. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  163. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  164. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  165. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  166. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  167. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  168. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  169. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  170. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  171. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  172. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  173. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  174. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  175. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  176. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  177. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  178. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  179. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  180. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  181. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  182. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  183. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  184. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  185. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  186. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  187. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  188. data/app/views/alchemy/pages/show.rss.builder +3 -2
  189. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  190. data/babel.config.js +12 -0
  191. data/bin/rails +5 -4
  192. data/config/alchemy/config.yml +15 -18
  193. data/config/brakeman.ignore +1 -1
  194. data/config/initializers/assets.rb +2 -1
  195. data/config/initializers/dragonfly.rb +2 -1
  196. data/config/initializers/mime_types.rb +1 -0
  197. data/config/initializers/mini_profiler.rb +3 -2
  198. data/config/initializers/simple_form.rb +6 -6
  199. data/config/locales/alchemy.en.yml +23 -8
  200. data/config/routes.rb +25 -24
  201. data/config/spring.rb +3 -2
  202. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  203. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  204. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  205. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  206. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  207. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  208. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  209. data/lib/alchemy/admin/locale.rb +3 -1
  210. data/lib/alchemy/admin/preview_url.rb +64 -0
  211. data/lib/alchemy/auth_accessors.rb +8 -7
  212. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  213. data/lib/alchemy/config.rb +1 -5
  214. data/lib/alchemy/configuration_methods.rb +3 -1
  215. data/lib/alchemy/controller_actions.rb +6 -5
  216. data/lib/alchemy/deprecation.rb +2 -1
  217. data/lib/alchemy/elements_finder.rb +5 -5
  218. data/lib/alchemy/engine.rb +22 -14
  219. data/lib/alchemy/errors.rb +0 -7
  220. data/lib/alchemy/essence.rb +17 -16
  221. data/lib/alchemy/filetypes.rb +5 -5
  222. data/lib/alchemy/forms/builder.rb +4 -4
  223. data/lib/alchemy/hints.rb +1 -1
  224. data/lib/alchemy/i18n.rb +2 -1
  225. data/lib/alchemy/modules.rb +12 -12
  226. data/lib/alchemy/name_conversions.rb +5 -5
  227. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  228. data/lib/alchemy/page_layout.rb +15 -12
  229. data/lib/alchemy/paths.rb +1 -1
  230. data/lib/alchemy/permissions.rb +7 -6
  231. data/lib/alchemy/resource.rb +25 -17
  232. data/lib/alchemy/resources_helper.rb +12 -18
  233. data/lib/alchemy/routing_constraints.rb +1 -1
  234. data/lib/alchemy/seeder.rb +42 -14
  235. data/lib/alchemy/shell.rb +13 -10
  236. data/lib/alchemy/taggable.rb +1 -0
  237. data/lib/alchemy/tasks/tidy.rb +4 -3
  238. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  239. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  240. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  241. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  242. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  243. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  244. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  245. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  246. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  247. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  248. data/lib/alchemy/test_support/factories/language_factory.rb +16 -14
  249. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  250. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  251. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  252. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  253. data/lib/alchemy/test_support/factories.rb +1 -1
  254. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  255. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  256. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  257. data/lib/alchemy/tinymce.rb +15 -13
  258. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  259. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  260. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  261. data/lib/alchemy/upgrader.rb +8 -7
  262. data/lib/alchemy/userstamp.rb +1 -1
  263. data/lib/alchemy/version.rb +1 -1
  264. data/lib/alchemy_cms.rb +52 -51
  265. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  266. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  267. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  268. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  269. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  270. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  271. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  272. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  273. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  274. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  275. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  276. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  277. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  278. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  279. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  280. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  281. data/lib/generators/alchemy/install/install_generator.rb +110 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  283. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/templates/menus.yml.tt +0 -0
  285. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  286. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +2 -2
  287. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  288. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  289. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  290. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  291. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +1 -1
  292. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +1 -1
  293. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  294. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  295. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  296. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  297. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  298. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  299. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  300. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  301. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  302. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  303. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  305. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  306. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  307. data/lib/tasks/alchemy/db.rake +3 -19
  308. data/lib/tasks/alchemy/install.rake +3 -2
  309. data/lib/tasks/alchemy/tidy.rake +9 -8
  310. data/lib/tasks/alchemy/upgrade.rake +18 -120
  311. data/package/admin.js +14 -0
  312. data/package/src/__tests__/i18n.spec.js +70 -0
  313. data/package/src/i18n.js +48 -0
  314. data/package/src/node_tree.js +72 -0
  315. data/package/src/translations.js +32 -0
  316. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  317. data/package/src/utils/__tests__/events.spec.js +38 -0
  318. data/package/src/utils/ajax.js +48 -0
  319. data/package/src/utils/events.js +16 -0
  320. data/package.json +45 -0
  321. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  322. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  323. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  324. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  325. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  326. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  327. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  328. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  329. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  330. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  331. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  332. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  333. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  334. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  335. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  336. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  337. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  338. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  339. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  340. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  341. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  342. metadata +117 -98
  343. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  344. data/app/assets/javascripts/alchemy/alchemy.node_tree.js +0 -66
  345. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  346. data/app/assets/javascripts/alchemy/alchemy.utils.js +0 -45
  347. data/app/helpers/alchemy/essences_helper.rb +0 -119
  348. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  349. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  350. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  351. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -37
  352. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  353. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  354. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  355. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  356. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  357. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  358. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  359. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  360. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  361. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  362. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  363. data/lib/alchemy/error_tracking/airbrake_handler.rb +0 -13
  364. data/lib/alchemy/error_tracking.rb +0 -14
  365. data/lib/alchemy/ssl_protection.rb +0 -34
  366. data/lib/alchemy/tasks/helpers.rb +0 -81
  367. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  368. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  369. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  370. data/lib/alchemy/upgrader/four_point_six.rb +0 -50
  371. data/lib/alchemy/upgrader/four_point_two.rb +0 -86
  372. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -45
  373. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -166
  374. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -32
  375. data/lib/alchemy/upgrader/tasks/fixed_element_name_finder.rb +0 -31
  376. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  377. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  378. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  379. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  380. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  381. data/lib/tasks/alchemy/convert.rake +0 -98
  382. data/vendor/assets/javascripts/sortable/Sortable.min.js +0 -2
  383. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  384. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
@@ -3,138 +3,29 @@
3
3
  module Alchemy
4
4
  module Admin
5
5
  module EssencesHelper
6
- include Alchemy::EssencesHelper
7
- include Alchemy::Admin::ContentsHelper
8
-
9
- # Renders the Content editor partial from the given Content.
10
- # For options see -> render_essence
11
- # @deprecated
12
- def render_essence_editor(content, options = {}, html_options = {})
13
- if !options.empty?
14
- Alchemy::Deprecation.warn <<~WARN
15
- Passing options to `render_essence_editor` is deprecated and will be removed from Alchemy 5.0.
16
- Add your static `#{options.keys}` options to the `#{content.name}` content definitions `settings` of `#{content.element&.name}` element.
17
- For dynamic options consider adding your own essence class.
18
- WARN
19
- end
20
- if !html_options.empty?
21
- Alchemy::Deprecation.warn <<~WARN
22
- Passing html_options to `render_essence_editor` is deprecated and will be removed in Alchemy 5.0 without replacement.
23
- WARN
24
- end
25
- render_essence(content, :editor, {for_editor: options}, html_options)
26
- end
27
- deprecate :render_essence_editor, deprecator: Alchemy::Deprecation
28
-
29
- # Renders the Content editor partial found in views/contents/ for the content with name inside the passed Element.
30
- # For options see -> render_essence
31
- #
32
- # Content creation on the fly:
33
- #
34
- # If you update the elements.yml file after creating an element this helper displays a error message with an option to create the content.
35
- # @deprecated
36
- def render_essence_editor_by_name(element, name, options = {}, html_options = {})
37
- if element.blank?
38
- return warning('Element is nil', Alchemy.t(:no_element_given))
39
- end
40
- content = element.content_by_name(name)
41
- if content.nil?
42
- render_missing_content(element, name, options)
43
- else
44
- render_essence_editor(content, options, html_options)
45
- end
46
- end
47
- deprecate :render_essence_editor_by_name, deprecator: Alchemy::Deprecation
48
-
49
- # Returns all public pages from current language as an option tags string suitable or the Rails +select_tag+ helper.
50
- #
51
- # @param [Array]
52
- # A collection of pages so it only returns these pages and does not query the database.
53
- # @param [String]
54
- # Pass a +Page#name+ or +Page#id+ as selected item to the +options_for_select+ helper.
55
- # @param [String]
56
- # Used as prompt message in the select tag
57
- # @param [Symbol]
58
- # Method that is called on the page object to get the value that is passed with the params of the form.
59
- # @deprecated
60
- def pages_for_select(pages = nil, selected = nil, prompt = "Choose page", page_attribute = :id)
61
- values = [[Alchemy.t(prompt), ""]]
62
- pages ||= begin
63
- nested = true
64
- Language.current.pages.published.order(:lft)
65
- end
66
- values += pages_attributes_for_select(pages, page_attribute, nested)
67
- options_for_select(values, selected.to_s)
68
- end
69
- deprecate :pages_for_select, deprecator: Alchemy::Deprecation
70
-
71
- # Renders the missing content partial
72
- # @deprecated
73
- def render_missing_content(element, name, options)
74
- render 'alchemy/admin/contents/missing', {element: element, name: name, options: options}
75
- end
76
- deprecate :render_missing_content, deprecator: Alchemy::Deprecation
77
-
78
6
  # Renders a thumbnail for given EssencePicture content with correct cropping and size
79
- def essence_picture_thumbnail(content, options = {})
7
+ def essence_picture_thumbnail(content)
80
8
  picture = content.ingredient
81
9
  essence = content.essence
82
10
 
83
11
  return if picture.nil?
84
12
 
85
13
  image_tag(
86
- essence.thumbnail_url(options),
14
+ essence.thumbnail_url,
87
15
  alt: picture.name,
88
- class: 'img_paddingtop',
89
- title: Alchemy.t(:image_name) + ": #{picture.name}"
16
+ class: "img_paddingtop",
17
+ title: Alchemy.t(:image_name) + ": #{picture.name}",
90
18
  )
91
19
  end
92
20
 
93
21
  # Size value for edit picture dialog
94
- def edit_picture_dialog_size(content, options = {})
95
- if content.settings_value(:caption_as_textarea, options)
96
- content.settings_value(:sizes, options) ? '380x320' : '380x300'
97
- else
98
- content.settings_value(:sizes, options) ? '380x290' : '380x255'
99
- end
100
- end
101
-
102
- private
103
-
104
- # Returns an Array with page attributes for select options
105
- #
106
- # @param [Array]
107
- # The pages
108
- # @param [String || Symbol]
109
- # The attribute that is used as value
110
- # @param [Boolean] (false)
111
- # Should the name be indented or not
112
- #
113
- def pages_attributes_for_select(pages, page_attribute, indent = false)
114
- pages.map do |page|
115
- [
116
- page_name_attribute_for_select(page, indent),
117
- page.send(page_attribute).to_s
118
- ]
119
- end
120
- end
121
- deprecate :pages_attributes_for_select, deprecator: Alchemy::Deprecation
122
-
123
- # Returns the page name for pages_for_select helper
124
- #
125
- # @param [Alchemy::Page]
126
- # The page
127
- # @param [Boolean] (false)
128
- # Should the page be indented or not
129
- #
130
- def page_name_attribute_for_select(page, indent = false)
131
- if indent
132
- ("&nbsp;&nbsp;" * (page.depth - 1) + page.name).html_safe
22
+ def edit_picture_dialog_size(content)
23
+ if content.settings[:caption_as_textarea]
24
+ content.settings[:sizes] ? "380x320" : "380x300"
133
25
  else
134
- page.name
26
+ content.settings[:sizes] ? "380x290" : "380x255"
135
27
  end
136
28
  end
137
- deprecate :page_name_attribute_for_select, deprecator: Alchemy::Deprecation
138
29
  end
139
30
  end
140
31
  end
@@ -19,7 +19,7 @@ module Alchemy
19
19
  options[:remote] = request.xhr?
20
20
  options[:html] = {
21
21
  id: options.delete(:id),
22
- class: ["alchemy", options.delete(:class)].compact.join(' ')
22
+ class: ["alchemy", options.delete(:class)].compact.join(" "),
23
23
  }
24
24
  simple_form_for(object, *(args << options), &block)
25
25
  end
@@ -12,9 +12,9 @@ module Alchemy
12
12
  #
13
13
  def alchemy_main_navigation_entry(alchemy_module)
14
14
  render(
15
- 'alchemy/admin/partials/main_navigation_entry',
15
+ "alchemy/admin/partials/main_navigation_entry",
16
16
  alchemy_module: alchemy_module,
17
- navigation: alchemy_module['navigation']
17
+ navigation: alchemy_module["navigation"],
18
18
  )
19
19
  end
20
20
 
@@ -36,8 +36,8 @@ module Alchemy
36
36
  #
37
37
  def navigate_module(navigation)
38
38
  [
39
- navigation['action'].to_sym,
40
- navigation['controller'].to_s.gsub(/\A\//, '').gsub(/\//, '_').to_sym
39
+ navigation["action"].to_sym,
40
+ navigation["controller"].to_s.gsub(/\A\//, "").gsub(/\//, "_").to_sym,
41
41
  ]
42
42
  end
43
43
 
@@ -45,9 +45,9 @@ module Alchemy
45
45
  #
46
46
  def main_navigation_css_classes(navigation)
47
47
  [
48
- 'main_navi_entry',
49
- admin_mainnavi_active?(navigation) ? 'active' : nil,
50
- navigation.key?('sub_navigation') ? 'has_sub_navigation' : nil
48
+ "main_navi_entry",
49
+ admin_mainnavi_active?(navigation) ? "active" : nil,
50
+ navigation.key?("sub_navigation") ? "has_sub_navigation" : nil,
51
51
  ].compact
52
52
  end
53
53
 
@@ -74,8 +74,8 @@ module Alchemy
74
74
  #
75
75
  def url_for_module(alchemy_module)
76
76
  route_from_engine_or_main_app(
77
- alchemy_module['engine_name'],
78
- url_options_for_module(alchemy_module)
77
+ alchemy_module["engine_name"],
78
+ url_options_for_module(alchemy_module),
79
79
  )
80
80
  end
81
81
 
@@ -91,9 +91,10 @@ module Alchemy
91
91
  def url_for_module_sub_navigation(navigation)
92
92
  alchemy_module = module_definition_for(navigation)
93
93
  return if alchemy_module.nil?
94
+
94
95
  route_from_engine_or_main_app(
95
- alchemy_module['engine_name'],
96
- url_options_for_navigation_entry(navigation)
96
+ alchemy_module["engine_name"],
97
+ url_options_for_navigation_entry(navigation),
97
98
  )
98
99
  end
99
100
 
@@ -105,13 +106,13 @@ module Alchemy
105
106
  sorted = []
106
107
  not_sorted = []
107
108
  alchemy_modules.map do |m|
108
- if m['position'].blank?
109
+ if m["position"].blank?
109
110
  not_sorted << m
110
111
  else
111
112
  sorted << m
112
113
  end
113
114
  end
114
- sorted.sort_by { |m| m['position'] } + not_sorted
115
+ sorted.sort_by { |m| m["position"] } + not_sorted
115
116
  end
116
117
 
117
118
  private
@@ -137,7 +138,7 @@ module Alchemy
137
138
  # A Alchemy module definition
138
139
  #
139
140
  def url_options_for_module(alchemy_module)
140
- url_options_for_navigation_entry(alchemy_module['navigation'] || {})
141
+ url_options_for_navigation_entry(alchemy_module["navigation"] || {})
141
142
  end
142
143
 
143
144
  # Returns a url options hash for given navigation entry.
@@ -147,26 +148,26 @@ module Alchemy
147
148
  #
148
149
  def url_options_for_navigation_entry(entry)
149
150
  {
150
- controller: entry['controller'],
151
- action: entry['action'],
151
+ controller: entry["controller"],
152
+ action: entry["action"],
152
153
  only_path: true,
153
- params: entry['params']
154
+ params: entry["params"],
154
155
  }.delete_if { |_k, v| v.nil? }
155
156
  end
156
157
 
157
158
  # Retrieves the current Alchemy module from controller and index action.
158
159
  #
159
160
  def current_alchemy_module
160
- module_definition_for(controller: params[:controller], action: 'index')
161
+ module_definition_for(controller: params[:controller], action: "index")
161
162
  end
162
163
 
163
164
  # Returns true if the current controller and action is in a modules navigation definition.
164
165
  #
165
166
  def admin_mainnavi_active?(navigation)
166
167
  # Has the given navigation entry a active sub navigation?
167
- has_active_entry?(navigation['sub_navigation'] || []) ||
168
+ has_active_entry?(navigation["sub_navigation"] || []) ||
168
169
  # Has the given navigation entry a active nested navigation?
169
- has_active_entry?(navigation['nested'] || []) ||
170
+ has_active_entry?(navigation["nested"] || []) ||
170
171
  # Is the navigation entry active?
171
172
  entry_active?(navigation || {})
172
173
  end
@@ -174,7 +175,7 @@ module Alchemy
174
175
  # Returns true if the given entry's controller is current controller
175
176
  #
176
177
  def is_entry_controller_active?(entry)
177
- entry['controller'].gsub(/\A\//, '') == params[:controller]
178
+ entry["controller"].gsub(/\A\//, "") == params[:controller]
178
179
  end
179
180
 
180
181
  # Returns true if the given entry's action is current controllers action
@@ -182,8 +183,8 @@ module Alchemy
182
183
  # Also checks if given entry has a +nested_actions+ key, if so it checks if one of them is current controller's action
183
184
  #
184
185
  def is_entry_action_active?(entry)
185
- entry['action'] == params[:action] ||
186
- entry.fetch('nested_actions', []).include?(params[:action])
186
+ entry["action"] == params[:action] ||
187
+ entry.fetch("nested_actions", []).include?(params[:action])
187
188
  end
188
189
 
189
190
  # Returns true if an entry of given entries is active.
@@ -34,8 +34,8 @@ module Alchemy
34
34
  end
35
35
  end
36
36
 
37
- def page_status_checkbox(page, attribute, label: nil)
38
- label_text = label || page.class.human_attribute_name(attribute)
37
+ def page_status_checkbox(page, attribute)
38
+ label = page.class.human_attribute_name(attribute)
39
39
 
40
40
  if page.attribute_fixed?(attribute)
41
41
  checkbox = check_box(:page, attribute, disabled: true)
@@ -43,11 +43,11 @@ module Alchemy
43
43
  Alchemy.t(:attribute_fixed, attribute: attribute)
44
44
  end
45
45
  content = content_tag(:span, class: "with-hint") do
46
- "#{checkbox}\n#{label_text}\n#{hint}".html_safe
46
+ "#{checkbox}\n#{label}\n#{hint}".html_safe
47
47
  end
48
48
  else
49
49
  checkbox = check_box(:page, attribute)
50
- content = "#{checkbox}\n#{label_text}".html_safe
50
+ content = "#{checkbox}\n#{label}".html_safe
51
51
  end
52
52
 
53
53
  content_tag(:label, class: "checkbox") { content }
@@ -5,10 +5,10 @@ module Alchemy
5
5
  module PicturesHelper
6
6
  def preview_size(size)
7
7
  case size
8
- when 'small' then '80x60'
9
- when 'large' then '240x180'
8
+ when "small" then "80x60"
9
+ when "large" then "240x180"
10
10
  else
11
- '160x120'
11
+ "160x120"
12
12
  end
13
13
  end
14
14
  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