alchemy_cms 7.0.15 → 7.1.0.pre.b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (354) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/backport.yml +36 -0
  3. data/.github/workflows/test.yml +3 -2
  4. data/.gitignore +0 -1
  5. data/.standard.yml +1 -1
  6. data/CHANGELOG.md +144 -42
  7. data/Gemfile +7 -11
  8. data/README.md +10 -8
  9. data/alchemy_cms.gemspec +4 -3
  10. data/app/assets/config/alchemy_manifest.js +0 -1
  11. data/app/assets/javascripts/alchemy/admin.js +1 -19
  12. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +2 -3
  13. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +19 -34
  14. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +38 -13
  15. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +1 -1
  16. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +32 -25
  17. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +1 -1
  18. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +3 -5
  19. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +0 -57
  20. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +22 -63
  21. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +2 -2
  22. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +5 -4
  23. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +5 -5
  24. data/app/assets/javascripts/alchemy/templates/index.js +0 -2
  25. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +1 -1
  26. data/app/assets/javascripts/alchemy/templates/page.hbs +1 -1
  27. data/app/assets/javascripts/alchemy/templates/page_folder.hbs +2 -2
  28. data/app/assets/stylesheets/alchemy/_custom-properties.scss +82 -0
  29. data/app/assets/stylesheets/alchemy/_mixins.scss +38 -30
  30. data/app/assets/stylesheets/alchemy/_variables.scss +12 -5
  31. data/app/assets/stylesheets/alchemy/admin.scss +3 -4
  32. data/app/assets/stylesheets/alchemy/archive.scss +107 -50
  33. data/app/assets/stylesheets/alchemy/attachments.scss +5 -4
  34. data/app/assets/stylesheets/alchemy/buttons.scss +38 -164
  35. data/app/assets/stylesheets/alchemy/dashboard.scss +31 -6
  36. data/app/assets/stylesheets/alchemy/dialogs.scss +12 -28
  37. data/app/assets/stylesheets/alchemy/elements.scss +273 -282
  38. data/app/assets/stylesheets/alchemy/flash.scss +20 -12
  39. data/app/assets/stylesheets/alchemy/forms.scss +21 -34
  40. data/app/assets/stylesheets/alchemy/frame.scss +11 -32
  41. data/app/assets/stylesheets/alchemy/hints.scss +4 -62
  42. data/app/assets/stylesheets/alchemy/image_library.scss +36 -33
  43. data/app/assets/stylesheets/alchemy/labels.scss +4 -1
  44. data/app/assets/stylesheets/alchemy/menubar.scss +7 -6
  45. data/app/assets/stylesheets/alchemy/navigation.scss +27 -15
  46. data/app/assets/stylesheets/alchemy/nodes.scss +11 -7
  47. data/app/assets/stylesheets/alchemy/notices.scss +16 -4
  48. data/app/assets/stylesheets/alchemy/page-select.scss +10 -2
  49. data/app/assets/stylesheets/alchemy/pagination.scss +22 -13
  50. data/app/assets/stylesheets/alchemy/preview_window.scss +4 -8
  51. data/app/assets/stylesheets/alchemy/resource_info.scss +7 -5
  52. data/app/assets/stylesheets/alchemy/selects.scss +49 -42
  53. data/app/assets/stylesheets/alchemy/shoelace.scss +345 -0
  54. data/app/assets/stylesheets/alchemy/sitemap.scss +24 -14
  55. data/app/assets/stylesheets/alchemy/spinner.scss +9 -19
  56. data/app/assets/stylesheets/alchemy/tables.scss +16 -24
  57. data/app/assets/stylesheets/alchemy/tags.scss +4 -0
  58. data/app/assets/stylesheets/alchemy/toolbar.scss +29 -25
  59. data/app/assets/stylesheets/alchemy/upload.scss +140 -89
  60. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +80 -108
  61. data/app/components/alchemy/admin/node_select.rb +39 -0
  62. data/app/components/alchemy/admin/page_select.rb +42 -0
  63. data/app/components/alchemy/ingredients/audio_view.rb +1 -1
  64. data/app/components/alchemy/ingredients/base_view.rb +1 -1
  65. data/app/components/alchemy/ingredients/boolean_view.rb +1 -1
  66. data/app/components/alchemy/ingredients/datetime_view.rb +3 -4
  67. data/app/components/alchemy/ingredients/file_view.rb +1 -1
  68. data/app/components/alchemy/ingredients/headline_view.rb +7 -16
  69. data/app/components/alchemy/ingredients/link_view.rb +1 -1
  70. data/app/components/alchemy/ingredients/page_view.rb +1 -1
  71. data/app/components/alchemy/ingredients/picture_view.rb +1 -1
  72. data/app/components/alchemy/ingredients/richtext_view.rb +1 -1
  73. data/app/components/alchemy/ingredients/text_view.rb +1 -1
  74. data/app/components/alchemy/ingredients/video_view.rb +1 -1
  75. data/app/controllers/alchemy/admin/base_controller.rb +5 -6
  76. data/app/controllers/alchemy/admin/elements_controller.rb +63 -35
  77. data/app/controllers/alchemy/admin/languages_controller.rb +1 -2
  78. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -19
  79. data/app/controllers/alchemy/base_controller.rb +4 -2
  80. data/app/controllers/alchemy/messages_controller.rb +1 -1
  81. data/app/controllers/concerns/alchemy/admin/current_language.rb +1 -5
  82. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +1 -1
  83. data/app/controllers/concerns/alchemy/site_redirects.rb +1 -1
  84. data/app/decorators/alchemy/element_editor.rb +0 -2
  85. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -5
  86. data/app/helpers/alchemy/admin/base_helper.rb +17 -12
  87. data/app/helpers/alchemy/admin/ingredients_helper.rb +4 -1
  88. data/app/helpers/alchemy/admin/pages_helper.rb +5 -11
  89. data/app/helpers/alchemy/base_helper.rb +47 -13
  90. data/app/javascript/alchemy_admin/components/alchemy_html_element.js +129 -0
  91. data/app/javascript/alchemy_admin/components/button.js +59 -0
  92. data/app/javascript/alchemy_admin/components/char_counter.js +40 -0
  93. data/app/javascript/alchemy_admin/components/datepicker.js +39 -0
  94. data/app/javascript/alchemy_admin/components/dialog_link.js +45 -0
  95. data/app/javascript/alchemy_admin/components/element_editor/publish_element_button.js +36 -0
  96. data/app/javascript/alchemy_admin/components/element_editor.js +553 -0
  97. data/app/javascript/alchemy_admin/components/ingredient_group.js +54 -0
  98. data/app/javascript/alchemy_admin/components/link_buttons/link_button.js +48 -0
  99. data/app/javascript/alchemy_admin/components/link_buttons/unlink_button.js +38 -0
  100. data/app/javascript/alchemy_admin/components/link_buttons.js +79 -0
  101. data/app/javascript/alchemy_admin/components/node_select.js +45 -0
  102. data/app/javascript/alchemy_admin/components/overlay.js +18 -0
  103. data/app/javascript/alchemy_admin/components/page_select.js +63 -0
  104. data/app/javascript/alchemy_admin/components/remote_select.js +134 -0
  105. data/app/javascript/alchemy_admin/components/select.js +12 -0
  106. data/app/javascript/alchemy_admin/components/spinner.js +31 -0
  107. data/app/javascript/alchemy_admin/components/tinymce.js +146 -0
  108. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +266 -0
  109. data/app/javascript/alchemy_admin/components/uploader/progress.js +258 -0
  110. data/app/javascript/alchemy_admin/components/uploader.js +132 -0
  111. data/app/javascript/alchemy_admin/dirty.js +49 -0
  112. data/app/javascript/alchemy_admin/file_editors.js +1 -1
  113. data/app/javascript/alchemy_admin/gui.js +14 -0
  114. data/app/javascript/alchemy_admin/i18n.js +12 -8
  115. data/app/javascript/alchemy_admin/image_cropper.js +6 -3
  116. data/app/javascript/alchemy_admin/image_loader.js +7 -15
  117. data/app/javascript/alchemy_admin/ingredient_anchor_link.js +2 -5
  118. data/app/javascript/alchemy_admin/initializer.js +65 -0
  119. data/app/javascript/alchemy_admin/locales/en.js +31 -0
  120. data/app/javascript/alchemy_admin/picture_editors.js +2 -2
  121. data/app/javascript/alchemy_admin/picture_selector.js +38 -0
  122. data/app/javascript/alchemy_admin/please_wait_overlay.js +8 -0
  123. data/app/javascript/alchemy_admin/sortable_elements.js +78 -0
  124. data/app/javascript/alchemy_admin/spinner.js +36 -0
  125. data/app/javascript/alchemy_admin/tags_autocomplete.js +46 -0
  126. data/app/javascript/alchemy_admin/utils/ajax.js +6 -5
  127. data/app/javascript/alchemy_admin/utils/dom_helpers.js +20 -0
  128. data/app/javascript/alchemy_admin/utils/format.js +11 -0
  129. data/app/javascript/alchemy_admin/utils/string_conversions.js +10 -0
  130. data/app/javascript/alchemy_admin.js +70 -13
  131. data/app/javascript/menubar.js +10 -0
  132. data/app/models/alchemy/attachment.rb +9 -11
  133. data/app/models/alchemy/element.rb +11 -0
  134. data/app/models/alchemy/ingredients/audio.rb +0 -11
  135. data/app/models/alchemy/ingredients/datetime.rb +1 -1
  136. data/app/models/alchemy/ingredients/richtext.rb +1 -10
  137. data/app/models/alchemy/ingredients/video.rb +0 -12
  138. data/app/models/alchemy/node.rb +4 -0
  139. data/app/models/alchemy/page/page_elements.rb +2 -11
  140. data/app/models/alchemy/page/page_natures.rb +10 -2
  141. data/app/models/alchemy/page.rb +9 -51
  142. data/app/models/alchemy/picture/url.rb +1 -9
  143. data/app/serializers/alchemy/page_tree_serializer.rb +2 -1
  144. data/app/services/alchemy/copy_page.rb +98 -0
  145. data/app/views/alchemy/_menubar.html.erb +17 -13
  146. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +14 -10
  147. data/app/views/alchemy/admin/attachments/_attachment.html.erb +44 -36
  148. data/app/views/alchemy/admin/attachments/_replace_button.html.erb +15 -21
  149. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +0 -1
  150. data/app/views/alchemy/admin/attachments/assign.js.erb +1 -1
  151. data/app/views/alchemy/admin/attachments/index.html.erb +6 -4
  152. data/app/views/alchemy/admin/attachments/show.html.erb +8 -8
  153. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  154. data/app/views/alchemy/admin/clipboard/index.html.erb +3 -7
  155. data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
  156. data/app/views/alchemy/admin/crop.html.erb +1 -1
  157. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  158. data/app/views/alchemy/admin/dashboard/index.html.erb +13 -11
  159. data/app/views/alchemy/admin/dashboard/info.html.erb +7 -7
  160. data/app/views/alchemy/admin/elements/_add_nested_element_form.html.erb +21 -23
  161. data/app/views/alchemy/admin/elements/_element.html.erb +52 -44
  162. data/app/views/alchemy/admin/elements/_footer.html.erb +1 -1
  163. data/app/views/alchemy/admin/elements/_form.html.erb +1 -1
  164. data/app/views/alchemy/admin/elements/_header.html.erb +11 -12
  165. data/app/views/alchemy/admin/elements/_toolbar.html.erb +33 -45
  166. data/app/views/alchemy/admin/elements/create.js.erb +7 -15
  167. data/app/views/alchemy/admin/elements/destroy.js.erb +0 -2
  168. data/app/views/alchemy/admin/elements/index.html.erb +27 -24
  169. data/app/views/alchemy/admin/elements/new.html.erb +9 -11
  170. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +2 -2
  171. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +3 -3
  172. data/app/views/alchemy/admin/ingredients/_video_fields.html.erb +1 -2
  173. data/app/views/alchemy/admin/languages/_form.html.erb +2 -3
  174. data/app/views/alchemy/admin/languages/_language.html.erb +15 -8
  175. data/app/views/alchemy/admin/languages/_table.html.erb +1 -0
  176. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +28 -16
  177. data/app/views/alchemy/admin/layoutpages/edit.html.erb +1 -1
  178. data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
  179. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +12 -8
  180. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
  181. data/app/views/alchemy/admin/nodes/_form.html.erb +20 -21
  182. data/app/views/alchemy/admin/nodes/_node.html.erb +39 -34
  183. data/app/views/alchemy/admin/nodes/index.html.erb +1 -1
  184. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +4 -4
  185. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +2 -2
  186. data/app/views/alchemy/admin/pages/_current_page.html.erb +1 -1
  187. data/app/views/alchemy/admin/pages/_external_link.html.erb +4 -4
  188. data/app/views/alchemy/admin/pages/_file_link.html.erb +5 -5
  189. data/app/views/alchemy/admin/pages/_form.html.erb +10 -21
  190. data/app/views/alchemy/admin/pages/_internal_link.html.erb +4 -4
  191. data/app/views/alchemy/admin/pages/_locked_page.html.erb +2 -2
  192. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +4 -17
  193. data/app/views/alchemy/admin/pages/_page.html.erb +76 -72
  194. data/app/views/alchemy/admin/pages/_page_infos.html.erb +23 -7
  195. data/app/views/alchemy/admin/pages/_page_layout_filter.html.erb +2 -1
  196. data/app/views/alchemy/admin/pages/_page_status.html.erb +11 -21
  197. data/app/views/alchemy/admin/pages/_publication_fields.html.erb +2 -5
  198. data/app/views/alchemy/admin/pages/_table.html.erb +1 -1
  199. data/app/views/alchemy/admin/pages/_table_row.html.erb +43 -39
  200. data/app/views/alchemy/admin/pages/_toolbar.html.erb +43 -38
  201. data/app/views/alchemy/admin/pages/configure.html.erb +12 -14
  202. data/app/views/alchemy/admin/pages/edit.html.erb +80 -103
  203. data/app/views/alchemy/admin/pages/info.html.erb +20 -11
  204. data/app/views/alchemy/admin/pages/link.html.erb +22 -16
  205. data/app/views/alchemy/admin/pages/new.html.erb +9 -11
  206. data/app/views/alchemy/admin/pages/unlock.js.erb +10 -3
  207. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -13
  208. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +3 -5
  209. data/app/views/alchemy/admin/partials/_routes.html.erb +10 -2
  210. data/app/views/alchemy/admin/partials/_site_select.html.erb +6 -5
  211. data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +28 -23
  212. data/app/views/alchemy/admin/pictures/_archive.html.erb +5 -5
  213. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  214. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +21 -23
  215. data/app/views/alchemy/admin/pictures/_infos.html.erb +2 -6
  216. data/app/views/alchemy/admin/pictures/_picture.html.erb +15 -17
  217. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +17 -16
  218. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +1 -1
  219. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +1 -1
  220. data/app/views/alchemy/admin/pictures/assign.js.erb +1 -1
  221. data/app/views/alchemy/admin/pictures/index.html.erb +34 -30
  222. data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
  223. data/app/views/alchemy/admin/resources/_filter.html.erb +2 -2
  224. data/app/views/alchemy/admin/resources/_form.html.erb +2 -2
  225. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +1 -1
  226. data/app/views/alchemy/admin/resources/_resource.html.erb +16 -9
  227. data/app/views/alchemy/admin/resources/_table.html.erb +4 -1
  228. data/app/views/alchemy/admin/resources/index.html.erb +22 -19
  229. data/app/views/alchemy/admin/sites/index.html.erb +2 -1
  230. data/app/views/alchemy/admin/styleguide/index.html.erb +54 -28
  231. data/app/views/alchemy/admin/tags/_tag.html.erb +16 -18
  232. data/app/views/alchemy/admin/tags/index.html.erb +15 -12
  233. data/app/views/alchemy/admin/tinymce/_setup.html.erb +29 -0
  234. data/app/views/alchemy/admin/uploader/_button.html.erb +23 -29
  235. data/app/views/alchemy/admin/uploader/_setup.html.erb +3 -8
  236. data/app/views/alchemy/base/500.html.erb +1 -1
  237. data/app/views/alchemy/base/error_notice.js.erb +0 -1
  238. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
  239. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +2 -3
  240. data/app/views/alchemy/ingredients/_file_editor.html.erb +5 -5
  241. data/app/views/alchemy/ingredients/_link_editor.html.erb +1 -1
  242. data/app/views/alchemy/ingredients/_node_editor.html.erb +6 -19
  243. data/app/views/alchemy/ingredients/_page_editor.html.erb +7 -19
  244. data/app/views/alchemy/ingredients/_picture_editor.html.erb +2 -2
  245. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +6 -15
  246. data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -1
  247. data/app/views/alchemy/ingredients/_text_editor.html.erb +1 -1
  248. data/app/views/alchemy/ingredients/shared/_anchor.html.erb +1 -1
  249. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +10 -20
  250. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +42 -49
  251. data/app/views/kaminari/alchemy/_first_page.html.erb +4 -2
  252. data/app/views/kaminari/alchemy/_gap.html.erb +1 -1
  253. data/app/views/kaminari/alchemy/_last_page.html.erb +4 -2
  254. data/app/views/kaminari/alchemy/_next_page.html.erb +4 -2
  255. data/app/views/kaminari/alchemy/_prev_page.html.erb +4 -2
  256. data/app/views/layouts/alchemy/admin.html.erb +10 -29
  257. data/config/alchemy/modules.yml +30 -30
  258. data/config/importmap.rb +10 -1
  259. data/config/initializers/rails_live_reload.rb +13 -0
  260. data/config/locales/alchemy.en.yml +23 -9
  261. data/config/routes.rb +3 -2
  262. data/lib/alchemy/auth_accessors.rb +6 -1
  263. data/lib/alchemy/controller_actions.rb +17 -4
  264. data/lib/alchemy/dev_support/live_reload_watcher.rb +5 -0
  265. data/lib/alchemy/engine.rb +8 -2
  266. data/lib/alchemy/forms/builder.rb +18 -12
  267. data/lib/alchemy/modules.rb +2 -2
  268. data/lib/alchemy/permissions.rb +1 -1
  269. data/lib/alchemy/resources_helper.rb +3 -3
  270. data/lib/alchemy/routing_constraints.rb +1 -1
  271. data/lib/alchemy/test_support/capybara_helpers.rb +8 -5
  272. data/lib/alchemy/test_support/rspec_matchers.rb +14 -0
  273. data/lib/alchemy/test_support/shared_uploader_examples.rb +1 -1
  274. data/lib/alchemy/tinymce.rb +8 -3
  275. data/lib/alchemy/version.rb +1 -1
  276. data/lib/tasks/alchemy/tidy.rake +1 -0
  277. data/package.json +14 -5
  278. data/vendor/assets/fonts/remixicon.eot +0 -0
  279. data/vendor/assets/fonts/remixicon.svg +7816 -0
  280. data/vendor/assets/fonts/remixicon.ttf +0 -0
  281. data/vendor/assets/fonts/remixicon.woff +0 -0
  282. data/vendor/assets/fonts/remixicon.woff2 +0 -0
  283. data/vendor/assets/stylesheets/remixicon.scss +10480 -0
  284. metadata +85 -97
  285. data/.gem_release.yml +0 -8
  286. data/app/assets/javascripts/alchemy/alchemy.autocomplete.js.coffee +0 -30
  287. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -53
  288. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +0 -45
  289. data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +0 -19
  290. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +0 -59
  291. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +0 -79
  292. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -267
  293. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +0 -27
  294. data/app/assets/javascripts/alchemy/alchemy.spinner.js +0 -32
  295. data/app/assets/javascripts/alchemy/alchemy.tooltips.coffee +0 -10
  296. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +0 -131
  297. data/app/assets/javascripts/alchemy/menubar.js.coffee +0 -8
  298. data/app/assets/javascripts/alchemy/node_select.js +0 -39
  299. data/app/assets/javascripts/alchemy/page_select.js +0 -46
  300. data/app/assets/javascripts/alchemy/templates/node.hbs +0 -16
  301. data/app/assets/javascripts/alchemy/templates/spinner.hbs +0 -7
  302. data/app/assets/stylesheets/alchemy/jquery-ui.scss +0 -435
  303. data/app/javascript/alchemy_admin/datepicker.js +0 -40
  304. data/app/javascript/alchemy_admin/tinymce.js +0 -146
  305. data/app/javascript/alchemy_admin/translations.js +0 -32
  306. data/app/views/alchemy/admin/elements/fold.js.erb +0 -33
  307. data/app/views/alchemy/admin/elements/order.js.erb +0 -11
  308. data/app/views/alchemy/admin/elements/publish.js.erb +0 -21
  309. data/app/views/alchemy/admin/elements/update.js.erb +0 -27
  310. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  311. data/vendor/assets/fonts/fa-regular-400.svg +0 -803
  312. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  313. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  314. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  315. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  316. data/vendor/assets/fonts/fa-solid-900.svg +0 -4938
  317. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  318. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  319. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  320. data/vendor/assets/javascripts/fileupload/jquery.fileupload-process.js +0 -178
  321. data/vendor/assets/javascripts/fileupload/jquery.fileupload-validate.js +0 -125
  322. data/vendor/assets/javascripts/fileupload/jquery.fileupload.js +0 -1502
  323. data/vendor/assets/javascripts/fileupload/jquery.iframe-transport.js +0 -224
  324. data/vendor/assets/javascripts/jquery-ui/data.js +0 -45
  325. data/vendor/assets/javascripts/jquery-ui/ie.js +0 -20
  326. data/vendor/assets/javascripts/jquery-ui/keycode.js +0 -51
  327. data/vendor/assets/javascripts/jquery-ui/plugin.js +0 -49
  328. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +0 -46
  329. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +0 -27
  330. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +0 -50
  331. data/vendor/assets/javascripts/jquery-ui/unique-id.js +0 -54
  332. data/vendor/assets/javascripts/jquery-ui/version.js +0 -20
  333. data/vendor/assets/javascripts/jquery-ui/widget.js +0 -754
  334. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +0 -1268
  335. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +0 -241
  336. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +0 -1623
  337. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +0 -931
  338. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo.min.js +0 -7
  339. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +0 -296
  340. data/vendor/assets/stylesheets/fontawesome/_animated.scss +0 -20
  341. data/vendor/assets/stylesheets/fontawesome/_bordered-pulled.scss +0 -20
  342. data/vendor/assets/stylesheets/fontawesome/_core.scss +0 -21
  343. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +0 -6
  344. data/vendor/assets/stylesheets/fontawesome/_icons.scss +0 -1441
  345. data/vendor/assets/stylesheets/fontawesome/_larger.scss +0 -23
  346. data/vendor/assets/stylesheets/fontawesome/_list.scss +0 -18
  347. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -56
  348. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +0 -24
  349. data/vendor/assets/stylesheets/fontawesome/_screen-reader.scss +0 -5
  350. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +0 -31
  351. data/vendor/assets/stylesheets/fontawesome/_variables.scss +0 -1458
  352. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +0 -16
  353. data/vendor/assets/stylesheets/fontawesome/regular.scss +0 -23
  354. data/vendor/assets/stylesheets/fontawesome/solid.scss +0 -24
