alchemy_cms 7.1.13 → 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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +132 -39
  3. data/Gemfile +2 -11
  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 +74 -42
  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 +3 -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/datetime_view.rb +2 -3
  62. data/app/components/alchemy/ingredients/link_view.rb +1 -7
  63. data/app/components/alchemy/ingredients/picture_view.rb +2 -2
  64. data/app/components/alchemy/ingredients/text_view.rb +1 -2
  65. data/app/controllers/alchemy/admin/base_controller.rb +3 -27
  66. data/app/controllers/alchemy/admin/elements_controller.rb +4 -2
  67. data/app/controllers/alchemy/admin/ingredients_controller.rb +2 -0
  68. data/app/controllers/alchemy/admin/languages_controller.rb +2 -2
  69. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -19
  70. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +12 -4
  71. data/app/controllers/alchemy/admin/nodes_controller.rb +26 -0
  72. data/app/controllers/alchemy/admin/pages_controller.rb +16 -79
  73. data/app/controllers/alchemy/admin/picture_descriptions_controller.rb +15 -0
  74. data/app/controllers/alchemy/admin/pictures_controller.rb +18 -1
  75. data/app/controllers/alchemy/admin/resources_controller.rb +16 -11
  76. data/app/controllers/alchemy/api/attachments_controller.rb +44 -0
  77. data/app/controllers/alchemy/api/pages_controller.rb +10 -6
  78. data/app/controllers/alchemy/base_controller.rb +2 -2
  79. data/app/controllers/alchemy/messages_controller.rb +3 -3
  80. data/app/controllers/alchemy/pages_controller.rb +8 -6
  81. data/app/controllers/concerns/alchemy/admin/current_language.rb +1 -11
  82. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +1 -1
  83. data/app/decorators/alchemy/element_editor.rb +2 -2
  84. data/app/helpers/alchemy/admin/base_helper.rb +8 -60
  85. data/app/helpers/alchemy/admin/elements_helper.rb +1 -1
  86. data/app/helpers/alchemy/admin/ingredients_helper.rb +1 -1
  87. data/app/helpers/alchemy/base_helper.rb +9 -91
  88. data/app/helpers/alchemy/elements_helper.rb +3 -3
  89. data/app/helpers/alchemy/pages_helper.rb +16 -9
  90. data/app/javascript/alchemy_admin/components/attachment_select.js +24 -0
  91. data/app/javascript/alchemy_admin/components/button.js +3 -0
  92. data/app/javascript/alchemy_admin/components/clipboard_button.js +3 -2
  93. data/app/javascript/alchemy_admin/components/dialog_link.js +10 -7
  94. data/app/javascript/alchemy_admin/components/dom_id_select.js +69 -0
  95. data/app/javascript/alchemy_admin/components/element_editor/delete_element_button.js +42 -0
  96. data/app/javascript/alchemy_admin/components/element_editor/publish_element_button.js +4 -2
  97. data/app/javascript/alchemy_admin/components/element_editor.js +21 -13
  98. data/app/javascript/alchemy_admin/components/elements_window.js +87 -0
  99. data/app/javascript/alchemy_admin/components/growl.js +13 -0
  100. data/app/javascript/alchemy_admin/components/icon.js +51 -0
  101. data/app/javascript/alchemy_admin/components/index.js +24 -0
  102. data/app/javascript/alchemy_admin/components/ingredient_group.js +6 -0
  103. data/app/javascript/alchemy_admin/components/link_buttons/link_button.js +21 -11
  104. data/app/javascript/alchemy_admin/components/link_buttons/unlink_button.js +2 -1
  105. data/app/javascript/alchemy_admin/components/link_buttons.js +1 -0
  106. data/app/javascript/alchemy_admin/components/list_filter.js +68 -0
  107. data/app/javascript/alchemy_admin/components/message.js +69 -0
  108. data/app/javascript/alchemy_admin/components/node_select.js +1 -1
  109. data/app/javascript/alchemy_admin/components/overlay.js +6 -6
  110. data/app/javascript/alchemy_admin/components/page_select.js +3 -7
  111. data/app/javascript/alchemy_admin/components/preview_window.js +121 -0
  112. data/app/javascript/alchemy_admin/components/remote_select.js +4 -1
  113. data/app/javascript/alchemy_admin/components/select.js +37 -1
  114. data/app/javascript/alchemy_admin/components/tags_autocomplete.js +57 -0
  115. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +4 -3
  116. data/app/javascript/alchemy_admin/components/uploader/progress.js +1 -1
  117. data/app/javascript/alchemy_admin/confirm_dialog.js +133 -0
  118. data/app/javascript/alchemy_admin/dirty.js +19 -14
  119. data/app/javascript/alchemy_admin/fixed_elements.js +24 -0
  120. data/app/javascript/alchemy_admin/growler.js +15 -0
  121. data/app/javascript/alchemy_admin/gui.js +2 -4
  122. data/app/javascript/alchemy_admin/hotkeys.js +60 -0
  123. data/app/javascript/alchemy_admin/image_loader.js +2 -2
  124. data/app/javascript/alchemy_admin/ingredient_anchor_link.js +2 -3
  125. data/app/javascript/alchemy_admin/initializer.js +1 -8
  126. data/app/javascript/alchemy_admin/link_dialog.js +131 -0
  127. data/app/javascript/alchemy_admin/locales/en.js +3 -0
  128. data/app/javascript/alchemy_admin/node_tree.js +4 -3
  129. data/app/javascript/alchemy_admin/page_sorter.js +23 -14
  130. data/app/javascript/alchemy_admin/picture_editors.js +6 -5
  131. data/app/javascript/alchemy_admin/shoelace_theme.js +60 -0
  132. data/app/javascript/alchemy_admin/sitemap.js +9 -3
  133. data/app/javascript/alchemy_admin/sortable_elements.js +4 -6
  134. data/app/javascript/alchemy_admin.js +18 -42
  135. data/app/models/alchemy/current.rb +26 -0
  136. data/app/models/alchemy/element.rb +1 -1
  137. data/app/models/alchemy/ingredients/audio.rb +0 -11
  138. data/app/models/alchemy/ingredients/datetime.rb +1 -1
  139. data/app/models/alchemy/ingredients/headline.rb +8 -1
  140. data/app/models/alchemy/ingredients/picture.rb +6 -0
  141. data/app/models/alchemy/ingredients/video.rb +0 -12
  142. data/app/models/alchemy/language.rb +8 -6
  143. data/app/models/alchemy/node.rb +2 -2
  144. data/app/models/alchemy/page/page_elements.rb +8 -8
  145. data/app/models/alchemy/page/page_layouts.rb +3 -3
  146. data/app/models/alchemy/page/page_natures.rb +13 -9
  147. data/app/models/alchemy/page/page_scopes.rb +2 -2
  148. data/app/models/alchemy/page/publisher.rb +1 -0
  149. data/app/models/alchemy/page.rb +16 -31
  150. data/app/models/alchemy/picture.rb +8 -0
  151. data/app/models/alchemy/picture_description.rb +8 -0
  152. data/app/models/alchemy/picture_variant.rb +1 -1
  153. data/app/models/alchemy/site.rb +10 -7
  154. data/app/models/concerns/alchemy/picture_thumbnails.rb +5 -4
  155. data/app/serializers/alchemy/attachment_serializer.rb +8 -0
  156. data/app/serializers/alchemy/page_node_serializer.rb +9 -0
  157. data/app/views/alchemy/_menubar.html.erb +1 -1
  158. data/app/views/alchemy/_preview_mode_code.html.erb +1 -1
  159. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +2 -2
  160. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +0 -1
  161. data/app/views/alchemy/admin/attachments/edit.html.erb +3 -4
  162. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  163. data/app/views/alchemy/admin/clipboard/index.html.erb +1 -1
  164. data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
  165. data/app/views/alchemy/admin/clipboard/remove.js.erb +1 -1
  166. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  167. data/app/views/alchemy/admin/dashboard/_sites.html.erb +1 -1
  168. data/app/views/alchemy/admin/dashboard/help.html.erb +48 -12
  169. data/app/views/alchemy/admin/dashboard/index.html.erb +1 -1
  170. data/app/views/alchemy/admin/dashboard/info.html.erb +5 -8
  171. data/app/views/alchemy/admin/elements/_add_nested_element_form.html.erb +1 -1
  172. data/app/views/alchemy/admin/elements/_element.html.erb +5 -5
  173. data/app/views/alchemy/admin/elements/_footer.html.erb +1 -1
  174. data/app/views/alchemy/admin/elements/_header.html.erb +6 -2
  175. data/app/views/alchemy/admin/elements/_toolbar.html.erb +8 -6
  176. data/app/views/alchemy/admin/elements/create.js.erb +0 -5
  177. data/app/views/alchemy/admin/elements/index.html.erb +70 -34
  178. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +1 -2
  179. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +3 -5
  180. data/app/views/alchemy/admin/languages/_language.html.erb +1 -1
  181. data/app/views/alchemy/admin/languages/index.html.erb +2 -2
  182. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +18 -18
  183. data/app/views/alchemy/admin/layoutpages/edit.html.erb +4 -5
  184. data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
  185. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +10 -11
  186. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +15 -17
  187. data/app/views/alchemy/admin/legacy_page_urls/_table.html.erb +16 -0
  188. data/app/views/alchemy/admin/legacy_page_urls/_update.turbo_stream.erb +12 -0
  189. data/app/views/alchemy/admin/legacy_page_urls/create.turbo_stream.erb +8 -0
  190. data/app/views/alchemy/admin/legacy_page_urls/destroy.turbo_stream.erb +1 -0
  191. data/app/views/alchemy/admin/legacy_page_urls/edit.html.erb +27 -0
  192. data/app/views/alchemy/admin/legacy_page_urls/show.html.erb +1 -0
  193. data/app/views/alchemy/admin/legacy_page_urls/update.turbo_stream.erb +1 -0
  194. data/app/views/alchemy/admin/nodes/_form.html.erb +12 -11
  195. data/app/views/alchemy/admin/nodes/_label.html.erb +1 -0
  196. data/app/views/alchemy/admin/nodes/_node.html.erb +19 -19
  197. data/app/views/alchemy/admin/nodes/_page_nodes.html.erb +48 -0
  198. data/app/views/alchemy/admin/nodes/_update.turbo_stream.erb +9 -0
  199. data/app/views/alchemy/admin/nodes/create.turbo_stream.erb +1 -0
  200. data/app/views/alchemy/admin/nodes/destroy.turbo_stream.erb +1 -0
  201. data/app/views/alchemy/admin/nodes/index.html.erb +3 -3
  202. data/app/views/alchemy/admin/pages/_form.html.erb +3 -4
  203. data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +4 -15
  204. data/app/views/alchemy/admin/pages/_page.html.erb +39 -39
  205. data/app/views/alchemy/admin/pages/_table_row.html.erb +3 -3
  206. data/app/views/alchemy/admin/pages/_toolbar.html.erb +2 -2
  207. data/app/views/alchemy/admin/pages/configure.html.erb +6 -0
  208. data/app/views/alchemy/admin/pages/edit.html.erb +15 -62
  209. data/app/views/alchemy/admin/pages/unlock.js.erb +3 -3
  210. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +3 -1
  211. data/app/views/alchemy/admin/partials/_flash_notices.html.erb +4 -2
  212. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
  213. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +5 -2
  214. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -2
  215. data/app/views/alchemy/admin/partials/_search_form.html.erb +2 -2
  216. data/app/views/alchemy/admin/partials/_site_select.html.erb +1 -1
  217. data/app/views/alchemy/admin/picture_descriptions/_form.html.erb +11 -0
  218. data/app/views/alchemy/admin/picture_descriptions/edit.html.erb +6 -0
  219. data/app/views/alchemy/admin/pictures/_form.html.erb +4 -3
  220. data/app/views/alchemy/admin/pictures/_infos.html.erb +1 -1
  221. data/app/views/alchemy/admin/pictures/_picture_description_field.html.erb +29 -0
  222. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
  223. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +0 -2
  224. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +3 -3
  225. data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
  226. data/app/views/alchemy/admin/resources/_form.html.erb +3 -4
  227. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +1 -1
  228. data/app/views/alchemy/admin/resources/_tag_list.html.erb +2 -2
  229. data/app/views/alchemy/admin/resources/index.html.erb +2 -2
  230. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  231. data/app/views/alchemy/admin/styleguide/index.html.erb +29 -24
  232. data/app/views/alchemy/admin/tags/_tag.html.erb +1 -1
  233. data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
  234. data/app/views/alchemy/admin/tags/index.html.erb +1 -1
  235. data/app/views/alchemy/base/500.html.erb +7 -18
  236. data/app/views/alchemy/base/error_notice.html.erb +3 -1
  237. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
  238. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +2 -3
  239. data/app/views/alchemy/ingredients/_headline_editor.html.erb +13 -8
  240. data/app/views/alchemy/ingredients/_picture_editor.html.erb +1 -1
  241. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +1 -1
  242. data/app/views/alchemy/language_links/_language.html.erb +1 -1
  243. data/app/views/kaminari/alchemy/_first_page.html.erb +2 -2
  244. data/app/views/kaminari/alchemy/_gap.html.erb +1 -1
  245. data/app/views/kaminari/alchemy/_last_page.html.erb +2 -2
  246. data/app/views/kaminari/alchemy/_next_page.html.erb +2 -2
  247. data/app/views/kaminari/alchemy/_prev_page.html.erb +2 -2
  248. data/app/views/layouts/alchemy/admin.html.erb +2 -1
  249. data/bundles/shoelace.js +3 -1
  250. data/config/locales/alchemy.en.yml +16 -3
  251. data/config/routes.rb +4 -2
  252. data/db/migrate/20240314105244_create_alchemy_picture_descriptions.rb +11 -0
  253. data/lib/alchemy/configuration_methods.rb +1 -1
  254. data/lib/alchemy/controller_actions.rb +3 -3
  255. data/lib/alchemy/element_definition.rb +10 -6
  256. data/lib/alchemy/engine.rb +19 -2
  257. data/lib/alchemy/page_layout.rb +10 -6
  258. data/lib/alchemy/permissions.rb +4 -3
  259. data/lib/alchemy/resource.rb +4 -14
  260. data/lib/alchemy/routing_constraints.rb +1 -1
  261. data/lib/alchemy/seeder.rb +2 -2
  262. data/lib/alchemy/test_support/capybara_helpers.rb +4 -0
  263. data/lib/alchemy/test_support/factories/language_factory.rb +1 -1
  264. data/lib/alchemy/test_support/shared_contexts.rb +8 -0
  265. data/lib/alchemy/tinymce.rb +2 -1
  266. data/lib/alchemy/version.rb +1 -1
  267. data/lib/alchemy.rb +36 -0
  268. data/lib/alchemy_cms.rb +0 -1
  269. data/lib/generators/alchemy/menus/templates/node.html.erb +2 -2
  270. data/lib/generators/alchemy/menus/templates/node.html.haml +2 -2
  271. data/lib/generators/alchemy/menus/templates/node.html.slim +2 -2
  272. data/lib/generators/alchemy/menus/templates/wrapper.html.erb +1 -1
  273. data/lib/generators/alchemy/menus/templates/wrapper.html.haml +1 -1
  274. data/lib/generators/alchemy/menus/templates/wrapper.html.slim +1 -1
  275. data/lib/tasks/alchemy/sitemap.rake +97 -0
  276. data/lib/tasks/alchemy/tidy.rake +1 -0
  277. data/package.json +8 -8
  278. data/vendor/assets/fonts/remixicon.symbol.svg +11 -0
  279. data/vendor/javascript/shoelace.min.js +333 -118
  280. data/vendor/javascript/sortable.min.js +1 -1
  281. data/vendor/javascript/tinymce.min.js +1 -1
  282. data/vendor/javascript/ungap-custom-elements.min.js +1 -1
  283. metadata +63 -55
  284. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +0 -85
  285. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +0 -107
  286. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +0 -66
  287. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +0 -45
  288. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +0 -24
  289. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +0 -49
  290. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +0 -0
  291. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +0 -230
  292. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +0 -49
  293. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +0 -82
  294. data/app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee +0 -11
  295. data/app/assets/javascripts/alchemy/templates/page.hbs +0 -19
  296. data/app/javascript/alchemy_admin/tags_autocomplete.js +0 -46
  297. data/app/models/alchemy/tree_node.rb +0 -7
  298. data/app/views/alchemy/admin/elements/destroy.js.erb +0 -8
  299. data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +0 -5
  300. data/app/views/alchemy/admin/legacy_page_urls/create.js.erb +0 -9
  301. data/app/views/alchemy/admin/legacy_page_urls/destroy.js.erb +0 -6
  302. data/app/views/alchemy/admin/legacy_page_urls/update.js.erb +0 -2
  303. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +0 -22
  304. data/app/views/alchemy/admin/pages/_external_link.html.erb +0 -31
  305. data/app/views/alchemy/admin/pages/_file_link.html.erb +0 -31
  306. data/app/views/alchemy/admin/pages/_internal_link.html.erb +0 -35
  307. data/app/views/alchemy/admin/pages/link.html.erb +0 -26
  308. data/app/views/alchemy/admin/partials/_flash.html.erb +0 -4
  309. data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +0 -29
  310. data/lib/alchemy/test_support/current_language_shared_examples.rb +0 -33
  311. data/vendor/assets/fonts/remixicon.eot +0 -0
  312. data/vendor/assets/fonts/remixicon.svg +0 -7816
  313. data/vendor/assets/fonts/remixicon.ttf +0 -0
  314. data/vendor/assets/fonts/remixicon.woff +0 -0
  315. data/vendor/assets/fonts/remixicon.woff2 +0 -0
  316. 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.13
