alchemy_cms 7.1.11 → 7.2.0.b

Sign up to get free protection for your applications and to get access to all the features.
Files changed (312) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +132 -24
  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 +73 -41
  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/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/layoutpages_controller.rb +0 -19
  69. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +12 -4
  70. data/app/controllers/alchemy/admin/nodes_controller.rb +26 -0
  71. data/app/controllers/alchemy/admin/pages_controller.rb +11 -78
  72. data/app/controllers/alchemy/admin/picture_descriptions_controller.rb +15 -0
  73. data/app/controllers/alchemy/admin/pictures_controller.rb +18 -1
  74. data/app/controllers/alchemy/admin/resources_controller.rb +15 -10
  75. data/app/controllers/alchemy/api/attachments_controller.rb +44 -0
  76. data/app/controllers/alchemy/api/pages_controller.rb +10 -6
  77. data/app/controllers/alchemy/base_controller.rb +2 -2
  78. data/app/controllers/alchemy/messages_controller.rb +3 -3
  79. data/app/controllers/alchemy/pages_controller.rb +8 -6
  80. data/app/controllers/concerns/alchemy/admin/current_language.rb +1 -11
  81. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +1 -1
  82. data/app/decorators/alchemy/element_editor.rb +2 -2
  83. data/app/helpers/alchemy/admin/base_helper.rb +8 -60
  84. data/app/helpers/alchemy/admin/elements_helper.rb +1 -1
  85. data/app/helpers/alchemy/admin/ingredients_helper.rb +1 -1
  86. data/app/helpers/alchemy/base_helper.rb +9 -91
  87. data/app/helpers/alchemy/elements_helper.rb +3 -3
  88. data/app/helpers/alchemy/pages_helper.rb +16 -9
  89. data/app/javascript/alchemy_admin/components/attachment_select.js +24 -0
  90. data/app/javascript/alchemy_admin/components/button.js +3 -0
  91. data/app/javascript/alchemy_admin/components/clipboard_button.js +3 -2
  92. data/app/javascript/alchemy_admin/components/dialog_link.js +10 -7
  93. data/app/javascript/alchemy_admin/components/dom_id_select.js +69 -0
  94. data/app/javascript/alchemy_admin/components/element_editor/delete_element_button.js +42 -0
  95. data/app/javascript/alchemy_admin/components/element_editor/publish_element_button.js +4 -2
  96. data/app/javascript/alchemy_admin/components/element_editor.js +21 -13
  97. data/app/javascript/alchemy_admin/components/elements_window.js +87 -0
  98. data/app/javascript/alchemy_admin/components/growl.js +13 -0
  99. data/app/javascript/alchemy_admin/components/icon.js +51 -0
  100. data/app/javascript/alchemy_admin/components/index.js +24 -0
  101. data/app/javascript/alchemy_admin/components/ingredient_group.js +6 -0
  102. data/app/javascript/alchemy_admin/components/link_buttons/link_button.js +21 -11
  103. data/app/javascript/alchemy_admin/components/link_buttons/unlink_button.js +2 -1
  104. data/app/javascript/alchemy_admin/components/link_buttons.js +1 -0
  105. data/app/javascript/alchemy_admin/components/list_filter.js +68 -0
  106. data/app/javascript/alchemy_admin/components/message.js +69 -0
  107. data/app/javascript/alchemy_admin/components/node_select.js +1 -1
  108. data/app/javascript/alchemy_admin/components/overlay.js +6 -6
  109. data/app/javascript/alchemy_admin/components/page_select.js +3 -7
  110. data/app/javascript/alchemy_admin/components/preview_window.js +121 -0
  111. data/app/javascript/alchemy_admin/components/remote_select.js +4 -1
  112. data/app/javascript/alchemy_admin/components/select.js +37 -1
  113. data/app/javascript/alchemy_admin/components/tags_autocomplete.js +57 -0
  114. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +4 -3
  115. data/app/javascript/alchemy_admin/components/uploader/progress.js +1 -1
  116. data/app/javascript/alchemy_admin/confirm_dialog.js +133 -0
  117. data/app/javascript/alchemy_admin/dirty.js +19 -14
  118. data/app/javascript/alchemy_admin/fixed_elements.js +24 -0
  119. data/app/javascript/alchemy_admin/growler.js +15 -0
  120. data/app/javascript/alchemy_admin/gui.js +2 -4
  121. data/app/javascript/alchemy_admin/hotkeys.js +60 -0
  122. data/app/javascript/alchemy_admin/image_loader.js +2 -2
  123. data/app/javascript/alchemy_admin/ingredient_anchor_link.js +2 -3
  124. data/app/javascript/alchemy_admin/initializer.js +1 -8
  125. data/app/javascript/alchemy_admin/link_dialog.js +131 -0
  126. data/app/javascript/alchemy_admin/locales/en.js +3 -0
  127. data/app/javascript/alchemy_admin/node_tree.js +4 -3
  128. data/app/javascript/alchemy_admin/page_sorter.js +23 -14
  129. data/app/javascript/alchemy_admin/picture_editors.js +6 -5
  130. data/app/javascript/alchemy_admin/shoelace_theme.js +60 -0
  131. data/app/javascript/alchemy_admin/sitemap.js +9 -3
  132. data/app/javascript/alchemy_admin/sortable_elements.js +4 -6
  133. data/app/javascript/alchemy_admin.js +18 -42
  134. data/app/models/alchemy/current.rb +26 -0
  135. data/app/models/alchemy/element.rb +1 -1
  136. data/app/models/alchemy/ingredients/audio.rb +0 -11
  137. data/app/models/alchemy/ingredients/headline.rb +8 -1
  138. data/app/models/alchemy/ingredients/picture.rb +6 -0
  139. data/app/models/alchemy/ingredients/video.rb +0 -12
  140. data/app/models/alchemy/language.rb +8 -6
  141. data/app/models/alchemy/node.rb +2 -2
  142. data/app/models/alchemy/page/page_elements.rb +8 -8
  143. data/app/models/alchemy/page/page_layouts.rb +3 -3
  144. data/app/models/alchemy/page/page_natures.rb +13 -9
  145. data/app/models/alchemy/page/page_scopes.rb +2 -2
  146. data/app/models/alchemy/page/publisher.rb +1 -0
  147. data/app/models/alchemy/page.rb +13 -28
  148. data/app/models/alchemy/picture.rb +8 -0
  149. data/app/models/alchemy/picture_description.rb +8 -0
  150. data/app/models/alchemy/picture_variant.rb +1 -1
  151. data/app/models/alchemy/site.rb +10 -7
  152. data/app/serializers/alchemy/attachment_serializer.rb +8 -0
  153. data/app/serializers/alchemy/page_node_serializer.rb +9 -0
  154. data/app/views/alchemy/_menubar.html.erb +1 -1
  155. data/app/views/alchemy/_preview_mode_code.html.erb +1 -1
  156. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +2 -2
  157. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +0 -1
  158. data/app/views/alchemy/admin/attachments/edit.html.erb +3 -4
  159. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  160. data/app/views/alchemy/admin/clipboard/index.html.erb +1 -1
  161. data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
  162. data/app/views/alchemy/admin/clipboard/remove.js.erb +1 -1
  163. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  164. data/app/views/alchemy/admin/dashboard/_sites.html.erb +1 -1
  165. data/app/views/alchemy/admin/dashboard/help.html.erb +48 -12
  166. data/app/views/alchemy/admin/dashboard/index.html.erb +1 -1
  167. data/app/views/alchemy/admin/dashboard/info.html.erb +5 -8
  168. data/app/views/alchemy/admin/elements/_add_nested_element_form.html.erb +1 -1
  169. data/app/views/alchemy/admin/elements/_element.html.erb +5 -5
  170. data/app/views/alchemy/admin/elements/_footer.html.erb +1 -1
  171. data/app/views/alchemy/admin/elements/_header.html.erb +6 -2
  172. data/app/views/alchemy/admin/elements/_toolbar.html.erb +8 -6
  173. data/app/views/alchemy/admin/elements/create.js.erb +0 -5
  174. data/app/views/alchemy/admin/elements/index.html.erb +70 -34
  175. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +1 -2
  176. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +3 -5
  177. data/app/views/alchemy/admin/languages/_language.html.erb +1 -1
  178. data/app/views/alchemy/admin/languages/index.html.erb +2 -2
  179. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +18 -18
  180. data/app/views/alchemy/admin/layoutpages/edit.html.erb +4 -5
  181. data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
  182. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +10 -11
  183. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +15 -17
  184. data/app/views/alchemy/admin/legacy_page_urls/_table.html.erb +16 -0
  185. data/app/views/alchemy/admin/legacy_page_urls/_update.turbo_stream.erb +12 -0
  186. data/app/views/alchemy/admin/legacy_page_urls/create.turbo_stream.erb +8 -0
  187. data/app/views/alchemy/admin/legacy_page_urls/destroy.turbo_stream.erb +1 -0
  188. data/app/views/alchemy/admin/legacy_page_urls/edit.html.erb +27 -0
  189. data/app/views/alchemy/admin/legacy_page_urls/show.html.erb +1 -0
  190. data/app/views/alchemy/admin/legacy_page_urls/update.turbo_stream.erb +1 -0
  191. data/app/views/alchemy/admin/nodes/_form.html.erb +12 -11
  192. data/app/views/alchemy/admin/nodes/_label.html.erb +1 -0
  193. data/app/views/alchemy/admin/nodes/_node.html.erb +19 -19
  194. data/app/views/alchemy/admin/nodes/_page_nodes.html.erb +48 -0
  195. data/app/views/alchemy/admin/nodes/_update.turbo_stream.erb +9 -0
  196. data/app/views/alchemy/admin/nodes/create.turbo_stream.erb +1 -0
  197. data/app/views/alchemy/admin/nodes/destroy.turbo_stream.erb +1 -0
  198. data/app/views/alchemy/admin/nodes/index.html.erb +3 -3
  199. data/app/views/alchemy/admin/pages/_form.html.erb +3 -4
  200. data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +4 -15
  201. data/app/views/alchemy/admin/pages/_page.html.erb +39 -39
  202. data/app/views/alchemy/admin/pages/_table_row.html.erb +3 -3
  203. data/app/views/alchemy/admin/pages/_toolbar.html.erb +2 -2
  204. data/app/views/alchemy/admin/pages/configure.html.erb +6 -0
  205. data/app/views/alchemy/admin/pages/edit.html.erb +15 -62
  206. data/app/views/alchemy/admin/pages/unlock.js.erb +3 -3
  207. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +3 -1
  208. data/app/views/alchemy/admin/partials/_flash_notices.html.erb +4 -2
  209. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
  210. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +5 -2
  211. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -2
  212. data/app/views/alchemy/admin/partials/_search_form.html.erb +2 -2
  213. data/app/views/alchemy/admin/partials/_site_select.html.erb +1 -1
  214. data/app/views/alchemy/admin/picture_descriptions/_form.html.erb +11 -0
  215. data/app/views/alchemy/admin/picture_descriptions/edit.html.erb +6 -0
  216. data/app/views/alchemy/admin/pictures/_form.html.erb +4 -3
  217. data/app/views/alchemy/admin/pictures/_infos.html.erb +1 -1
  218. data/app/views/alchemy/admin/pictures/_picture_description_field.html.erb +29 -0
  219. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
  220. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +0 -2
  221. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +3 -3
  222. data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
  223. data/app/views/alchemy/admin/resources/_form.html.erb +3 -4
  224. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +1 -1
  225. data/app/views/alchemy/admin/resources/_tag_list.html.erb +2 -2
  226. data/app/views/alchemy/admin/resources/index.html.erb +2 -2
  227. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  228. data/app/views/alchemy/admin/styleguide/index.html.erb +29 -24
  229. data/app/views/alchemy/admin/tags/_tag.html.erb +1 -1
  230. data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
  231. data/app/views/alchemy/admin/tags/index.html.erb +1 -1
  232. data/app/views/alchemy/base/500.html.erb +7 -18
  233. data/app/views/alchemy/base/error_notice.html.erb +3 -1
  234. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
  235. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +1 -1
  236. data/app/views/alchemy/ingredients/_headline_editor.html.erb +13 -8
  237. data/app/views/alchemy/ingredients/_picture_editor.html.erb +1 -1
  238. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +1 -1
  239. data/app/views/alchemy/language_links/_language.html.erb +1 -1
  240. data/app/views/kaminari/alchemy/_first_page.html.erb +2 -2
  241. data/app/views/kaminari/alchemy/_gap.html.erb +1 -1
  242. data/app/views/kaminari/alchemy/_last_page.html.erb +2 -2
  243. data/app/views/kaminari/alchemy/_next_page.html.erb +2 -2
  244. data/app/views/kaminari/alchemy/_prev_page.html.erb +2 -2
  245. data/app/views/layouts/alchemy/admin.html.erb +2 -1
  246. data/bundles/shoelace.js +3 -1
  247. data/config/locales/alchemy.en.yml +16 -3
  248. data/config/routes.rb +4 -2
  249. data/db/migrate/20240314105244_create_alchemy_picture_descriptions.rb +11 -0
  250. data/lib/alchemy/configuration_methods.rb +1 -1
  251. data/lib/alchemy/controller_actions.rb +3 -3
  252. data/lib/alchemy/element_definition.rb +10 -6
  253. data/lib/alchemy/engine.rb +19 -2
  254. data/lib/alchemy/page_layout.rb +10 -6
  255. data/lib/alchemy/permissions.rb +4 -3
  256. data/lib/alchemy/routing_constraints.rb +1 -1
  257. data/lib/alchemy/seeder.rb +2 -2
  258. data/lib/alchemy/test_support/capybara_helpers.rb +4 -0
  259. data/lib/alchemy/test_support/factories/language_factory.rb +1 -1
  260. data/lib/alchemy/test_support/shared_contexts.rb +8 -0
  261. data/lib/alchemy/tinymce.rb +2 -1
  262. data/lib/alchemy/version.rb +1 -1
  263. data/lib/alchemy.rb +36 -0
  264. data/lib/alchemy_cms.rb +0 -1
  265. data/lib/generators/alchemy/menus/templates/node.html.erb +2 -2
  266. data/lib/generators/alchemy/menus/templates/node.html.haml +2 -2
  267. data/lib/generators/alchemy/menus/templates/node.html.slim +2 -2
  268. data/lib/generators/alchemy/menus/templates/wrapper.html.erb +1 -1
  269. data/lib/generators/alchemy/menus/templates/wrapper.html.haml +1 -1
  270. data/lib/generators/alchemy/menus/templates/wrapper.html.slim +1 -1
  271. data/lib/tasks/alchemy/sitemap.rake +97 -0
  272. data/lib/tasks/alchemy/tidy.rake +1 -0
  273. data/package.json +8 -8
  274. data/vendor/assets/fonts/remixicon.symbol.svg +11 -0
  275. data/vendor/javascript/shoelace.min.js +333 -118
  276. data/vendor/javascript/sortable.min.js +1 -1
  277. data/vendor/javascript/tinymce.min.js +1 -1
  278. data/vendor/javascript/ungap-custom-elements.min.js +1 -1
  279. metadata +61 -55
  280. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +0 -85
  281. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +0 -107
  282. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +0 -66
  283. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +0 -45
  284. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +0 -24
  285. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +0 -49
  286. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +0 -0
  287. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +0 -230
  288. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +0 -49
  289. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +0 -82
  290. data/app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee +0 -11
  291. data/app/assets/javascripts/alchemy/templates/page.hbs +0 -19
  292. data/app/javascript/alchemy_admin/tags_autocomplete.js +0 -46
  293. data/app/models/alchemy/tree_node.rb +0 -7
  294. data/app/views/alchemy/admin/elements/destroy.js.erb +0 -8
  295. data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +0 -5
  296. data/app/views/alchemy/admin/legacy_page_urls/create.js.erb +0 -9
  297. data/app/views/alchemy/admin/legacy_page_urls/destroy.js.erb +0 -6
  298. data/app/views/alchemy/admin/legacy_page_urls/update.js.erb +0 -2
  299. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +0 -22
  300. data/app/views/alchemy/admin/pages/_external_link.html.erb +0 -31
  301. data/app/views/alchemy/admin/pages/_file_link.html.erb +0 -31
  302. data/app/views/alchemy/admin/pages/_internal_link.html.erb +0 -35
  303. data/app/views/alchemy/admin/pages/link.html.erb +0 -26
  304. data/app/views/alchemy/admin/partials/_flash.html.erb +0 -4
  305. data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +0 -29
  306. data/lib/alchemy/test_support/current_language_shared_examples.rb +0 -33
  307. data/vendor/assets/fonts/remixicon.eot +0 -0
  308. data/vendor/assets/fonts/remixicon.svg +0 -7816
  309. data/vendor/assets/fonts/remixicon.ttf +0 -0
  310. data/vendor/assets/fonts/remixicon.woff +0 -0
  311. data/vendor/assets/fonts/remixicon.woff2 +0 -0
  312. 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.11
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-08-10 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
@@ -1304,7 +1315,6 @@ files:
1304
1315
  - lib/alchemy/test_support.rb