@@ -1,7 +1,7 @@
1
1
  <div class="resource_info">
2
2
  <div class="value">
3
3
  <label>
4
- <%= render_icon @attachment.icon_css_class, style: 'regular', size: 'lg' %>
4
+ <%= render_icon @attachment.icon_css_class %>
5
5
  </label>
6
6
  <p><%= @attachment.file_name %></p>
7
7
  </div>
@@ -9,32 +9,32 @@
9
9
  <label><%= Alchemy::Attachment.human_attribute_name(:url) %></label>
10
10
  <p><%= @attachment.url %></p>
11
11
  <a data-clipboard-text="<%= @attachment.url %>" class="icon_button--right">
12
- <%= render_icon(:clipboard, style: 'regular') %>
12
+ <%= render_icon(:clipboard) %>
13
13
  </a>
14
14
  </div>
15
15
  <div class="value with-icon">
16
16
  <label><%= Alchemy::Attachment.human_attribute_name(:download_url) %></label>
17
17
  <p><%= @attachment.url(download: true) %></p>
18
18
  <a data-clipboard-text="<%= @attachment.url(download: true) %>" class="icon_button--right">
19
- <%= render_icon(:clipboard, style: 'regular') %>
19
+ <%= render_icon(:clipboard) %>
20
20
  </a>
