alchemy_cms 4.4.4 → 5.0.0.beta2

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 +56 -18
  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 +33 -20
  8. data/CHANGELOG.md +121 -0
  9. data/Gemfile +24 -22
  10. data/README.md +31 -19
  11. data/Rakefile +10 -8
  12. data/alchemy_cms.gemspec +7 -5
  13. data/app/assets/javascripts/alchemy/admin.js +1 -2
  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.link_dialog.js.coffee +5 -5
  17. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +17 -17
  18. data/app/assets/javascripts/alchemy/node_select.js +39 -0
  19. data/app/assets/javascripts/alchemy/templates/index.js +2 -0
  20. data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
  21. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +3 -0
  22. data/app/assets/javascripts/alchemy/templates/page.hbs +1 -1
  23. data/app/assets/stylesheets/alchemy/_mixins.scss +2 -3
  24. data/app/assets/stylesheets/alchemy/_variables.scss +2 -2
  25. data/app/assets/stylesheets/alchemy/admin.scss +3 -2
  26. data/app/assets/stylesheets/alchemy/base.scss +0 -1
  27. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  28. data/app/assets/stylesheets/alchemy/forms.scss +5 -0
  29. data/app/assets/stylesheets/alchemy/lists.scss +0 -8
  30. data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
  31. data/app/assets/stylesheets/alchemy/nodes.scss +6 -1
  32. data/app/assets/stylesheets/alchemy/sitemap.scss +63 -21
  33. data/app/assets/stylesheets/alchemy/tables.scss +1 -24
  34. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
  35. data/app/controllers/alchemy/admin/base_controller.rb +13 -33
  36. data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
  37. data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
  38. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
  39. data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
  40. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
  41. data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
  42. data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
  43. data/app/controllers/alchemy/admin/nodes_controller.rb +5 -14
  44. data/app/controllers/alchemy/admin/pages_controller.rb +50 -63
  45. data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
  46. data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
  47. data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
  48. data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
  49. data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
  50. data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
  51. data/app/controllers/alchemy/api/base_controller.rb +2 -2
  52. data/app/controllers/alchemy/api/contents_controller.rb +4 -4
  53. data/app/controllers/alchemy/api/elements_controller.rb +8 -8
  54. data/app/controllers/alchemy/api/nodes_controller.rb +65 -0
  55. data/app/controllers/alchemy/api/pages_controller.rb +15 -22
  56. data/app/controllers/alchemy/attachments_controller.rb +5 -5
  57. data/app/controllers/alchemy/base_controller.rb +10 -9
  58. data/app/controllers/alchemy/messages_controller.rb +16 -23
  59. data/app/controllers/alchemy/pages_controller.rb +13 -11
  60. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
  61. data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
  62. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
  63. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
  64. data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
  65. data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
  66. data/app/decorators/alchemy/content_editor.rb +55 -0
  67. data/app/decorators/alchemy/element_editor.rb +39 -0
  68. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
  69. data/app/helpers/alchemy/admin/base_helper.rb +36 -35
  70. data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
  71. data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
  72. data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
  73. data/app/helpers/alchemy/admin/form_helper.rb +1 -1
  74. data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
  75. data/app/helpers/alchemy/admin/pages_helper.rb +12 -12
  76. data/app/helpers/alchemy/admin/pictures_helper.rb +4 -6
  77. data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
  78. data/app/helpers/alchemy/base_helper.rb +13 -8
  79. data/app/helpers/alchemy/elements_block_helper.rb +2 -31
  80. data/app/helpers/alchemy/elements_helper.rb +12 -58
  81. data/app/helpers/alchemy/pages_helper.rb +24 -174
  82. data/app/helpers/alchemy/url_helper.rb +2 -1
  83. data/app/mailers/alchemy/base_mailer.rb +1 -1
  84. data/app/mailers/alchemy/messages_mailer.rb +1 -1
  85. data/app/models/alchemy/attachment.rb +20 -18
  86. data/app/models/alchemy/base_record.rb +2 -5
  87. data/app/models/alchemy/content.rb +33 -52
  88. data/app/models/alchemy/content/factory.rb +24 -31
  89. data/app/models/alchemy/element.rb +45 -53
  90. data/app/models/alchemy/element/definitions.rb +4 -4
  91. data/app/models/alchemy/element/element_contents.rb +9 -6
  92. data/app/models/alchemy/element/element_essences.rb +4 -3
  93. data/app/models/alchemy/element/presenters.rb +3 -2
  94. data/app/models/alchemy/element_to_page.rb +1 -1
  95. data/app/models/alchemy/essence_boolean.rb +1 -3
  96. data/app/models/alchemy/essence_date.rb +2 -3
  97. data/app/models/alchemy/essence_file.rb +4 -4
  98. data/app/models/alchemy/essence_html.rb +1 -3
  99. data/app/models/alchemy/essence_link.rb +1 -3
  100. data/app/models/alchemy/essence_node.rb +18 -0
  101. data/app/models/alchemy/essence_page.rb +3 -16
  102. data/app/models/alchemy/essence_picture.rb +17 -16
  103. data/app/models/alchemy/essence_picture_view.rb +7 -6
  104. data/app/models/alchemy/essence_richtext.rb +1 -3
  105. data/app/models/alchemy/essence_select.rb +1 -3
  106. data/app/models/alchemy/essence_text.rb +0 -2
  107. data/app/models/alchemy/folded_page.rb +1 -0
  108. data/app/models/alchemy/language.rb +21 -35
  109. data/app/models/alchemy/language/code.rb +4 -4
  110. data/app/models/alchemy/legacy_page_url.rb +1 -1
  111. data/app/models/alchemy/message.rb +3 -3
  112. data/app/models/alchemy/node.rb +55 -9
  113. data/app/models/alchemy/page.rb +53 -123
  114. data/app/models/alchemy/page/fixed_attributes.rb +3 -2
  115. data/app/models/alchemy/page/page_elements.rb +35 -44
  116. data/app/models/alchemy/page/page_naming.rb +20 -70
  117. data/app/models/alchemy/page/page_natures.rb +7 -34
  118. data/app/models/alchemy/page/page_scopes.rb +23 -29
  119. data/app/models/alchemy/page/url_path.rb +64 -0
  120. data/app/models/alchemy/picture.rb +40 -30
  121. data/app/models/alchemy/picture/preprocessor.rb +26 -0
  122. data/app/models/alchemy/picture/transformations.rb +9 -7
  123. data/app/models/alchemy/picture/url.rb +5 -5
  124. data/app/models/alchemy/site.rb +6 -36
  125. data/app/models/alchemy/site/layout.rb +2 -2
  126. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  127. data/app/serializers/alchemy/content_serializer.rb +0 -3
  128. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  129. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  130. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  131. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  132. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  133. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  134. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  135. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  136. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  137. data/app/serializers/alchemy/node_serializer.rb +14 -0
  138. data/app/serializers/alchemy/page_serializer.rb +2 -1
  139. data/app/serializers/alchemy/page_tree_serializer.rb +11 -14
  140. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  141. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  142. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  143. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  144. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  145. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  146. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  147. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  148. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  149. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  150. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  151. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  152. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  153. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  154. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  155. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  156. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  157. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  158. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  159. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -2
  160. data/app/views/alchemy/admin/nodes/_form.html.erb +23 -15
  161. data/app/views/alchemy/admin/nodes/_node.html.erb +5 -19
  162. data/app/views/alchemy/admin/nodes/index.html.erb +3 -18
  163. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  164. data/app/views/alchemy/admin/pages/_form.html.erb +1 -2
  165. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  166. data/app/views/alchemy/admin/pages/_page.html.erb +14 -25
  167. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  168. data/app/views/alchemy/admin/pages/_sitemap.html.erb +6 -0
  169. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  170. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  171. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  172. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  173. data/app/views/alchemy/admin/partials/_routes.html.erb +8 -0
  174. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  175. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  176. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  177. data/app/views/alchemy/admin/pictures/index.html.erb +18 -3
  178. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  179. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  180. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  181. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  182. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  183. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  184. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  185. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  186. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  187. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  188. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  189. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  190. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  191. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  192. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  193. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  194. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  195. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  196. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  197. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  198. data/app/views/alchemy/pages/show.rss.builder +3 -2
  199. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  200. data/babel.config.js +12 -0
  201. data/bin/rails +5 -4
  202. data/config/alchemy/config.yml +23 -22
  203. data/config/brakeman.ignore +1 -1
  204. data/config/initializers/assets.rb +2 -1
  205. data/config/initializers/dragonfly.rb +2 -1
  206. data/config/initializers/mime_types.rb +1 -0
  207. data/config/initializers/mini_profiler.rb +3 -2
  208. data/config/initializers/simple_form.rb +6 -6
  209. data/config/locales/alchemy.en.yml +37 -14
  210. data/config/routes.rb +32 -28
  211. data/config/spring.rb +3 -2
  212. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  213. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  214. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  215. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  216. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  217. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  218. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  219. data/lib/alchemy/admin/locale.rb +3 -1
  220. data/lib/alchemy/admin/preview_url.rb +85 -0
  221. data/lib/alchemy/auth_accessors.rb +8 -7
  222. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  223. data/lib/alchemy/config.rb +26 -2
  224. data/lib/alchemy/configuration_methods.rb +3 -1
  225. data/lib/alchemy/controller_actions.rb +6 -5
  226. data/lib/alchemy/deprecation.rb +2 -1
  227. data/lib/alchemy/elements_finder.rb +5 -5
  228. data/lib/alchemy/engine.rb +23 -8
  229. data/lib/alchemy/errors.rb +0 -7
  230. data/lib/alchemy/essence.rb +17 -16
  231. data/lib/alchemy/filetypes.rb +5 -5
  232. data/lib/alchemy/forms/builder.rb +4 -4
  233. data/lib/alchemy/hints.rb +1 -1
  234. data/lib/alchemy/i18n.rb +2 -1
  235. data/lib/alchemy/modules.rb +12 -12
  236. data/lib/alchemy/name_conversions.rb +5 -5
  237. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  238. data/lib/alchemy/page_layout.rb +15 -12
  239. data/lib/alchemy/paths.rb +1 -1
  240. data/lib/alchemy/permissions.rb +7 -6
  241. data/lib/alchemy/resource.rb +23 -13
  242. data/lib/alchemy/resources_helper.rb +12 -18
  243. data/lib/alchemy/routing_constraints.rb +1 -1
  244. data/lib/alchemy/seeder.rb +42 -14
  245. data/lib/alchemy/shell.rb +13 -10
  246. data/lib/alchemy/taggable.rb +1 -0
  247. data/lib/alchemy/tasks/tidy.rb +4 -3
  248. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  249. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  250. data/lib/alchemy/test_support/factories.rb +1 -1
  251. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  252. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  253. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  254. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  255. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  256. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  257. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  258. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  259. data/lib/alchemy/test_support/factories/language_factory.rb +21 -14
  260. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  261. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  262. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  263. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  264. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  265. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  266. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  267. data/lib/alchemy/tinymce.rb +15 -13
  268. data/lib/alchemy/upgrader.rb +8 -7
  269. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  270. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  271. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  272. data/lib/alchemy/version.rb +1 -1
  273. data/lib/alchemy_cms.rb +52 -50
  274. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  275. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  276. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  277. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  278. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  279. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  280. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  281. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  283. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  285. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  286. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  287. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  288. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  289. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  290. data/lib/generators/alchemy/install/install_generator.rb +110 -0
  291. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  292. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  293. data/lib/generators/alchemy/install/templates/menus.yml.tt +8 -0
  294. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  295. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +5 -5
  296. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  297. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  298. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  299. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  300. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +2 -2
  301. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +2 -2
  302. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  303. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  305. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  306. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  307. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  308. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  309. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  310. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  311. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  312. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  313. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  314. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  315. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  316. data/lib/tasks/alchemy/db.rake +3 -19
  317. data/lib/tasks/alchemy/install.rake +3 -2
  318. data/lib/tasks/alchemy/tidy.rake +9 -8
  319. data/lib/tasks/alchemy/upgrade.rake +28 -105
  320. data/package.json +45 -0
  321. data/package/admin.js +14 -0
  322. data/package/src/__tests__/i18n.spec.js +70 -0
  323. data/package/src/i18n.js +48 -0
  324. data/package/src/node_tree.js +72 -0
  325. data/package/src/translations.js +32 -0
  326. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  327. data/package/src/utils/__tests__/events.spec.js +38 -0
  328. data/package/src/utils/ajax.js +48 -0
  329. data/package/src/utils/events.js +16 -0
  330. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  331. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  332. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  333. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  334. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  335. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  336. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  337. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  338. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  339. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  340. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  341. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  342. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  343. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  344. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  345. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  346. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  347. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  348. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  349. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  350. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  351. metadata +131 -83
  352. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  353. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  354. data/app/helpers/alchemy/essences_helper.rb +0 -119
  355. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  356. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  357. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  358. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -33
  359. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  360. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  361. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  362. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  363. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  364. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  365. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  366. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  367. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  368. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  369. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  370. data/lib/alchemy/ssl_protection.rb +0 -32
  371. data/lib/alchemy/tasks/helpers.rb +0 -81
  372. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  373. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  374. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  375. data/lib/alchemy/upgrader/four_point_two.rb +0 -85
  376. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -43
  377. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -148
  378. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -28
  379. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  380. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  381. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  382. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  383. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  384. data/lib/tasks/alchemy/convert.rake +0 -95
  385. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  386. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
