alchemy_cms 8.3.11 → 8.4.0

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 (368) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +58 -10
  4. data/app/assets/builds/alchemy/admin/page-select.css +1 -1
  5. data/app/assets/builds/alchemy/admin/print.css +1 -1
  6. data/app/assets/builds/alchemy/admin/remote-select.css +1 -0
  7. data/app/assets/builds/alchemy/admin/tags-autocomplete.css +1 -0
  8. data/app/assets/builds/alchemy/admin.css +4 -4
  9. data/app/assets/builds/alchemy/alchemy_admin.min.js +1 -1
  10. data/app/assets/builds/alchemy/alchemy_admin.min.js.map +1 -1
  11. data/app/assets/builds/alchemy/dark-theme.css +1 -1
  12. data/app/assets/builds/alchemy/light-theme.css +1 -1
  13. data/app/assets/builds/alchemy/preview.min.js +1 -1
  14. data/app/assets/builds/alchemy/theme.css +1 -1
  15. data/app/assets/builds/alchemy/welcome.css +1 -1
  16. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css +1 -1
  17. data/app/assets/builds/tinymce/skins/content/alchemy-dark/content.min.css +1 -1
  18. data/app/assets/builds/tinymce/skins/ui/alchemy/skin.min.css +1 -1
  19. data/app/assets/builds/tinymce/skins/ui/alchemy-dark/skin.min.css +1 -1
  20. data/app/assets/images/alchemy/icons-sprite.svg +1 -1
  21. data/app/components/alchemy/admin/dashboard/widgets/greeting.html.erb +1 -1
  22. data/app/components/alchemy/admin/dashboard/widgets/news_reader.html.erb +38 -0
  23. data/app/components/alchemy/admin/dashboard/widgets/news_reader.rb +54 -0
  24. data/app/components/alchemy/admin/dashboard/widgets/online_users.html.erb +1 -1
  25. data/app/components/alchemy/admin/dashboard/widgets/recent_pages.html.erb +1 -1
  26. data/app/components/alchemy/admin/dashboard/widgets/system_info.html.erb +11 -3
  27. data/app/components/alchemy/admin/dashboard/widgets/system_info.rb +6 -1
  28. data/app/components/alchemy/admin/element_editor.html.erb +1 -1
  29. data/app/components/alchemy/admin/element_select.rb +30 -20
  30. data/app/components/alchemy/admin/element_status_indicators.html.erb +16 -0
  31. data/app/components/alchemy/admin/element_status_indicators.rb +31 -0
  32. data/app/components/alchemy/admin/link_dialog/external_tab.rb +2 -1
  33. data/app/components/alchemy/admin/main_navigation/entry.rb +61 -0
  34. data/app/components/alchemy/admin/main_navigation/menu.rb +21 -0
  35. data/app/components/alchemy/admin/main_navigation/sub_navigation.rb +31 -0
  36. data/app/components/alchemy/admin/page_node.html.erb +1 -1
  37. data/app/components/alchemy/admin/page_permitted_roles_select.html.erb +11 -0
  38. data/app/components/alchemy/admin/page_permitted_roles_select.rb +35 -0
  39. data/app/components/alchemy/admin/page_select.rb +18 -8
  40. data/app/components/alchemy/admin/preview_time_select.rb +1 -1
  41. data/app/components/alchemy/admin/toolbar_button.rb +43 -20
  42. data/app/components/alchemy/admin/uploader_button.rb +66 -0
  43. data/app/components/alchemy/ingredients/base_editor.rb +10 -1
  44. data/app/components/alchemy/ingredients/boolean_editor.rb +1 -0
  45. data/app/components/alchemy/ingredients/color_editor.rb +6 -3
  46. data/app/components/alchemy/ingredients/datetime_view.rb +1 -1
  47. data/app/components/alchemy/ingredients/picture_view.rb +2 -4
  48. data/app/components/alchemy/menubar.html.erb +157 -0
  49. data/app/components/alchemy/menubar.rb +15 -0
  50. data/app/controllers/alchemy/admin/attachments_controller.rb +12 -9
  51. data/app/controllers/alchemy/admin/base_controller.rb +34 -21
  52. data/app/controllers/alchemy/admin/dashboard_controller.rb +4 -0
  53. data/app/controllers/alchemy/admin/elements_controller.rb +4 -23
  54. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  55. data/app/controllers/alchemy/admin/nodes_controller.rb +1 -1
  56. data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
  57. data/app/controllers/alchemy/admin/pictures_controller.rb +6 -3
  58. data/app/controllers/alchemy/admin/resources_controller.rb +5 -5
  59. data/app/controllers/alchemy/admin/sites_controller.rb +1 -1
  60. data/app/controllers/alchemy/base_controller.rb +24 -16
  61. data/app/controllers/alchemy/pages_controller.rb +29 -8
  62. data/app/controllers/alchemy/sitemap_controller.rb +58 -0
  63. data/app/controllers/concerns/alchemy/admin/csp_protection.rb +43 -0
  64. data/app/controllers/concerns/alchemy/admin/current_language.rb +1 -1
  65. data/app/controllers/concerns/alchemy/admin/resource_filter.rb +3 -1
  66. data/{lib → app/controllers/concerns}/alchemy/controller_actions.rb +13 -0
  67. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
  68. data/app/helpers/alchemy/admin/base_helper.rb +4 -1
  69. data/app/helpers/alchemy/admin/form_helper.rb +0 -2
  70. data/app/helpers/alchemy/admin/navigation_helper.rb +10 -181
  71. data/app/helpers/alchemy/elements_block_helper.rb +14 -0
  72. data/app/helpers/alchemy/resources_helper.rb +15 -1
  73. data/app/javascript/alchemy_admin/components/attachment_select.js +11 -20
  74. data/app/javascript/alchemy_admin/components/auto_submit.js +2 -4
  75. data/app/javascript/alchemy_admin/components/button.js +0 -6
  76. data/app/javascript/alchemy_admin/components/clear_schedule_button.js +21 -0
  77. data/app/javascript/alchemy_admin/components/color_select.js +50 -45
  78. data/app/javascript/alchemy_admin/components/conditional_field.js +50 -0
  79. data/app/javascript/alchemy_admin/components/dirty_guard.js +77 -0
  80. data/app/javascript/alchemy_admin/components/dom_id_select.js +17 -10
  81. data/app/javascript/alchemy_admin/components/element_editor/delete_element_button.js +7 -2
  82. data/app/javascript/alchemy_admin/components/element_editor.js +29 -56
  83. data/app/javascript/alchemy_admin/components/element_select.js +26 -66
  84. data/app/javascript/alchemy_admin/components/icon.js +9 -4
  85. data/app/javascript/alchemy_admin/{image_cropper.js → components/image_cropper.js} +39 -53
  86. data/app/javascript/alchemy_admin/components/image_overlay_link.js +14 -0
  87. data/app/javascript/alchemy_admin/components/index.js +12 -1
  88. data/app/javascript/alchemy_admin/components/main_navi_entry.js +75 -0
  89. data/app/javascript/alchemy_admin/components/menu_node.js +73 -0
  90. data/app/javascript/alchemy_admin/components/news_reader.js +109 -0
  91. data/app/javascript/alchemy_admin/components/node_folder.js +36 -0
  92. data/app/javascript/alchemy_admin/components/node_form.js +34 -0
  93. data/app/javascript/alchemy_admin/components/node_select.js +25 -30
  94. data/app/javascript/alchemy_admin/components/node_tree.js +56 -0
  95. data/app/javascript/alchemy_admin/components/page_node.js +2 -1
  96. data/app/javascript/alchemy_admin/components/page_select.js +16 -34
  97. data/app/javascript/alchemy_admin/components/picture_archive.js +92 -0
  98. data/app/javascript/alchemy_admin/components/picture_editor.js +2 -1
  99. data/app/javascript/alchemy_admin/components/preview_window.js +11 -3
  100. data/app/javascript/alchemy_admin/components/remote_select.js +461 -81
  101. data/app/javascript/alchemy_admin/components/select.js +26 -88
  102. data/app/javascript/alchemy_admin/components/sitemap.js +2 -1
  103. data/app/javascript/alchemy_admin/components/sortable_elements.js +2 -1
  104. data/app/javascript/alchemy_admin/components/tags_autocomplete.js +63 -48
  105. data/app/javascript/alchemy_admin/components/tinymce.js +2 -1
  106. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +3 -2
  107. data/app/javascript/alchemy_admin/components/uploader.js +19 -3
  108. data/app/javascript/alchemy_admin/confirm_dialog.js +7 -1
  109. data/app/javascript/alchemy_admin/dialog.js +182 -110
  110. data/app/javascript/alchemy_admin/hotkeys.js +0 -5
  111. data/app/javascript/alchemy_admin/i18n.js +3 -9
  112. data/app/javascript/alchemy_admin/image_overlay.js +58 -42
  113. data/app/javascript/alchemy_admin/initializer.js +2 -2
  114. data/app/javascript/alchemy_admin/link_dialog.js +15 -2
  115. data/app/javascript/alchemy_admin/routes.js +18 -0
  116. data/app/javascript/alchemy_admin/turbo_stream_actions.js +88 -0
  117. data/app/javascript/alchemy_admin/utils/ajax.js +14 -3
  118. data/app/javascript/alchemy_admin/utils/events.js +5 -0
  119. data/app/javascript/alchemy_admin/utils/json_script.js +12 -0
  120. data/app/javascript/alchemy_admin/utils/tom_select.js +171 -0
  121. data/app/javascript/alchemy_admin.js +2 -19
  122. data/app/javascript/preview.js +131 -113
  123. data/app/jobs/alchemy/invalidate_elements_cache_job.rb +1 -1
  124. data/app/models/alchemy/admin/content_security_policy.rb +143 -0
  125. data/app/models/alchemy/admin/filters/base.rb +7 -0
  126. data/app/models/alchemy/admin/filters/datepicker.rb +1 -1
  127. data/app/models/alchemy/admin/filters/select.rb +20 -7
  128. data/app/models/alchemy/attachment.rb +14 -7
  129. data/app/models/alchemy/cache_control.rb +104 -0
  130. data/app/models/alchemy/current.rb +1 -1
  131. data/app/models/alchemy/eager_loading.rb +0 -2
  132. data/app/models/alchemy/element.rb +23 -8
  133. data/app/models/alchemy/element_definition.rb +1 -0
  134. data/app/models/alchemy/elements_repository.rb +11 -0
  135. data/app/models/alchemy/folded_page.rb +5 -1
  136. data/app/models/alchemy/ingredient.rb +26 -0
  137. data/app/models/alchemy/ingredients/datetime.rb +1 -1
  138. data/app/models/alchemy/ingredients/link.rb +2 -0
  139. data/app/models/alchemy/ingredients/picture.rb +3 -0
  140. data/app/models/alchemy/ingredients/text.rb +2 -0
  141. data/app/models/alchemy/language.rb +19 -7
  142. data/app/models/alchemy/legacy_page_url.rb +6 -1
  143. data/app/models/alchemy/node.rb +51 -0
  144. data/app/models/alchemy/page/page_natures.rb +41 -8
  145. data/app/models/alchemy/page/page_scopes.rb +23 -0
  146. data/app/models/alchemy/page/sitemap_cache_key.rb +56 -0
  147. data/app/models/alchemy/page.rb +88 -32
  148. data/app/models/alchemy/page_definition.rb +1 -1
  149. data/app/models/alchemy/page_mutex.rb +16 -0
  150. data/app/models/alchemy/page_version.rb +24 -1
  151. data/app/models/alchemy/permissions.rb +6 -5
  152. data/app/models/alchemy/picture.rb +15 -7
  153. data/app/models/alchemy/picture_description.rb +22 -0
  154. data/app/models/alchemy/picture_thumb.rb +18 -0
  155. data/app/models/alchemy/publishable/timestamp_resolver.rb +70 -0
  156. data/app/models/alchemy/resource.rb +1 -1
  157. data/app/models/alchemy/safe_url_validator.rb +34 -0
  158. data/app/models/alchemy/site.rb +8 -3
  159. data/app/models/alchemy/storage_adapter/active_storage/preprocessor.rb +7 -3
  160. data/app/models/alchemy/storage_adapter/active_storage.rb +4 -1
  161. data/app/models/alchemy/tag.rb +10 -4
  162. data/{lib → app/models/concerns}/alchemy/filetypes.rb +5 -0
  163. data/app/models/concerns/alchemy/picture_thumbnails.rb +61 -6
  164. data/app/models/concerns/alchemy/publishable.rb +14 -27
  165. data/app/models/concerns/alchemy/taggable.rb +92 -0
  166. data/app/models/concerns/alchemy/user_methods.rb +95 -0
  167. data/app/services/alchemy/duplicate_element.rb +5 -2
  168. data/app/services/alchemy/element_preloader.rb +1 -2
  169. data/app/stylesheets/alchemy/_custom-properties.scss +1 -0
  170. data/app/stylesheets/alchemy/_extends.scss +0 -8
  171. data/app/stylesheets/alchemy/_themes.scss +10 -9
  172. data/app/stylesheets/alchemy/admin/_empty-state.scss +29 -0
  173. data/app/stylesheets/alchemy/admin/_help.scss +10 -0
  174. data/app/stylesheets/alchemy/admin/_tom-select.scss +104 -15
  175. data/app/stylesheets/alchemy/admin/archive.scss +56 -11
  176. data/app/stylesheets/alchemy/admin/base.scss +4 -5
  177. data/app/stylesheets/alchemy/admin/buttons.scss +12 -1
  178. data/app/stylesheets/alchemy/admin/dashboard.scss +150 -20
  179. data/app/stylesheets/alchemy/admin/dialogs.scss +27 -36
  180. data/app/stylesheets/alchemy/admin/element-select.scss +1 -1
  181. data/app/stylesheets/alchemy/admin/elements.scss +8 -24
  182. data/app/stylesheets/alchemy/admin/flash.scss +2 -1
  183. data/app/stylesheets/alchemy/admin/forms.scss +60 -24
  184. data/app/stylesheets/alchemy/admin/frame.scss +40 -4
  185. data/app/stylesheets/alchemy/admin/image_library.scss +9 -12
  186. data/app/stylesheets/alchemy/admin/navigation.scss +17 -14
  187. data/app/stylesheets/alchemy/admin/node-select.scss +13 -37
  188. data/app/stylesheets/alchemy/admin/nodes.scss +1 -1
  189. data/app/stylesheets/alchemy/admin/page-select.scss +6 -97
  190. data/app/stylesheets/alchemy/admin/print.scss +0 -4
  191. data/app/stylesheets/alchemy/admin/remote-select.scss +170 -0
  192. data/app/stylesheets/alchemy/admin/search.scss +2 -3
  193. data/app/stylesheets/alchemy/admin/selects.scss +1 -294
  194. data/app/stylesheets/alchemy/admin/sitemap.scss +2 -1
  195. data/app/stylesheets/alchemy/admin/tables.scss +7 -1
  196. data/app/stylesheets/alchemy/admin/tags-autocomplete.scss +17 -0
  197. data/app/stylesheets/alchemy/admin/tags.scss +0 -13
  198. data/app/stylesheets/alchemy/admin/toolbar.scss +9 -6
  199. data/app/stylesheets/alchemy/admin/upload.scss +61 -1
  200. data/app/stylesheets/alchemy/admin.scss +4 -1
  201. data/app/types/alchemy/cache_control_type.rb +84 -0
  202. data/app/views/alchemy/_edit_mode.html.erb +1 -1
  203. data/app/views/alchemy/_menubar.html.erb +2 -154
  204. data/app/views/alchemy/_preview_mode_code.html.erb +0 -3
  205. data/app/views/alchemy/admin/_left_menu.html.erb +18 -5
  206. data/app/views/alchemy/admin/_top_menu.html.erb +1 -1
  207. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +5 -4
  208. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +3 -3
  209. data/app/views/alchemy/admin/attachments/_files_list.html.erb +71 -83
  210. data/app/views/alchemy/admin/attachments/assign.turbo_stream.erb +8 -0
  211. data/app/views/alchemy/admin/attachments/index.html.erb +32 -7
  212. data/app/views/alchemy/admin/clipboard/insert.turbo_stream.erb +1 -1
  213. data/app/views/alchemy/admin/crop.html.erb +20 -20
  214. data/app/views/alchemy/admin/dashboard/_footer.html.erb +0 -3
  215. data/app/views/alchemy/admin/dashboard/_top.html.erb +1 -0
  216. data/app/views/alchemy/admin/dashboard/help.html.erb +84 -57
  217. data/app/views/alchemy/admin/dashboard/license.html.erb +6 -0
  218. data/app/views/alchemy/admin/elements/_footer.html.erb +0 -1
  219. data/app/views/alchemy/admin/elements/_form.html.erb +1 -1
  220. data/app/views/alchemy/admin/elements/_header.html.erb +2 -19
  221. data/app/views/alchemy/admin/elements/_preview_text_quote.html.erb +3 -0
  222. data/app/views/alchemy/admin/elements/_schedule.html.erb +7 -7
  223. data/app/views/alchemy/admin/elements/_toolbar.html.erb +1 -1
  224. data/app/views/alchemy/admin/elements/create.turbo_stream.erb +1 -1
  225. data/app/views/alchemy/admin/elements/index.html.erb +1 -1
  226. data/app/views/alchemy/admin/elements/publish.turbo_stream.erb +2 -2
  227. data/app/views/alchemy/admin/elements/update.turbo_stream.erb +31 -0
  228. data/app/views/alchemy/admin/ingredients/update.turbo_stream.erb +6 -3
  229. data/app/views/alchemy/admin/languages/_table.html.erb +0 -2
  230. data/app/views/alchemy/admin/languages/index.html.erb +25 -29
  231. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +1 -3
  232. data/app/views/alchemy/admin/layoutpages/edit.html.erb +1 -1
  233. data/app/views/alchemy/admin/layoutpages/index.html.erb +26 -7
  234. data/app/views/alchemy/admin/nodes/_form.html.erb +3 -21
  235. data/app/views/alchemy/admin/nodes/_node.html.erb +93 -88
  236. data/app/views/alchemy/admin/nodes/index.html.erb +15 -23
  237. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +2 -6
  238. data/app/views/alchemy/admin/pages/_form.html.erb +2 -1
  239. data/app/views/alchemy/admin/pages/_publication_fields.html.erb +1 -1
  240. data/app/views/alchemy/admin/pages/_table.html.erb +2 -4
  241. data/app/views/alchemy/admin/pages/_toolbar.html.erb +2 -1
  242. data/app/views/alchemy/admin/pages/edit.html.erb +10 -21
  243. data/app/views/alchemy/admin/pages/flush.turbo_stream.erb +1 -1
  244. data/app/views/alchemy/admin/pages/index.html.erb +26 -31
  245. data/app/views/alchemy/admin/pages/info.html.erb +2 -2
  246. data/app/views/alchemy/admin/pages/update.turbo_stream.erb +2 -2
  247. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
  248. data/app/views/alchemy/admin/partials/_routes.html.erb +24 -48
  249. data/app/views/alchemy/admin/pictures/_archive.html.erb +3 -17
  250. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  251. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +5 -3
  252. data/app/views/alchemy/admin/pictures/_form.html.erb +0 -1
  253. data/app/views/alchemy/admin/pictures/_infos.html.erb +5 -1
  254. data/app/views/alchemy/admin/pictures/_picture.html.erb +1 -1
  255. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +3 -4
  256. data/app/views/alchemy/admin/pictures/assign.turbo_stream.erb +7 -0
  257. data/app/views/alchemy/admin/pictures/index.html.erb +38 -30
  258. data/app/views/alchemy/admin/pictures/show.html.erb +41 -41
  259. data/app/views/alchemy/admin/resources/_empty_state.html.erb +27 -0
  260. data/app/views/alchemy/admin/resources/_pagination.html.erb +1 -1
  261. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +1 -1
  262. data/app/views/alchemy/admin/resources/_resource_table.html.erb +0 -2
  263. data/app/views/alchemy/admin/resources/_resource_usage_info.html.erb +3 -2
  264. data/app/views/alchemy/admin/resources/index.html.erb +32 -13
  265. data/app/views/alchemy/admin/sites/index.html.erb +24 -22
  266. data/app/views/alchemy/admin/styleguide/index.html.erb +35 -12
  267. data/app/views/alchemy/admin/tags/index.html.erb +27 -25
  268. data/app/views/alchemy/admin/tinymce/_setup.html.erb +6 -8
  269. data/app/views/alchemy/admin/translations/_en.js +3 -0
  270. data/app/views/alchemy/admin/uploader/_button.html.erb +11 -17
  271. data/app/views/alchemy/admin/uploader/_setup.html.erb +3 -3
  272. data/app/views/alchemy/pages/sitemap.xml.erb +2 -0
  273. data/app/views/kaminari/alchemy/_first_page.html.erb +1 -2
  274. data/app/views/kaminari/alchemy/_gap.html.erb +0 -1
  275. data/app/views/kaminari/alchemy/_last_page.html.erb +1 -2
  276. data/app/views/kaminari/alchemy/_next_page.html.erb +1 -2
  277. data/app/views/kaminari/alchemy/_page.html.erb +1 -2
  278. data/app/views/kaminari/alchemy/_paginator.html.erb +0 -1
  279. data/app/views/kaminari/alchemy/_prev_page.html.erb +1 -2
  280. data/app/views/layouts/alchemy/admin/dialog.html.erb +3 -0
  281. data/app/views/layouts/alchemy/admin.html.erb +5 -6
  282. data/config/brakeman.ignore +23 -1
  283. data/config/importmap.rb +10 -8
  284. data/config/initializers/dragonfly.rb +21 -17
  285. data/config/locales/alchemy.en.yml +52 -11
  286. data/config/routes.rb +3 -3
  287. data/db/migrate/20260727120000_add_permitted_roles_to_alchemy_pages.rb +23 -0
  288. data/db/migrate/20260820120000_add_cached_tag_list_to_taggables.rb +57 -0
  289. data/lib/alchemy/configuration/number_option.rb +13 -0
  290. data/lib/alchemy/configuration/proc_option.rb +13 -0
  291. data/lib/alchemy/configuration.rb +2 -0
  292. data/lib/alchemy/configurations/admin_components.rb +30 -0
  293. data/lib/alchemy/configurations/format_matchers.rb +7 -1
  294. data/lib/alchemy/configurations/main.rb +103 -4
  295. data/lib/alchemy/configurations/menu.rb +91 -0
  296. data/lib/alchemy/configurations/menu_item.rb +123 -0
  297. data/lib/alchemy/configurations/sitemap.rb +1 -0
  298. data/lib/alchemy/configurations/uploader.rb +15 -1
  299. data/lib/alchemy/engine.rb +0 -6
  300. data/lib/alchemy/i18n.rb +26 -0
  301. data/lib/alchemy/modules.rb +52 -50
  302. data/lib/alchemy/tasks/generate_thumbnails.rb +99 -0
  303. data/lib/alchemy/tasks/tidy.rb +1 -1
  304. data/lib/alchemy/test_support/capybara_helpers.rb +48 -37
  305. data/lib/alchemy/test_support/current_language_shared_examples.rb +1 -1
  306. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +4 -1
  307. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +132 -0
  308. data/lib/alchemy/test_support/shared_ingredient_examples.rb +52 -0
  309. data/lib/alchemy/test_support/shared_publishable_examples.rb +29 -4
  310. data/lib/alchemy/upgrader/eight_four.rb +237 -0
  311. data/lib/alchemy/upgrader/register_module_rewriter.rb +177 -0
  312. data/lib/alchemy/upgrader.rb +2 -1
  313. data/lib/alchemy/version.rb +1 -1
  314. data/lib/alchemy.rb +0 -1
  315. data/lib/alchemy_cms.rb +0 -13
  316. data/lib/generators/alchemy/elements/templates/view.html.erb +1 -1
  317. data/lib/generators/alchemy/elements/templates/view.html.haml +1 -1
  318. data/lib/generators/alchemy/elements/templates/view.html.slim +1 -1
  319. data/lib/generators/alchemy/install/install_generator.rb +2 -13
  320. data/lib/generators/alchemy/install/templates/alchemy.rb.tt +24 -9
  321. data/lib/generators/alchemy/module/module_generator.rb +1 -0
  322. data/lib/generators/alchemy/module/templates/ability.rb.tt +1 -1
  323. data/lib/generators/alchemy/module/templates/module_config.rb.tt +16 -18
  324. data/lib/generators/alchemy/user_columns_migration/templates/migration.rb.tt +19 -0
  325. data/lib/generators/alchemy/user_columns_migration/user_columns_migration_generator.rb +30 -0
  326. data/lib/tasks/alchemy/thumbnails.rake +16 -29
  327. data/lib/tasks/alchemy/upgrade.rake +45 -3
  328. data/vendor/javascript/cropperjs.min.js +3 -3
  329. data/vendor/javascript/floating-ui.min.js +1 -1
  330. data/vendor/javascript/tinymce.min.js +5 -5
  331. data/vendor/javascript/tom-select.min.js +1 -1
  332. metadata +85 -65
  333. data/app/javascript/alchemy_admin/components/action.js +0 -50
  334. data/app/javascript/alchemy_admin/dirty.js +0 -55
  335. data/app/javascript/alchemy_admin/node_tree.js +0 -82
  336. data/app/javascript/alchemy_admin/picture_selector.js +0 -67
  337. data/app/javascript/alchemy_admin/templates/compiled.js +0 -1
  338. data/app/javascript/alchemy_admin/templates/node_folder.hbs +0 -3
  339. data/app/stylesheets/alchemy/admin/attachment-select.scss +0 -19
  340. data/app/views/alchemy/admin/_main_navi.html.erb +0 -6
  341. data/app/views/alchemy/admin/attachments/assign.js.erb +0 -15
  342. data/app/views/alchemy/admin/pages/_page_layout_filter.html.erb +0 -30
  343. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +0 -20
  344. data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +0 -11
  345. data/app/views/alchemy/admin/pictures/assign.js.erb +0 -13
  346. data/app/views/alchemy/base/error_notice.js.erb +0 -1
  347. data/app/views/alchemy/base/permission_denied.js.erb +0 -3
  348. data/app/views/alchemy/base/redirect.js.erb +0 -11
  349. data/config/alchemy/config.yml +0 -217
  350. data/config/alchemy/modules.yml +0 -82
  351. data/config/initializers/rails_live_reload.rb +0 -13
  352. data/lib/alchemy/dev_support/live_reload_watcher.rb +0 -5
  353. data/lib/alchemy/taggable.rb +0 -49
  354. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +0 -34
  355. data/vendor/assets/stylesheets/alchemy_admin/select2.css +0 -1
  356. data/vendor/javascript/handlebars.min.js +0 -29
  357. data/vendor/javascript/jquery.min.js +0 -2
  358. data/vendor/javascript/rails-ujs.min.js +0 -1
  359. data/vendor/javascript/select2.min.js +0 -23
  360. /data/{lib → app/controllers/concerns}/alchemy/ability_helper.rb +0 -0
  361. /data/{lib → app/controllers/concerns}/alchemy/admin/locale.rb +0 -0
  362. /data/{lib → app/controllers/concerns}/alchemy/admin/preview_time.rb +0 -0
  363. /data/{lib → app/controllers/concerns}/alchemy/admin/timezone.rb +0 -0
  364. /data/{lib → app/controllers/concerns}/alchemy/configuration_methods.rb +0 -0
  365. /data/{lib → app/models}/alchemy/admin/preview_url.rb +0 -0
  366. /data/{lib → app/models/concerns}/alchemy/hints.rb +0 -0
  367. /data/{lib → app/models/concerns}/alchemy/name_conversions.rb +0 -0
  368. /data/{lib → app/services}/alchemy/elements_finder.rb +0 -0
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: 8.3.11
4
+ version: 8.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas von Deyen
@@ -282,20 +282,6 @@ dependencies:
282
282
  - - "~>"