4
+ version: 7.2.0.b
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas von Deyen
@@ -10,9 +10,10 @@ authors:
10
10
  - Hendrik Mans
11
11
  - Carsten Fregin
12
12
  - Martin Meyerhoff
13
+ autorequire:
13
14
  bindir: bin
14
15
  cert_chain: []
15
- date: 2025-01-24 00:00:00.000000000 Z
16
+ date: 2024-05-16 00:00:00.000000000 Z
16
17
  dependencies:
17
18
  - !ruby/object:Gem::Dependency
18
19
  name: actionmailer
@@ -412,20 +413,6 @@ dependencies:
412
413
  - - "<"
413
414
  - !ruby/object:Gem::Version
414
415
  version: '5.0'
415
- - !ruby/object:Gem::Dependency
416
- name: request_store
417
- requirement: !ruby/object:Gem::Requirement
418
- requirements:
419
- - - "~>"
420
- - !ruby/object:Gem::Version
421
- version: '1.2'
422
- type: :runtime
423
- prerelease: false
424
- version_requirements: !ruby/object:Gem::Requirement
425
- requirements:
426
- - - "~>"
427
- - !ruby/object:Gem::Version
428
- version: '1.2'
429
416
  - !ruby/object:Gem::Dependency
430
417
  name: responders
