alchemy_cms 7.0.8 → 7.1.0.pre.b2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (394) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +162 -0
  3. data/Gemfile +9 -11
  4. data/README.md +11 -9
  5. data/alchemy_cms.gemspec +4 -3
  6. data/app/assets/config/alchemy_manifest.js +3 -5
  7. data/app/assets/images/alchemy/missing-image.svg +1 -1
  8. data/app/assets/javascripts/alchemy/admin.js +1 -23
  9. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +2 -3
  10. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +19 -34
  11. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +38 -13
  12. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +1 -1
  13. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +32 -25
  14. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +1 -1
  15. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +3 -5
  16. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +0 -57
  17. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +24 -65
  18. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +2 -2
  19. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +5 -4
  20. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +5 -5
  21. data/app/assets/javascripts/alchemy/templates/index.js +0 -2
  22. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +1 -1
  23. data/app/assets/javascripts/alchemy/templates/page.hbs +1 -1
  24. data/app/assets/javascripts/alchemy/templates/page_folder.hbs +2 -2
  25. data/app/assets/javascripts/tinymce/icons/remixicons/icons.js +93 -0
  26. data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +37 -18
  27. data/app/assets/stylesheets/alchemy/_custom-properties.scss +82 -0
  28. data/app/assets/stylesheets/alchemy/_mixins.scss +38 -30
  29. data/app/assets/stylesheets/alchemy/_variables.scss +23 -8
  30. data/app/assets/stylesheets/alchemy/admin.scss +3 -4
  31. data/app/assets/stylesheets/alchemy/archive.scss +110 -50
  32. data/app/assets/stylesheets/alchemy/attachments.scss +5 -4
  33. data/app/assets/stylesheets/alchemy/buttons.scss +41 -166
  34. data/app/assets/stylesheets/alchemy/dashboard.scss +31 -6
  35. data/app/assets/stylesheets/alchemy/dialogs.scss +12 -28
  36. data/app/assets/stylesheets/alchemy/elements.scss +272 -282
  37. data/app/assets/stylesheets/alchemy/flash.scss +20 -12
  38. data/app/assets/stylesheets/alchemy/forms.scss +21 -34
  39. data/app/assets/stylesheets/alchemy/frame.scss +11 -32
  40. data/app/assets/stylesheets/alchemy/hints.scss +4 -62
  41. data/app/assets/stylesheets/alchemy/image_library.scss +36 -33
  42. data/app/assets/stylesheets/alchemy/menubar.scss +7 -6
  43. data/app/assets/stylesheets/alchemy/navigation.scss +27 -15
  44. data/app/assets/stylesheets/alchemy/nodes.scss +11 -7
  45. data/app/assets/stylesheets/alchemy/notices.scss +16 -4
  46. data/app/assets/stylesheets/alchemy/page-select.scss +10 -2
  47. data/app/assets/stylesheets/alchemy/pagination.scss +22 -13
  48. data/app/assets/stylesheets/alchemy/resource_info.scss +7 -5
  49. data/app/assets/stylesheets/alchemy/selects.scss +49 -42
  50. data/app/assets/stylesheets/alchemy/shoelace.scss +345 -0
  51. data/app/assets/stylesheets/alchemy/sitemap.scss +24 -14
  52. data/app/assets/stylesheets/alchemy/spinner.scss +9 -19
  53. data/app/assets/stylesheets/alchemy/tables.scss +16 -24
  54. data/app/assets/stylesheets/alchemy/tags.scss +4 -0
  55. data/app/assets/stylesheets/alchemy/toolbar.scss +29 -25
  56. data/app/assets/stylesheets/alchemy/upload.scss +140 -89
  57. data/app/assets/stylesheets/tinymce/skins/content/alchemy/content.min.scss +69 -0
  58. data/app/assets/stylesheets/tinymce/skins/skintool.json +38 -0
  59. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.css +711 -0
  60. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.inline.css +705 -0
  61. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.inline.min.css +7 -0
  62. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.min.css +7 -0
  63. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.mobile.css +29 -0
  64. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/content.mobile.min.css +7 -0
  65. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/fonts/tinymce-mobile.woff +0 -0
  66. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.min.scss +3798 -0
  67. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.css +677 -0
  68. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/skin.mobile.min.css +7 -0
  69. data/app/components/alchemy/admin/node_select.rb +39 -0
  70. data/app/components/alchemy/admin/page_select.rb +42 -0
  71. data/app/controllers/alchemy/admin/base_controller.rb +5 -6
  72. data/app/controllers/alchemy/admin/elements_controller.rb +63 -35
  73. data/app/controllers/alchemy/admin/pages_controller.rb +9 -4
  74. data/app/controllers/alchemy/base_controller.rb +4 -2
  75. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +1 -1
  76. data/app/controllers/concerns/alchemy/site_redirects.rb +1 -1
  77. data/app/decorators/alchemy/element_editor.rb +0 -2
  78. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -5
  79. data/app/helpers/alchemy/admin/base_helper.rb +17 -12
  80. data/app/helpers/alchemy/admin/ingredients_helper.rb +4 -1
  81. data/app/helpers/alchemy/admin/pages_helper.rb +5 -11
  82. data/app/helpers/alchemy/base_helper.rb +47 -13
  83. data/app/javascript/alchemy_admin/clipboard.js +16 -0
  84. data/app/javascript/alchemy_admin/components/alchemy_html_element.js +129 -0
  85. data/app/javascript/alchemy_admin/components/button.js +59 -0
  86. data/app/javascript/alchemy_admin/components/char_counter.js +40 -0
  87. data/app/javascript/alchemy_admin/components/datepicker.js +39 -0
  88. data/app/javascript/alchemy_admin/components/dialog_link.js +45 -0
  89. data/app/javascript/alchemy_admin/components/element_editor/publish_element_button.js +36 -0
  90. data/app/javascript/alchemy_admin/components/element_editor.js +553 -0
  91. data/app/javascript/alchemy_admin/components/ingredient_group.js +54 -0
  92. data/app/javascript/alchemy_admin/components/link_buttons/link_button.js +48 -0
  93. data/app/javascript/alchemy_admin/components/link_buttons/unlink_button.js +38 -0
  94. data/app/javascript/alchemy_admin/components/link_buttons.js +79 -0
  95. data/app/javascript/alchemy_admin/components/node_select.js +45 -0
  96. data/app/javascript/alchemy_admin/components/overlay.js +18 -0
  97. data/app/javascript/alchemy_admin/components/page_select.js +63 -0
  98. data/app/javascript/alchemy_admin/components/remote_select.js +134 -0
  99. data/app/javascript/alchemy_admin/components/select.js +12 -0
  100. data/app/javascript/alchemy_admin/components/spinner.js +31 -0
  101. data/app/javascript/alchemy_admin/components/tinymce.js +134 -0
  102. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +266 -0
  103. data/app/javascript/alchemy_admin/components/uploader/progress.js +258 -0
  104. data/app/javascript/alchemy_admin/components/uploader.js +132 -0
  105. data/app/javascript/alchemy_admin/dirty.js +49 -0
  106. data/app/javascript/alchemy_admin/file_editors.js +1 -1
  107. data/app/javascript/alchemy_admin/gui.js +14 -0
  108. data/app/javascript/alchemy_admin/i18n.js +12 -8
  109. data/app/javascript/alchemy_admin/image_cropper.js +6 -3
  110. data/app/javascript/alchemy_admin/image_loader.js +7 -15
  111. data/app/javascript/alchemy_admin/ingredient_anchor_link.js +2 -5
  112. data/app/javascript/alchemy_admin/initializer.js +65 -0
  113. data/app/javascript/alchemy_admin/locales/en.js +31 -0
  114. data/app/javascript/alchemy_admin/picture_editors.js +6 -4
  115. data/app/javascript/alchemy_admin/picture_selector.js +38 -0
  116. data/app/javascript/alchemy_admin/please_wait_overlay.js +8 -0
  117. data/app/javascript/alchemy_admin/sortable_elements.js +78 -0
  118. data/app/javascript/alchemy_admin/spinner.js +36 -0
  119. data/app/javascript/alchemy_admin/tags_autocomplete.js +46 -0
  120. data/app/javascript/alchemy_admin/utils/ajax.js +6 -5
  121. data/app/javascript/alchemy_admin/utils/debounce.js +10 -0
  122. data/app/javascript/alchemy_admin/utils/dom_helpers.js +20 -0
  123. data/app/javascript/alchemy_admin/utils/format.js +11 -0
  124. data/app/javascript/alchemy_admin/utils/max.js +3 -0
  125. data/app/javascript/alchemy_admin/utils/string_conversions.js +10 -0
  126. data/app/javascript/alchemy_admin.js +64 -13
  127. data/app/javascript/menubar.js +10 -0
  128. data/app/models/alchemy/attachment.rb +9 -11
  129. data/app/models/alchemy/element.rb +11 -0
  130. data/app/models/alchemy/ingredients/richtext.rb +1 -10
  131. data/app/models/alchemy/node.rb +4 -0
  132. data/app/models/alchemy/page/page_naming.rb +7 -0
  133. data/app/models/alchemy/page/page_natures.rb +10 -2
  134. data/app/models/alchemy/page.rb +11 -51
  135. data/app/models/alchemy/picture/url.rb +1 -9
  136. data/app/models/alchemy/picture_variant.rb +11 -2
  137. data/app/models/concerns/alchemy/picture_thumbnails.rb +1 -1
  138. data/app/serializers/alchemy/page_tree_serializer.rb +2 -1
  139. data/app/services/alchemy/copy_page.rb +98 -0
  140. data/app/views/alchemy/_menubar.html.erb +17 -13
  141. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +14 -10
  142. data/app/views/alchemy/admin/attachments/_attachment.html.erb +44 -36
  143. data/app/views/alchemy/admin/attachments/_replace_button.html.erb +15 -21
  144. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +0 -1
  145. data/app/views/alchemy/admin/attachments/assign.js.erb +1 -1
  146. data/app/views/alchemy/admin/attachments/index.html.erb +6 -4
  147. data/app/views/alchemy/admin/attachments/show.html.erb +10 -23
  148. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  149. data/app/views/alchemy/admin/clipboard/index.html.erb +3 -7
  150. data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
  151. data/app/views/alchemy/admin/crop.html.erb +1 -1
  152. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  153. data/app/views/alchemy/admin/dashboard/index.html.erb +13 -11
  154. data/app/views/alchemy/admin/dashboard/info.html.erb +7 -7
  155. data/app/views/alchemy/admin/elements/_add_nested_element_form.html.erb +21 -23
  156. data/app/views/alchemy/admin/elements/_element.html.erb +52 -44
  157. data/app/views/alchemy/admin/elements/_footer.html.erb +1 -1
  158. data/app/views/alchemy/admin/elements/_form.html.erb +1 -1
  159. data/app/views/alchemy/admin/elements/_header.html.erb +11 -12
  160. data/app/views/alchemy/admin/elements/_toolbar.html.erb +33 -45
  161. data/app/views/alchemy/admin/elements/create.js.erb +7 -15
  162. data/app/views/alchemy/admin/elements/destroy.js.erb +0 -2
  163. data/app/views/alchemy/admin/elements/index.html.erb +27 -24
  164. data/app/views/alchemy/admin/elements/new.html.erb +9 -11
  165. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +2 -2
  166. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +3 -3
  167. data/app/views/alchemy/admin/ingredients/_video_fields.html.erb +1 -2
  168. data/app/views/alchemy/admin/languages/_form.html.erb +2 -3
  169. data/app/views/alchemy/admin/languages/_language.html.erb +15 -8
  170. data/app/views/alchemy/admin/languages/_table.html.erb +1 -0
  171. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +28 -16
  172. data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
  173. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +12 -8
  174. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
  175. data/app/views/alchemy/admin/nodes/_form.html.erb +20 -21
  176. data/app/views/alchemy/admin/nodes/_node.html.erb +39 -34
  177. data/app/views/alchemy/admin/nodes/index.html.erb +1 -1
  178. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +4 -4
  179. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +2 -2
  180. data/app/views/alchemy/admin/pages/_current_page.html.erb +1 -1
  181. data/app/views/alchemy/admin/pages/_external_link.html.erb +4 -4
  182. data/app/views/alchemy/admin/pages/_file_link.html.erb +5 -5
  183. data/app/views/alchemy/admin/pages/_form.html.erb +10 -21
  184. data/app/views/alchemy/admin/pages/_internal_link.html.erb +4 -4
  185. data/app/views/alchemy/admin/pages/_locked_page.html.erb +2 -2
  186. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +4 -17
  187. data/app/views/alchemy/admin/pages/_page.html.erb +76 -72
  188. data/app/views/alchemy/admin/pages/_page_infos.html.erb +23 -7
  189. data/app/views/alchemy/admin/pages/_page_layout_filter.html.erb +2 -1
  190. data/app/views/alchemy/admin/pages/_page_status.html.erb +11 -21
  191. data/app/views/alchemy/admin/pages/_publication_fields.html.erb +2 -5
  192. data/app/views/alchemy/admin/pages/_table.html.erb +1 -1
  193. data/app/views/alchemy/admin/pages/_table_row.html.erb +43 -39
  194. data/app/views/alchemy/admin/pages/_toolbar.html.erb +43 -38
  195. data/app/views/alchemy/admin/pages/configure.html.erb +12 -14
  196. data/app/views/alchemy/admin/pages/edit.html.erb +80 -103
  197. data/app/views/alchemy/admin/pages/info.html.erb +20 -11
  198. data/app/views/alchemy/admin/pages/link.html.erb +22 -16
  199. data/app/views/alchemy/admin/pages/new.html.erb +9 -11
  200. data/app/views/alchemy/admin/pages/unlock.js.erb +10 -3
  201. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -13
  202. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +3 -5
  203. data/app/views/alchemy/admin/partials/_routes.html.erb +10 -2
  204. data/app/views/alchemy/admin/partials/_site_select.html.erb +6 -5
  205. data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +28 -23
  206. data/app/views/alchemy/admin/pictures/_archive.html.erb +5 -5
  207. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  208. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +21 -23
  209. data/app/views/alchemy/admin/pictures/_infos.html.erb +2 -6
  210. data/app/views/alchemy/admin/pictures/_picture.html.erb +17 -21
  211. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +17 -16
  212. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +1 -1
  213. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +1 -1
  214. data/app/views/alchemy/admin/pictures/assign.js.erb +1 -1
  215. data/app/views/alchemy/admin/pictures/index.html.erb +34 -30
  216. data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
  217. data/app/views/alchemy/admin/resources/_filter.html.erb +2 -2
  218. data/app/views/alchemy/admin/resources/_form.html.erb +2 -2
  219. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +1 -1
  220. data/app/views/alchemy/admin/resources/_resource.html.erb +16 -9
  221. data/app/views/alchemy/admin/resources/_table.html.erb +4 -1
  222. data/app/views/alchemy/admin/resources/index.html.erb +22 -19
  223. data/app/views/alchemy/admin/sites/index.html.erb +2 -1
  224. data/app/views/alchemy/admin/styleguide/index.html.erb +54 -28
  225. data/app/views/alchemy/admin/tags/_tag.html.erb +16 -14
  226. data/app/views/alchemy/admin/tags/index.html.erb +15 -12
  227. data/app/views/alchemy/admin/tinymce/_setup.html.erb +28 -0
  228. data/app/views/alchemy/admin/uploader/_button.html.erb +23 -29
  229. data/app/views/alchemy/admin/uploader/_setup.html.erb +3 -8
  230. data/app/views/alchemy/base/500.html.erb +1 -1
  231. data/app/views/alchemy/base/error_notice.js.erb +0 -1
  232. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
  233. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +1 -1
  234. data/app/views/alchemy/ingredients/_file_editor.html.erb +5 -5
  235. data/app/views/alchemy/ingredients/_link_editor.html.erb +1 -1
  236. data/app/views/alchemy/ingredients/_node_editor.html.erb +6 -19
  237. data/app/views/alchemy/ingredients/_page_editor.html.erb +7 -19
  238. data/app/views/alchemy/ingredients/_picture_editor.html.erb +2 -2
  239. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +6 -15
  240. data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -1
  241. data/app/views/alchemy/ingredients/_text_editor.html.erb +1 -1
  242. data/app/views/alchemy/ingredients/shared/_anchor.html.erb +1 -1
  243. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +10 -20
  244. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +42 -49
  245. data/app/views/kaminari/alchemy/_first_page.html.erb +4 -2
  246. data/app/views/kaminari/alchemy/_gap.html.erb +1 -1
  247. data/app/views/kaminari/alchemy/_last_page.html.erb +4 -2
  248. data/app/views/kaminari/alchemy/_next_page.html.erb +4 -2
  249. data/app/views/kaminari/alchemy/_prev_page.html.erb +4 -2
  250. data/app/views/layouts/alchemy/admin.html.erb +10 -29
  251. data/bundles/shoelace.js +10 -0
  252. data/bundles/tinymce.js +20 -0
  253. data/config/alchemy/config.yml +11 -10
  254. data/config/alchemy/modules.yml +30 -30
  255. data/config/brakeman.ignore +0 -34
  256. data/config/importmap.rb +9 -5
  257. data/config/initializers/dragonfly.rb +1 -0
  258. data/config/initializers/rails_live_reload.rb +13 -0
  259. data/config/locales/alchemy.en.yml +25 -9
  260. data/config/routes.rb +2 -1
  261. data/lib/alchemy/auth_accessors.rb +6 -1
  262. data/lib/alchemy/config.rb +24 -2
  263. data/lib/alchemy/dev_support/live_reload_watcher.rb +5 -0
  264. data/lib/alchemy/engine.rb +10 -3
  265. data/lib/alchemy/forms/builder.rb +18 -12
  266. data/lib/alchemy/resources_helper.rb +3 -3
  267. data/lib/alchemy/test_support/capybara_helpers.rb +8 -5
  268. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +6 -6
  269. data/lib/alchemy/test_support/rspec_matchers.rb +14 -0
  270. data/lib/alchemy/test_support/shared_uploader_examples.rb +1 -1
  271. data/lib/alchemy/tinymce.rb +19 -3
  272. data/lib/alchemy/version.rb +1 -1
  273. data/package.json +30 -9
  274. data/rollup.config.mjs +65 -0
  275. data/vendor/assets/fonts/remixicon.eot +0 -0
  276. data/vendor/assets/fonts/remixicon.svg +7816 -0
  277. data/vendor/assets/fonts/remixicon.ttf +0 -0
  278. data/vendor/assets/fonts/remixicon.woff +0 -0
  279. data/vendor/assets/fonts/remixicon.woff2 +0 -0
  280. data/vendor/assets/stylesheets/remixicon.scss +10480 -0
  281. data/vendor/assets/stylesheets/tinymce/skins/content/default/content.min.css +1 -0
  282. data/vendor/javascript/clipboard.min.js +7 -0
  283. data/vendor/javascript/flatpickr.min.js +1 -0
  284. data/vendor/javascript/keymaster.min.js +1 -0
  285. data/vendor/javascript/rails-ujs.min.js +1 -0
  286. data/vendor/javascript/shoelace.min.js +995 -0
  287. data/vendor/javascript/sortable.min.js +7 -0
  288. data/vendor/javascript/tinymce.min.js +1 -0
  289. data/vendor/javascript/ungap-custom-elements.min.js +3 -0
  290. metadata +111 -124
  291. data/.codeclimate.yml +0 -35
  292. data/.editorconfig +0 -23
  293. data/.github/FUNDING.yml +0 -4
  294. data/.github/ISSUE_TEMPLATE/Bug_report.md +0 -22
  295. data/.github/ISSUE_TEMPLATE/Feature_request.md +0 -17
  296. data/.github/PULL_REQUEST_TEMPLATE.md +0 -18
  297. data/.github/workflows/brakeman-analysis.yml +0 -46
  298. data/.github/workflows/lint.yml +0 -37
  299. data/.github/workflows/stale.yml +0 -33
  300. data/.github/workflows/test.yml +0 -124
  301. data/.gitignore +0 -31
  302. data/.hound.yml +0 -9
  303. data/.localeapp/config.rb +0 -8
  304. data/.prettierrc +0 -6
  305. data/.rspec +0 -1
  306. data/.rubocop.yml +0 -7
  307. data/.standard.yml +0 -4
  308. data/.yardopts +0 -5
  309. data/app/assets/javascripts/alchemy/alchemy.autocomplete.js.coffee +0 -30
  310. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -53
  311. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +0 -45
  312. data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +0 -19
  313. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +0 -59
  314. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +0 -79
  315. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -267
  316. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +0 -27
  317. data/app/assets/javascripts/alchemy/alchemy.spinner.js +0 -32
  318. data/app/assets/javascripts/alchemy/alchemy.tooltips.coffee +0 -10
  319. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +0 -131
  320. data/app/assets/javascripts/alchemy/menubar.js.coffee +0 -8
  321. data/app/assets/javascripts/alchemy/node_select.js +0 -39
  322. data/app/assets/javascripts/alchemy/page_select.js +0 -46
  323. data/app/assets/javascripts/alchemy/templates/node.hbs +0 -16
  324. data/app/assets/javascripts/alchemy/templates/spinner.hbs +0 -7
  325. data/app/assets/stylesheets/alchemy/jquery-ui.scss +0 -435
  326. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +0 -94
  327. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.svg +0 -63
  328. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.ttf +0 -0
  329. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.woff +0 -0
  330. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.svg +0 -129
  331. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.ttf +0 -0
  332. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.woff +0 -0
  333. data/app/assets/stylesheets/tinymce/skins/alchemy/img/anchor.gif +0 -0
  334. data/app/assets/stylesheets/tinymce/skins/alchemy/img/loader.gif +0 -0
  335. data/app/assets/stylesheets/tinymce/skins/alchemy/img/object.gif +0 -0
  336. data/app/assets/stylesheets/tinymce/skins/alchemy/img/trans.gif +0 -0
  337. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +0 -2105
  338. data/app/javascript/alchemy_admin/datepicker.js +0 -33
  339. data/app/javascript/alchemy_admin/tinymce.js +0 -146
  340. data/app/javascript/alchemy_admin/translations.js +0 -32
  341. data/app/views/alchemy/admin/elements/fold.js.erb +0 -33
  342. data/app/views/alchemy/admin/elements/order.js.erb +0 -11
  343. data/app/views/alchemy/admin/elements/publish.js.erb +0 -21
  344. data/app/views/alchemy/admin/elements/update.js.erb +0 -27
  345. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  346. data/vendor/assets/fonts/fa-regular-400.svg +0 -803
  347. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  348. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  349. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  350. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  351. data/vendor/assets/fonts/fa-solid-900.svg +0 -4938
  352. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  353. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  354. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  355. data/vendor/assets/javascripts/clipboard.min.js +0 -7
  356. data/vendor/assets/javascripts/fileupload/jquery.fileupload-process.js +0 -178
  357. data/vendor/assets/javascripts/fileupload/jquery.fileupload-validate.js +0 -125
  358. data/vendor/assets/javascripts/fileupload/jquery.fileupload.js +0 -1502
  359. data/vendor/assets/javascripts/fileupload/jquery.iframe-transport.js +0 -224
  360. data/vendor/assets/javascripts/jquery-ui/data.js +0 -45
  361. data/vendor/assets/javascripts/jquery-ui/ie.js +0 -20
  362. data/vendor/assets/javascripts/jquery-ui/keycode.js +0 -51
  363. data/vendor/assets/javascripts/jquery-ui/plugin.js +0 -49
  364. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +0 -46
  365. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +0 -27
  366. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +0 -50
  367. data/vendor/assets/javascripts/jquery-ui/unique-id.js +0 -54
  368. data/vendor/assets/javascripts/jquery-ui/version.js +0 -20
  369. data/vendor/assets/javascripts/jquery-ui/widget.js +0 -754
  370. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +0 -1268
  371. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +0 -241
  372. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +0 -1623
  373. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +0 -931
  374. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo.min.js +0 -7
  375. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +0 -296
  376. data/vendor/assets/javascripts/keymaster.js +0 -296
  377. data/vendor/assets/javascripts/requestAnimationFrame.js +0 -31
  378. data/vendor/assets/javascripts/tinymce/license.txt +0 -504
  379. data/vendor/assets/javascripts/tinymce/tinymce.min.js +0 -2
  380. data/vendor/assets/stylesheets/fontawesome/_animated.scss +0 -20
  381. data/vendor/assets/stylesheets/fontawesome/_bordered-pulled.scss +0 -20
  382. data/vendor/assets/stylesheets/fontawesome/_core.scss +0 -21
  383. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +0 -6
  384. data/vendor/assets/stylesheets/fontawesome/_icons.scss +0 -1441
  385. data/vendor/assets/stylesheets/fontawesome/_larger.scss +0 -23
  386. data/vendor/assets/stylesheets/fontawesome/_list.scss +0 -18
  387. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -56
  388. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +0 -24
  389. data/vendor/assets/stylesheets/fontawesome/_screen-reader.scss +0 -5
  390. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +0 -31
  391. data/vendor/assets/stylesheets/fontawesome/_variables.scss +0 -1458
  392. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +0 -16
  393. data/vendor/assets/stylesheets/fontawesome/regular.scss +0 -23
  394. data/vendor/assets/stylesheets/fontawesome/solid.scss +0 -24