1305
1316
  - lib/alchemy/test_support/capybara_helpers.rb
1306
1317
  - lib/alchemy/test_support/config_stubbing.rb
1307
- - lib/alchemy/test_support/current_language_shared_examples.rb
1308
1318
  - lib/alchemy/test_support/factories/attachment_factory.rb
1309
1319
  - lib/alchemy/test_support/factories/dummy_user_factory.rb
1310
1320
  - lib/alchemy/test_support/factories/element_factory.rb
@@ -1377,23 +1387,19 @@ files:
1377
1387
  - lib/non_stupid_digest_assets.rb
1378
1388
  - lib/tasks/alchemy/db.rake
1379
1389
  - lib/tasks/alchemy/install.rake
1390
+ - lib/tasks/alchemy/sitemap.rake
1380
1391
  - lib/tasks/alchemy/thumbnails.rake
1381
1392
  - lib/tasks/alchemy/tidy.rake
1382
1393
  - lib/tasks/alchemy/upgrade.rake
1383
1394
  - lib/tasks/alchemy/usage.rake
1384
1395
  - package.json
1385
1396
  - rollup.config.mjs
1386
- - vendor/assets/fonts/remixicon.eot
1387
- - vendor/assets/fonts/remixicon.svg
1388
- - vendor/assets/fonts/remixicon.ttf
1389
- - vendor/assets/fonts/remixicon.woff
1390
- - vendor/assets/fonts/remixicon.woff2
1397
+ - vendor/assets/fonts/remixicon.symbol.svg
1391
1398
  - vendor/assets/images/Jcrop.gif