431
418
  requirement: !ruby/object:Gem::Requirement
@@ -509,7 +496,7 @@ dependencies:
509
496
  version: '1.4'
510
497
  - - "<"
511
498
  - !ruby/object:Gem::Version
512
- version: '2'
499
+ version: '2.1'
513
500
  type: :runtime
514
501
  prerelease: false
515
502
  version_requirements: !ruby/object:Gem::Requirement
@@ -519,7 +506,7 @@ dependencies:
519
506
  version: '1.4'
520
507
  - - "<"
521
508
  - !ruby/object:Gem::Version
522
- version: '2'
509
+ version: '2.1'
523
510
  - !ruby/object:Gem::Dependency
524
511
  name: view_component
525
512
  requirement: !ruby/object:Gem::Requirement
@@ -718,7 +705,7 @@ dependencies:
718
705
  version: '0.9'
719
706
  description: Alchemy is a powerful, userfriendly and flexible Rails CMS.
720
707
  email:
721
- - hello@alchemy-cms.com
708
+ - alchemy@blish.cloud
722
709
  executables: []
723
710
  extensions: []
724
711
  extra_rdoc_files: []
@@ -741,24 +728,12 @@ files:
741
728
  - app/assets/images/alchemy/lupe.cur
742
729
  - app/assets/images/alchemy/missing-image.svg