@@ -1,25 +1,30 @@
1
- <div class="button_with_label<%= options[:active] ? ' active' : '' %>">
2
- <% if options[:dialog] %>
3
- <%= link_to_dialog(
4
- render_icon(options[:icon]),
5
- options[:url],
6
- options[:dialog_options],
7
- {
8
- class: 'icon_button',
9
- title: options[:title],
10
- 'data-alchemy-hotkey' => options[:hotkey]
11
- }.merge(options[:link_options])
12
- ) %>
13
- <% else %>
14
- <%= link_to(
15
- options[:url], {
16
- class: "icon_button#{options[:loading_indicator] ? ' please_wait' : ''}",
17
- title: options[:title],
18
- 'data-alchemy-hotkey' => options[:hotkey]
19
- }.merge(options[:link_options])
20
- ) do %>
21
- <%= render_icon(options[:icon]) %>
1
+ <div class="toolbar_button">
2
+ <%= content_tag "sl-tooltip", content: options[:label], placement: options[:tooltip_placement] do %>
3
+ <% if options[:dialog] %>
4
+ <%= link_to_dialog(
5
+ render_icon(options[:icon]),
6
+ options[:url],
7
+ options[:dialog_options],
8
+ {
9
+ class: ["icon_button", options[:active] && "active"].compact,
10
+ title: options[:title],
11
+ "data-alchemy-hotkey" => options[:hotkey]
12
+ }.merge(options[:link_options])
13
+ ) %>
14
+ <% else %>
15
+ <%= link_to(
16
+ options[:url], {
17
+ class: [
18
+ "icon_button",
19
+ options[:loading_indicator] && "please_wait",
20
+ options[:active] && "active",
21
+ ].compact,
22
+ title: options[:title],
23
+ "data-alchemy-hotkey" => options[:hotkey]
24
+ }.merge(options[:link_options])
25
+ ) do %>
26
+ <%= render_icon(options[:icon]) %>
27
+ <% end %>
28
+ <% end %>
22
29
  <% end %>
