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
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class MigrateTagsToGutentag < ActiveRecord::Migration[5.0]
4
- def up
5
- return if table_exists?(:gutentag_tags)
6
-
7
- remove_index :taggings, :taggable_id
8
- remove_column :taggings, :tagger_id, :integer
9
- remove_index :taggings, :taggable_type
10
- remove_column :taggings, :tagger_type, :string
11
- remove_index :taggings, column: [:taggable_id, :taggable_type, :context], name: 'index_taggings_on_taggable_id_and_taggable_type_and_context'
12
- remove_column :taggings, :context, :string, limit: 128
13
- if index_exists? :taggings, [:tag_id, :taggable_id, :taggable_type], unique: true, name: 'taggings_idx'
14
- rename_index :taggings, 'taggings_idx', 'unique_taggings'
15
- else
16
- add_index :taggings, [:taggable_type, :taggable_id, :tag_id], unique: true, name: 'unique_taggings'
17
- end
18
- if index_exists? :taggings, [:taggable_id, :taggable_type], name: 'taggings_idy'
19
- rename_index :taggings, 'taggings_idy', 'index_gutentag_taggings_on_taggable_id_and_taggable_type'
20
- else
21
- add_index :taggings, [:taggable_type, :taggable_id]
22
- end
23
- add_column :taggings, :updated_at, :datetime, precision: 6
24
- change_column_null :taggings, :tag_id, false
25
- change_column_null :taggings, :taggable_id, false
26
- change_column_null :taggings, :taggable_type, false
27
- change_column_null :taggings, :created_at, false, Time.current
28
- change_column_null :taggings, :updated_at, false, Time.current
29
- rename_table :taggings, :gutentag_taggings
30
-
31
- change_column_null :tags, :name, false
32
- add_index :tags, :taggings_count
33
- rename_table :tags, :gutentag_tags
34
-
35
- %i(alchemy_attachments alchemy_elements alchemy_pages alchemy_pictures).each do |table|
36
- if column_exists? table, :cached_tag_list
37
- remove_column table, :cached_tag_list
38
- end
39
- end
40
- end
41
- end
@@ -1,6 +0,0 @@
1
- class AddFixedToAlchemyElements < ActiveRecord::Migration[5.0]
2
- def change
3
- add_column :alchemy_elements, :fixed, :boolean, default: false, null: false
4
- add_index :alchemy_elements, :fixed
5
- end
6
- end
@@ -1,8 +0,0 @@
1
- class CreateAlchemyEssencePages < ActiveRecord::Migration[5.0]
2
- def change
3
- create_table :alchemy_essence_pages do |t|
4
- t.references :page, null: true, foreign_key: { to_table: :alchemy_pages }
5
- t.timestamps
6
- end
7
- end
8
- end
@@ -1,24 +0,0 @@
1
- class CreateAlchemyNodes < ActiveRecord::Migration[5.0]
2
- def change
3
- create_table :alchemy_nodes do |t|
4
- t.string :name
5
- t.string :title
6
- t.string :url
7
- t.boolean :nofollow, null: false, default: false
8
- t.boolean :external, null: false, default: false
9
- t.boolean :folded, null: false, default: false
10
-
11
- t.integer :parent_id, index: true
12
- t.integer :lft, null: false, index: true
13
- t.integer :rgt, null: false, index: true
14
- t.integer :depth, null: false, default: 0
15
-
16
- t.references :page, foreign_key: { to_table: :alchemy_pages, on_delete: :cascade }
17
- t.references :language, null: false, foreign_key: { to_table: :alchemy_languages }
18
- t.references :creator, index: true
19
- t.references :updater, index: true
20
-
21
- t.timestamps
22
- end
23
- end
24
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class AddSiteIdToAlchemyNodes < ActiveRecord::Migration[5.0]
4
- def change
5
- add_column :alchemy_nodes, :site_id, :integer, index: true
6
- add_index :alchemy_nodes, :site_id
7
- reversible do |dir|
8
- dir.up do
9
- Alchemy::Node.update_all(site_id: Alchemy::Site.first&.id)
10
- change_column_null :alchemy_nodes, :site_id, false
11
- end
12
- end
13
- add_foreign_key :alchemy_nodes, :alchemy_sites, column: :site_id, on_delete: :cascade
14
- end
15
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Alchemy
4
- module SSLProtection
5
- private
6
-
7
- # Enforce ssl for login and all admin modules.
8
- #
9
- # Default is +false+
10
- #
11
- # === Usage
12
- #
13
- # # config/alchemy/config.yml
14
- # ...
15
- # require_ssl: true
16
- # ...
17
- #
18
- # === Note
19
- #
20
- # You have to create a ssl certificate
21
- # if you want to use the ssl protection.
22
- #
23
- def ssl_required?
24
- !Rails.env.test? && Config.get(:require_ssl)
25
- end
26
-
27
- # Redirects current request to https.
28
- def enforce_ssl
29
- redirect_to url_for(request.params.merge(protocol: 'https'))
30
- end
31
- end
32
- end
@@ -1,81 +0,0 @@
1
- module Alchemy
2
- module Tasks
3
- module Helpers
4
- def database_dump_command(adapter)
5
- database_command(adapter, 'dump')
6
- end
7
-
8
- def database_import_command(adapter)
9
- database_command(adapter, 'import')
10
- end
11
-
12
- def database_config
13
- raise "Could not find #{database_config_file}!" if !File.exist?(database_config_file)
14
- @database_config ||= begin
15
- config_file = YAML.safe_load(ERB.new(File.read(database_config_file)).result, [], [], true)
16
- config_file.fetch(environment)
17
- rescue KeyError
18
- raise "Database configuration for #{environment} not found!"
19
- end
20
- end
21
-
22
- private
23
-
24
- def database_command(adapter, action = 'import')
25
- case adapter.to_s
26
- when /mysql/
27
- "#{mysql_command(mysql_command_for(action))} #{database_config['database']}"
28
- when /postgresql/
29
- "#{postgres_command(postgres_command_for(action))} #{database_config['database']}"
30
- else
31
- raise ArgumentError, "Alchemy only supports #{action}ing MySQL and PostgreSQL databases. #{adapter} is not supported."
32
- end
33
- end
34
-
35
- def mysql_command(cmd = 'mysql')
36
- command = [cmd]
37
- if database_config['username']
38
- command << "--user='#{database_config['username']}'"
39
- end
40
- if database_config['password']
41
- command << "--password='#{database_config['password']}'"
42
- end
43
- if (host = database_config['host']) && (host != 'localhost')
44
- command << "--host='#{host}'"
45
- end
46
- command.join(' ')
47
- end
48
-
49
- def postgres_command(cmd = 'psql')
50
- command = []
51
- if database_config['password']
52
- command << "PGPASSWORD='#{database_config['password']}'"
53
- end
54
- command << cmd
55
- if database_config['username']
56
- command << "--username='#{database_config['username']}'"
57
- end
58
- if (host = database_config['host']) && (host != 'localhost')
59
- command << "--host='#{host}'"
60
- end
61
- command.join(' ')
62
- end
63
-
64
- def mysql_command_for(action)
65
- action == 'import' ? 'mysql' : 'mysqldump'
66
- end
67
-
68
- def postgres_command_for(action)
69
- action == 'import' ? 'psql' : 'pg_dump --clean'
70
- end
71
-
72
- def database_config_file
73
- "./config/database.yml"
74
- end
75
-
76
- def environment
77
- ENV['RAILS_ENV'] || 'development'
78
- end
79
- end
80
- end
81
- end
@@ -1,93 +0,0 @@
1
- # *There is generally no need* to use this module. Instead, in
2
- # a functional/controller test against a Alchemy controller, just
3
- # use standard Rails functionality by including:
4
- #
5
- # routes { Alchemy::Engine.routes }
6
- #
7
- # And then use standard Rails test `get`, `post` etc methods.
8
- #
9
- # Use this module to easily test Alchemy actions within Alchemy components
10
- # or inside your application to test routes for the mounted Alchemy engine.
11
- #
12
- # Inside your spec_helper.rb, include this module inside the RSpec.configure
13
- # block by doing this:
14
- #
15
- # require 'alchemy/test_support/controller_requests'
16
- # RSpec.configure do |c|
17
- # c.include Alchemy::TestSupport::ControllerRequests, type: :controller
18
- # end
19
- #
20
- # Then, in your controller tests, you can access alchemy routes like this:
21
- #
22
- # require 'rails_helper'
23
- #
24
- # describe Alchemy::Admin::PagesController do
25
- # it "can see all the pages" do
26
- # alchemy_get :index
27
- # end
28
- # end
29
- #
30
- # Use alchemy_get, alchemy_post, alchemy_put or alchemy_delete to make requests
31
- # to the Alchemy engine, and use regular get, post, put or delete to make
32
- # requests to your application.
33
- #
34
- # Note: Based on Spree::TestingSupport::ControllerRequests. Thanks <3
35
- #
36
- # @deprecated Use Rails build in test request methods instead
37
- #
38
- module Alchemy
39
- module TestSupport
40
- module ControllerRequests
41
- extend ActiveSupport::Concern
42
-
43
- # Executes a request simulating GET HTTP method
44
- # @deprecated Use Rails test `get` helper instead
45
- def alchemy_get(action, parameters = nil, session = nil, flash = nil)
46
- process_alchemy_action(action, parameters, session, flash, "GET")
47
- end
48
- deprecate alchemy_get: :get, deprecator: Alchemy::Deprecation
49
-
50
- # Executes a request simulating POST HTTP method
51
- # @deprecated Use Rails test `post` helper instead
52
- def alchemy_post(action, parameters = nil, session = nil, flash = nil)
53
- process_alchemy_action(action, parameters, session, flash, "POST")
54
- end
55
- deprecate alchemy_post: :post, deprecator: Alchemy::Deprecation
56
-
57
- # Executes a request simulating PUT HTTP method
58
- # @deprecated Use Rails test `put` helper instead
59
- def alchemy_put(action, parameters = nil, session = nil, flash = nil)
60
- process_alchemy_action(action, parameters, session, flash, "PUT")
61
- end
62
- deprecate alchemy_put: :put, deprecator: Alchemy::Deprecation
63
-
64
- # Executes a request simulating DELETE HTTP method
65
- # @deprecated Use Rails test `delete` helper instead
66
- def alchemy_delete(action, parameters = nil, session = nil, flash = nil)
67
- process_alchemy_action(action, parameters, session, flash, "DELETE")
68
- end
69
- deprecate alchemy_delete: :delete, deprecator: Alchemy::Deprecation
70
-
71
- # Executes a simulated XHR request
72
- # @deprecated Use Rails test `xhr` helper instead
73
- def alchemy_xhr(method, action, parameters = nil, session = nil, flash = nil)
74
- process_alchemy_xhr_action(method, action, parameters, session, flash)
75
- end
76
- deprecate alchemy_xhr: :xhr, deprecator: Alchemy::Deprecation
77
-
78
- private
79
-
80
- def process_alchemy_action(action, parameters = nil, session = nil, flash = nil, method = "GET")
81
- @routes = Alchemy::Engine.routes
82
- parameters ||= {}
83
- process(action, method, parameters, session, flash)
84
- end
85
-
86
- def process_alchemy_xhr_action(method, action, parameters = nil, session = nil, flash = nil)
87
- @routes = Alchemy::Engine.routes
88
- parameters ||= {}
89
- xml_http_request(method, action, parameters, session, flash)
90
- end
91
- end
92
- end
93
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'tasks/element_views_updater'
4
-
5
- module Alchemy
6
- class Upgrader::FourPointFour < Upgrader
7
- class << self
8
- def rename_element_views
9
- desc "Remove '_view' suffix from element views."
10
- Alchemy::Upgrader::Tasks::ElementViewsUpdater.new.rename_element_views
11
- end
12
-
13
- def update_local_variable
14
- desc 'Update element views local variable to element name.'
15
- Alchemy::Upgrader::Tasks::ElementViewsUpdater.new.update_local_variable
16
- end
17
-
18
- def alchemy_4_4_todos
19
- notice = <<-NOTE.strip_heredoc
20
-
21
- ℹ️ Element editor partials are deprecated
22
- -----------------------------------------
23
-
24
- The element editor partials are not needed anymore. They still work, but in order to
25
- prepare the Alchemy 5 upgrade your should consider removing them now.
26
-
27
- In order to update check if you have any messages in your editor partials and move them
28
- to either a `warning` or `message` in your element definition.
29
-
30
- Also check if you pass any values to EssenceSelects `select_values`. Move static values
31
- to the `settings` of your content definition and either use EssencePage for referencing
32
- pages or create a custom essence for other dynamic values.
33
-
34
-
35
- ℹ️ The `_view` suffix of Element view partials is deprecated
36
- -----------------------------------------------------------
37
-
38
- The element view partials do not need the `_view` suffix anymore. Your files have been
39
- renamed.
40
-
41
- The local variable in your element views has been replaced by a variable named after the
42
- element itself. A "article" element has a "_article.html.erb" partial and therefore
43
- a `article` local variable now.
44
-
45
- The former `element` variable is still present, though.
46
-
47
- NOTE
48
- todo notice, 'Alchemy v4.4 TODO'
49
- end
50
- end
51
- end
52
- end
@@ -1,42 +0,0 @@
1
- require_relative 'tasks/harden_acts_as_taggable_on_migrations'
2
-
3
- module Alchemy
4
- class Upgrader::FourPointOne < Upgrader
5
- class << self
6
- def harden_acts_as_taggable_on_migrations
7
- desc 'Harden `acts_as_taggable_on_migrations`'
8
- `bundle exec rake railties:install:migrations FROM=acts_as_taggable_on_engine`
9
- Alchemy::Upgrader::Tasks::HardenActsAsTaggableOnMigrations.new.patch_migrations
10
- `bundle exec rake db:migrate`
11
- end
12
-
13
- def alchemy_4_1_todos
14
- notice = <<-NOTE.strip_heredoc
15
- ℹ️ Changed tagging provider to Gutentag
16
- ---------------------------------------
17
-
18
- The automatic updater that just ran updated all existing `acts_as_taggable_on_migrations`,
19
- so that they don't blow up if the `acts_as_taggable_on` gem is no longer available.
20
-
21
- All your existing tags have been migrated to `Gutentag::Tag`s.
22
-
23
-
24
- ⚠️ Removed Rails and non-English translations
25
- ---------------------------------------------
26
-
27
- Removed the Rails translations from our translation files and moved all non-english translation
28
- files into the newly introduced `alchemy_i18n` gem.
29
-
30
- If you need more translations than the default English one you can either put `alchemy_i18n`
31
- in to your apps `Gemfile` or - recommended - copy only the translation files you need into your
32
- apps `config/locales` folder.
33
-
34
- For the Rails translations either put the `rails-i18n` gem into your apps Gemfile or - recommended -
35
- copy only the translation files you need into your apps config/locales folder.
36
-
37
- NOTE
38
- todo notice, 'Alchemy v4.1 TODO'
39
- end
40
- end
41
- end
42
- end
@@ -1,85 +0,0 @@
1
- require_relative 'tasks/picture_gallery_upgrader'
2
- require_relative 'tasks/picture_gallery_migration'
3
- require_relative 'tasks/cells_upgrader'
4
- require_relative 'tasks/cells_migration'
5
- require_relative 'tasks/element_partial_name_variable_updater'
6
-
7
- module Alchemy
8
- class Upgrader::FourPointTwo < Upgrader
9
- class << self
10
- def convert_picture_galleries
11
- desc 'Convert `picture_gallery` element definitions to `nestable_elements`.'
12
- Alchemy::Upgrader::Tasks::PictureGalleryUpgrader.new.convert_picture_galleries
13
- end
14
-
15
- def migrate_picture_galleries
16
- desc 'Migrate existing gallery elements to `nestable_elements`.'
17
- Alchemy::Upgrader::Tasks::PictureGalleryMigration.new.migrate_picture_galleries
18
- end
19
-
20
- def convert_cells
21
- desc 'Convert cells config to fixed nestable elements.'
22
- Alchemy::Upgrader::Tasks::CellsUpgrader.new.convert_cells
23
- end
24
-
25
- def migrate_cells
26
- desc 'Migrate existing cells to fixed nestable elements.'
27
- Alchemy::Upgrader::Tasks::CellsMigration.new.migrate_cells
28
- end
29
-
30
- def update_element_views_variable_name
31
- desc 'Update element views to use element partial name variable.'
32
- Alchemy::Upgrader::Tasks::ElementPartialNameVariableUpdater.new.update_element_views
33
- end
34
-
35
- def alchemy_4_2_todos
36
- notice = <<-NOTE.strip_heredoc
37
- ⚠️ Element's "picture_gallery" feature removed
38
- ----------------------------------------------
39
-
40
- The `picture_gallery` feature of elements was removed and has been replaced by nestable elements.
41
-
42
- The automatic updater that just ran updated your `config/alchemy/elements.yml`. A backup was made.
43
- Nevertheless, you should have a look into it and double check the changes.
44
-
45
- We created nested elements for each gallery picture we found in your database.
46
-
47
- We also updated your element view partials so they have hints about how to render the child elements.
48
-
49
- 🚨 PLEASE LOOK INTO YOUR ELEMENT VIEW PARTIALS AND FOLLOW THE INSTRUCTIONS!
50
-
51
-
52
- ⚠️️ Cells replaced by fixed nestable elements
53
- --------------------------------------------
54
-
55
- The Cells feature has been replaced by fixed nestable elements.
56
-
57
- The automatic updater that just ran updated your `config/alchemy/elements.yml`.
58
- Nevertheless, you should have a look into it and double check the changes.
59
-
60
- We defined new fixed elements for each cell former defined in `cells.yml`
61
- and put its `elements` into the `nestable_elements` collection of the new elements definition.
62
-
63
- We also updated your element view partials so they render the child elements.
64
-
65
- Please review and fix markup, if necessary.
66
-
67
- 🚨 PLEASE DOUBLE CHECK YOUR ELEMENT PARTIALS AND ADJUST ACCORDINGLY!
68
-
69
- As always `git diff` is your friend.
70
-
71
-
72
- ℹ️ Element views use element partial name as local variable
73
- -----------------------------------------------------------
74
-
75
- The local `element` variable in your element views has been replaced by a variable named after the partial.
76
- A "article" element has a "_article_view.html.erb" partial and therefore a `article_view` local variable now.
77
-
78
- The former `element` variable is still present, though.
79
-
80
- NOTE
81
- todo notice, 'Alchemy v4.2 TODO'
82
- end
83
- end
84
- end
85
- end