743
730
  - app/assets/javascripts/alchemy/admin.js
744
- - app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee
745
731
  - app/assets/javascripts/alchemy/alchemy.dialog.js.coffee
746
- - app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee
747
- - app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee
748
- - app/assets/javascripts/alchemy/alchemy.fixed_elements.js
749
- - app/assets/javascripts/alchemy/alchemy.growler.js.coffee
750
- - app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee
751
732
  - app/assets/javascripts/alchemy/alchemy.image_overlay.coffee
752
- - app/assets/javascripts/alchemy/alchemy.initializer.js.coffee
753
- - app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee
754
- - app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee
755
733
  - app/assets/javascripts/alchemy/alchemy.preview.js.coffee
756
- - app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee
757
- - app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee
758
734
  - app/assets/javascripts/alchemy/preview.js
759
735
  - app/assets/javascripts/alchemy/templates/index.js
760
736
  - app/assets/javascripts/alchemy/templates/node_folder.hbs
761
- - app/assets/javascripts/alchemy/templates/page.hbs
762
737
  - app/assets/javascripts/alchemy/templates/page_folder.hbs
763
738
  - app/assets/javascripts/tinymce/icons/remixicons/icons.js
764
739
  - app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js
@@ -769,6 +744,7 @@ files:
769
744
  - app/assets/stylesheets/alchemy/_variables.scss