1392
1399
  - vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js
1393
1400
  - vendor/assets/javascripts/jquery_plugins/select2.js
1394
1401
  - vendor/assets/stylesheets/alchemy_admin/select2.scss
1395
1402
  - vendor/assets/stylesheets/jquery.Jcrop.min.scss
1396
- - vendor/assets/stylesheets/remixicon.scss
1397
1403
  - vendor/assets/stylesheets/tinymce/skins/content/default/content.min.css
1398
1404
  - vendor/javascript/clipboard.min.js
1399
1405
  - vendor/javascript/flatpickr.min.js
@@ -1405,7 +1411,7 @@ files:
1405
1411
  - vendor/javascript/ungap-custom-elements.min.js
1406
1412
  homepage: https://alchemy-cms.com
1407
1413
  licenses:
1408
- - BSD New
1414
+ - BSD-3-Clause
1409
1415
  metadata: {}
1410
1416
  post_install_message: |+
1411
1417
  -------------------------------------------------------------
@@ -1443,7 +1449,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1443
1449
  version: '0'
1444
1450
  requirements:
1445
1451
  - ImageMagick (libmagick), v6.6 or greater.
1446
- rubygems_version: 3.5.11
1452
+ rubygems_version: 3.5.9
1447
1453
  signing_key:
1448
1454
  specification_version: 4
1449
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)