@@ -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.
@@ -9,13 +9,13 @@ module Alchemy
9
9
  #
10
10
  def preview_sizes_for_select
11
11
  options_for_select([
12
- 'auto',
13
- [Alchemy.t('240', scope: 'preview_sizes'), 240],
14
- [Alchemy.t('320', scope: 'preview_sizes'), 320],
15
- [Alchemy.t('480', scope: 'preview_sizes'), 480],
16
- [Alchemy.t('768', scope: 'preview_sizes'), 768],
17
- [Alchemy.t('1024', scope: 'preview_sizes'), 1024],
18
- [Alchemy.t('1280', scope: 'preview_sizes'), 1280]
12
+ "auto",
13
+ [Alchemy.t("240", scope: "preview_sizes"), 240],
14
+ [Alchemy.t("320", scope: "preview_sizes"), 320],
15
+ [Alchemy.t("480", scope: "preview_sizes"), 480],
16
+ [Alchemy.t("768", scope: "preview_sizes"), 768],
17
+ [Alchemy.t("1024", scope: "preview_sizes"), 1024],
18
+ [Alchemy.t("1280", scope: "preview_sizes"), 1280],
19
19
  ])
20
20
  end
21
21
 
@@ -27,8 +27,8 @@ module Alchemy
27
27
  if page.persisted? && page.definition.blank?