283
283
  - !ruby/object:Gem::Version
284
284
  version: '3.3'
285
- - !ruby/object:Gem::Dependency
286
- name: dragonfly
287
- requirement: !ruby/object:Gem::Requirement
288
- requirements:
289
- - - "~>"
290
- - !ruby/object:Gem::Version
291
- version: '1.4'
292
- type: :runtime
293
- prerelease: false
294
- version_requirements: !ruby/object:Gem::Requirement
295
- requirements:
296
- - - "~>"
297
- - !ruby/object:Gem::Version
298
- version: '1.4'
299
285
  - !ruby/object:Gem::Dependency
300
286
  name: gutentag
301
287
  requirement: !ruby/object:Gem::Requirement
@@ -384,20 +370,20 @@ dependencies:
384
370
  requirements:
385
371
  - - ">="
386
372
  - !ruby/object:Gem::Version
387
- version: '1.8'
373
+ version: '4.0'
388
374
  - - "<"
389
375
  - !ruby/object:Gem::Version
390
- version: '5.0'
376
+ version: '7.0'
391
377
  type: :runtime
392
378
  prerelease: false
393
379
  version_requirements: !ruby/object:Gem::Requirement
394
380
  requirements:
395
381
  - - ">="
396
382
  - !ruby/object:Gem::Version