770
745
  - app/assets/stylesheets/alchemy/admin.scss
771
746
  - app/assets/stylesheets/alchemy/archive.scss
747
+ - app/assets/stylesheets/alchemy/attachment-select.scss
772
748
  - app/assets/stylesheets/alchemy/attachments.scss
773
749
  - app/assets/stylesheets/alchemy/base.scss
774
750
  - app/assets/stylesheets/alchemy/buttons.scss
@@ -777,7 +753,6 @@ files:
777
753
  - app/assets/stylesheets/alchemy/dialogs.scss
778
754
  - app/assets/stylesheets/alchemy/elements.scss
779
755
  - app/assets/stylesheets/alchemy/errors.scss
780
- - app/assets/stylesheets/alchemy/filter_field.scss
781
756
  - app/assets/stylesheets/alchemy/flash.scss
782
757
  - app/assets/stylesheets/alchemy/flatpickr.scss
783
758
  - app/assets/stylesheets/alchemy/fonts.scss
@@ -789,6 +764,7 @@ files:
789
764
  - app/assets/stylesheets/alchemy/image_library.scss
790
765
  - app/assets/stylesheets/alchemy/images.scss
791
766
  - app/assets/stylesheets/alchemy/labels.scss
767
+ - app/assets/stylesheets/alchemy/list_filter.scss
792
768
  - app/assets/stylesheets/alchemy/lists.scss