21
21
  </div>
22
22
  </div>
23
23
 
24
- <% case @attachment.icon_css_class %>
25
- <% when "file-image" %>
24
+ <% case @attachment.file_mime_type %>
25
+ <% when *Alchemy::Filetypes::IMAGE_FILE_TYPES %>
26
26
  <div class="attachment_preview_container image-preview">
27
27
  <%= image_tag(@attachment.url, class: "full_width") %>
28
28
  </div>
29
- <% when "file-audio" %>
29
+ <% when *Alchemy::Filetypes::AUDIO_FILE_TYPES %>
30
30
  <div class="attachment_preview_container player-preview">
31
31
  <%= audio_tag(@attachment.url, preload: "none", controls: true, class: "full_width") %>
32
32
  </div>
33
- <% when "file-video" %>
33
+ <% when *Alchemy::Filetypes::VIDEO_FILE_TYPES %>
34
34
  <div class="attachment_preview_container player-preview">
35
35
  <%= video_tag(@attachment.url, preload: "metadata", controls: true, class: "full_width") %>
36
36
  </div>
37
- <% when "file-pdf" %>
37
+ <% when "application/pdf" %>
38
38
  <iframe src="<%= @attachment.url %>" frameborder=0 class="full-iframe">
39
39
  Your browser does not support frames.