397
- version: '1.8'
383
+ version: '4.0'
398
384
  - - "<"
399
385
  - !ruby/object:Gem::Version
400
- version: '5.0'
386
+ version: '7.0'
401
387
  - !ruby/object:Gem::Dependency
402
388
  name: simple_form
403
389
  requirement: !ruby/object:Gem::Requirement
@@ -654,7 +640,7 @@ dependencies:
654
640
  - - "~>"
655
641
  - !ruby/object:Gem::Version
656
642
  version: '0.9'
657
- description: Alchemy is a powerful, userfriendly and flexible Rails CMS.
643
+ description: Alchemy is a semantically structured and full-featured Rails CMS Engine.
658
644
  email:
659
645
  - alchemy@blish.cloud
660
646
  executables: []
@@ -666,6 +652,8 @@ files:
666
652
  - app/assets/builds/alchemy/admin.css
667
653
  - app/assets/builds/alchemy/admin/page-select.css
668
654
  - app/assets/builds/alchemy/admin/print.css
655
+ - app/assets/builds/alchemy/admin/remote-select.css
656
+ - app/assets/builds/alchemy/admin/tags-autocomplete.css
669
657
  - app/assets/builds/alchemy/alchemy_admin.min.js
670
658
  - app/assets/builds/alchemy/alchemy_admin.min.js.map