793
769
  - app/assets/stylesheets/alchemy/menubar.scss
794
770
  - app/assets/stylesheets/alchemy/navigation.scss
@@ -823,8 +799,20 @@ files:
823
799
  - app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.min.scss
824
800
  - app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.css
825
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
826
812
  - app/components/alchemy/admin/node_select.rb
827
813
  - app/components/alchemy/admin/page_select.rb
814
+ - app/components/alchemy/admin/tags_autocomplete.rb
815
+ - app/components/alchemy/admin/toolbar_button.rb
828
816
  - app/components/alchemy/ingredients/audio_view.rb
829
817
  - app/components/alchemy/ingredients/base_view.rb
830
818
  - app/components/alchemy/ingredients/boolean_view.rb
@@ -851,11 +839,13 @@ files:
851
839
  - app/controllers/alchemy/admin/legacy_page_urls_controller.rb
852
840
  - app/controllers/alchemy/admin/nodes_controller.rb
853
841
  - app/controllers/alchemy/admin/pages_controller.rb
842
+ - app/controllers/alchemy/admin/picture_descriptions_controller.rb
854
843
  - app/controllers/alchemy/admin/pictures_controller.rb
855
844
  - app/controllers/alchemy/admin/resources_controller.rb
856
845
  - app/controllers/alchemy/admin/sites_controller.rb
857
846
  - app/controllers/alchemy/admin/styleguide_controller.rb
858
847
  - app/controllers/alchemy/admin/tags_controller.rb
848
+ - app/controllers/alchemy/api/attachments_controller.rb
859
849
  - app/controllers/alchemy/api/base_controller.rb
860
850
  - app/controllers/alchemy/api/elements_controller.rb
861
851
  - app/controllers/alchemy/api/ingredients_controller.rb
@@ -890,35 +880,51 @@ files:
890
880
  - app/helpers/alchemy/url_helper.rb
891
881
  - app/javascript/alchemy_admin.js
892
882
  - app/javascript/alchemy_admin/components/alchemy_html_element.js
883
+ - app/javascript/alchemy_admin/components/attachment_select.js
893
884
  - app/javascript/alchemy_admin/components/button.js
894
885
  - app/javascript/alchemy_admin/components/char_counter.js
895
886
  - app/javascript/alchemy_admin/components/clipboard_button.js
896
887
  - app/javascript/alchemy_admin/components/datepicker.js
897
888
  - app/javascript/alchemy_admin/components/dialog_link.js
889
+ - app/javascript/alchemy_admin/components/dom_id_select.js
898
890
  - app/javascript/alchemy_admin/components/element_editor.js
891
+ - app/javascript/alchemy_admin/components/element_editor/delete_element_button.js
899
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
900
897
  - app/javascript/alchemy_admin/components/ingredient_group.js
901
898
  - app/javascript/alchemy_admin/components/link_buttons.js
902
899
  - app/javascript/alchemy_admin/components/link_buttons/link_button.js
903
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
904
903
  - app/javascript/alchemy_admin/components/node_select.js
905
904
  - app/javascript/alchemy_admin/components/overlay.js
906
905
  - app/javascript/alchemy_admin/components/page_select.js
906
+ - app/javascript/alchemy_admin/components/preview_window.js
907
907
  - app/javascript/alchemy_admin/components/remote_select.js
908
908
  - app/javascript/alchemy_admin/components/select.js
909
909
  - app/javascript/alchemy_admin/components/spinner.js
910
+ - app/javascript/alchemy_admin/components/tags_autocomplete.js
910
911
  - app/javascript/alchemy_admin/components/tinymce.js
911
912
  - app/javascript/alchemy_admin/components/uploader.js
912
913
  - app/javascript/alchemy_admin/components/uploader/file_upload.js
913
914
  - app/javascript/alchemy_admin/components/uploader/progress.js
915
+ - app/javascript/alchemy_admin/confirm_dialog.js
914
916
  - app/javascript/alchemy_admin/dirty.js
915
917
  - app/javascript/alchemy_admin/file_editors.js
918
+ - app/javascript/alchemy_admin/fixed_elements.js
919
+ - app/javascript/alchemy_admin/growler.js
916
920
  - app/javascript/alchemy_admin/gui.js
921
+ - app/javascript/alchemy_admin/hotkeys.js
917
922
  - app/javascript/alchemy_admin/i18n.js
918
923
  - app/javascript/alchemy_admin/image_cropper.js
919
924
  - app/javascript/alchemy_admin/image_loader.js
920
925
  - app/javascript/alchemy_admin/ingredient_anchor_link.js
921
926
  - app/javascript/alchemy_admin/initializer.js
927
+ - app/javascript/alchemy_admin/link_dialog.js
922
928
  - app/javascript/alchemy_admin/locales/en.js