40
40
  </iframe>
@@ -1,3 +1,3 @@
1
1
  $("#clipboard_items").replaceWith("<%= j render_message { Alchemy.t('No items in your clipboard') } -%>");
2
- $('#clipboard_button .icon').removeClass('fa-paste').addClass('fa-clipboard');
2
+ $('#clipboard_button .icon').removeClass('ri-clipboard-fill').addClass('ri-clipboard-line');
3
3
  Alchemy.pleaseWaitOverlay(false);
@@ -9,18 +9,14 @@
9
9
  <% item_class = item.class.name.demodulize.underscore.pluralize %>
10
10
  <li id="clipboard_item_<%= item.id -%>" class="<%= item_class -%>">
11
11
  <% if item_class == 'pages' %>
12
- <%= render_icon(:file, style: 'regular') %>
12
+ <%= render_icon(:file) %>
13
13
  <%= truncate(item.name, length: 50) %>
14
14
  <% else %>
15
- <% if item.public? %>
16
- <%= render_icon('window-maximize', style: 'regular', class: 'element') %>
17
- <% else %>
18
- <%= render_icon('window-close', class: 'element') %>
19
- <% end %>
15
+ <%= render_icon(:draggable, style: nil) %>
20
16
  <%= truncate(item.display_name_with_preview_text(50), length: 50) %>