671
659
  - app/assets/builds/alchemy/dark-theme.css
@@ -698,6 +686,8 @@ files:
698
686
  - app/components/alchemy/admin/dashboard/widgets/greeting.rb
699
687
  - app/components/alchemy/admin/dashboard/widgets/locked_pages.html.erb
700
688
  - app/components/alchemy/admin/dashboard/widgets/locked_pages.rb
689
+ - app/components/alchemy/admin/dashboard/widgets/news_reader.html.erb
690
+ - app/components/alchemy/admin/dashboard/widgets/news_reader.rb
701
691
  - app/components/alchemy/admin/dashboard/widgets/online_users.html.erb
702
692
  - app/components/alchemy/admin/dashboard/widgets/online_users.rb
703
693
  - app/components/alchemy/admin/dashboard/widgets/page_counts.rb
@@ -718,6 +708,8 @@ files:
718
708
  - app/components/alchemy/admin/element_editor.rb
719
709
  - app/components/alchemy/admin/element_schedule_timestamps.rb
720
710
  - app/components/alchemy/admin/element_select.rb
711
+ - app/components/alchemy/admin/element_status_indicators.html.erb
712
+ - app/components/alchemy/admin/element_status_indicators.rb
721
713
  - app/components/alchemy/admin/icon.rb
722
714
  - app/components/alchemy/admin/ingredient_editor.rb
723
715
  - app/components/alchemy/admin/link_dialog/anchor_tab.rb
@@ -728,10 +720,15 @@ files:
728
720
  - app/components/alchemy/admin/link_dialog/tabs.rb
729
721
  - app/components/alchemy/admin/list_filter.rb
730
722
  - app/components/alchemy/admin/locale_select.rb
723
+ - app/components/alchemy/admin/main_navigation/entry.rb
724
+ - app/components/alchemy/admin/main_navigation/menu.rb
725
+ - app/components/alchemy/admin/main_navigation/sub_navigation.rb
731
726
  - app/components/alchemy/admin/message.rb
732
727
  - app/components/alchemy/admin/node_select.rb
733
728
  - app/components/alchemy/admin/page_node.html.erb
734
729
  - app/components/alchemy/admin/page_node.rb
730
+ - app/components/alchemy/admin/page_permitted_roles_select.html.erb
731
+ - app/components/alchemy/admin/page_permitted_roles_select.rb
735
732
  - app/components/alchemy/admin/page_publication_fields.html.erb
736
733
  - app/components/alchemy/admin/page_publication_fields.rb
737
734
  - app/components/alchemy/admin/page_select.rb
@@ -757,6 +754,7 @@ files:
757
754
  - app/components/alchemy/admin/timezone_select.rb
758
755
  - app/components/alchemy/admin/toolbar_button.rb
759
756
  - app/components/alchemy/admin/update_check.rb