923
929
  - app/javascript/alchemy_admin/node_tree.js
924
930
  - app/javascript/alchemy_admin/page_publication_fields.js
@@ -926,10 +932,10 @@ files:
926
932
  - app/javascript/alchemy_admin/picture_editors.js
927
933
  - app/javascript/alchemy_admin/picture_selector.js
928
934
  - app/javascript/alchemy_admin/please_wait_overlay.js
935
+ - app/javascript/alchemy_admin/shoelace_theme.js
929
936
  - app/javascript/alchemy_admin/sitemap.js
930
937
  - app/javascript/alchemy_admin/sortable_elements.js
931
938
  - app/javascript/alchemy_admin/spinner.js
932
- - app/javascript/alchemy_admin/tags_autocomplete.js
933
939
  - app/javascript/alchemy_admin/utils/ajax.js
934
940
  - app/javascript/alchemy_admin/utils/debounce.js
935
941
  - app/javascript/alchemy_admin/utils/dom_helpers.js
@@ -945,6 +951,7 @@ files:
945
951
  - app/models/alchemy/attachment.rb
946
952
  - app/models/alchemy/attachment/url.rb
947
953
  - app/models/alchemy/base_record.rb
954
+ - app/models/alchemy/current.rb
948
955
  - app/models/alchemy/eager_loading.rb
949
956
  - app/models/alchemy/element.rb
950
957
  - app/models/alchemy/element/definitions.rb
@@ -992,6 +999,7 @@ files:
992
999
  - app/models/alchemy/picture/preprocessor.rb
993
1000
  - app/models/alchemy/picture/transformations.rb
994
1001
  - app/models/alchemy/picture/url.rb
1002
+ - app/models/alchemy/picture_description.rb
995
1003
  - app/models/alchemy/picture_thumb.rb
996
1004
  - app/models/alchemy/picture_thumb/create.rb
997
1005
  - app/models/alchemy/picture_thumb/file_store.rb
@@ -1001,7 +1009,6 @@ files:
1001
1009
  - app/models/alchemy/site.rb
1002
1010
  - app/models/alchemy/site/layout.rb
1003
1011
  - app/models/alchemy/tag.rb
1004
- - app/models/alchemy/tree_node.rb
1005
1012
  - app/models/concerns/alchemy/dom_ids.rb
1006
1013
  - app/models/concerns/alchemy/picture_thumbnails.rb
1007
1014
  - app/models/concerns/alchemy/touch_elements.rb
@@ -1010,6 +1017,7 @@ files:
1010
1017
  - app/serializers/alchemy/element_serializer.rb
1011
1018
  - app/serializers/alchemy/ingredient_serializer.rb
1012
1019
  - app/serializers/alchemy/node_serializer.rb
1020
+ - app/serializers/alchemy/page_node_serializer.rb
1013
1021
  - app/serializers/alchemy/page_serializer.rb
1014
1022
  - app/serializers/alchemy/page_tree_serializer.rb
1015
1023
  - app/serializers/alchemy/picture_serializer.rb
@@ -1052,7 +1060,6 @@ files:
1052
1060
  - app/views/alchemy/admin/elements/_header.html.erb
1053
1061
  - app/views/alchemy/admin/elements/_toolbar.html.erb
1054
1062
  - app/views/alchemy/admin/elements/create.js.erb
1055
- - app/views/alchemy/admin/elements/destroy.js.erb
1056
1063
  - app/views/alchemy/admin/elements/index.html.erb
1057
1064
  - app/views/alchemy/admin/elements/new.html.erb
1058
1065
  - app/views/alchemy/admin/ingredients/_audio_fields.html.erb
@@ -1074,25 +1081,29 @@ files:
1074
1081
  - app/views/alchemy/admin/layoutpages/edit.html.erb
1075
1082
  - app/views/alchemy/admin/layoutpages/index.html.erb
1076
1083
  - app/views/alchemy/admin/leave.html.erb
1077
- - app/views/alchemy/admin/legacy_page_urls/_form.html.erb
1078
1084
  - app/views/alchemy/admin/legacy_page_urls/_label.html.erb
1079
1085
  - app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb
1080
1086
  - app/views/alchemy/admin/legacy_page_urls/_new.html.erb
1081
- - app/views/alchemy/admin/legacy_page_urls/create.js.erb
1082
- - app/views/alchemy/admin/legacy_page_urls/destroy.js.erb
1083
- - 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
1084
1094
  - app/views/alchemy/admin/nodes/_form.html.erb
1095
+ - app/views/alchemy/admin/nodes/_label.html.erb
1085
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
1086
1101
  - app/views/alchemy/admin/nodes/edit.html.erb