23
- <% end %>
24
- <label><%= options[:label] %></label>
25
30
  </div>
@@ -9,17 +9,17 @@
9
9
  </div>
10
10
 
11
11
  <%= form_tag delete_multiple_admin_pictures_path, method: :delete do %>
12
- <div class="selected_item_tools">
12
+ <div class="selected_item_tools hidden">
13
13
  <h3><%= Alchemy.t(:edit_selected_pictures) %></h3>
14
14
  <%= link_to(
15
- render_icon(:edit, size: 'xs') + Alchemy.t("Edit"),
15
+ render_icon(:edit, size: '1x') + Alchemy.t("Edit"),
16
16
  edit_multiple_admin_pictures_path,
17
17
  class: 'button with_icon',
18
18
  title: Alchemy.t('Edit multiple pictures'),
19
19
  id: 'edit_multiple_pictures',
20
20
  style: 'float: none'
21
21
  ) %>
22
- <%= button_tag render_icon(:minus, size: 'xs') + Alchemy.t("Delete"), 'data-alchemy-confirm' => {
22
+ <%= button_tag render_icon("delete-bin-2", size: '1x') + Alchemy.t("Delete"), 'data-alchemy-confirm' => {
23
23
  title: Alchemy.t(:please_confirm),
24
24
  message: Alchemy.t(:confirm_to_delete_images_from_server),
25
25
  ok_label: Alchemy.t("Yes"),
@@ -27,7 +27,7 @@
27
27
  }.to_json, class: 'button with_icon' %>
28
28
  &nbsp;<%= Alchemy.t(:or) %>&nbsp;
29
29
  <%= link_to(
30
- render_icon(:times, size: 'xs') + Alchemy.t("Clear selection"),
30
+ render_icon(:close) + Alchemy.t("Clear selection"),
31
31
  admin_pictures_path(
32
32
  q: search_filter_params[:q],
33
33
  tagged_with: search_filter_params[:tagged_with],
@@ -38,7 +38,7 @@
38
38
  style: 'float: none'
39
39
  ) %>
40
40
  </div>
41
- <div id="pictures">
41
+ <div id="pictures" class="picture-size--<%= @size %>">
42
42
  <% if @pictures.blank? and @recent_pictures.blank? and search_filter_params[:q].blank? %>
43
43
  <%= render_message do %>
44
44
  <%= Alchemy.t(:no_images_in_archive) %>
@@ -8,7 +8,7 @@
8
8
  <%= render 'tag_list' %>
9
9
  </div>
10
10
  </div>
11
- <div id="overlay_picture_list">
11
+ <div id="overlay_picture_list" class="picture-size--<%= @size %>">
12
12
  <%= render 'overlay_picture_list' %>
13
13
  </div>
14
14
  </div>
@@ -1,21 +1,23 @@
1
- <div id="image_assign_filter_and_image_sizing">
1
+ <div class="toolbar_buttons">
2
2
  <% if can? :create, Alchemy::Picture %>
3
- <%= render 'alchemy/admin/uploader/button',
4
- object: Alchemy::Picture.new,
5
- dropzone: '#assign_image_list',
6
- file_attribute: 'image_file',
7
- in_dialog: true,
8
- redirect_url: alchemy.admin_pictures_path(
9
- size: search_filter_params[:size],
10
- filter: { misc: 'last_upload' },
11
- form_field_id: @form_field_id
12
- ) %>
3
+ <div class="toolbar_button">
4
+ <%= render 'alchemy/admin/uploader/button',
5
+ object: Alchemy::Picture.new,
6
+ dropzone: '#assign_image_list',
7
+ file_attribute: 'image_file',
8
+ in_dialog: true,
9
+ redirect_url: alchemy.admin_pictures_path(
10
+ size: search_filter_params[:size],
11
+ filter: { misc: 'last_upload' },
12
+ form_field_id: @form_field_id
13
+ ) %>
14
+ </div>
13
15
  <div class="toolbar_spacer"></div>
14
16
  <% end %>
15
17
  <div class="button_group">
16
- <div class="button_with_label">
18
+ <sl-tooltip content="<%= Alchemy.t(:small_thumbnails) %>">
17
19
  <%= link_to(
18
- render_icon('search-minus'),
20
+ render_icon('zoom-out'),
19
21
  alchemy.admin_pictures_path({
20
22
  size: "small",
21
23
  form_field_id: @form_field_id,
@@ -24,11 +26,10 @@
24
26
  tagged_with: search_filter_params[:tagged_with]
25
27
  }),
26
28
  remote: true,
27
- title: Alchemy.t(:small_thumbnails),
28
29
  class: "icon_button"
29
30
  ) %>
30
- </div>
31
- <div class="button_with_label">
31
+ </sl-tooltip>
32
+ <sl-tooltip content="<%= Alchemy.t(:medium_thumbnails) %>">
32
33
  <%= link_to(
33
34
  render_icon('search'),
34
35
  alchemy.admin_pictures_path({
@@ -39,13 +40,12 @@
39
40
  tagged_with: search_filter_params[:tagged_with]
40
41
  }),
41
42
  remote: true,
42
- title: Alchemy.t(:medium_thumbnails),
43
43
  class: "icon_button"
44
44
  ) %>
45
- </div>
46
- <div class="button_with_label">
45
+ </sl-tooltip>
46
+ <sl-tooltip content="<%= Alchemy.t(:big_thumbnails) %>">
47
47
  <%= link_to(
48
- render_icon('search-plus'),
48
+ render_icon('zoom-in'),
49
49
  alchemy.admin_pictures_path({
50
50
  size: "large",
51
51
  form_field_id: @form_field_id,
@@ -54,11 +54,9 @@
54
54
  tagged_with: search_filter_params[:tagged_with]
55
55
  }),
56
56
  remote: true,
57
- title: Alchemy.t(:big_thumbnails),
58
57
  class: "icon_button"
59
58
  ) %>
60
- </div>
61
- <label><%= Alchemy.t('Image size') %></label>
59
+ </sl-tooltip>
62
60
  <%= hidden_field_tag('size', @size, id: 'overlay_thumbnails_size') %>
63
61
  </div>
64
62
  <%= render partial: 'alchemy/admin/partials/remote_search_form' %>
@@ -26,7 +26,7 @@
26
26
  <% if page %>
27
27
  <li>
28
28
  <h3>
29
- <%= render_icon 'file-alt' %>
29
+ <%= render_icon 'file' %>
30
30
  <p><%= link_to page.name, edit_admin_page_path(page) %></p>
31
31
  </h3>
32
32
  <ul class="list">
@@ -35,11 +35,7 @@
35
35
  <% page_link = link_to element.display_name_with_preview_text,
36
36
  edit_admin_page_path(page, anchor: "element_#{element.id}") %>
37
37
  <% ingredients = picture_ingredients.map { |p| Alchemy::IngredientEditor.new(p).translated_role }.to_sentence %>
38
- <% if element.public? %>
39
- <%= render_icon('window-maximize', style: 'regular') %>
40
- <% else %>
41
- <%= render_icon('window-close') %>
42
- <% end %>
38
+ <%= render_icon('draggable', style: nil) %>
43
39
  <p>
44
40
  <%== Alchemy.t(:pictures_in_page, page: page_link, pictures: ingredients) %>
45
41
  </p>
@@ -4,29 +4,25 @@
4
4
  </span>
5
5
  <% if picture.deletable? && can?(:destroy, picture) %>
6
6
  <span class="picture_tool delete">
7
- <%= link_to_confirm_dialog(
8
- render_icon(:minus),
9
- Alchemy.t(:confirm_to_delete_image_from_server),
10
- alchemy.admin_picture_path(
11
- id: picture,
12
- q: search_filter_params[:q],
13
- page: params[:page],
14
- tagged_with: search_filter_params[:tagged_with],
15
- size: @size,
16
- filter: search_filter_params[:filter]
17
- ),
18
- {
19
- title: Alchemy.t('Delete image')
20
- }
21
- ) -%>
7
+ <sl-tooltip content="<%= Alchemy.t('Delete image') %>">
8
+ <%= link_to_confirm_dialog(
9
+ render_icon("delete-bin-2"),
10
+ Alchemy.t(:confirm_to_delete_image_from_server),
11
+ alchemy.admin_picture_path(
12
+ id: picture,
13
+ q: search_filter_params[:q],
14
+ page: params[:page],
15
+ tagged_with: search_filter_params[:tagged_with],
16
+ size: @size,
17
+ filter: search_filter_params[:filter]
18
+ )
19
+ ) -%>
20
+ </sl-tooltip>
22
21
  </span>
23
22
  <% end %>
24
- <% image = image_tag(
25
- picture.url(size: preview_size(@size), flatten: true) || "alchemy/missing-image.svg",
26
- alt: picture.name,
27
- title: Alchemy.t(:zoom_image)
28
- ) %>
29
- <% if can?(:edit, picture) %>
23
+ <% picture_url = picture.url(size: preview_size(@size), flatten: true, format: "webp") %>
24
+ <% image = image_tag(picture_url || "alchemy/missing-image.svg", alt: picture.name) %>
25
+ <% if can?(:edit, picture) && picture_url %>
30
26
  <%= link_to(
31
27
  image,
32
28
  alchemy.admin_picture_path(
@@ -1,19 +1,20 @@
1
- <div class="picture_thumbnail assign_image_list_detail <%= size.blank? ? 'medium' : size %>" name="<%= picture_to_assign.name %>" id="assignable_<%= picture_to_assign.id %>">
2
- <%= link_to(
3
- image_tag(
4
- picture_to_assign.url(size: preview_size(size), flatten: true) || "alchemy/missing-image.svg",
5
- alt: picture_to_assign.name
6
- ),
7
- alchemy.assign_admin_picture_path(
8
- id: picture_to_assign.id,
9
- form_field_id: @form_field_id
10
- ),
11
- remote: true,
12
- onclick: '$(self).attr("href", "#").off("click"); return false',
13
- method: 'put',
14
- title: Alchemy.t(:assign_image),
15
- class: 'thumbnail_background'
16
- ) %>
1
+ <div class="picture_thumbnail" name="<%= picture_to_assign.name %>" id="assignable_<%= picture_to_assign.id %>">
2
+ <sl-tooltip content="<%= Alchemy.t(:assign_image) %>">
3
+ <%= link_to(
4
+ image_tag(
5
+ picture_to_assign.url(size: preview_size(size), flatten: true, format: "webp") || "alchemy/missing-image.svg",
6
+ alt: picture_to_assign.name
7
+ ),
8
+ alchemy.assign_admin_picture_path(
9
+ id: picture_to_assign.id,
10
+ form_field_id: @form_field_id
11
+ ),
12
+ remote: true,
13
+ onclick: '$(self).attr("href", "#").off("click"); return false',
14
+ method: 'put',
15
+ class: 'thumbnail_background'
16
+ ) %>
17
+ </sl-tooltip>
17
18
  <div class="picture_name" title="<%= picture_to_assign.name %>">
18
19
  <%= picture_to_assign.name %>
19
20
  </div>
@@ -6,7 +6,7 @@
6
6
  </ul>
7
7
  <% if search_filter_params[:tagged_with].present? %>
8
8
  <%= link_to(
9
- render_icon(:times, size: 'xs') + Alchemy.t('Remove tag filter'),
9
+ render_icon(:close) + Alchemy.t('Remove tag filter'),
10
10
  url_for(search_filter_params.except(:tagged_with)),
11
11
  remote: request.xhr?,
12
12
  class: 'secondary button small with_icon'
@@ -1,7 +1,7 @@
1
1
  (function() {
2
2
  var dialog = Alchemy.currentDialog();
3
3
  dialog.dialog_body.html('<%= j render("archive_overlay") %>');
4
- Alchemy.SelectBox('#filter_bar');
5
4
  Alchemy.ImageLoader('#assign_image_list');
6
5
  Alchemy.ListFilter(dialog.dialog_body);
7
6
  })();
7
+
@@ -5,6 +5,6 @@
5
5
  $form_field.attr("data-image-file-width", <%= @picture.image_file_width %>)
6
6
  $form_field.attr("data-image-file-height", <%= @picture.image_file_height %>)
7
7
  Alchemy.closeCurrentDialog(function() {
8
- Alchemy.setElementDirty($form_field.closest(".element-editor"))
8
+ $form_field[0].closest("alchemy-element-editor").setDirty()
9
9
  })
10
10
  })()
@@ -1,30 +1,31 @@
1
1
  <% content_for(:toolbar) do %>
2
2
  <div class="toolbar_buttons">
3
3
  <% if can? :create, Alchemy::Picture %>
4
- <%= render 'alchemy/admin/uploader/button',
5
- object: Alchemy::Picture.new,
6
- file_attribute: 'image_file',
7
- redirect_url: alchemy.admin_pictures_path(
8
- size: @size,
9
- filter: { misc: 'last_upload' }
10
- ) %>
4
+ <div class="toolbar_button">
5
+ <%= render 'alchemy/admin/uploader/button',
6
+ object: Alchemy::Picture.new,
7
+ file_attribute: 'image_file',
8
+ redirect_url: alchemy.admin_pictures_path(
9
+ size: @size,
10
+ filter: { misc: 'last_upload' }
11
+ ) %>
12
+ </div>
11
13
  <div class="toolbar_spacer"></div>
12
14
  <% end %>
13
15
  <div class="button_group">
14
- <div class="button_with_label">
16
+ <sl-tooltip content="<%= Alchemy.t(:small_thumbnails) %>">
15
17
  <%= link_to(
16
- render_icon('search-minus'),
18
+ render_icon('zoom-out'),
17
19
  alchemy.admin_pictures_path(
18
20
  size: "small",
19
21
  q: search_filter_params[:q],
20
22
  filter: search_filter_params[:filter],
21
23
  tagged_with: search_filter_params[:tagged_with]
22
24
  ),
23
- title: Alchemy.t(:small_thumbnails),
24
25
  class: "icon_button"
25
26
  ) %>
26
- </div>
27
- <div class="button_with_label">
27
+ </sl-tooltip>
28
+ <sl-tooltip content="<%= Alchemy.t(:medium_thumbnails) %>">
28
29
  <%= link_to(
29
30
  render_icon('search'),
30
31
  alchemy.admin_pictures_path(
@@ -33,36 +34,34 @@
33
34
  filter: search_filter_params[:filter],
34
35
  tagged_with: search_filter_params[:tagged_with]
35
36
  ),
36
- title: Alchemy.t(:medium_thumbnails),
37
37
  class: "icon_button"
38
38
  ) %>
39
- </div>
40
- <div class="button_with_label">
39
+ </sl-tooltip>
40
+ <sl-tooltip content="<%= Alchemy.t(:big_thumbnails) %>">
41
41
  <%= link_to(
42
- render_icon('search-plus'),
42
+ render_icon('zoom-in'),
43
43
  alchemy.admin_pictures_path(
44
44
  size: "large",
45
45
  q: search_filter_params[:q],
46
46
  filter: search_filter_params[:filter],
47
47
  tagged_with: search_filter_params[:tagged_with]
48
48
  ),
49
- title: Alchemy.t(:big_thumbnails),
50
49
  class: "icon_button"
51
50
  ) %>
52
- </div>
53
- <label><%= Alchemy.t('Image size') %></label>
51
+ </sl-tooltip>
54
52
  <%= hidden_field_tag('size', @size, id: 'overlay_thumbnails_size') %>
55
53
  </div>
56
54
  <div class="toolbar_spacer"></div>
57
- <div class="button_with_label">
58
- <%= link_to(
59
- render_icon('check-square', style: 'regular'),
60
- nil,
61
- id: 'select_all_pictures',
62
- class: 'icon_button',
63
- 'data-alchemy-hotkey' => 'alt+a'
64
- ) %>
65
- <label><%= Alchemy.t("Select all") %></label>
55
+ <div class="toolbar_button">
56
+ <sl-tooltip content="<%= Alchemy.t("Select all") %>">
57
+ <%= link_to(
58
+ render_icon('checkbox-multiple'),
59
+ nil,
60
+ id: 'select_all_pictures',
61
+ class: 'icon_button',
62
+ 'data-alchemy-hotkey' => 'alt+a'
63
+ ) %>
64
+ </sl-tooltip>
66
65
  </div>
67
66
  </div>
68
67
 
@@ -91,11 +90,16 @@
91
90
  $(function() {
92
91
  Alchemy.pictureSelector();
93
92
  $('#select_all_pictures').on('click', function(e) {
94
- $('.picture_tool.select :checkbox').prop('checked', true).change();
93
+ $(this).toggleClass("active")
94
+ $('.picture_tool.select :checkbox')
95
+ .prop('checked', function(_i, val) { return !val })
96
+ .closest(".picture_thumbnail")
97
+ .toggleClass("active");
95
98
  e.preventDefault;
99
+ $(".selected_item_tools").toggleClass("hidden")
96
100
  return false;
97
101
  });
98
- $('.thumbnail_background').click(function(event) {
102
+ $('.thumbnail_background').on("click", function(event) {
99
103
  var url = $(this).attr('href');
100
104
  var overlay = new Alchemy.ImageOverlay(url);
101
105
  overlay.open();
@@ -14,7 +14,7 @@
14
14
  ),
15
15
  class: "previous-picture",
16
16
  remote: true do %>
17
- <i class="icon fas fa-angle-left fa-fw"></i>
17
+ <i class="icon ri-arrow-left-s-line ri-fw"></i>
18
18
  <% end %>
19
19
  <% end %>
20
20
  <% if @next %>
@@ -28,7 +28,7 @@
28
28
  ),
29
29
  class: "next-picture",
30
30
  remote: true do %>
31
- <i class="icon fas fa-angle-right fa-fw"></i>
31
+ <i class="icon ri-arrow-right-s-line ri-fw"></i>
32
32
  <% end %>
33
33
  <% end %>
34
34
  </div>
@@ -39,5 +39,5 @@
39
39
  </div>
40
40
 
41
41
  <div class="picture-overlay-handle">
42
- <i class="icon fas fa-angle-double-right fa-fw"></i>
42
+ <i class="icon ri-contract-right-line ri-fw"></i>
43
43
  </div>
@@ -3,10 +3,10 @@
3
3
  <%= select_tag(
4
4
  filter.name,
5
5
  options_for_select(
6
- filter.options_for_select, params[:filter].try(:[], filter.name)
6
+ filter.options_for_select, search_filter_params.dig(:filter, filter.name)
7
7
  ),
8
8
  include_blank: Alchemy.t(:all, scope: ['resources', resource_name, 'filters']),
9
9
  data: { remote: !!request.xhr? },
10
- class: 'alchemy_selectbox'
10
+ is: 'alchemy-select'
11
11
  ) %>
12
12
  </label>
@@ -5,14 +5,14 @@
5
5
  collection: relation[:collection],
6
6
  label_method: relation[:attr_method],
7
7
  include_blank: Alchemy.t(:blank, scope: 'resources.relation_select'),
8
- input_html: {class: 'alchemy_selectbox'} %>
8
+ input_html: {is: 'alchemy-select'} %>
9
9
  <% elsif attribute[:type].in? %i[date time datetime] %>
10
10
  <%= f.datepicker attribute[:name], resource_attribute_field_options(attribute) %>
11
11
  <% elsif attribute[:enum].present? %>
12
12
  <%= f.input attribute[:name],
13
13
  collection: attribute[:enum],
14
14
  include_blank: Alchemy.t(:blank, scope: 'resources.relation_select'),
15
- input_html: {class: 'alchemy_selectbox'} %>
15
+ input_html: {is: 'alchemy-select'} %>
16
16
  <% else %>
17
17
  <%= f.input attribute[:name], resource_attribute_field_options(attribute) %>
18
18
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <%= form_tag url_for, method: :get, class: 'per-page-select-form' do |f| %>
2
2
  <% search_filter_params.reject { |k, _| k == 'page' || k == 'per_page' }.each do |key, value| %>
3
- <% if value.is_a? Hash %>
3
+ <% if value.is_a? ActionController::Parameters %>
4
4
  <% value.each do |k, v| %>
5
5
  <%= hidden_field_tag "#{key}[#{k}]", v, id: nil %>
6
6
  <% end %>
@@ -1,4 +1,7 @@
1
1
  <tr class="<%= cycle('even', 'odd') %>">
2
+ <% if local_assigns[:icon] %>
3
+ <td class="icon"><%= render_icon(local_assigns[:icon], size: "xl") %></td>
4
+ <% end %>
2
5
  <% resource_handler.sorted_attributes.each do |attribute| %>
3
6
  <td class="<%= attribute[:type] %> <%= attribute[:name] %>">
4
7
  <% if attribute[:type] == :boolean %>
@@ -10,16 +13,20 @@
10
13
  <% end %>
11
14
  <td class="tools">
12
15
  <% if can?(:destroy, resource) %>
13
- <%= delete_button resource_path(resource, search_filter_params) %>
16
+ <sl-tooltip content="<%= Alchemy.t("Delete") %>">
17
+ <%= delete_button resource_path(resource, search_filter_params) %>
18
+ </sl-tooltip>
14
19
  <% end %>
15
20
  <% if can?(:edit, resource) %>
16
- <%= link_to_dialog render_icon(:edit),
17
- edit_resource_path(resource, search_filter_params),
18
- {
19
- title: Alchemy.t('Edit'),
20
- size: resource_window_size
21
- },
22
- title: Alchemy.t('Edit') %>
23
- <% end %>
21
+ <sl-tooltip content="<%= Alchemy.t("Edit") %>">
22
+ <%= link_to_dialog render_icon(:edit),
23
+ edit_resource_path(resource, search_filter_params),
24
+ {
25
+ title: Alchemy.t('Edit'),
26
+ size: resource_window_size
27
+ },
28
+ class: "icon_button" %>
29
+ <% end %>
30
+ </sl-tooltip>
24
31
  </td>
25
32
  </tr>
@@ -2,6 +2,9 @@
2
2
  <table class="list" id="<%= resource_handler.resources_name %>_list">
3
3
  <thead>
4
4
  <tr>
5
+ <% if local_assigns[:icon] %>
6
+ <th class="icon"></th>
7
+ <% end %>
5
8
  <% resource_handler.sorted_attributes.each do |attribute| %>
6
9
  <th class="<%= attribute[:type] %> <%= attribute[:name] %>">
7
10
  <%= sort_link [:resource_url_proxy, @query],
@@ -14,7 +17,7 @@
14
17
  </tr>
15
18
  </thead>
16
19
  <tbody>
17
- <%= render_resources %>
20
+ <%= render_resources(icon: local_assigns[:icon]) %>
18
21
  </tbody>
19
22
  </table>
20
23
  <% elsif search_filter_params[:q].present? %>
@@ -1,26 +1,29 @@
1
1
  <% label_title = Alchemy.t("Create #{resource_name}", default: Alchemy.t('Create')) %>
2
2
 
3
3
  <% content_for(:toolbar) do %>
4
- <%= toolbar_button(
5
- icon: :plus,
6
- label: label_title,
7
- url: new_resource_path,
8
- title: label_title,
9
- hotkey: 'alt+n',
10
- dialog_options: {
4
+ <div class="toolbar_buttons">
5
+ <%= toolbar_button(
6
+ icon: "add",
7
+ label: label_title,
8
+ url: new_resource_path,
11
9
  title: label_title,
12
- size: resource_window_size
13
- },
14
- if_permitted_to: [:create, resource_model]
15
- ) %>
16
- <%= toolbar_button(
17
- icon: :download,
18
- url: resource_url_proxy.url_for(action: 'index', format: 'csv', q: search_filter_params[:q], sort: params[:sort]),
19
- label: Alchemy.t(:download_csv),
20
- title: Alchemy.t(:download_csv),
21
- dialog: false,
22
- if_permitted_to: [:index, resource_model]
23
- ) %>
10
+ hotkey: 'alt+n',
11
+ tooltip_placement: "top-start",
12
+ dialog_options: {
13
+ title: label_title,
14
+ size: resource_window_size
15
+ },
16
+ if_permitted_to: [:create, resource_model]
17
+ ) %>
18
+ <%= toolbar_button(
19
+ icon: :download,
20
+ url: resource_url_proxy.url_for(action: 'index', format: 'csv', q: search_filter_params[:q], sort: params[:sort]),
21
+ label: Alchemy.t(:download_csv),
22
+ title: Alchemy.t(:download_csv),
23
+ dialog: false,
24
+ if_permitted_to: [:index, resource_model]
25
+ ) %>
26
+ </div>
24
27
  <%= render 'alchemy/admin/partials/search_form' %>
25
28
  <% end %>
26
29
 
@@ -8,6 +8,7 @@
8
8
  url: new_resource_path,
9
9
  title: label_title,
10
10
  hotkey: 'alt+n',
11
+ tooltip_placement: "top-start",
11
12
  dialog_options: {
12
13
  title: label_title,
13
14
  size: "430x415"
@@ -21,7 +22,7 @@
21
22
  <div id="archive_all" class="resources-table-wrapper">
22
23
  <% if @sites.any? %>
23
24
  <%= render 'alchemy/admin/resources/table_header' %>
24
- <%= render 'table' %>
25
+ <%= render 'table', icon: "global" %>
25
26
  <% elsif search_filter_params[:q].present? %>
26
27
  <%= render_message { Alchemy.t('Nothing found') } %>
27
28
  <% else %>