757
+ - app/components/alchemy/admin/uploader_button.rb
760
758
  - app/components/alchemy/ingredients/audio_editor.rb
761
759
  - app/components/alchemy/ingredients/audio_view.rb
762
760
  - app/components/alchemy/ingredients/base_editor.rb
@@ -791,6 +789,8 @@ files:
791
789
  - app/components/alchemy/ingredients/text_view.rb
792
790
  - app/components/alchemy/ingredients/video_editor.rb
793
791
  - app/components/alchemy/ingredients/video_view.rb
792
+ - app/components/alchemy/menubar.html.erb
793
+ - app/components/alchemy/menubar.rb
794
794
  - app/components/concerns/alchemy/ingredients/link_target.rb
795
795
  - app/controllers/alchemy/admin/attachments_controller.rb
796
796
  - app/controllers/alchemy/admin/base_controller.rb
@@ -821,13 +821,21 @@ files:
821
821
  - app/controllers/alchemy/base_controller.rb
822
822
  - app/controllers/alchemy/messages_controller.rb
823
823
  - app/controllers/alchemy/pages_controller.rb
824
+ - app/controllers/alchemy/sitemap_controller.rb
825
+ - app/controllers/concerns/alchemy/ability_helper.rb
824
826
  - app/controllers/concerns/alchemy/admin/archive_overlay.rb
825
827
  - app/controllers/concerns/alchemy/admin/clipboard.rb
826
828
  - app/controllers/concerns/alchemy/admin/crop_action.rb
829
+ - app/controllers/concerns/alchemy/admin/csp_protection.rb
827
830
  - app/controllers/concerns/alchemy/admin/current_language.rb
831
+ - app/controllers/concerns/alchemy/admin/locale.rb
828
832
  - app/controllers/concerns/alchemy/admin/picture_descriptions_form_helper.rb
833
+ - app/controllers/concerns/alchemy/admin/preview_time.rb
829
834
  - app/controllers/concerns/alchemy/admin/resource_filter.rb
835
+ - app/controllers/concerns/alchemy/admin/timezone.rb
830
836
  - app/controllers/concerns/alchemy/admin/uploader_responses.rb
837
+ - app/controllers/concerns/alchemy/configuration_methods.rb
838
+ - app/controllers/concerns/alchemy/controller_actions.rb
831
839
  - app/controllers/concerns/alchemy/legacy_page_redirects.rb
832
840
  - app/controllers/concerns/alchemy/site_redirects.rb
833
841
  - app/decorators/alchemy/ingredient_editor.rb
@@ -844,15 +852,17 @@ files:
844
852
  - app/helpers/alchemy/resources_helper.rb
845
853
  - app/helpers/alchemy/url_helper.rb
846
854
  - app/javascript/alchemy_admin.js
847
- - app/javascript/alchemy_admin/components/action.js
848
855
  - app/javascript/alchemy_admin/components/attachment_select.js
849
856
  - app/javascript/alchemy_admin/components/auto_submit.js
850
857
  - app/javascript/alchemy_admin/components/button.js
851
858
  - app/javascript/alchemy_admin/components/char_counter.js
859
+ - app/javascript/alchemy_admin/components/clear_schedule_button.js
852
860
  - app/javascript/alchemy_admin/components/clipboard_button.js
853
861
  - app/javascript/alchemy_admin/components/color_select.js
862
+ - app/javascript/alchemy_admin/components/conditional_field.js
854
863
  - app/javascript/alchemy_admin/components/datepicker.js
855
864
  - app/javascript/alchemy_admin/components/dialog_link.js
865
+ - app/javascript/alchemy_admin/components/dirty_guard.js
856
866
  - app/javascript/alchemy_admin/components/dom_id_select.js
857
867
  - app/javascript/alchemy_admin/components/element_editor.js
858
868
  - app/javascript/alchemy_admin/components/element_editor/delete_element_button.js
@@ -863,18 +873,27 @@ files:
863
873
  - app/javascript/alchemy_admin/components/file_editor.js
864
874
  - app/javascript/alchemy_admin/components/growl.js
865
875
  - app/javascript/alchemy_admin/components/icon.js
876
+ - app/javascript/alchemy_admin/components/image_cropper.js
877
+ - app/javascript/alchemy_admin/components/image_overlay_link.js
866
878
  - app/javascript/alchemy_admin/components/index.js
867
879
  - app/javascript/alchemy_admin/components/ingredient_group.js
868
880
  - app/javascript/alchemy_admin/components/link_buttons.js
869
881
  - app/javascript/alchemy_admin/components/link_buttons/link_button.js
870
882
  - app/javascript/alchemy_admin/components/link_buttons/unlink_button.js
871
883
  - app/javascript/alchemy_admin/components/list_filter.js
884
+ - app/javascript/alchemy_admin/components/main_navi_entry.js
885
+ - app/javascript/alchemy_admin/components/menu_node.js
872
886
  - app/javascript/alchemy_admin/components/message.js
887
+ - app/javascript/alchemy_admin/components/news_reader.js
888
+ - app/javascript/alchemy_admin/components/node_folder.js
889
+ - app/javascript/alchemy_admin/components/node_form.js
873
890
  - app/javascript/alchemy_admin/components/node_select.js
891
+ - app/javascript/alchemy_admin/components/node_tree.js
874
892
  - app/javascript/alchemy_admin/components/overlay.js
875
893
  - app/javascript/alchemy_admin/components/page_node.js
876
894
  - app/javascript/alchemy_admin/components/page_publication_fields.js
877
895
  - app/javascript/alchemy_admin/components/page_select.js
896
+ - app/javascript/alchemy_admin/components/picture_archive.js
878
897
  - app/javascript/alchemy_admin/components/picture_description_select.js
879
898
  - app/javascript/alchemy_admin/components/picture_editor.js
880
899
  - app/javascript/alchemy_admin/components/picture_thumbnail.js
@@ -893,31 +912,29 @@ files:
893
912
  - app/javascript/alchemy_admin/components/uploader/progress.js
894
913
  - app/javascript/alchemy_admin/confirm_dialog.js
895
914
  - app/javascript/alchemy_admin/dialog.js
896
- - app/javascript/alchemy_admin/dirty.js
897
915
  - app/javascript/alchemy_admin/fixed_elements.js
898
916
  - app/javascript/alchemy_admin/growler.js
899
917
  - app/javascript/alchemy_admin/hotkeys.js
900
918
  - app/javascript/alchemy_admin/i18n.js
901
- - app/javascript/alchemy_admin/image_cropper.js
902
919
  - app/javascript/alchemy_admin/image_overlay.js
903
920
  - app/javascript/alchemy_admin/ingredient_anchor_link.js
904
921
  - app/javascript/alchemy_admin/initializer.js
905
922
  - app/javascript/alchemy_admin/link_dialog.js
906
- - app/javascript/alchemy_admin/node_tree.js
907
- - app/javascript/alchemy_admin/picture_selector.js
908
923
  - app/javascript/alchemy_admin/please_wait_overlay.js
924
+ - app/javascript/alchemy_admin/routes.js
909
925
  - app/javascript/alchemy_admin/shoelace_theme.js
910
926
  - app/javascript/alchemy_admin/spinner.js
911
- - app/javascript/alchemy_admin/templates/compiled.js
912
- - app/javascript/alchemy_admin/templates/node_folder.hbs
927
+ - app/javascript/alchemy_admin/turbo_stream_actions.js
913
928
  - app/javascript/alchemy_admin/utils/ajax.js
914
929
  - app/javascript/alchemy_admin/utils/debounce.js
915
930
  - app/javascript/alchemy_admin/utils/dispatch_page_dirty_event.js
916
931
  - app/javascript/alchemy_admin/utils/dom_helpers.js
917
932
  - app/javascript/alchemy_admin/utils/events.js
918
933
  - app/javascript/alchemy_admin/utils/format.js
934
+ - app/javascript/alchemy_admin/utils/json_script.js
919
935
  - app/javascript/alchemy_admin/utils/max.js
920
936
  - app/javascript/alchemy_admin/utils/string_conversions.js
937
+ - app/javascript/alchemy_admin/utils/tom_select.js
921
938
  - app/javascript/preview.js
922
939
  - app/javascript/tinymce/icons/remixicons/index.js
923
940
  - app/javascript/tinymce/plugins/alchemy_link/index.js
@@ -928,13 +945,16 @@ files:
928
945
  - app/jobs/alchemy/storage_adapter/active_storage/sanitize_svg_job.rb