28
28
  [
29
29
  page_layout_missing_warning,
30
- Alchemy.t(:page_type)
31
- ].join('&nbsp;').html_safe
30
+ Alchemy.t(:page_type),
31
+ ].join("&nbsp;").html_safe
32
32
  else
33
33
  Alchemy.t(:page_type)
34
34
  end
@@ -39,10 +39,10 @@ module Alchemy
39
39
 
40
40
  if page.attribute_fixed?(attribute)
41
41
  checkbox = check_box(:page, attribute, disabled: true)
42
- hint = content_tag(:span, class: 'hint-bubble') do
42
+ hint = content_tag(:span, class: "hint-bubble") do
43
43
  Alchemy.t(:attribute_fixed, attribute: attribute)
44
44
  end
45
- content = content_tag(:span, class: 'with-hint') do
45
+ content = content_tag(:span, class: "with-hint") do
46
46
  "#{checkbox}\n#{label}\n#{hint}".html_safe
47
47
  end
48
48
  else
@@ -50,7 +50,7 @@ module Alchemy
50
50
  content = "#{checkbox}\n#{label}".html_safe
51
51
  end
52
52
 
53
- content_tag(:label, class: 'checkbox') { content }
53
+ content_tag(:label, class: "checkbox") { content }
54
54
  end
55
55
  end
56
56
  end
@@ -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