alchemy_cms 7.1.7 → 7.2.0.b

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 (305) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +133 -0
  3. data/Gemfile +2 -4
  4. data/LICENSE +1 -1
  5. data/README.md +5 -6
  6. data/SECURITY.md +1 -1
  7. data/alchemy_cms.gemspec +3 -4
  8. data/app/assets/javascripts/alchemy/admin.js +0 -9
  9. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +5 -15
  10. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +5 -4
  11. data/app/assets/javascripts/alchemy/templates/index.js +0 -1
  12. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +1 -1
  13. data/app/assets/javascripts/alchemy/templates/page_folder.hbs +1 -1
  14. data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +20 -7
  15. data/app/assets/stylesheets/alchemy/_custom-properties.scss +12 -0
  16. data/app/assets/stylesheets/alchemy/_mixins.scss +10 -6
  17. data/app/assets/stylesheets/alchemy/_variables.scss +3 -0
  18. data/app/assets/stylesheets/alchemy/admin.scss +2 -2
  19. data/app/assets/stylesheets/alchemy/archive.scss +4 -3
  20. data/app/assets/stylesheets/alchemy/attachment-select.scss +19 -0
  21. data/app/assets/stylesheets/alchemy/base.scss +31 -18
  22. data/app/assets/stylesheets/alchemy/buttons.scss +3 -4
  23. data/app/assets/stylesheets/alchemy/dashboard.scss +1 -1
  24. data/app/assets/stylesheets/alchemy/dialogs.scss +2 -5
  25. data/app/assets/stylesheets/alchemy/elements.scss +76 -46
  26. data/app/assets/stylesheets/alchemy/flash.scss +20 -70
  27. data/app/assets/stylesheets/alchemy/forms.scss +41 -36
  28. data/app/assets/stylesheets/alchemy/frame.scss +12 -3
  29. data/app/assets/stylesheets/alchemy/icons.scss +34 -2
  30. data/app/assets/stylesheets/alchemy/image_library.scss +18 -9
  31. data/app/assets/stylesheets/alchemy/{filter_field.scss → list_filter.scss} +8 -7
  32. data/app/assets/stylesheets/alchemy/lists.scss +1 -1
  33. data/app/assets/stylesheets/alchemy/navigation.scss +9 -12
  34. data/app/assets/stylesheets/alchemy/node-select.scss +1 -1
  35. data/app/assets/stylesheets/alchemy/nodes.scss +15 -13
  36. data/app/assets/stylesheets/alchemy/notices.scss +56 -39
  37. data/app/assets/stylesheets/alchemy/page-select.scss +1 -4
  38. data/app/assets/stylesheets/alchemy/pagination.scss +11 -1
  39. data/app/assets/stylesheets/alchemy/preview_window.scss +7 -3
  40. data/app/assets/stylesheets/alchemy/search.scss +4 -4
  41. data/app/assets/stylesheets/alchemy/selects.scss +13 -7
  42. data/app/assets/stylesheets/alchemy/shoelace.scss +33 -2
  43. data/app/assets/stylesheets/alchemy/sitemap.scss +155 -159
  44. data/app/assets/stylesheets/alchemy/tables.scss +49 -12
  45. data/app/assets/stylesheets/alchemy/tags.scss +17 -11
  46. data/app/assets/stylesheets/alchemy/toolbar.scss +2 -2
  47. data/app/assets/stylesheets/alchemy/typography.scss +41 -22
  48. data/app/assets/stylesheets/alchemy/upload.scss +5 -4
  49. data/app/components/alchemy/admin/attachment_select.rb +39 -0
  50. data/app/components/alchemy/admin/icon.rb +72 -0
  51. data/app/components/alchemy/admin/link_dialog/anchor_tab.rb +41 -0
  52. data/app/components/alchemy/admin/link_dialog/base_tab.rb +75 -0
  53. data/app/components/alchemy/admin/link_dialog/external_tab.rb +42 -0
  54. data/app/components/alchemy/admin/link_dialog/file_tab.rb +45 -0
  55. data/app/components/alchemy/admin/link_dialog/internal_tab.rb +66 -0
  56. data/app/components/alchemy/admin/link_dialog/tabs.rb +33 -0
  57. data/app/components/alchemy/admin/list_filter.rb +42 -0
  58. data/app/components/alchemy/admin/message.rb +19 -0
  59. data/app/components/alchemy/admin/tags_autocomplete.rb +25 -0
  60. data/app/components/alchemy/admin/toolbar_button.rb +111 -0
  61. data/app/components/alchemy/ingredients/link_view.rb +1 -7
  62. data/app/components/alchemy/ingredients/picture_view.rb +2 -2
  63. data/app/components/alchemy/ingredients/text_view.rb +1 -2
  64. data/app/controllers/alchemy/admin/base_controller.rb +1 -1
  65. data/app/controllers/alchemy/admin/elements_controller.rb +4 -2
  66. data/app/controllers/alchemy/admin/ingredients_controller.rb +2 -0
  67. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  68. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +12 -4
  69. data/app/controllers/alchemy/admin/nodes_controller.rb +26 -0
  70. data/app/controllers/alchemy/admin/pages_controller.rb +11 -78
  71. data/app/controllers/alchemy/admin/picture_descriptions_controller.rb +15 -0
  72. data/app/controllers/alchemy/admin/pictures_controller.rb +18 -1
  73. data/app/controllers/alchemy/admin/resources_controller.rb +15 -10
  74. data/app/controllers/alchemy/api/attachments_controller.rb +44 -0
  75. data/app/controllers/alchemy/api/pages_controller.rb +10 -6
  76. data/app/controllers/alchemy/base_controller.rb +2 -2
  77. data/app/controllers/alchemy/messages_controller.rb +2 -2
  78. data/app/controllers/alchemy/pages_controller.rb +8 -6
  79. data/app/controllers/concerns/alchemy/admin/current_language.rb +1 -1
  80. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +1 -1
  81. data/app/decorators/alchemy/element_editor.rb +2 -2
  82. data/app/helpers/alchemy/admin/base_helper.rb +8 -60
  83. data/app/helpers/alchemy/admin/elements_helper.rb +1 -1
  84. data/app/helpers/alchemy/admin/ingredients_helper.rb +1 -1
  85. data/app/helpers/alchemy/base_helper.rb +9 -91
  86. data/app/helpers/alchemy/elements_helper.rb +3 -3
  87. data/app/helpers/alchemy/pages_helper.rb +16 -9
  88. data/app/javascript/alchemy_admin/components/attachment_select.js +24 -0
  89. data/app/javascript/alchemy_admin/components/button.js +3 -0
  90. data/app/javascript/alchemy_admin/components/clipboard_button.js +3 -2
  91. data/app/javascript/alchemy_admin/components/dialog_link.js +10 -7
  92. data/app/javascript/alchemy_admin/components/dom_id_select.js +69 -0
  93. data/app/javascript/alchemy_admin/components/element_editor/delete_element_button.js +42 -0
  94. data/app/javascript/alchemy_admin/components/element_editor/publish_element_button.js +4 -2
  95. data/app/javascript/alchemy_admin/components/element_editor.js +21 -13
  96. data/app/javascript/alchemy_admin/components/elements_window.js +87 -0
  97. data/app/javascript/alchemy_admin/components/growl.js +13 -0
  98. data/app/javascript/alchemy_admin/components/icon.js +51 -0
  99. data/app/javascript/alchemy_admin/components/index.js +24 -0
  100. data/app/javascript/alchemy_admin/components/ingredient_group.js +6 -0
  101. data/app/javascript/alchemy_admin/components/link_buttons/link_button.js +21 -11
  102. data/app/javascript/alchemy_admin/components/link_buttons/unlink_button.js +2 -1
  103. data/app/javascript/alchemy_admin/components/link_buttons.js +1 -0
  104. data/app/javascript/alchemy_admin/components/list_filter.js +68 -0
  105. data/app/javascript/alchemy_admin/components/message.js +69 -0
  106. data/app/javascript/alchemy_admin/components/node_select.js +1 -1
  107. data/app/javascript/alchemy_admin/components/overlay.js +6 -6
  108. data/app/javascript/alchemy_admin/components/page_select.js +3 -7
  109. data/app/javascript/alchemy_admin/components/preview_window.js +121 -0
  110. data/app/javascript/alchemy_admin/components/remote_select.js +4 -1
  111. data/app/javascript/alchemy_admin/components/select.js +37 -1
  112. data/app/javascript/alchemy_admin/components/tags_autocomplete.js +57 -0
  113. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +4 -3
  114. data/app/javascript/alchemy_admin/components/uploader/progress.js +1 -1
  115. data/app/javascript/alchemy_admin/confirm_dialog.js +133 -0
  116. data/app/javascript/alchemy_admin/dirty.js +19 -14
  117. data/app/javascript/alchemy_admin/fixed_elements.js +24 -0
  118. data/app/javascript/alchemy_admin/growler.js +15 -0
  119. data/app/javascript/alchemy_admin/gui.js +2 -4
  120. data/app/javascript/alchemy_admin/hotkeys.js +60 -0
  121. data/app/javascript/alchemy_admin/image_loader.js +2 -2
  122. data/app/javascript/alchemy_admin/ingredient_anchor_link.js +2 -3
  123. data/app/javascript/alchemy_admin/initializer.js +1 -8
  124. data/app/javascript/alchemy_admin/link_dialog.js +131 -0
  125. data/app/javascript/alchemy_admin/locales/en.js +3 -0
  126. data/app/javascript/alchemy_admin/node_tree.js +4 -3
  127. data/app/javascript/alchemy_admin/page_sorter.js +23 -14
  128. data/app/javascript/alchemy_admin/picture_editors.js +3 -2
  129. data/app/javascript/alchemy_admin/shoelace_theme.js +60 -0
  130. data/app/javascript/alchemy_admin/sitemap.js +9 -3
  131. data/app/javascript/alchemy_admin/sortable_elements.js +4 -6
  132. data/app/javascript/alchemy_admin.js +18 -42
  133. data/app/models/alchemy/current.rb +26 -0
  134. data/app/models/alchemy/element.rb +1 -1
  135. data/app/models/alchemy/ingredients/headline.rb +8 -1
  136. data/app/models/alchemy/ingredients/picture.rb +6 -0
  137. data/app/models/alchemy/language.rb +8 -6
  138. data/app/models/alchemy/node.rb +2 -2
  139. data/app/models/alchemy/page/page_elements.rb +8 -8
  140. data/app/models/alchemy/page/page_layouts.rb +3 -3
  141. data/app/models/alchemy/page/page_natures.rb +13 -9
  142. data/app/models/alchemy/page/page_scopes.rb +2 -2
  143. data/app/models/alchemy/page/publisher.rb +1 -0
  144. data/app/models/alchemy/page.rb +13 -28
  145. data/app/models/alchemy/picture.rb +8 -0
  146. data/app/models/alchemy/picture_description.rb +8 -0
  147. data/app/models/alchemy/picture_variant.rb +1 -1
  148. data/app/models/alchemy/site.rb +10 -7
  149. data/app/serializers/alchemy/attachment_serializer.rb +8 -0
  150. data/app/serializers/alchemy/page_node_serializer.rb +9 -0
  151. data/app/views/alchemy/_menubar.html.erb +1 -1
  152. data/app/views/alchemy/_preview_mode_code.html.erb +1 -1
  153. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +2 -2
  154. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +0 -1
  155. data/app/views/alchemy/admin/attachments/edit.html.erb +3 -4
  156. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  157. data/app/views/alchemy/admin/clipboard/index.html.erb +1 -1
  158. data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
  159. data/app/views/alchemy/admin/clipboard/remove.js.erb +1 -1
  160. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  161. data/app/views/alchemy/admin/dashboard/_sites.html.erb +1 -1
  162. data/app/views/alchemy/admin/dashboard/help.html.erb +48 -12
  163. data/app/views/alchemy/admin/dashboard/index.html.erb +1 -1
  164. data/app/views/alchemy/admin/dashboard/info.html.erb +5 -8
  165. data/app/views/alchemy/admin/elements/_add_nested_element_form.html.erb +1 -1
  166. data/app/views/alchemy/admin/elements/_element.html.erb +5 -5
  167. data/app/views/alchemy/admin/elements/_footer.html.erb +1 -1
  168. data/app/views/alchemy/admin/elements/_header.html.erb +6 -2
  169. data/app/views/alchemy/admin/elements/_toolbar.html.erb +8 -6
  170. data/app/views/alchemy/admin/elements/create.js.erb +0 -5
  171. data/app/views/alchemy/admin/elements/index.html.erb +70 -34
  172. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +1 -2
  173. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +3 -5
  174. data/app/views/alchemy/admin/languages/_language.html.erb +1 -1
  175. data/app/views/alchemy/admin/languages/index.html.erb +2 -2
  176. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +18 -18
  177. data/app/views/alchemy/admin/layoutpages/edit.html.erb +3 -4
  178. data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
  179. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +10 -11
  180. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +15 -17
  181. data/app/views/alchemy/admin/legacy_page_urls/_table.html.erb +16 -0
  182. data/app/views/alchemy/admin/legacy_page_urls/_update.turbo_stream.erb +12 -0
  183. data/app/views/alchemy/admin/legacy_page_urls/create.turbo_stream.erb +8 -0
  184. data/app/views/alchemy/admin/legacy_page_urls/destroy.turbo_stream.erb +1 -0
  185. data/app/views/alchemy/admin/legacy_page_urls/edit.html.erb +27 -0
  186. data/app/views/alchemy/admin/legacy_page_urls/show.html.erb +1 -0
  187. data/app/views/alchemy/admin/legacy_page_urls/update.turbo_stream.erb +1 -0
  188. data/app/views/alchemy/admin/nodes/_form.html.erb +12 -11
  189. data/app/views/alchemy/admin/nodes/_label.html.erb +1 -0
  190. data/app/views/alchemy/admin/nodes/_node.html.erb +19 -19
  191. data/app/views/alchemy/admin/nodes/_page_nodes.html.erb +48 -0
  192. data/app/views/alchemy/admin/nodes/_update.turbo_stream.erb +9 -0
  193. data/app/views/alchemy/admin/nodes/create.turbo_stream.erb +1 -0
  194. data/app/views/alchemy/admin/nodes/destroy.turbo_stream.erb +1 -0
  195. data/app/views/alchemy/admin/nodes/index.html.erb +3 -3
  196. data/app/views/alchemy/admin/pages/_form.html.erb +3 -4
  197. data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +4 -15
  198. data/app/views/alchemy/admin/pages/_page.html.erb +39 -39
  199. data/app/views/alchemy/admin/pages/_table_row.html.erb +3 -3
  200. data/app/views/alchemy/admin/pages/_toolbar.html.erb +2 -2
  201. data/app/views/alchemy/admin/pages/configure.html.erb +6 -0
  202. data/app/views/alchemy/admin/pages/edit.html.erb +15 -62
  203. data/app/views/alchemy/admin/pages/unlock.js.erb +2 -2
  204. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +3 -1
  205. data/app/views/alchemy/admin/partials/_flash_notices.html.erb +4 -2
  206. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
  207. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +5 -2
  208. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -2
  209. data/app/views/alchemy/admin/partials/_search_form.html.erb +2 -2
  210. data/app/views/alchemy/admin/partials/_site_select.html.erb +1 -1
  211. data/app/views/alchemy/admin/picture_descriptions/_form.html.erb +11 -0
  212. data/app/views/alchemy/admin/picture_descriptions/edit.html.erb +6 -0
  213. data/app/views/alchemy/admin/pictures/_form.html.erb +4 -3
  214. data/app/views/alchemy/admin/pictures/_infos.html.erb +1 -1
  215. data/app/views/alchemy/admin/pictures/_picture_description_field.html.erb +29 -0
  216. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
  217. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +0 -2
  218. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +3 -3
  219. data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
  220. data/app/views/alchemy/admin/resources/_form.html.erb +3 -4
  221. data/app/views/alchemy/admin/resources/_tag_list.html.erb +2 -2
  222. data/app/views/alchemy/admin/resources/index.html.erb +2 -2
  223. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  224. data/app/views/alchemy/admin/styleguide/index.html.erb +29 -24
  225. data/app/views/alchemy/admin/tags/_tag.html.erb +1 -1
  226. data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
  227. data/app/views/alchemy/admin/tags/index.html.erb +1 -1
  228. data/app/views/alchemy/base/500.html.erb +7 -18
  229. data/app/views/alchemy/base/error_notice.html.erb +3 -1
  230. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
  231. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +1 -1
  232. data/app/views/alchemy/ingredients/_headline_editor.html.erb +13 -8
  233. data/app/views/alchemy/ingredients/_picture_editor.html.erb +1 -1
  234. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +1 -1
  235. data/app/views/alchemy/language_links/_language.html.erb +1 -1
  236. data/app/views/kaminari/alchemy/_first_page.html.erb +2 -2
  237. data/app/views/kaminari/alchemy/_gap.html.erb +1 -1
  238. data/app/views/kaminari/alchemy/_last_page.html.erb +2 -2
  239. data/app/views/kaminari/alchemy/_next_page.html.erb +2 -2
  240. data/app/views/kaminari/alchemy/_prev_page.html.erb +2 -2
  241. data/app/views/layouts/alchemy/admin.html.erb +2 -1
  242. data/bundles/shoelace.js +3 -1
  243. data/config/locales/alchemy.en.yml +16 -3
  244. data/config/routes.rb +3 -1
  245. data/db/migrate/20240314105244_create_alchemy_picture_descriptions.rb +11 -0
  246. data/lib/alchemy/configuration_methods.rb +1 -1
  247. data/lib/alchemy/controller_actions.rb +3 -3
  248. data/lib/alchemy/element_definition.rb +10 -6
  249. data/lib/alchemy/engine.rb +19 -2
  250. data/lib/alchemy/page_layout.rb +10 -6
  251. data/lib/alchemy/permissions.rb +3 -2
  252. data/lib/alchemy/seeder.rb +2 -2
  253. data/lib/alchemy/test_support/capybara_helpers.rb +4 -0
  254. data/lib/alchemy/test_support/factories/language_factory.rb +1 -1
  255. data/lib/alchemy/test_support/shared_contexts.rb +8 -0
  256. data/lib/alchemy/tinymce.rb +2 -1
  257. data/lib/alchemy/version.rb +1 -1
  258. data/lib/alchemy.rb +36 -0
  259. data/lib/alchemy_cms.rb +0 -1
  260. data/lib/generators/alchemy/menus/templates/node.html.erb +2 -2
  261. data/lib/generators/alchemy/menus/templates/node.html.haml +2 -2
  262. data/lib/generators/alchemy/menus/templates/node.html.slim +2 -2
  263. data/lib/generators/alchemy/menus/templates/wrapper.html.erb +1 -1
  264. data/lib/generators/alchemy/menus/templates/wrapper.html.haml +1 -1
  265. data/lib/generators/alchemy/menus/templates/wrapper.html.slim +1 -1
  266. data/lib/tasks/alchemy/sitemap.rake +97 -0
  267. data/package.json +8 -8
  268. data/vendor/assets/fonts/remixicon.symbol.svg +11 -0
  269. data/vendor/javascript/shoelace.min.js +333 -118
  270. data/vendor/javascript/sortable.min.js +1 -1
  271. data/vendor/javascript/tinymce.min.js +1 -1
  272. data/vendor/javascript/ungap-custom-elements.min.js +1 -1
  273. metadata +61 -54
  274. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +0 -85
  275. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +0 -107
  276. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +0 -66
  277. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +0 -45
  278. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +0 -24
  279. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +0 -49
  280. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +0 -0
  281. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +0 -230
  282. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +0 -49
  283. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +0 -82
  284. data/app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee +0 -11
  285. data/app/assets/javascripts/alchemy/templates/page.hbs +0 -19
  286. data/app/javascript/alchemy_admin/tags_autocomplete.js +0 -46
  287. data/app/models/alchemy/tree_node.rb +0 -7
  288. data/app/views/alchemy/admin/elements/destroy.js.erb +0 -8
  289. data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +0 -5
  290. data/app/views/alchemy/admin/legacy_page_urls/create.js.erb +0 -9
  291. data/app/views/alchemy/admin/legacy_page_urls/destroy.js.erb +0 -6
  292. data/app/views/alchemy/admin/legacy_page_urls/update.js.erb +0 -2
  293. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +0 -22
  294. data/app/views/alchemy/admin/pages/_external_link.html.erb +0 -31
  295. data/app/views/alchemy/admin/pages/_file_link.html.erb +0 -31
  296. data/app/views/alchemy/admin/pages/_internal_link.html.erb +0 -35
  297. data/app/views/alchemy/admin/pages/link.html.erb +0 -26
  298. data/app/views/alchemy/admin/partials/_flash.html.erb +0 -4
  299. data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +0 -29
  300. data/vendor/assets/fonts/remixicon.eot +0 -0
  301. data/vendor/assets/fonts/remixicon.svg +0 -7816
  302. data/vendor/assets/fonts/remixicon.ttf +0 -0
  303. data/vendor/assets/fonts/remixicon.woff +0 -0
  304. data/vendor/assets/fonts/remixicon.woff2 +0 -0
  305. data/vendor/assets/stylesheets/remixicon.scss +0 -10480