929
946
  - app/mailers/alchemy/base_mailer.rb
930
947
  - app/mailers/alchemy/messages_mailer.rb
948
+ - app/models/alchemy/admin/content_security_policy.rb
931
949
  - app/models/alchemy/admin/filters/base.rb
932
950
  - app/models/alchemy/admin/filters/checkbox.rb
933
951
  - app/models/alchemy/admin/filters/datepicker.rb
934
952
  - app/models/alchemy/admin/filters/select.rb
953
+ - app/models/alchemy/admin/preview_url.rb
935
954
  - app/models/alchemy/admin/resource_name.rb
936
955
  - app/models/alchemy/attachment.rb
937
956
  - app/models/alchemy/base_record.rb
957
+ - app/models/alchemy/cache_control.rb
938
958
  - app/models/alchemy/current.rb
939
959
  - app/models/alchemy/eager_loading.rb
940
960
  - app/models/alchemy/element.rb
@@ -979,6 +999,7 @@ files:
979
999
  - app/models/alchemy/page/page_natures.rb
980
1000
  - app/models/alchemy/page/page_scopes.rb
981
1001
  - app/models/alchemy/page/publisher.rb
1002
+ - app/models/alchemy/page/sitemap_cache_key.rb
982
1003
  - app/models/alchemy/page/url_path.rb
983
1004
  - app/models/alchemy/page_definition.rb
984
1005
  - app/models/alchemy/page_mutex.rb
@@ -992,7 +1013,9 @@ files:
992
1013
  - app/models/alchemy/picture_thumb/signature.rb
993
1014
  - app/models/alchemy/picture_thumb/uid.rb
994
1015
  - app/models/alchemy/picture_variant.rb
1016
+ - app/models/alchemy/publishable/timestamp_resolver.rb
995
1017
  - app/models/alchemy/resource.rb
1018
+ - app/models/alchemy/safe_url_validator.rb
996
1019
  - app/models/alchemy/searchable_resource.rb
997
1020
  - app/models/alchemy/site.rb
998
1021
  - app/models/alchemy/site/layout.rb
@@ -1007,10 +1030,15 @@ files:
1007
1030
  - app/models/alchemy/storage_adapter/dragonfly/preprocessor.rb
1008
1031
  - app/models/alchemy/tag.rb
1009
1032
  - app/models/concerns/alchemy/dom_ids.rb
1033
+ - app/models/concerns/alchemy/filetypes.rb
1034
+ - app/models/concerns/alchemy/hints.rb
1035
+ - app/models/concerns/alchemy/name_conversions.rb
1010
1036
  - app/models/concerns/alchemy/picture_thumbnails.rb
1011
1037
  - app/models/concerns/alchemy/publishable.rb
1012
1038
  - app/models/concerns/alchemy/relatable_resource.rb
1039
+ - app/models/concerns/alchemy/taggable.rb
1013
1040
  - app/models/concerns/alchemy/touch_elements.rb
1041
+ - app/models/concerns/alchemy/user_methods.rb
1014
1042
  - app/serializers/alchemy/attachment_serializer.rb
1015
1043
  - app/serializers/alchemy/base_serializer.rb
1016
1044
  - app/serializers/alchemy/element_serializer.rb
@@ -1027,6 +1055,7 @@ files:
1027
1055
  - app/services/alchemy/dragonfly_to_image_processing.rb
1028
1056
  - app/services/alchemy/duplicate_element.rb
1029
1057
  - app/services/alchemy/element_preloader.rb
1058
+ - app/services/alchemy/elements_finder.rb
1030
1059
  - app/services/alchemy/page_finder.rb
1031
1060
  - app/services/alchemy/page_tree_preloader.rb
1032
1061
  - app/services/alchemy/tag_validations.rb
@@ -1041,9 +1070,10 @@ files:
1041
1070
  - app/stylesheets/alchemy/_themes.scss
1042
1071
  - app/stylesheets/alchemy/_variables.scss
1043
1072
  - app/stylesheets/alchemy/admin.scss
1073
+ - app/stylesheets/alchemy/admin/_empty-state.scss
1074
+ - app/stylesheets/alchemy/admin/_help.scss
1044
1075
  - app/stylesheets/alchemy/admin/_tom-select.scss
1045
1076
  - app/stylesheets/alchemy/admin/archive.scss
1046
- - app/stylesheets/alchemy/admin/attachment-select.scss
1047
1077
  - app/stylesheets/alchemy/admin/attachments.scss
1048
1078
  - app/stylesheets/alchemy/admin/base.scss
1049
1079
  - app/stylesheets/alchemy/admin/buttons.scss
@@ -1075,6 +1105,7 @@ files:
1075
1105
  - app/stylesheets/alchemy/admin/popover.scss
1076
1106
  - app/stylesheets/alchemy/admin/preview_window.scss
1077
1107
  - app/stylesheets/alchemy/admin/print.scss
1108
+ - app/stylesheets/alchemy/admin/remote-select.scss
1078
1109
  - app/stylesheets/alchemy/admin/resource_info.scss
1079
1110
  - app/stylesheets/alchemy/admin/search.scss
1080
1111
  - app/stylesheets/alchemy/admin/selects.scss
@@ -1082,6 +1113,7 @@ files:
1082
1113
  - app/stylesheets/alchemy/admin/sitemap.scss
1083
1114
  - app/stylesheets/alchemy/admin/spinner.scss
1084
1115
  - app/stylesheets/alchemy/admin/tables.scss
1116
+ - app/stylesheets/alchemy/admin/tags-autocomplete.scss
1085
1117
  - app/stylesheets/alchemy/admin/tags.scss
1086
1118
  - app/stylesheets/alchemy/admin/toolbar.scss
1087
1119
  - app/stylesheets/alchemy/admin/typography.scss
@@ -1098,13 +1130,13 @@ files:
1098
1130
  - app/stylesheets/tinymce/skins/ui/alchemy/content.scss
1099
1131
  - app/stylesheets/tinymce/skins/ui/alchemy/fonts/tinymce-mobile.woff
1100
1132
  - app/stylesheets/tinymce/skins/ui/alchemy/skin.scss
1133
+ - app/types/alchemy/cache_control_type.rb
1101
1134
  - app/types/alchemy/wildcard_url_type.rb
1102
1135
  - app/views/alchemy/_edit_mode.html.erb
1103
1136
  - app/views/alchemy/_menubar.html.erb
1104
1137
  - app/views/alchemy/_preview_mode_code.html.erb
1105
1138
  - app/views/alchemy/admin/_header.html.erb
1106
1139
  - app/views/alchemy/admin/_left_menu.html.erb
1107
- - app/views/alchemy/admin/_main_navi.html.erb
1108
1140
  - app/views/alchemy/admin/_top_menu.html.erb
1109
1141
  - app/views/alchemy/admin/_user_info.html.erb
1110
1142
  - app/views/alchemy/admin/attachments/_archive_overlay.html.erb
@@ -1115,7 +1147,7 @@ files:
1115
1147
  - app/views/alchemy/admin/attachments/_replace_button.html.erb
1116
1148
  - app/views/alchemy/admin/attachments/_sorting_select.html.erb
1117
1149
  - app/views/alchemy/admin/attachments/_tag_list.html.erb
1118
- - app/views/alchemy/admin/attachments/assign.js.erb
1150
+ - app/views/alchemy/admin/attachments/assign.turbo_stream.erb
1119
1151
  - app/views/alchemy/admin/attachments/edit.html.erb
1120
1152
  - app/views/alchemy/admin/attachments/index.html.erb
1121
1153
  - app/views/alchemy/admin/attachments/show.html.erb
@@ -1134,12 +1166,14 @@ files:
1134
1166
  - app/views/alchemy/admin/dashboard/help.html.erb
1135
1167
  - app/views/alchemy/admin/dashboard/index.html.erb
1136
1168
  - app/views/alchemy/admin/dashboard/info.html.erb
1169
+ - app/views/alchemy/admin/dashboard/license.html.erb
1137
1170
  - app/views/alchemy/admin/dashboard/widgets/show.html.erb
1138
1171
  - app/views/alchemy/admin/elements/_add_nested_element_form.html.erb
1139
1172
  - app/views/alchemy/admin/elements/_fixed_element.html.erb
1140
1173
  - app/views/alchemy/admin/elements/_footer.html.erb
1141
1174
  - app/views/alchemy/admin/elements/_form.html.erb
1142
1175
  - app/views/alchemy/admin/elements/_header.html.erb