21
17
  <% end %>
22
18
  <span class="float_right">
23
- <%= link_to render_icon(:times, size: 'xs'),
19
+ <%= link_to render_icon(:close, size: '1x'),
24
20
  alchemy.remove_admin_clipboard_path(remarkable_type: item_class, remarkable_id: item.id),
25
21
  remote: true, method: 'delete',
26
22
  title: Alchemy.t('Remove item from clipboard') %>
@@ -13,7 +13,7 @@
13
13
  <% else -%>
14
14
  Alchemy.growl('<%= j Alchemy.t("item copied to clipboard", name: @item.class.name == "Alchemy::Element" ? @item.display_name_with_preview_text : @item.name) %>')
15
15
  <% end -%>
16
- $('#clipboard_button .icon').removeClass('fa-clipboard').addClass('fa-paste');
16
+ $('#clipboard_button .icon').removeClass('ri-clipboard-line').addClass('ri-clipboard-fill');
17
17
 
18
18
  <%# Update add nested element forms for any elements that accept ONLY this as a nested element %>
19
19
  <% if @item.class == Alchemy::Element %>
@@ -19,7 +19,7 @@
19
19
  <% if @settings %>
20
20
  <script type="text/javascript">
21
21
  Alchemy.ImageLoader('#jscropper .thumbnail_background');