1087
1102
  - app/views/alchemy/admin/nodes/index.html.erb
1088
1103
  - app/views/alchemy/admin/nodes/new.html.erb
1089
- - app/views/alchemy/admin/pages/_anchor_link.html.erb
1090
1104
  - app/views/alchemy/admin/pages/_create_language_form.html.erb
1091
1105
  - app/views/alchemy/admin/pages/_current_page.html.erb
1092
- - app/views/alchemy/admin/pages/_external_link.html.erb
1093
- - app/views/alchemy/admin/pages/_file_link.html.erb
1094
1106
  - app/views/alchemy/admin/pages/_form.html.erb
1095
- - app/views/alchemy/admin/pages/_internal_link.html.erb
1096
1107
  - app/views/alchemy/admin/pages/_legacy_urls.html.erb
1097
1108
  - app/views/alchemy/admin/pages/_locked_page.html.erb
1098
1109
  - app/views/alchemy/admin/pages/_new_page_form.html.erb
@@ -1110,7 +1121,6 @@ files:
1110
1121
  - app/views/alchemy/admin/pages/flush.js.erb
1111
1122
  - app/views/alchemy/admin/pages/index.html.erb
1112
1123
  - app/views/alchemy/admin/pages/info.html.erb
1113
- - app/views/alchemy/admin/pages/link.html.erb
1114
1124
  - app/views/alchemy/admin/pages/list/_table.html.erb
1115
1125
  - app/views/alchemy/admin/pages/locked.html.erb
1116
1126
  - app/views/alchemy/admin/pages/new.html.erb
@@ -1118,7 +1128,6 @@ files:
1118
1128
  - app/views/alchemy/admin/pages/unlock.js.erb
1119
1129
  - app/views/alchemy/admin/pages/update.js.erb
1120
1130
  - app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb
1121
- - app/views/alchemy/admin/partials/_flash.html.erb
1122
1131
  - app/views/alchemy/admin/partials/_flash_notices.html.erb
1123
1132
  - app/views/alchemy/admin/partials/_language_tree_select.html.erb
1124
1133
  - app/views/alchemy/admin/partials/_main_navigation_entry.html.erb
@@ -1127,13 +1136,15 @@ files:
1127
1136
  - app/views/alchemy/admin/partials/_search_form.html.erb
1128
1137
  - app/views/alchemy/admin/partials/_site_select.html.erb
1129
1138
  - app/views/alchemy/admin/partials/_sub_navigation.html.erb
1130
- - 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
1131
1141
  - app/views/alchemy/admin/pictures/_archive.html.erb
1132
1142
  - app/views/alchemy/admin/pictures/_archive_overlay.html.erb
1133
1143
  - app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb
1134
1144
  - app/views/alchemy/admin/pictures/_form.html.erb
1135
1145
  - app/views/alchemy/admin/pictures/_infos.html.erb
1136
1146
  - app/views/alchemy/admin/pictures/_picture.html.erb
1147
+ - app/views/alchemy/admin/pictures/_picture_description_field.html.erb
1137
1148
  - app/views/alchemy/admin/pictures/_picture_to_assign.html.erb
1138
1149
  - app/views/alchemy/admin/pictures/_tag_list.html.erb
1139
1150
  - app/views/alchemy/admin/pictures/archive_overlay.js.erb
@@ -1256,6 +1267,7 @@ files:
1256
1267
  - db/migrate/20230123112425_add_searchable_to_alchemy_pages.rb
1257
1268
  - db/migrate/20230505132743_add_indexes_to_alchemy_pictures.rb
1258
1269
  - db/migrate/20231113104432_create_page_mutexes.rb
1270
+ - db/migrate/20240314105244_create_alchemy_picture_descriptions.rb
1259
1271
  - eslint.config.js
1260
1272
  - lib/alchemy.rb
1261
1273
  - lib/alchemy/ability_helper.rb
@@ -1303,7 +1315,6 @@ files:
1303
1315
  - lib/alchemy/test_support.rb
1304
1316
  - lib/alchemy/test_support/capybara_helpers.rb
1305
1317
  - lib/alchemy/test_support/config_stubbing.rb
1306
- - lib/alchemy/test_support/current_language_shared_examples.rb
1307
1318
  - lib/alchemy/test_support/factories/attachment_factory.rb
1308
1319
  - lib/alchemy/test_support/factories/dummy_user_factory.rb
1309
1320
  - lib/alchemy/test_support/factories/element_factory.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,8 @@ 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.6.3
1452
+ rubygems_version: 3.5.9
1453
+ signing_key:
1446
1454
  specification_version: 4
1447
1455
  summary: A powerful, userfriendly and flexible CMS for Rails
1448
1456
  test_files: []
@@ -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)