1176
+ - app/views/alchemy/admin/elements/_preview_text_quote.html.erb
1143
1177
  - app/views/alchemy/admin/elements/_schedule.html.erb
1144
1178
  - app/views/alchemy/admin/elements/_schedule_fields.html.erb
1145
1179
  - app/views/alchemy/admin/elements/_toolbar.html.erb
@@ -1147,6 +1181,7 @@ files:
1147
1181
  - app/views/alchemy/admin/elements/index.html.erb
1148
1182
  - app/views/alchemy/admin/elements/new.html.erb
1149
1183
  - app/views/alchemy/admin/elements/publish.turbo_stream.erb
1184
+ - app/views/alchemy/admin/elements/update.turbo_stream.erb
1150
1185
  - app/views/alchemy/admin/ingredients/_audio_fields.html.erb
1151
1186
  - app/views/alchemy/admin/ingredients/_dom_id_fields.html.erb
1152
1187
  - app/views/alchemy/admin/ingredients/_file_fields.html.erb
@@ -1191,7 +1226,6 @@ files:
1191
1226
  - app/views/alchemy/admin/pages/_locked_pages.html.erb
1192
1227
  - app/views/alchemy/admin/pages/_new_page_form.html.erb
1193
1228
  - app/views/alchemy/admin/pages/_page_infos.html.erb
1194
- - app/views/alchemy/admin/pages/_page_layout_filter.html.erb
1195
1229
  - app/views/alchemy/admin/pages/_page_status.html.erb
1196
1230
  - app/views/alchemy/admin/pages/_publication_fields.html.erb
1197
1231
  - app/views/alchemy/admin/pages/_table.html.erb
@@ -1212,13 +1246,11 @@ files:
1212
1246
  - app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb
1213
1247
  - app/views/alchemy/admin/partials/_flash_notices.html.erb
1214
1248
  - app/views/alchemy/admin/partials/_language_tree_select.html.erb
1215
- - app/views/alchemy/admin/partials/_main_navigation_entry.html.erb
1216
1249
  - app/views/alchemy/admin/partials/_overlay_search_form.html.erb
1217
1250
  - app/views/alchemy/admin/partials/_paste_from_clipboard_form.html.erb
1218
1251
  - app/views/alchemy/admin/partials/_routes.html.erb
1219
1252
  - app/views/alchemy/admin/partials/_search_form.html.erb
1220
1253
  - app/views/alchemy/admin/partials/_site_select.html.erb
1221
- - app/views/alchemy/admin/partials/_sub_navigation.html.erb
1222
1254
  - app/views/alchemy/admin/picture_descriptions/_form.html.erb
1223
1255
  - app/views/alchemy/admin/picture_descriptions/edit.html.erb
1224
1256
  - app/views/alchemy/admin/pictures/_archive.html.erb
@@ -1232,12 +1264,13 @@ files:
1232
1264
  - app/views/alchemy/admin/pictures/_picture_to_assign.html.erb
1233
1265
  - app/views/alchemy/admin/pictures/_sorting_select.html.erb
1234
1266
  - app/views/alchemy/admin/pictures/_tag_list.html.erb
1235
- - app/views/alchemy/admin/pictures/assign.js.erb
1267
+ - app/views/alchemy/admin/pictures/assign.turbo_stream.erb
1236
1268
  - app/views/alchemy/admin/pictures/edit_multiple.html.erb
1237
1269
  - app/views/alchemy/admin/pictures/index.html.erb
1238
1270
  - app/views/alchemy/admin/pictures/show.html.erb
1239
1271
  - app/views/alchemy/admin/pictures/update.turbo_stream.erb
1240
1272
  - app/views/alchemy/admin/resources/_applied_filters.html.erb
1273
+ - app/views/alchemy/admin/resources/_empty_state.html.erb
1241
1274
  - app/views/alchemy/admin/resources/_filter_bar.html.erb
1242
1275
  - app/views/alchemy/admin/resources/_form.html.erb
1243
1276
  - app/views/alchemy/admin/resources/_pagination.html.erb
@@ -1266,9 +1299,6 @@ files:
1266
1299
  - app/views/alchemy/base/500.html.erb
1267
1300
  - app/views/alchemy/base/500.turbo_stream.erb
1268
1301
  - app/views/alchemy/base/error_notice.html.erb
1269
- - app/views/alchemy/base/error_notice.js.erb
1270
- - app/views/alchemy/base/permission_denied.js.erb
1271
- - app/views/alchemy/base/redirect.js.erb
1272
1302
  - app/views/alchemy/breadcrumb/_page.html.erb
1273
1303
  - app/views/alchemy/breadcrumb/_separator.html.erb
1274
1304
  - app/views/alchemy/breadcrumb/_wrapper.html.erb
@@ -1296,15 +1326,13 @@ files:
1296
1326
  - app/views/kaminari/alchemy/_paginator.html.erb
1297
1327
  - app/views/kaminari/alchemy/_prev_page.html.erb
1298
1328
  - app/views/layouts/alchemy/admin.html.erb
1329
+ - app/views/layouts/alchemy/admin/dialog.html.erb
1299
1330
  - app/views/layouts/alchemy/sitemap.xml.erb
1300
- - config/alchemy/config.yml
1301
- - config/alchemy/modules.yml
1302
1331
  - config/brakeman.ignore
1303
1332
  - config/importmap.rb
1304
1333
  - config/initializers/dragonfly.rb
1305
1334
  - config/initializers/mime_types.rb
1306
1335
  - config/initializers/mini_profiler.rb
1307
- - config/initializers/rails_live_reload.rb
1308
1336
  - config/initializers/simple_form.rb
1309
1337
  - config/locales/alchemy.en.yml
1310
1338
  - config/routes.rb
@@ -1321,12 +1349,9 @@ files:
1321
1349
  - db/migrate/20260115164704_add_publication_timestamps_to_alchemy_elements.rb
1322
1350
  - db/migrate/20260115164705_add_index_to_element_publication_timestamps.rb
1323
1351
  - db/migrate/20260702090038_add_index_to_elements_pages_join_table.rb
1352
+ - db/migrate/20260727120000_add_permitted_roles_to_alchemy_pages.rb
1353
+ - db/migrate/20260820120000_add_cached_tag_list_to_taggables.rb
1324
1354
  - lib/alchemy.rb
1325
- - lib/alchemy/ability_helper.rb
1326
- - lib/alchemy/admin/locale.rb
1327
- - lib/alchemy/admin/preview_time.rb
1328
- - lib/alchemy/admin/preview_url.rb
1329
- - lib/alchemy/admin/timezone.rb
1330
1355
  - lib/alchemy/auth_accessors.rb
1331
1356
  - lib/alchemy/cache_digests/template_tracker.rb
1332
1357
  - lib/alchemy/config_missing.rb
@@ -1337,11 +1362,13 @@ files:
1337
1362
  - lib/alchemy/configuration/collection_option.rb
1338
1363
  - lib/alchemy/configuration/configuration_option.rb
1339
1364
  - lib/alchemy/configuration/integer_option.rb
1365
+ - lib/alchemy/configuration/number_option.rb
1340
1366
  - lib/alchemy/configuration/pathname_option.rb
1367
+ - lib/alchemy/configuration/proc_option.rb
1341
1368
  - lib/alchemy/configuration/regexp_option.rb
1342
1369
  - lib/alchemy/configuration/string_option.rb
1343
1370
  - lib/alchemy/configuration/symbol_option.rb
1344
- - lib/alchemy/configuration_methods.rb
1371
+ - lib/alchemy/configurations/admin_components.rb
1345
1372
  - lib/alchemy/configurations/dashboard.rb
1346
1373
  - lib/alchemy/configurations/default_language.rb
1347
1374
  - lib/alchemy/configurations/default_site.rb
@@ -1349,29 +1376,25 @@ files:
1349
1376
  - lib/alchemy/configurations/importmap.rb
1350
1377
  - lib/alchemy/configurations/mailer.rb
1351
1378
  - lib/alchemy/configurations/main.rb
1379
+ - lib/alchemy/configurations/menu.rb
1380
+ - lib/alchemy/configurations/menu_item.rb
1352
1381
  - lib/alchemy/configurations/page_cache.rb
1353
1382
  - lib/alchemy/configurations/preview.rb
1354
1383
  - lib/alchemy/configurations/sitemap.rb
1355
1384
  - lib/alchemy/configurations/uploader.rb