@@ -1,3 +1,3 @@
1
1
  /*! (c) Andrea Giammarchi @webreflection ISC */
2
- !function(){var e=function(e,t){var n=function(e){for(var t=0,n=e.length;t<n;t++)r(e[t]);},r=function(e){var t=e.target,n=e.attributeName,r=e.oldValue;t.attributeChangedCallback(n,r,t.getAttribute(n));};return function(o,a){var l=o.constructor.observedAttributes;return l&&e(a).then((function(){new t(n).observe(o,{attributes:!0,attributeOldValue:!0,attributeFilter:l});for(var e=0,a=l.length;e<a;e++)o.hasAttribute(l[e])&&r({target:o,attributeName:l[e],oldValue:null});})),o}};function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function n(e,n){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,n){if(e){if("string"==typeof e)return t(e,n);var r=Object.prototype.toString.call(e).slice(8,-1);return "Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?t(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){r&&(e=r);var o=0,a=function(){};return {s:a,n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var l,i=!0,c=!1;return {s:function(){r=r.call(e);},n:function(){var e=r.next();return i=e.done,e},e:function(e){c=!0,l=e;},f:function(){try{i||null==r.return||r.return();}finally{if(c)throw l}}}}
2
+ !function(){var e=function(e,t){var n=function(e){for(var t=0,n=e.length;t<n;t++)r(e[t]);},r=function(e){var t=e.target,n=e.attributeName,r=e.oldValue;t.attributeChangedCallback(n,r,t.getAttribute(n));};return function(o,a){var l=o.constructor.observedAttributes;return l&&e(a).then((function(){new t(n).observe(o,{attributes:!0,attributeOldValue:!0,attributeFilter:l});for(var e=0,a=l.length;e<a;e++)o.hasAttribute(l[e])&&r({target:o,attributeName:l[e],oldValue:null});})),o}};function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function n(e,n){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,n){if(e){if("string"==typeof e)return t(e,n);var r=Object.prototype.toString.call(e).slice(8,-1);return "Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?t(e,n):void 0}}(e))||n){r&&(e=r);var o=0,a=function(){};return {s:a,n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var l,i=!0,c=!1;return {s:function(){r=r.call(e);},n:function(){var e=r.next();return i=e.done,e},e:function(e){c=!0,l=e;},f:function(){try{i||null==r.return||r.return();}finally{if(c)throw l}}}}
3
3
  /*! (c) Andrea Giammarchi - ISC */var r=!0,o=!1,a="querySelectorAll",l="querySelectorAll",i=self,c=i.document,u=i.Element,s=i.MutationObserver,f=i.Set,d=i.WeakMap,h=function(e){return l in e},v=[].filter,p=function(e){var t=new d,i=function(n,r){var o;if(r)for(var a,l=function(e){return e.matches||e.webkitMatchesSelector||e.msMatchesSelector}(n),i=0,c=y.length;i<c;i++)l.call(n,a=y[i])&&(t.has(n)||t.set(n,new f),(o=t.get(n)).has(a)||(o.add(a),e.handle(n,r,a)));else t.has(n)&&(o=t.get(n),t.delete(n),o.forEach((function(t){e.handle(n,r,t);})));},p=function(e){for(var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=0,r=e.length;n<r;n++)i(e[n],t);},y=e.query,g=e.root||c,m=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:MutationObserver,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:["*"],c=function t(o,l,i,c,u,s){var f,d=n(o);try{for(d.s();!(f=d.n()).done;){var h=f.value;(s||a in h)&&(u?i.has(h)||(i.add(h),c.delete(h),e(h,u)):c.has(h)||(c.add(h),i.delete(h),e(h,u)),s||t(h[a](l),l,i,c,u,r));}}catch(e){d.e(e);}finally{d.f();}},u=new l((function(e){if(i.length){var t,a=i.join(","),l=new Set,u=new Set,s=n(e);try{for(s.s();!(t=s.n()).done;){var f=t.value,d=f.addedNodes,h=f.removedNodes;c(h,a,l,u,o,o),c(d,a,l,u,r,o);}}catch(e){s.e(e);}finally{s.f();}}})),s=u.observe;return (u.observe=function(e){return s.call(u,e,{subtree:r,childList:r})})(t),u}(i,g,s,y),w=u.prototype.attachShadow;return w&&(u.prototype.attachShadow=function(e){var t=w.call(this,e);return m.observe(t),t}),y.length&&p(g[l](y)),{drop:function(e){for(var n=0,r=e.length;n<r;n++)t.delete(e[n]);},flush:function(){for(var e=m.takeRecords(),t=0,n=e.length;t<n;t++)p(v.call(e[t].removedNodes,h),!1),p(v.call(e[t].addedNodes,h),!0);},observer:m,parse:p}},y=self,g=y.document,m=y.Map,w=y.MutationObserver,b=y.Object,E=y.Set,S=y.WeakMap,A=y.Element,M=y.HTMLElement,O=y.Node,N=y.Error,C=y.TypeError,T=y.Reflect,q=b.defineProperty,D=b.keys,I=b.getOwnPropertyNames,P=b.setPrototypeOf,k=!self.customElements,L=function(e){for(var t=D(e),n=[],r=new E,o=t.length,a=0;a<o;a++){n[a]=e[t[a]];try{delete e[t[a]];}catch(e){r.add(a);}}return function(){for(var a=0;a<o;a++)r.has(a)||(e[t[a]]=n[a]);}};if(k){var x=function(){var e=this.constructor;if(!$.has(e))throw new C("Illegal constructor");var t=$.get(e);if(W)return F(W,t);var n=H.call(g,t);return F(P(n,e.prototype),t)},H=g.createElement,$=new m,_=new m,j=new m,R=new m,V=[],U=p({query:V,handle:function(e,t,n){var r=j.get(n);if(t&&!r.isPrototypeOf(e)){var o=L(e);W=P(e,r);try{new r.constructor;}finally{W=null,o();}}var a="".concat(t?"":"dis","connectedCallback");a in r&&e[a]();}}).parse,W=null,B=function(e){if(!_.has(e)){var t,n=new Promise((function(e){t=e;}));_.set(e,{$:n,_:t});}return _.get(e).$},F=e(B,w);self.customElements={define:function(e,t){if(R.has(e))throw new N('the name "'.concat(e,'" has already been used with this registry'));$.set(t,e),j.set(e,t.prototype),R.set(e,t),V.push(e),B(e).then((function(){U(g.querySelectorAll(e));})),_.get(e)._(t);},get:function(e){return R.get(e)},whenDefined:B},q(x.prototype=M.prototype,"constructor",{value:x}),self.HTMLElement=x,g.createElement=function(e,t){var n=t&&t.is,r=n?R.get(n):R.get(e);return r?new r:H.call(g,e)},"isConnected"in O.prototype||q(O.prototype,"isConnected",{configurable:!0,get:function(){return !(this.ownerDocument.compareDocumentPosition(this)&this.DOCUMENT_POSITION_DISCONNECTED)}});}else if(k=!self.customElements.get("extends-br"))try{var z=function e(){return self.Reflect.construct(HTMLBRElement,[],e)};z.prototype=HTMLLIElement.prototype;var G="extends-br";self.customElements.define("extends-br",z,{extends:"br"}),k=g.createElement("br",{is:G}).outerHTML.indexOf(G)<0;var J=self.customElements,K=J.get,Q=J.whenDefined;self.customElements.whenDefined=function(e){var t=this;return Q.call(this,e).then((function(n){return n||K.call(t,e)}))};}catch(e){}if(k){var X=function(e){var t=ae.get(e);ve(t.querySelectorAll(this),e.isConnected);},Y=self.customElements,Z=g.createElement,ee=Y.define,te=Y.get,ne=Y.upgrade,re=T||{construct:function(e){return e.call(this)}},oe=re.construct,ae=new S,le=new E,ie=new m,ce=new m,ue=new m,se=new m,fe=[],de=[],he=function(e){return se.get(e)||te.call(Y,e)},ve=p({query:de,handle:function(e,t,n){var r=ue.get(n);if(t&&!r.isPrototypeOf(e)){var o=L(e);we=P(e,r);try{new r.constructor;}finally{we=null,o();}}var a="".concat(t?"":"dis","connectedCallback");a in r&&e[a]();}}).parse,pe=p({query:fe,handle:function(e,t){ae.has(e)&&(t?le.add(e):le.delete(e),de.length&&X.call(de,e));}}).parse,ye=A.prototype.attachShadow;ye&&(A.prototype.attachShadow=function(e){var t=ye.call(this,e);return ae.set(this,t),t});var ge=function(e){if(!ce.has(e)){var t,n=new Promise((function(e){t=e;}));ce.set(e,{$:n,_:t});}return ce.get(e).$},me=e(ge,w),we=null;I(self).filter((function(e){return /^HTML.*Element$/.test(e)})).forEach((function(e){var t=self[e];function n(){var e=this.constructor;if(!ie.has(e))throw new C("Illegal constructor");var n=ie.get(e),r=n.is,o=n.tag;if(r){if(we)return me(we,r);var a=Z.call(g,o);return a.setAttribute("is",r),me(P(a,e.prototype),r)}return oe.call(this,t,[],e)}q(n.prototype=t.prototype,"constructor",{value:n}),q(self,e,{value:n});})),g.createElement=function(e,t){var n=t&&t.is;if(n){var r=se.get(n);if(r&&ie.get(r).tag===e)return new r}var o=Z.call(g,e);return n&&o.setAttribute("is",n),o},Y.get=he,Y.whenDefined=ge,Y.upgrade=function(e){var t=e.getAttribute("is");if(t){var n=se.get(t);if(n)return void me(P(e,n.prototype),t)}ne.call(Y,e);},Y.define=function(e,t,n){if(he(e))throw new N("'".concat(e,"' has already been defined as a custom element"));var r,o=n&&n.extends;ie.set(t,o?{is:e,tag:o}:{is:"",tag:e}),o?(r="".concat(o,'[is="').concat(e,'"]'),ue.set(r,t.prototype),se.set(e,t),de.push(r)):(ee.apply(Y,arguments),fe.push(r=e)),ge(e).then((function(){o?(ve(g.querySelectorAll(r)),le.forEach(X,[r])):pe(g.querySelectorAll(r));})),ce.get(e)._(t);};}}();
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alchemy_cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.7
4
+ version: 7.2.0.b
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas von Deyen
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2024-04-12 00:00:00.000000000 Z
16
+ date: 2024-05-16 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: actionmailer
@@ -413,20 +413,6 @@ dependencies:
413
413
  - - "<"
414
414
  - !ruby/object:Gem::Version
415
415
  version: '5.0'
416
- - !ruby/object:Gem::Dependency
417
- name: request_store
418
- requirement: !ruby/object:Gem::Requirement
419
- requirements:
420
- - - "~>"
421
- - !ruby/object:Gem::Version
422
- version: '1.2'
423
- type: :runtime
424
- prerelease: false
425
- version_requirements: !ruby/object:Gem::Requirement
426
- requirements:
427
- - - "~>"
428
- - !ruby/object:Gem::Version
429
- version: '1.2'
430
416
  - !ruby/object:Gem::Dependency
431
417
  name: responders
432
418
  requirement: !ruby/object:Gem::Requirement
@@ -510,7 +496,7 @@ dependencies:
510
496
  version: '1.4'
511
497
  - - "<"
512
498
  - !ruby/object:Gem::Version
513
- version: '2'
499
+ version: '2.1'
514
500
  type: :runtime
515
501
  prerelease: false
516
502
  version_requirements: !ruby/object:Gem::Requirement
@@ -520,7 +506,7 @@ dependencies:
520
506
  version: '1.4'
521
507
  - - "<"
522
508
  - !ruby/object:Gem::Version
523
- version: '2'
509
+ version: '2.1'
524
510
  - !ruby/object:Gem::Dependency
525
511
  name: view_component
526
512
  requirement: !ruby/object:Gem::Requirement
@@ -719,7 +705,7 @@ dependencies:
719
705
  version: '0.9'
720
706
  description: Alchemy is a powerful, userfriendly and flexible Rails CMS.
721
707
  email:
722
- - hello@alchemy-cms.com
708
+ - alchemy@blish.cloud
723
709
  executables: []
724
710
  extensions: []
725
711
  extra_rdoc_files: []
@@ -742,24 +728,12 @@ files:
742
728
  - app/assets/images/alchemy/lupe.cur
743
729
  - app/assets/images/alchemy/missing-image.svg
744
730
  - app/assets/javascripts/alchemy/admin.js
745
- - app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee
746
731
  - app/assets/javascripts/alchemy/alchemy.dialog.js.coffee
747
- - app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee
748
- - app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee
749
- - app/assets/javascripts/alchemy/alchemy.fixed_elements.js
750
- - app/assets/javascripts/alchemy/alchemy.growler.js.coffee
751
- - app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee
752
732
  - app/assets/javascripts/alchemy/alchemy.image_overlay.coffee
753
- - app/assets/javascripts/alchemy/alchemy.initializer.js.coffee
754
- - app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee
755
- - app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee
756
733
  - app/assets/javascripts/alchemy/alchemy.preview.js.coffee
757
- - app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee
758
- - app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee
759
734
  - app/assets/javascripts/alchemy/preview.js
760
735
  - app/assets/javascripts/alchemy/templates/index.js
761
736
  - app/assets/javascripts/alchemy/templates/node_folder.hbs
762
- - app/assets/javascripts/alchemy/templates/page.hbs
763
737
  - app/assets/javascripts/alchemy/templates/page_folder.hbs
764
738
  - app/assets/javascripts/tinymce/icons/remixicons/icons.js
765
739
  - app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js
@@ -770,6 +744,7 @@ files:
770
744
  - app/assets/stylesheets/alchemy/_variables.scss
771
745
  - app/assets/stylesheets/alchemy/admin.scss
772
746
  - app/assets/stylesheets/alchemy/archive.scss
747
+ - app/assets/stylesheets/alchemy/attachment-select.scss
773
748
  - app/assets/stylesheets/alchemy/attachments.scss
774
749
  - app/assets/stylesheets/alchemy/base.scss
775
750
  - app/assets/stylesheets/alchemy/buttons.scss
@@ -778,7 +753,6 @@ files:
778
753
  - app/assets/stylesheets/alchemy/dialogs.scss
779
754
  - app/assets/stylesheets/alchemy/elements.scss
780
755
  - app/assets/stylesheets/alchemy/errors.scss
781
- - app/assets/stylesheets/alchemy/filter_field.scss
782
756
  - app/assets/stylesheets/alchemy/flash.scss
783
757
  - app/assets/stylesheets/alchemy/flatpickr.scss
784
758
  - app/assets/stylesheets/alchemy/fonts.scss
@@ -790,6 +764,7 @@ files:
790
764
  - app/assets/stylesheets/alchemy/image_library.scss
791
765
  - app/assets/stylesheets/alchemy/images.scss
792
766
  - app/assets/stylesheets/alchemy/labels.scss
767
+ - app/assets/stylesheets/alchemy/list_filter.scss
793
768
  - app/assets/stylesheets/alchemy/lists.scss
794
769
  - app/assets/stylesheets/alchemy/menubar.scss
795
770
  - app/assets/stylesheets/alchemy/navigation.scss
@@ -824,8 +799,20 @@ files:
824
799
  - app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.min.scss
825
800
  - app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.css
826
801
  - app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.min.css
802
+ - app/components/alchemy/admin/attachment_select.rb
803
+ - app/components/alchemy/admin/icon.rb
804
+ - app/components/alchemy/admin/link_dialog/anchor_tab.rb
805
+ - app/components/alchemy/admin/link_dialog/base_tab.rb
806
+ - app/components/alchemy/admin/link_dialog/external_tab.rb
807
+ - app/components/alchemy/admin/link_dialog/file_tab.rb
808
+ - app/components/alchemy/admin/link_dialog/internal_tab.rb
809
+ - app/components/alchemy/admin/link_dialog/tabs.rb
810
+ - app/components/alchemy/admin/list_filter.rb
811
+ - app/components/alchemy/admin/message.rb
827
812
  - app/components/alchemy/admin/node_select.rb
828
813
  - app/components/alchemy/admin/page_select.rb
814
+ - app/components/alchemy/admin/tags_autocomplete.rb
815
+ - app/components/alchemy/admin/toolbar_button.rb
829
816
  - app/components/alchemy/ingredients/audio_view.rb
830
817
  - app/components/alchemy/ingredients/base_view.rb
831
818
  - app/components/alchemy/ingredients/boolean_view.rb
@@ -852,11 +839,13 @@ files:
852
839
  - app/controllers/alchemy/admin/legacy_page_urls_controller.rb
853
840
  - app/controllers/alchemy/admin/nodes_controller.rb
854
841
  - app/controllers/alchemy/admin/pages_controller.rb
842
+ - app/controllers/alchemy/admin/picture_descriptions_controller.rb
855
843
  - app/controllers/alchemy/admin/pictures_controller.rb
856
844
  - app/controllers/alchemy/admin/resources_controller.rb
857
845
  - app/controllers/alchemy/admin/sites_controller.rb
858
846
  - app/controllers/alchemy/admin/styleguide_controller.rb
859
847
  - app/controllers/alchemy/admin/tags_controller.rb
848
+ - app/controllers/alchemy/api/attachments_controller.rb
860
849
  - app/controllers/alchemy/api/base_controller.rb
861
850
  - app/controllers/alchemy/api/elements_controller.rb
862
851
  - app/controllers/alchemy/api/ingredients_controller.rb
@@ -891,35 +880,51 @@ files:
891
880
  - app/helpers/alchemy/url_helper.rb
892
881
  - app/javascript/alchemy_admin.js
893
882
  - app/javascript/alchemy_admin/components/alchemy_html_element.js
883
+ - app/javascript/alchemy_admin/components/attachment_select.js
894
884
  - app/javascript/alchemy_admin/components/button.js
895
885
  - app/javascript/alchemy_admin/components/char_counter.js
896
886
  - app/javascript/alchemy_admin/components/clipboard_button.js
897
887
  - app/javascript/alchemy_admin/components/datepicker.js
898
888
  - app/javascript/alchemy_admin/components/dialog_link.js
889
+ - app/javascript/alchemy_admin/components/dom_id_select.js
899
890
  - app/javascript/alchemy_admin/components/element_editor.js
891
+ - app/javascript/alchemy_admin/components/element_editor/delete_element_button.js
900
892
  - app/javascript/alchemy_admin/components/element_editor/publish_element_button.js
893
+ - app/javascript/alchemy_admin/components/elements_window.js
894
+ - app/javascript/alchemy_admin/components/growl.js
895
+ - app/javascript/alchemy_admin/components/icon.js
896
+ - app/javascript/alchemy_admin/components/index.js
901
897
  - app/javascript/alchemy_admin/components/ingredient_group.js
902
898
  - app/javascript/alchemy_admin/components/link_buttons.js
903
899
  - app/javascript/alchemy_admin/components/link_buttons/link_button.js
904
900
  - app/javascript/alchemy_admin/components/link_buttons/unlink_button.js
901
+ - app/javascript/alchemy_admin/components/list_filter.js
902
+ - app/javascript/alchemy_admin/components/message.js
905
903
  - app/javascript/alchemy_admin/components/node_select.js
906
904
  - app/javascript/alchemy_admin/components/overlay.js
907
905
  - app/javascript/alchemy_admin/components/page_select.js
906
+ - app/javascript/alchemy_admin/components/preview_window.js
908
907
  - app/javascript/alchemy_admin/components/remote_select.js
909
908
  - app/javascript/alchemy_admin/components/select.js
910
909
  - app/javascript/alchemy_admin/components/spinner.js
910
+ - app/javascript/alchemy_admin/components/tags_autocomplete.js
911
911
  - app/javascript/alchemy_admin/components/tinymce.js
912
912
  - app/javascript/alchemy_admin/components/uploader.js
913
913
  - app/javascript/alchemy_admin/components/uploader/file_upload.js
914
914
  - app/javascript/alchemy_admin/components/uploader/progress.js
915
+ - app/javascript/alchemy_admin/confirm_dialog.js
915
916
  - app/javascript/alchemy_admin/dirty.js
916
917
  - app/javascript/alchemy_admin/file_editors.js
918
+ - app/javascript/alchemy_admin/fixed_elements.js
919
+ - app/javascript/alchemy_admin/growler.js
917
920
  - app/javascript/alchemy_admin/gui.js
921
+ - app/javascript/alchemy_admin/hotkeys.js
918
922
  - app/javascript/alchemy_admin/i18n.js
919
923
  - app/javascript/alchemy_admin/image_cropper.js
920
924
  - app/javascript/alchemy_admin/image_loader.js
921
925
  - app/javascript/alchemy_admin/ingredient_anchor_link.js
922
926
  - app/javascript/alchemy_admin/initializer.js
927
+ - app/javascript/alchemy_admin/link_dialog.js
923
928
  - app/javascript/alchemy_admin/locales/en.js
924
929
  - app/javascript/alchemy_admin/node_tree.js
925
930
  - app/javascript/alchemy_admin/page_publication_fields.js
@@ -927,10 +932,10 @@ files:
927
932
  - app/javascript/alchemy_admin/picture_editors.js
928
933
  - app/javascript/alchemy_admin/picture_selector.js
929
934
  - app/javascript/alchemy_admin/please_wait_overlay.js
935
+ - app/javascript/alchemy_admin/shoelace_theme.js
930
936
  - app/javascript/alchemy_admin/sitemap.js
931
937
  - app/javascript/alchemy_admin/sortable_elements.js
932
938
  - app/javascript/alchemy_admin/spinner.js
933
- - app/javascript/alchemy_admin/tags_autocomplete.js
934
939
  - app/javascript/alchemy_admin/utils/ajax.js
935
940
  - app/javascript/alchemy_admin/utils/debounce.js
936
941
  - app/javascript/alchemy_admin/utils/dom_helpers.js
@@ -946,6 +951,7 @@ files:
946
951
  - app/models/alchemy/attachment.rb
947
952
  - app/models/alchemy/attachment/url.rb
948
953
  - app/models/alchemy/base_record.rb
954
+ - app/models/alchemy/current.rb
949
955
  - app/models/alchemy/eager_loading.rb
950
956
  - app/models/alchemy/element.rb
951
957
  - app/models/alchemy/element/definitions.rb
@@ -993,6 +999,7 @@ files:
993
999
  - app/models/alchemy/picture/preprocessor.rb
994
1000
  - app/models/alchemy/picture/transformations.rb
995
1001
  - app/models/alchemy/picture/url.rb
1002
+ - app/models/alchemy/picture_description.rb
996
1003
  - app/models/alchemy/picture_thumb.rb
997
1004
  - app/models/alchemy/picture_thumb/create.rb
998
1005
  - app/models/alchemy/picture_thumb/file_store.rb
@@ -1002,7 +1009,6 @@ files:
1002
1009
  - app/models/alchemy/site.rb
1003
1010
  - app/models/alchemy/site/layout.rb
1004
1011
  - app/models/alchemy/tag.rb
1005
- - app/models/alchemy/tree_node.rb
1006
1012
  - app/models/concerns/alchemy/dom_ids.rb
1007
1013
  - app/models/concerns/alchemy/picture_thumbnails.rb
1008
1014
  - app/models/concerns/alchemy/touch_elements.rb
@@ -1011,6 +1017,7 @@ files:
1011
1017
  - app/serializers/alchemy/element_serializer.rb
1012
1018
  - app/serializers/alchemy/ingredient_serializer.rb
1013
1019
  - app/serializers/alchemy/node_serializer.rb
1020
+ - app/serializers/alchemy/page_node_serializer.rb
1014
1021
  - app/serializers/alchemy/page_serializer.rb
1015
1022
  - app/serializers/alchemy/page_tree_serializer.rb
1016
1023
  - app/serializers/alchemy/picture_serializer.rb
@@ -1053,7 +1060,6 @@ files:
1053
1060
  - app/views/alchemy/admin/elements/_header.html.erb
1054
1061
  - app/views/alchemy/admin/elements/_toolbar.html.erb
1055
1062
  - app/views/alchemy/admin/elements/create.js.erb
1056
- - app/views/alchemy/admin/elements/destroy.js.erb
1057
1063
  - app/views/alchemy/admin/elements/index.html.erb
1058
1064
  - app/views/alchemy/admin/elements/new.html.erb
1059
1065
  - app/views/alchemy/admin/ingredients/_audio_fields.html.erb
@@ -1075,25 +1081,29 @@ files:
1075
1081
  - app/views/alchemy/admin/layoutpages/edit.html.erb
1076
1082
  - app/views/alchemy/admin/layoutpages/index.html.erb
1077
1083
  - app/views/alchemy/admin/leave.html.erb
1078
- - app/views/alchemy/admin/legacy_page_urls/_form.html.erb
1079
1084
  - app/views/alchemy/admin/legacy_page_urls/_label.html.erb
1080
1085
  - app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb
1081
1086
  - app/views/alchemy/admin/legacy_page_urls/_new.html.erb
1082
- - app/views/alchemy/admin/legacy_page_urls/create.js.erb
1083
- - app/views/alchemy/admin/legacy_page_urls/destroy.js.erb
1084
- - app/views/alchemy/admin/legacy_page_urls/update.js.erb
1087
+ - app/views/alchemy/admin/legacy_page_urls/_table.html.erb
1088
+ - app/views/alchemy/admin/legacy_page_urls/_update.turbo_stream.erb
1089
+ - app/views/alchemy/admin/legacy_page_urls/create.turbo_stream.erb
1090
+ - app/views/alchemy/admin/legacy_page_urls/destroy.turbo_stream.erb
1091
+ - app/views/alchemy/admin/legacy_page_urls/edit.html.erb
1092
+ - app/views/alchemy/admin/legacy_page_urls/show.html.erb
1093
+ - app/views/alchemy/admin/legacy_page_urls/update.turbo_stream.erb
1085
1094
  - app/views/alchemy/admin/nodes/_form.html.erb
1095
+ - app/views/alchemy/admin/nodes/_label.html.erb
1086
1096
  - app/views/alchemy/admin/nodes/_node.html.erb
1097
+ - app/views/alchemy/admin/nodes/_page_nodes.html.erb
1098
+ - app/views/alchemy/admin/nodes/_update.turbo_stream.erb
1099
+ - app/views/alchemy/admin/nodes/create.turbo_stream.erb
1100
+ - app/views/alchemy/admin/nodes/destroy.turbo_stream.erb
1087
1101
  - app/views/alchemy/admin/nodes/edit.html.erb
1088
1102
  - app/views/alchemy/admin/nodes/index.html.erb
1089
1103
  - app/views/alchemy/admin/nodes/new.html.erb
1090
- - app/views/alchemy/admin/pages/_anchor_link.html.erb
1091
1104
  - app/views/alchemy/admin/pages/_create_language_form.html.erb
1092
1105
  - app/views/alchemy/admin/pages/_current_page.html.erb
1093
- - app/views/alchemy/admin/pages/_external_link.html.erb
1094
- - app/views/alchemy/admin/pages/_file_link.html.erb
1095
1106
  - app/views/alchemy/admin/pages/_form.html.erb
1096
- - app/views/alchemy/admin/pages/_internal_link.html.erb
1097
1107
  - app/views/alchemy/admin/pages/_legacy_urls.html.erb
1098
1108
  - app/views/alchemy/admin/pages/_locked_page.html.erb
1099
1109
  - app/views/alchemy/admin/pages/_new_page_form.html.erb
@@ -1111,7 +1121,6 @@ files:
1111
1121
  - app/views/alchemy/admin/pages/flush.js.erb
1112
1122
  - app/views/alchemy/admin/pages/index.html.erb
1113
1123
  - app/views/alchemy/admin/pages/info.html.erb
1114
- - app/views/alchemy/admin/pages/link.html.erb
1115
1124
  - app/views/alchemy/admin/pages/list/_table.html.erb
1116
1125
  - app/views/alchemy/admin/pages/locked.html.erb
1117
1126
  - app/views/alchemy/admin/pages/new.html.erb
@@ -1119,7 +1128,6 @@ files:
1119
1128
  - app/views/alchemy/admin/pages/unlock.js.erb
1120
1129
  - app/views/alchemy/admin/pages/update.js.erb
1121
1130
  - app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb
1122
- - app/views/alchemy/admin/partials/_flash.html.erb
1123
1131
  - app/views/alchemy/admin/partials/_flash_notices.html.erb
1124
1132
  - app/views/alchemy/admin/partials/_language_tree_select.html.erb
1125
1133
  - app/views/alchemy/admin/partials/_main_navigation_entry.html.erb
@@ -1128,13 +1136,15 @@ files:
1128
1136
  - app/views/alchemy/admin/partials/_search_form.html.erb
1129
1137
  - app/views/alchemy/admin/partials/_site_select.html.erb
1130
1138
  - app/views/alchemy/admin/partials/_sub_navigation.html.erb
1131
- - app/views/alchemy/admin/partials/_toolbar_button.html.erb
1139
+ - app/views/alchemy/admin/picture_descriptions/_form.html.erb
1140
+ - app/views/alchemy/admin/picture_descriptions/edit.html.erb
1132
1141
  - app/views/alchemy/admin/pictures/_archive.html.erb
1133
1142
  - app/views/alchemy/admin/pictures/_archive_overlay.html.erb
1134
1143
  - app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb
1135
1144
  - app/views/alchemy/admin/pictures/_form.html.erb
1136
1145
  - app/views/alchemy/admin/pictures/_infos.html.erb
1137
1146
  - app/views/alchemy/admin/pictures/_picture.html.erb
1147
+ - app/views/alchemy/admin/pictures/_picture_description_field.html.erb
1138
1148
  - app/views/alchemy/admin/pictures/_picture_to_assign.html.erb
1139
1149
  - app/views/alchemy/admin/pictures/_tag_list.html.erb
1140
1150
  - app/views/alchemy/admin/pictures/archive_overlay.js.erb
@@ -1257,6 +1267,7 @@ files:
1257
1267
  - db/migrate/20230123112425_add_searchable_to_alchemy_pages.rb
1258
1268
  - db/migrate/20230505132743_add_indexes_to_alchemy_pictures.rb
1259
1269
  - db/migrate/20231113104432_create_page_mutexes.rb
1270
+ - db/migrate/20240314105244_create_alchemy_picture_descriptions.rb
1260
1271
  - eslint.config.js
1261
1272
  - lib/alchemy.rb
1262
1273
  - lib/alchemy/ability_helper.rb
@@ -1376,23 +1387,19 @@ files:
1376
1387
  - lib/non_stupid_digest_assets.rb
1377
1388
  - lib/tasks/alchemy/db.rake
1378
1389
  - lib/tasks/alchemy/install.rake
1390
+ - lib/tasks/alchemy/sitemap.rake
1379
1391
  - lib/tasks/alchemy/thumbnails.rake
1380
1392
  - lib/tasks/alchemy/tidy.rake
1381
1393
  - lib/tasks/alchemy/upgrade.rake
1382
1394
  - lib/tasks/alchemy/usage.rake
1383
1395
  - package.json
1384
1396
  - rollup.config.mjs
1385
- - vendor/assets/fonts/remixicon.eot
1386
- - vendor/assets/fonts/remixicon.svg
1387
- - vendor/assets/fonts/remixicon.ttf
1388
- - vendor/assets/fonts/remixicon.woff
1389
- - vendor/assets/fonts/remixicon.woff2
1397
+ - vendor/assets/fonts/remixicon.symbol.svg
1390
1398
  - vendor/assets/images/Jcrop.gif
1391
1399
  - vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js
1392
1400
  - vendor/assets/javascripts/jquery_plugins/select2.js
1393
1401
  - vendor/assets/stylesheets/alchemy_admin/select2.scss
1394
1402
  - vendor/assets/stylesheets/jquery.Jcrop.min.scss
1395
- - vendor/assets/stylesheets/remixicon.scss
1396
1403
  - vendor/assets/stylesheets/tinymce/skins/content/default/content.min.css
1397
1404
  - vendor/javascript/clipboard.min.js
1398
1405
  - vendor/javascript/flatpickr.min.js
@@ -1404,7 +1411,7 @@ files:
1404
1411
  - vendor/javascript/ungap-custom-elements.min.js
1405
1412
  homepage: https://alchemy-cms.com
1406
1413
  licenses:
1407
- - BSD New
1414
+ - BSD-3-Clause
1408
1415
  metadata: {}
1409
1416
  post_install_message: |+
1410
1417
  -------------------------------------------------------------
@@ -1442,7 +1449,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1442
1449
  version: '0'
1443
1450
  requirements:
1444
1451
  - ImageMagick (libmagick), v6.6 or greater.
1445
- rubygems_version: 3.4.19
1452
+ rubygems_version: 3.5.9
1446
1453
  signing_key:
1447
1454
  specification_version: 4
1448
1455
  summary: A powerful, userfriendly and flexible CMS for Rails
@@ -1,85 +0,0 @@
1
- class window.Alchemy.ConfirmDialog extends Alchemy.Dialog
2
-
3
- DEFAULTS:
4
- header_height: 36
5
- size: '300x100'
6
- padding: true
7
- modal: true
8
- title: 'Please confirm'
9
- ok_label: 'Yes'
10
- cancel_label: 'No'
11
- on_ok: ->
12
-
13
- constructor: (@message, @options = {}) ->
14
- super('', @options)
15
-
16
- load: ->
17
- @dialog_title.text @options.title
18
- @dialog_body.html "<p>#{@message}</p>"
19
- @dialog_body.append @build_buttons()
20
- @bind_buttons()
21
-
22
- build_buttons: ->
23
- $btn_container = $('<div class="alchemy-dialog-buttons" />')
24
- @cancel_button = $("<button class=\"cancel secondary\">#{@options.cancel_label}</button>")
25
- @ok_button = $("<button class=\"confirm\">#{@options.ok_label}</button>")
26
- $btn_container.append(@cancel_button)
27
- $btn_container.append(@ok_button)
28
- $btn_container
29
-
30
- bind_buttons: ->
31
- @cancel_button.focus()
32
- @cancel_button.on "click", =>
33
- @close()
34
- false
35
- @ok_button.on "click", =>
36
- @close()
37
- @options.on_ok()
38
- false
39
-
40
- # Opens a confirm dialog
41
- #
42
- # Arguments:
43
- #
44
- # message - The message that will be displayed to the user (String)
45
- #
46
- # Options:
47
- #
48
- # title: '' - The title of the overlay window (String)
49
- # cancel_label: '' - The label of the cancel button (String)
50
- # ok_label: '' - The label of the ok button (String)
51
- # on_ok: null - The function to invoke on confirmation (Function)
52
- #
53
- window.Alchemy.openConfirmDialog = (message, options = {}) ->
54
- dialog = new Alchemy.ConfirmDialog(message, options)
55
- dialog.open()
56
-
57
- # Opens a confirm to delete dialog
58
- #
59
- # Arguments:
60
- #
61
- # url - The url to the server delete action. Uses DELETE as HTTP method. (String)
62
- # opts - An options object (Object)
63
- #
64
- # Options:
65
- #
66
- # title: '' - The title of the confirmation window (String)
67
- # message: '' - The message that will be displayed to the user (String)
68
- # ok_label: '' - The label for the ok button (String)
69
- # cancel_label: '' - The label for the cancel button (String)
70
- #
71
- window.Alchemy.confirmToDeleteDialog = (url, opts) ->
72
- options =
73
- on_ok: ->
74
- Alchemy.pleaseWaitOverlay()
75
- $.ajax
76
- url: url
77
- type: "DELETE"
78
- error: (xhr, status, error) ->
79
- type = if xhr.status == 403 then 'warning' else 'error'
80
- Alchemy.growl(xhr.responseText || error, type)
81
- complete: () ->
82
- Alchemy.pleaseWaitOverlay(false)
83
-
84
- $.extend(options, opts)
85
- Alchemy.openConfirmDialog options.message, options
@@ -1,107 +0,0 @@
1
- window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
2
-
3
- # Adds buttons into a toolbar inside of overlay windows
4
- Alchemy.ToolbarButton = (options) ->
5
- $btn = $("<sl-tooltip content='#{options.label}' placement='top-#{options.align}'></sl-tooltip>")
6
- if options.align
7
- $btn.addClass(options.class)
8
- if options.buttonId
9
- $btn.attr(id: options.buttonId)
10
- $lnk = $("<a class='icon_button' href='#' />")
11
- if options.hotkey
12
- $lnk.attr('data-alchemy-hotkey', options.hotkey)
13
- $lnk.on "click", (e) ->
14
- e.preventDefault()
15
- options.onClick(e)
16
- return
17
- $lnk.append "<i class='icon ri-#{options.iconClass} ri-fw' />"
18
- $btn.append $lnk
19
- $btn
20
-
21
- Alchemy.ElementsWindow =
22
-
23
- init: (url, options, callback) ->
24
- @hidden = false
25
- @$body = $('body')
26
- @element_window = $('<div id="alchemy_elements_window"/>')
27
- @element_area = $('<div id="element_area"/>')
28
- @url = url
29
- @options = options
30
- @callback = callback
31
- @element_window.append @createToolbar(options.toolbarButtons)
32
- @element_window.append @element_area
33
- @button = $('#element_window_button')
34
- @button.on "click", =>
35
- @hide()
36
- false
37
-
38
- window.requestAnimationFrame =>
39
- spinner = new Alchemy.Spinner('medium')
40
- spinner.spin @element_area[0]
41
-
42
- window.addEventListener 'message', (event) =>
43
- data = event.data
44
- if data?.message == 'Alchemy.focusElementEditor'
45
- element = document.getElementById("element_#{data.element_id}")
46
- Alchemy.ElementsWindow.show()
47
- element?.focusElement()
48
- true
49
-
50
- @$body.on "click", (evt) =>
51
- unless evt.target.closest(".element-editor")
52
- @element_area.find('.element-editor').removeClass('selected')
53
- Alchemy.PreviewWindow.postMessage(message: 'Alchemy.blurElements')
54
- return
55
-
56
- $('#main_content').append(@element_window)
57
- @show()
58
- @reload()
59
-
60
- createToolbar: (buttons) ->
61
- @toolbar = $('<div class="elements-window-toolbar" />')
62
- buttons.push
63
- label: Alchemy.t("Collapse all elements")
64
- iconClass: "contract-up-down-line"
65
- align: "end"
66
- class: "right"
67
- onClick: =>
68
- $("alchemy-element-editor:not([compact]):not([fixed])").each () ->
69
- @collapse()
70
- for btn in buttons
71
- @toolbar.append Alchemy.ToolbarButton(btn)
72
- @toolbar.append @collapseAllBtn
73
-
74
- reload: ->
75
- $.get @url, (data) =>
76
- @element_area.html data
77
- Alchemy.SortableElements()
78
- if @callback
79
- @callback.call()
80
- .fail (xhr, status, error) =>
81
- Alchemy.Dialog::show_error(xhr, error, @element_area)
82
-
83
- hide: ->
84
- @$body.removeClass('elements-window-visible');
85
- @hidden = true
86
- @toggleButton()
87
-
88
- show: ->
89
- @$body.addClass('elements-window-visible');
90
- @hidden = false
91
- @toggleButton()
92
-
93
- toggleButton: ->
94
- if @hidden
95
- @button.find('label').text(@options.texts.showElements)
96
- @button.find('.icon').removeClass("ri-menu-unfold-line").addClass("ri-menu-fold-line")
97
- @button.off('click')
98
- @button.on "click", =>
99
- @show()
100
- false
101
- else
102
- @button.find('label').text(@options.texts.hideElements)
103
- @button.find('.icon').removeClass("ri-menu-fold-line").addClass("ri-menu-unfold-line")
104
- @button.off('click')
105
- @button.on "click", =>
106
- @hide()
107
- false
@@ -1,66 +0,0 @@
1
- window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
2
-
3
- Alchemy.FileProgress = (file) ->
4
-
5
- # Build Wrapper
6
- @$fileProgressWrapper = $('<div class="progress-wrapper"/>')
7
-
8
- # Build Container
9
- @$fileProgressElement = $('<div class="progress-container"/>')
10
-
11
- # Append Cancel Button
12
- @$fileProgressCancel = $('<a href="javascript:void(0);" class="progress-cancel"><i class="icon ri-close-line ri-fw" /></a>')
13
- @$fileProgressElement.append @$fileProgressCancel
14
-
15
- # Append Filename
16
- @$fileProgressElement.append "<div class=\"progress-name\">" + file.name + "</div>"
17
-
18
- # Append Progressbar Status Text
19
- @$fileProgressStatus = $('<div class="progress-bar-status">&nbsp;</div>')
20
- @$fileProgressElement.append @$fileProgressStatus
21
-
22
- # Build Progressbar Container
23
- $progressBarContainer = $('<div class="progress-bar-container"/>')
24
-
25
- # Build Progressbar
26
- @$progressBar = $('<div class="progress-bar-in-progress"/>')
27
-
28
- # Knit all together
29
- $progressBarContainer.append @$progressBar
30
- @$fileProgressElement.append $progressBarContainer
31
- @$fileProgressWrapper.append @$fileProgressElement
32
- $('.upload-progress-container').append @$fileProgressWrapper
33
- this
34
-
35
- Alchemy.FileProgress::reset = ->
36
- @$fileProgressStatus.html '&nbsp;'
37
- @$progressBar.removeClass().addClass 'progress-bar-in-progress'
38
- @$progressBar.css width: '0%'
39
-
40
- Alchemy.FileProgress::setProgress = (percentage) ->
41
- @$progressBar.removeClass().addClass 'progress-bar-in-progress'
42
- @$progressBar.css width: percentage + '%'
43
-
44
- Alchemy.FileProgress::setComplete = ->
45
- @$progressBar.removeClass().addClass 'progress-bar-complete'
46
- @$progressBar.css width: '100%'
47
- @$fileProgressCancel.hide()
48
- @$fileProgressWrapper.delay(1500).fadeOut ->
49
- $(this).remove()
50
-
51
- Alchemy.FileProgress::setError = ->
52
- @$progressBar.removeClass().addClass 'progress-bar-error'
53
- @$progressBar.css width: '100%'
54
-
55
- Alchemy.FileProgress::setCancelled = ->
56
- @$progressBar.removeClass().addClass 'progress-bar-canceled'
57
- @$progressBar.css width: '100%'
58
- @$fileProgressCancel.hide()
59
- @$fileProgressWrapper.delay(1500).fadeOut ->
60
- $(this).remove()
61
- if $('.upload-progress-container').is(':empty')
62
- $('.overall-upload').removeClass('visible')
63
- return
64
-
65
- Alchemy.FileProgress::setStatus = (status) ->
66
- @$fileProgressStatus.text Alchemy.t(status)