22
- $('#imageToCrop').load(function() {
22
+ $('#imageToCrop').on("load", function() {
23
23
  new Alchemy.ImageCropper(
24
24
  <%= @settings[:min_size].to_json %>,
25
25
  <%= @settings[:default_box].to_json %>,
@@ -39,7 +39,7 @@
39
39
  <% if (current_alchemy_user.id == page.locked_by) || can?(:manage, Alchemy::Site.current) %>
40
40
  <%= form_tag(alchemy.unlock_admin_page_path(page, :redirect_to => alchemy.admin_dashboard_url)) do %>
41
41
  <button class="icon_button small" title="<%= Alchemy.t(:explain_unlocking) %>">
42
- <%= render_icon(:times, size: 'xs') %>
42
+ <%= render_icon(:close, size: '1x') %>
43
43
  </button>
44
44
  <% end %>
45
45
  <% end %>
@@ -1,16 +1,18 @@
1
1
  <%= content_for :toolbar do %>
2
- <%= toolbar_button(
3
- icon: 'info-circle',
4
- label: Alchemy.t(:info),
5
- url: alchemy.dashboard_info_path,
6
- title: Alchemy.t(:info),
7
- dialog_options: {
2
+ <div class="toolbar_buttons">
3
+ <%= toolbar_button(
4
+ icon: 'information',
5
+ label: Alchemy.t(:info),
6
+ url: alchemy.dashboard_info_path,
8
7
  title: Alchemy.t(:info),
9
- size: "420x435"
10
- },
11
- if_permitted_to: [:info, :alchemy_admin_dashboard],
12
- hotkey: 'alt+i'
13
- ) %>
8
+ dialog_options: {
9
+ title: Alchemy.t(:info),
10
+ size: "420x435"
11
+ },
12
+ if_permitted_to: [:info, :alchemy_admin_dashboard],
13
+ hotkey: 'alt+i'
14
+ ) %>
15
+ </div>
14
16
  <% end %>
15
17
 
16
18
  <div id="dashboard">
@@ -9,15 +9,15 @@
9
9
  </h2>
10
10
  <% if can? :update_check, :alchemy_admin_dashboard %>
11
11
  <p class="center" id="update_check">
12
- <span id="update_available">
12
+ <span id="update_available" class="hidden">
13
13
  <%= render_icon(:exclamation) %>
14
14
  <%= Alchemy.t 'Update available' %>
15
15
  </span>
16
- <span id="up_to_date">
16
+ <span id="up_to_date" class="hidden">
17
17
  <%= render_icon(:check) %>
18
18
  <%= Alchemy.t 'Alchemy is up to date' %>
19
19
  </span>
20
- <span id="error">
20
+ <span id="error" class="hidden">
21
21
  <%= render_icon(:exclamation) %>
22
22
  <%= Alchemy.t 'Update status unavailable' %>
23
23
  </span>
@@ -28,12 +28,12 @@
28
28
  spinner.spin(el[0])
29
29
  $.get('<%= alchemy.update_check_path %>', function(data, textStatus, jqXHR) {
30
30
  if (data == 'true') {
31
- $('#update_available').show()
31
+ $('#update_available').removeClass("hidden")
32
32
  } else {
33
- $('#up_to_date').show()
33
+ $('#up_to_date').removeClass("hidden")
34
34
  }
35
35
  }).fail(function(jqXHR, textStatus, errorThrown) {
36
- $('#error').show()
36
+ $('#error').removeClass("hidden")
37
37
  }).always(function() {
38
38
  spinner.stop()
39
39
  })
@@ -58,7 +58,7 @@
58
58
  <a href="http://blueimp.github.io/jQuery-File-Upload/" target="_blank">jQuery File Upload</a>
59
59
  </li>
60
60
  <li>
61
- <a href="https://fontawesome.com" target="_blank">FontAwesome Icons</a>
61
+ <a href="https://remixicon.com" target="_blank">Remix Icon</a>
62
62
  </li>
63
63
  </ul>
64
64
  <% end %>
@@ -1,27 +1,25 @@
1
1
  <%= content_tag :div, class: 'add-nested-element', data: { element_id: element.id } do %>
2
- <% if element.expanded? || element.fixed? %>
3
- <% if element.nestable_elements.length == 1 &&
4
- (nestable_element = element.nestable_elements.first) &&
5
- Alchemy::Element.all_from_clipboard_for_parent_element(get_clipboard("elements"), element).none?
6
- %>
7
- <%= form_for [:admin, Alchemy::Element.new(name: nestable_element)],
8
- remote: true, html: { class: 'add-nested-element-form', id: nil } do |f| %>
9
- <%= f.hidden_field :name %>
10
- <%= f.hidden_field :page_version_id, value: element.page_version_id %>
11
- <%= f.hidden_field :parent_element_id, value: element.id %>
12
- <button class="button add-nestable-element-button" data-alchemy-button>
13
- <%= Alchemy.t(:add_nested_element, name: Alchemy.t(nestable_element.to_sym, scope: 'element_names')) %>
14
- </button>
15
- <% end %>
16
- <% else %>
17
- <%= link_to_dialog (nestable_element ? Alchemy.t(:add_nested_element, name: Alchemy.t(nestable_element.to_sym, scope: 'element_names')) : Alchemy.t("New Element")),
18
- alchemy.new_admin_element_path(
19
- parent_element_id: element.id,
20
- page_version_id: element.page_version_id
21
- ), {
22
- size: "320x125",
23
- title: Alchemy.t("New Element")
24
- }, class: "button add-nestable-element-button" %>
2
+ <% if element.nestable_elements.length == 1 &&
3
+ (nestable_element = element.nestable_elements.first) &&
4
+ Alchemy::Element.all_from_clipboard_for_parent_element(get_clipboard("elements"), element).none?
5
+ %>
6
+ <%= form_for [:admin, Alchemy::Element.new(name: nestable_element)],
7
+ remote: true, html: { class: 'add-nested-element-form', id: nil } do |f| %>
8
+ <%= f.hidden_field :name %>
9
+ <%= f.hidden_field :page_version_id, value: element.page_version_id %>
10
+ <%= f.hidden_field :parent_element_id, value: element.id %>
11
+ <button class="add-nestable-element-button" is="alchemy-button">
12
+ <%= Alchemy.t(:add_nested_element, name: Alchemy.t(nestable_element.to_sym, scope: 'element_names')) %>
13
+ </button>
25
14
  <% end %>
15
+ <% else %>
16
+ <%= link_to_dialog (nestable_element ? Alchemy.t(:add_nested_element, name: Alchemy.t(nestable_element.to_sym, scope: 'element_names')) : Alchemy.t("New Element")),
17
+ alchemy.new_admin_element_path(
18
+ parent_element_id: element.id,
19
+ page_version_id: element.page_version_id
20
+ ), {
21
+ size: "320x125",
22
+ title: Alchemy.t("New Element")
23
+ }, class: "button add-nestable-element-button" %>
26
24
  <% end %>
27
25
  <% end %>
@@ -1,59 +1,66 @@
1
- <%= content_tag :div,
2
- id: "element_#{element.id}",
3
- data: {'element-id' => element.id, 'element-name' => element.name},
4
- class: element.css_classes do %>
5
-
1
+ <alchemy-element-editor
2
+ id="element_<%= element.id %>"
3
+ data-element-id="<%= element.id %>"
4
+ data-element-name="<%= element.name %>"
5
+ class="<%= element.css_classes %>"
6
+ <%= element.compact? ? "compact" : nil %>
7
+ <%= element.fixed? ? "fixed" : nil %>
8
+ >
6
9
  <% unless element.fixed? %>
7
10
  <%= render 'alchemy/admin/elements/header', element: element %>
8
11
  <% end %>
9
12
 
10
- <% if element.expanded? || element.fixed? %>
11
- <%= render 'alchemy/admin/elements/toolbar', element: element %>
13
+ <%= render 'alchemy/admin/elements/toolbar', element: element %>
12
14
 
13
- <% element.definition[:message].tap do |message| %>
14
- <%= render_message(:info, sanitize(message)) if message %>
15
- <% end %>
15
+ <% if element.has_hint? %>
16
+ <%= render_message(:hint, sanitize(element.hint)) %>
17
+ <% end %>
16
18
 
17
- <% element.definition[:warning].tap do |warning| %>
18
- <%= render_message(:warning, sanitize(warning)) if warning %>
19
- <% end %>
19
+ <% element.definition[:message].tap do |message| %>
20
+ <%= render_message(:info, sanitize(message)) if message %>
21
+ <% end %>
20
22
 
21
- <% if element.editable? %>
22
- <%= form_for [alchemy, :admin, element], remote: true,
23
- html: {id: "element_#{element.id}_form".html_safe, class: 'element-body'} do |f| %>
23
+ <% element.definition[:warning].tap do |warning| %>
24
+ <%= render_message(:warning, sanitize(warning)) if warning %>
25
+ <% end %>
24
26
 
25
- <div id="element_<%= element.id %>_errors" class="element_errors"></div>
27
+ <% if element.editable? %>
28
+ <%= form_for [alchemy, :admin, element], remote: true,
29
+ html: {id: "element_#{element.id}_form".html_safe, class: 'element-body'} do |f| %>
26
30
 
27
- <!-- Ingredients -->
28
- <% if element.has_ingredients_defined? %>
29
- <div class="element-ingredient-editors">
30
- <%= render element.ingredients.select { |i| !i.definition[:group] }, element_form: f %>
31
+ <div id="element_<%= element.id %>_errors" class="element_errors hidden">
32
+ <h2><%= Alchemy.t("Validation failed") %></h2>
33
+ <p><%= Alchemy.t(:ingredient_validations_headline) %></p>
34
+ <ul class="error-messages"></ul>
35
+ </div>
31
36
 
32
- <!-- Each ingredient group -->
33
- <% element.ingredients.select { |i| i.definition[:group] }.group_by { |i| i.definition[:group] }.each do |group, ingredients| %>
34
- <div class="ingredient-group">
35
- <%= link_to '#', id: "element_#{element.id}_ingredient_group_#{group.parameterize.underscore}_header", class: 'ingredient-group-header', data: { toggle_ingredient_group: true } do %>
36
- <%= element.translated_group group %>
37
- <i class="ingredient-group-expand icon fa-fw fa-angle-down fas"></i>
38
- <% end %>
39
- <%= content_tag :div, id: "element_#{element.id}_ingredient_group_#{group.parameterize.underscore}", class: 'ingredient-group-ingredients' do %>
40
- <%= render ingredients, element_form: f %>
41
- <% end %>
42
- </div>
43
- <% end %>
44
- </div>
45
- <% end %>
37
+ <!-- Ingredients -->
38
+ <% if element.has_ingredients_defined? %>
39
+ <div class="element-ingredient-editors">
40
+ <%= render element.ingredients.select { |i| !i.definition[:group] }, element_form: f %>
46
41
 
47
- <% if element.taggable? %>
48
- <div class="autocomplete_tag_list">
49
- <%= f.label :tag_list %>
50
- <%= render 'alchemy/admin/partials/autocomplete_tag_list', f: f %>
51
- </div>
52
- <% end %>
42
+ <!-- Each ingredient group -->
43
+ <% element.ingredients.select { |i| i.definition[:group] }.group_by { |i| i.definition[:group] }.each do |group, ingredients| %>
44
+ <%= content_tag :details, class: "ingredient-group", id: "element_#{element.id}_ingredient_group_#{group.parameterize.underscore}", is: "alchemy-ingredient-group" do %>
45
+ <summary>
46
+ <%= element.translated_group group %>
47
+ <i class="ingredient-group-expand icon ri-fw ri-arrow-left-s-line"></i>
48
+ </summary>
49
+ <%= render ingredients, element_form: f %>
50
+ <% end %>
51
+ <% end %>
52
+ </div>
53
53
  <% end %>
54
54
 
55
- <%= render 'alchemy/admin/elements/footer', element: element %>
55
+ <% if element.taggable? %>
56
+ <div class="autocomplete_tag_list">
57
+ <%= f.label :tag_list %>
58
+ <%= render 'alchemy/admin/partials/autocomplete_tag_list', f: f %>
59
+ </div>
60
+ <% end %>
56
61
  <% end %>
62
+
63
+ <%= render 'alchemy/admin/elements/footer', element: element %>
57
64
  <% end %>
58
65
 
59
66
  <%# We need to render nested elements even if the element is folded,
@@ -63,7 +70,8 @@
63
70
  <div class="nestable-elements">
64
71
  <%= content_tag :div,
65
72
  class: "nested-elements", data: {
66
- 'droppable-elements' => element.nestable_elements.join(' ')
73
+ 'droppable-elements' => element.nestable_elements.join(' '),
74
+ 'element-name' => element.name
67
75
  } do %>
68
76
  <%= render element.all_nested_elements.map { |element|
69
77
  Alchemy::ElementEditor.new(element)
@@ -73,4 +81,4 @@
73
81
  <%= render "alchemy/admin/elements/add_nested_element_form", element: element %>
74
82
  </div>
75
83
  <% end %>
76
- <% end %>
84
+ </alchemy-element-editor>
@@ -5,7 +5,7 @@
5
5
  </p>
6
6
  <% end %>
7
7
 
8
- <button type="submit" form="element_<%= element.id %>_form" class="button" data-alchemy-button>
8
+ <button type="submit" form="element_<%= element.id %>_form" is="alchemy-button">
9
9
  <%= Alchemy.t(:save) %>
10
10
  </button>
11
11
  </div>
@@ -10,7 +10,7 @@
10
10
  collection: elements_for_select(@elements),
11
11
  prompt: Alchemy.t(:select_element),
12
12
  selected: (@elements.first if @elements.count == 1),
13
- input_html: {class: 'alchemy_selectbox', autofocus: true, disabled: @elements.count == 1} %>
13
+ input_html: {is: 'alchemy-select', autofocus: true, disabled: @elements.count == 1} %>
14
14
  <% if @elements.count == 1 %>
15
15
  <%= form.hidden_field :name, value: @elements.first[:name] %>
16
16
  <% end %>
@@ -5,11 +5,7 @@
5
5
  <% elsif element.deprecated? %>
6
6
  <%= hint_with_tooltip element.deprecation_notice %>
7
7
  <% else %>
8
- <% if element.public? %>
9
- <%= render_icon('window-maximize', style: 'regular', class: 'element') %>
10
- <% else %>
11
- <%= render_icon('window-close', class: 'element') %>
12
- <% end %>
8
+ <%= render_icon('draggable', style: nil, class: 'element', fixed_width: false) %>
13
9
  <% end %>
14
10
  </span>
15
11
  <span class="element-title">
@@ -18,13 +14,16 @@
18
14
  <%= sanitize(element.preview_text.presence || '&nbsp;') %>
19
15
  </span>
20
16
  </span>
21
- <%= render_hint_for(element) %>
22
- <%= link_to '#', {
23
- 'data-element-toggle' => element.id,
17
+ <span class="element-hidden-icon">
18
+ <%= render_icon("cloud-off", size: "1x") %>
19
+ <span class="element-hidden-label">
20
+ <%= Alchemy.t(:element_hidden) %>
21
+ </span>
22
+ </span>
23
+ <%= button_tag({
24
24
  title: Alchemy.t(element.folded? ? :show_element_content : :hide_element_content),
25
- id: "element_#{element.id}_folder",
26
- class: "ajax-folder"
27
- } do %>
28
- <%= render_icon element.folded? ? 'plus-square' : 'minus-square' %>
25
+ class: "element-toggle"
26
+ }) do %>
27
+ <%= render_icon element.folded? ? 'arrow-left-s' : 'arrow-down-s' %>
29
28
  <% end %>
30
29
  </div>
@@ -1,48 +1,36 @@
1
1
  <% remarkable_type = "elements" %>
2
2
  <div class="element-toolbar">
3
- <span class="element_tools">
4
- <div class="button_with_label">
5
- <%= link_to(
6
- render_icon(:clone),
7
- alchemy.insert_admin_clipboard_path(remarkable_type: remarkable_type, remarkable_id: element.id),
8
- remote: true,
9
- method: :post,
10
- class: "icon_button"
11
- ) %>
12
- <label><%= Alchemy.t(:copy_element) %></label>
13
- </div>
14
- <div class="button_with_label">
15
- <%= link_to(
16
- render_icon(:cut),
17
- alchemy.insert_admin_clipboard_path(remarkable_type: remarkable_type, remarkable_id: element.id, remove: true),
18
- remote: true,
19
- method: :post,
20
- class: "icon_button"
21
- ) %>
22
- <label><%= Alchemy.t(:cut_element) %></label>
23
- </div>
24
- <div class="button_with_label">
25
- <%= link_to_confirm_dialog(
26
- render_icon('trash-alt'),
27
- Alchemy.t(:confirm_to_delete_element),
28
- alchemy.admin_element_path(element),
29
- class: "icon_button"
30
- ) -%>
31
- <label><%= Alchemy.t("Delete element") %></label>
32
- </div>
33
- <div class="button_with_label publish-element-button">
34
- <%= link_to(
35
- render_icon(element.public? ? 'eye-slash' : 'eye'),
36
- alchemy.publish_admin_element_path(id: element.id),
37
- remote: true,
38
- method: :patch,
39
- class: "icon_button"
40
- ) %>
41
- <% if element.public? %>
42
- <label><%= Alchemy.t(:hide_element) %></label>
43
- <% else %>
44
- <label><%= Alchemy.t(:show_element) %></label>
45
- <% end %>
46
- </div>
47
- </span>
3
+ <sl-tooltip placement="top-start" content="<%= Alchemy.t(:copy_element) %>">
4
+ <%= link_to(
5
+ render_icon("file-copy"),
6
+ alchemy.insert_admin_clipboard_path(remarkable_type: remarkable_type, remarkable_id: element.id),
7
+ remote: true,
8
+ method: :post,
9
+ class: "icon_button"
10
+ ) %>
11
+ </sl-tooltip>
12
+ <sl-tooltip content="<%= Alchemy.t(:cut_element) %>">
13
+ <%= link_to(
14
+ render_icon("scissors-cut"),
15
+ alchemy.insert_admin_clipboard_path(remarkable_type: remarkable_type, remarkable_id: element.id, remove: true),
16
+ remote: true,
17
+ method: :post,
18
+ class: "icon_button"
19
+ ) %>
20
+ </sl-tooltip>
21
+ <sl-tooltip content="<%= Alchemy.t("Delete element") %>">
22
+ <%= link_to_confirm_dialog(
23
+ render_icon('delete-bin-2'),
24
+ Alchemy.t(:confirm_to_delete_element),
25
+ alchemy.admin_element_path(element),
26
+ class: "icon_button"
27
+ ) -%>
28
+ </sl-tooltip>
29
+ <sl-tooltip content="<%= element.public? ? Alchemy.t(:hide_element) : Alchemy.t(:show_element) %>" placement="top-end">
30
+ <alchemy-publish-element-button>
31
+ <sl-switch <%= element.public? ? nil : "checked" %> size="small">
32
+ <%= t(".hide") %>
33
+ </sl-switch>
34
+ </alchemy-publish-element-button>
35
+ </sl-tooltip>
48
36
  </div>
@@ -1,5 +1,4 @@
1
1
  (function() {
2
- var $el;
3
2
  var $element_area;
4
3
  var element_html = '<%= j render(Alchemy::ElementEditor.new(@element)) %>';
5
4
 
@@ -12,10 +11,9 @@
12
11
  Alchemy.FixedElements.buildTabs('<%= Alchemy.t(:main_content) %>');
13
12
  }
14
13
  Alchemy.FixedElements.createTab('<%= @element.id %>', '<%= @element.display_name %>');
15
- $element_area = $('#fixed-element-<%= @element.id %>');
14
+ $element_area = $('[name="fixed-element-<%= @element.id %>"]');
16
15
  <% elsif @element.parent_element %>
17
16
  $element_area = $('#element_<%= @element.parent_element_id %> > .nestable-elements > .nested-elements');
18
- Alchemy.Buttons.enable('.nestable-elements');
19
17
  <% else %>
20
18
  $element_area = $('#main-content-elements');
21
19
  <% end %>
@@ -26,22 +24,16 @@
26
24
  $element_area.append(element_html);
27
25
  <%- end -%>
28
26
 
29
- if ($element_area.find('.element-editor').length > 0) {
30
- Alchemy.SortableElements(<%= @page.id %>, '<%= form_authenticity_token %>', $element_area);
31
- } else {
32
- $element_area.sortable('refresh');
33
- }
27
+ <% if @element.fixed? %>
28
+ Alchemy.SortableElements('[name="fixed-element-<%= @element.id %>"] .nested-elements');
29
+ <% end %>
34
30
 
35
31
  Alchemy.growl('<%= Alchemy.t(:successfully_added_element) %>');
36
32
  Alchemy.closeCurrentDialog();
37
- Alchemy.Tinymce.init(<%= @element.richtext_ingredients_ids.to_json %>);
38
- Alchemy.PreviewWindow.refresh(function() {
39
- Alchemy.ElementEditors.focusElementPreview(<%= @element.id %>);
40
- });
41
33
 
42
- $el = $('#element_<%= @element.id %>');
43
- $el.trigger('FocusElementEditor.Alchemy');
44
- Alchemy.GUI.initElement($el);
34
+ el = document.querySelector('#element_<%= @element.id %>');
35
+ el.focusElement();
36
+ el.focusElementPreview();
45
37
 
46
38
  <%- if @clipboard.blank? -%>
47
39
  $('#clipboard_button .icon.clipboard').removeClass('full');
@@ -1,9 +1,7 @@
1
1
  $('#element_<%= @element.id %>').hide(200, function() {
2
2
  $(this).remove();
3
3
  Alchemy.growl('<%= j @notice %>');
4
- $('#element_area .sortable-elements').sortable('refresh');
5
4
  Alchemy.PreviewWindow.refresh();
6
- Alchemy.Tinymce.remove(<%= @richtext_ids.to_json %>);
7
5
  <% if @element.fixed? %>
8
6
  Alchemy.FixedElements.removeTab(<%= @element.id %>);
9
7
  <% end %>
@@ -1,33 +1,36 @@
1
1
  <% if @fixed_elements.any? %>
2
- <div id="fixed-elements">
3
- <ul>
4
- <li>
5
- <a href="#main-content-elements">
6
- <%= Alchemy.t(:main_content) %>
7
- </a>
8
- </li>
9
- <% @fixed_elements.each do |element| %>
10
- <li>
11
- <a href="#fixed-element-<%= element.id %>">
12
- <%= element.display_name %>
13
- </a>
14
- </li>
15
- <% end %>
16
- </ul>
17
- <div id="main-content-elements" class="sortable-elements" data-droppable-elements="<%= @page.element_definition_names.join(' ') %>">
2
+ <sl-tab-group id="fixed-elements">
3
+ <sl-tab slot="nav" panel="main-content-elements">
4
+ <%= Alchemy.t(:main_content) %>
5
+ </sl-tab>
6
+ <% @fixed_elements.each do |element| %>
7
+ <sl-tab slot="nav" panel="fixed-element-<%= element.id %>">
8
+ <%= element.display_name %>
9
+ </sl-tab>
10
+ <% end %>
11
+ <sl-tab-panel
12
+ name="main-content-elements"
13
+ class="sortable-elements scrollable-elements"
14
+ data-droppable-elements="<%= @page.element_definition_names.join(' ') %>"
15
+ data-element-name="main-content-elements"
16
+ id="main-content-elements"
17
+ style="--padding: 0"
18
+ >
18
19
  <%= render @elements.map { |element| Alchemy::ElementEditor.new(element) } %>
19
- </div>
20
+ </sl-tab-panel>
20
21
  <% @fixed_elements.each do |element| %>
21
- <div
22
- id="fixed-element-<%= element.id %>"
23
- class="sortable-elements"
24
- data-droppable-elements="<%= element.nestable_elements.join(' ') %>">
22
+ <sl-tab-panel name="fixed-element-<%= element.id %>" style="--padding: 0" class="scrollable-elements">
25
23
  <%= render Alchemy::ElementEditor.new(element) %>
26
- </div>
24
+ </sl-tab-panel>
27
25
  <% end %>
28
- </div>
26
+ </sl-tab-group>
29
27
  <% else %>
30
- <div id="main-content-elements" class="sortable-elements" data-droppable-elements="<%= @page.element_definition_names.join(' ') %>">
28
+ <div
29
+ id="main-content-elements"
30
+ class="sortable-elements scrollable-elements"
31
+ data-droppable-elements="<%= @page.element_definition_names.join(' ') %>"
32
+ data-element-name="main-content-elements"
33
+ >
31
34
  <%= render @elements.map { |element| Alchemy::ElementEditor.new(element) } %>
32
35
  </div>
33
36
  <% end %>