1356
- - lib/alchemy/controller_actions.rb
1357
1385
  - lib/alchemy/deprecation.rb
1358
- - lib/alchemy/dev_support/live_reload_watcher.rb
1359
1386
  - lib/alchemy/dragonfly/processors/auto_orient.rb
1360
1387
  - lib/alchemy/dragonfly/processors/crop_resize.rb
1361
1388
  - lib/alchemy/dragonfly/processors/thumbnail.rb
1362
- - lib/alchemy/elements_finder.rb
1363
1389
  - lib/alchemy/engine.rb
1364
1390
  - lib/alchemy/error_tracking.rb
1365
1391
  - lib/alchemy/error_tracking/error_logger.rb
1366
1392
  - lib/alchemy/errors.rb
1367
- - lib/alchemy/filetypes.rb
1368
1393
  - lib/alchemy/forms/builder.rb
1369
- - lib/alchemy/hints.rb
1370
1394
  - lib/alchemy/i18n.rb
1371
1395
  - lib/alchemy/install/tasks.rb
1372
1396
  - lib/alchemy/logger.rb
1373
1397
  - lib/alchemy/modules.rb
1374
- - lib/alchemy/name_conversions.rb
1375
1398
  - lib/alchemy/on_page_layout.rb
1376
1399
  - lib/alchemy/on_page_layout/callbacks_runner.rb
1377
1400
  - lib/alchemy/paths.rb
@@ -1381,7 +1404,7 @@ files:
1381
1404
  - lib/alchemy/shell.rb
1382
1405
  - lib/alchemy/sprockets/skip_builds_compression.rb
1383
1406
  - lib/alchemy/svg_scrubber.rb
1384
- - lib/alchemy/taggable.rb
1407
+ - lib/alchemy/tasks/generate_thumbnails.rb
1385
1408
  - lib/alchemy/tasks/reorient_pictures.rb
1386
1409
  - lib/alchemy/tasks/tidy.rb
1387
1410
  - lib/alchemy/tasks/usage.rb
@@ -1415,8 +1438,10 @@ files:
1415
1438
  - lib/alchemy/test_support/shared_uploader_examples.rb
1416
1439
  - lib/alchemy/tinymce.rb
1417
1440
  - lib/alchemy/upgrader.rb
1441
+ - lib/alchemy/upgrader/eight_four.rb
1418
1442
  - lib/alchemy/upgrader/eight_one.rb
1419
1443
  - lib/alchemy/upgrader/eight_zero.rb
1444
+ - lib/alchemy/upgrader/register_module_rewriter.rb
1420
1445
  - lib/alchemy/version.rb
1421
1446
  - lib/alchemy_cms.rb
1422
1447
  - lib/generators/alchemy/base.rb
@@ -1435,7 +1460,6 @@ files:
1435
1460
  - lib/generators/alchemy/install/files/custom.css
1436
1461
  - lib/generators/alchemy/install/install_generator.rb
1437
1462
  - lib/generators/alchemy/install/templates/alchemy.rb.tt
1438
- - lib/generators/alchemy/install/templates/dragonfly.rb.tt
1439
1463
  - lib/generators/alchemy/install/templates/elements.yml.tt
1440
1464
  - lib/generators/alchemy/install/templates/menus.yml.tt
1441
1465
  - lib/generators/alchemy/install/templates/page_layouts.yml.tt
@@ -1458,6 +1482,8 @@ files:
1458
1482
  - lib/generators/alchemy/site_layouts/templates/layout.html.erb
1459
1483
  - lib/generators/alchemy/site_layouts/templates/layout.html.haml
1460
1484
  - lib/generators/alchemy/site_layouts/templates/layout.html.slim
1485
+ - lib/generators/alchemy/user_columns_migration/templates/migration.rb.tt
1486
+ - lib/generators/alchemy/user_columns_migration/user_columns_migration_generator.rb
1461
1487
  - lib/generators/alchemy/views/views_generator.rb
1462
1488
  - lib/non_stupid_digest_assets.rb
1463
1489
  - lib/tasks/alchemy/assets.rake
@@ -1469,7 +1495,6 @@ files:
1469
1495
  - lib/tasks/alchemy/tidy.rake
1470
1496
  - lib/tasks/alchemy/upgrade.rake
1471
1497
  - lib/tasks/alchemy/usage.rake
1472
- - vendor/assets/stylesheets/alchemy_admin/select2.css
1473
1498
  - vendor/assets/stylesheets/tinymce/skins/content/dark/content.min.css
1474
1499
  - vendor/assets/stylesheets/tinymce/skins/content/default/content.min.css
1475
1500
  - vendor/assets/stylesheets/tinymce/skins/ui/oxide-dark/content.min.css
@@ -1479,11 +1504,7 @@ files:
1479
1504
  - vendor/javascript/cropperjs.min.js
1480
1505
  - vendor/javascript/flatpickr.min.js
1481
1506
  - vendor/javascript/floating-ui.min.js
1482
- - vendor/javascript/handlebars.min.js
1483
- - vendor/javascript/jquery.min.js
1484
1507
  - vendor/javascript/keymaster.min.js
1485
- - vendor/javascript/rails-ujs.min.js
1486
- - vendor/javascript/select2.min.js
1487
1508
  - vendor/javascript/shoelace.min.js
1488
1509
  - vendor/javascript/sortable.min.js
1489
1510
  - vendor/javascript/tinymce.min.js
@@ -1503,18 +1524,18 @@ post_install_message: |+
1503
1524
 
1504
1525
  - Complete the installation in an existing Rails application:
1505
1526
 
1506
- $ bin/rake alchemy:install
1527
+ $ bin/rails alchemy:install
1507
1528
 
1508
1529
  - Complete the upgrade of an existing Alchemy installation:
1509
1530
 
1510
- $ bin/rake alchemy:upgrade
1531
+ $ bin/rails alchemy:upgrade
1511
1532
 
1512
1533
  and follow the onscreen instructions.
1513
1534
 
1514
1535
  Need help? Try:
1515
1536
 
1516
1537
  * https://stackoverflow.com/questions/tagged/alchemy-cms
1517
- * https://slackin.alchemy-cms.com
1538
+ * https://alchemy-cms.slack.com
1518
1539
  -------------------------------------------------------------
1519
1540
 
1520
1541
  rdoc_options: []
@@ -1530,10 +1551,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1530
1551
  - - ">="
1531
1552
  - !ruby/object:Gem::Version
1532
1553
  version: '0'
1533
- requirements:
1534
- - ImageMagick (libmagick), v6.6 or greater.
1554
+ requirements: []
1535
1555
  rubygems_version: 4.0.20
1536
1556
  specification_version: 4
1537
- summary: A powerful, userfriendly and flexible CMS for Rails
1557
+ summary: A semantically structured and full-featured CMS Engine for Rails
1538
1558
  test_files: []
1539
1559
  ...
@@ -1,50 +0,0 @@
1
- import { reloadPreview } from "alchemy_admin/components/preview_window"
2
- import { removeTab } from "alchemy_admin/fixed_elements"
3
- import { closeCurrentDialog } from "alchemy_admin/dialog"
4
- import IngredientAnchorLink from "alchemy_admin/ingredient_anchor_link"
5
- import pleaseWaitOverlay from "alchemy_admin/please_wait_overlay"
6
-
7
- class Action extends HTMLElement {
8
- constructor() {
9
- super()
10
-
11
- // map action names with Javascript functions
12
- this.actions = {
13
- // add a intermediate closeCurrentDialog - action
14
- // this will be gone, if all dialogs are working with a promise and
15
- // we don't have to implicitly close the dialog
16
- closeCurrentDialog,
17
- reloadPreview,
18
- removeFixedElement: removeTab,
19
- updateAnchorIcon: IngredientAnchorLink.updateIcon,
20
- hidePleaseWaitOverlay() {
21
- pleaseWaitOverlay(false)
22
- }
23
- }
24
- }
25
-
26
- connectedCallback() {
27
- const func = this.actions[this.name]
28
-
29
- if (func) {
30
- func(...this.params)
31
- } else {
32
- console.error(`Unknown Alchemy action: ${this.name}`)
33
- }
34
-
35
- this.remove()
36
- }
37
-
38
- get name() {
39
- return this.getAttribute("name")
40
- }
41
-
42
- get params() {
43
- if (this.hasAttribute("params")) {
44
- return JSON.parse(this.getAttribute("params"))
45
- }
46
- return []
47
- }
48
- }
49
-
50
- customElements.define("alchemy-action", Action)