alchemy_cms 7.0.16 → 7.1.0.pre.b1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/backport.yml +36 -0
  3. data/.github/workflows/brakeman-analysis.yml +5 -13
  4. data/.github/workflows/lint.yml +2 -9
  5. data/.github/workflows/stale.yml +2 -5
  6. data/.github/workflows/test.yml +7 -15
  7. data/.gitignore +0 -1
  8. data/.standard.yml +1 -1
  9. data/CHANGELOG.md +144 -51
  10. data/Gemfile +7 -18
  11. data/README.md +10 -8
  12. data/alchemy_cms.gemspec +4 -3
  13. data/app/assets/config/alchemy_manifest.js +0 -1
  14. data/app/assets/javascripts/alchemy/admin.js +1 -19
  15. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +2 -3
  16. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +19 -34
  17. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +38 -13
  18. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +32 -25
  20. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +1 -1
  21. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +3 -5
  22. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +0 -57
  23. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +22 -63
  24. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +2 -2
  25. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +5 -4
  26. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +5 -5
  27. data/app/assets/javascripts/alchemy/templates/index.js +0 -2
  28. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +1 -1
  29. data/app/assets/javascripts/alchemy/templates/page.hbs +1 -1
  30. data/app/assets/javascripts/alchemy/templates/page_folder.hbs +2 -2
  31. data/app/assets/stylesheets/alchemy/_custom-properties.scss +82 -0
  32. data/app/assets/stylesheets/alchemy/_mixins.scss +38 -30
  33. data/app/assets/stylesheets/alchemy/_variables.scss +12 -5
  34. data/app/assets/stylesheets/alchemy/admin.scss +3 -4
  35. data/app/assets/stylesheets/alchemy/archive.scss +107 -50
  36. data/app/assets/stylesheets/alchemy/attachments.scss +5 -4
  37. data/app/assets/stylesheets/alchemy/buttons.scss +38 -164
  38. data/app/assets/stylesheets/alchemy/dashboard.scss +31 -6
  39. data/app/assets/stylesheets/alchemy/dialogs.scss +12 -28
  40. data/app/assets/stylesheets/alchemy/elements.scss +273 -282
  41. data/app/assets/stylesheets/alchemy/flash.scss +20 -12
  42. data/app/assets/stylesheets/alchemy/forms.scss +21 -34
  43. data/app/assets/stylesheets/alchemy/frame.scss +11 -32
  44. data/app/assets/stylesheets/alchemy/hints.scss +4 -62
  45. data/app/assets/stylesheets/alchemy/image_library.scss +36 -33
  46. data/app/assets/stylesheets/alchemy/labels.scss +4 -1
  47. data/app/assets/stylesheets/alchemy/menubar.scss +7 -6
  48. data/app/assets/stylesheets/alchemy/navigation.scss +27 -15
  49. data/app/assets/stylesheets/alchemy/nodes.scss +11 -7
  50. data/app/assets/stylesheets/alchemy/notices.scss +16 -4
  51. data/app/assets/stylesheets/alchemy/page-select.scss +10 -2
  52. data/app/assets/stylesheets/alchemy/pagination.scss +22 -13
  53. data/app/assets/stylesheets/alchemy/preview_window.scss +4 -8
  54. data/app/assets/stylesheets/alchemy/resource_info.scss +7 -5
  55. data/app/assets/stylesheets/alchemy/selects.scss +49 -42
  56. data/app/assets/stylesheets/alchemy/shoelace.scss +345 -0
  57. data/app/assets/stylesheets/alchemy/sitemap.scss +24 -14
  58. data/app/assets/stylesheets/alchemy/spinner.scss +9 -19
  59. data/app/assets/stylesheets/alchemy/tables.scss +16 -24
  60. data/app/assets/stylesheets/alchemy/tags.scss +4 -0
  61. data/app/assets/stylesheets/alchemy/toolbar.scss +29 -25
  62. data/app/assets/stylesheets/alchemy/upload.scss +140 -89
  63. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +80 -108
  64. data/app/components/alchemy/admin/node_select.rb +39 -0
  65. data/app/components/alchemy/admin/page_select.rb +42 -0
  66. data/app/components/alchemy/ingredients/audio_view.rb +1 -1
  67. data/app/components/alchemy/ingredients/base_view.rb +1 -1
  68. data/app/components/alchemy/ingredients/boolean_view.rb +1 -1
  69. data/app/components/alchemy/ingredients/datetime_view.rb +3 -4
  70. data/app/components/alchemy/ingredients/file_view.rb +1 -1
  71. data/app/components/alchemy/ingredients/headline_view.rb +7 -16
  72. data/app/components/alchemy/ingredients/link_view.rb +1 -1
  73. data/app/components/alchemy/ingredients/page_view.rb +1 -1
  74. data/app/components/alchemy/ingredients/picture_view.rb +1 -1
  75. data/app/components/alchemy/ingredients/richtext_view.rb +1 -1
  76. data/app/components/alchemy/ingredients/text_view.rb +1 -1
  77. data/app/components/alchemy/ingredients/video_view.rb +1 -1
  78. data/app/controllers/alchemy/admin/base_controller.rb +7 -32
  79. data/app/controllers/alchemy/admin/elements_controller.rb +63 -35
  80. data/app/controllers/alchemy/admin/languages_controller.rb +2 -3
  81. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -19
  82. data/app/controllers/alchemy/admin/pages_controller.rb +4 -5
  83. data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
  84. data/app/controllers/alchemy/base_controller.rb +4 -2
  85. data/app/controllers/alchemy/messages_controller.rb +1 -1
  86. data/app/controllers/concerns/alchemy/admin/current_language.rb +1 -5
  87. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +1 -1
  88. data/app/decorators/alchemy/element_editor.rb +0 -2
  89. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -5
  90. data/app/helpers/alchemy/admin/base_helper.rb +17 -12
  91. data/app/helpers/alchemy/admin/ingredients_helper.rb +4 -1
  92. data/app/helpers/alchemy/admin/pages_helper.rb +5 -11
  93. data/app/helpers/alchemy/base_helper.rb +47 -13
  94. data/app/javascript/alchemy_admin/components/alchemy_html_element.js +129 -0
  95. data/app/javascript/alchemy_admin/components/button.js +59 -0
  96. data/app/javascript/alchemy_admin/components/char_counter.js +40 -0
  97. data/app/javascript/alchemy_admin/components/datepicker.js +39 -0
  98. data/app/javascript/alchemy_admin/components/dialog_link.js +45 -0
  99. data/app/javascript/alchemy_admin/components/element_editor/publish_element_button.js +36 -0
  100. data/app/javascript/alchemy_admin/components/element_editor.js +553 -0
  101. data/app/javascript/alchemy_admin/components/ingredient_group.js +54 -0
  102. data/app/javascript/alchemy_admin/components/link_buttons/link_button.js +48 -0
  103. data/app/javascript/alchemy_admin/components/link_buttons/unlink_button.js +38 -0
  104. data/app/javascript/alchemy_admin/components/link_buttons.js +79 -0
  105. data/app/javascript/alchemy_admin/components/node_select.js +45 -0
  106. data/app/javascript/alchemy_admin/components/overlay.js +18 -0
  107. data/app/javascript/alchemy_admin/components/page_select.js +63 -0
  108. data/app/javascript/alchemy_admin/components/remote_select.js +134 -0
  109. data/app/javascript/alchemy_admin/components/select.js +12 -0
  110. data/app/javascript/alchemy_admin/components/spinner.js +31 -0
  111. data/app/javascript/alchemy_admin/components/tinymce.js +146 -0
  112. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +266 -0
  113. data/app/javascript/alchemy_admin/components/uploader/progress.js +258 -0
  114. data/app/javascript/alchemy_admin/components/uploader.js +132 -0
  115. data/app/javascript/alchemy_admin/dirty.js +49 -0
  116. data/app/javascript/alchemy_admin/file_editors.js +1 -1
  117. data/app/javascript/alchemy_admin/gui.js +14 -0
  118. data/app/javascript/alchemy_admin/i18n.js +12 -8
  119. data/app/javascript/alchemy_admin/image_cropper.js +6 -3
  120. data/app/javascript/alchemy_admin/image_loader.js +7 -15
  121. data/app/javascript/alchemy_admin/ingredient_anchor_link.js +2 -5
  122. data/app/javascript/alchemy_admin/initializer.js +65 -0
  123. data/app/javascript/alchemy_admin/locales/en.js +31 -0
  124. data/app/javascript/alchemy_admin/picture_editors.js +2 -2
  125. data/app/javascript/alchemy_admin/picture_selector.js +38 -0
  126. data/app/javascript/alchemy_admin/please_wait_overlay.js +8 -0
  127. data/app/javascript/alchemy_admin/sortable_elements.js +78 -0
  128. data/app/javascript/alchemy_admin/spinner.js +36 -0
  129. data/app/javascript/alchemy_admin/tags_autocomplete.js +46 -0
  130. data/app/javascript/alchemy_admin/utils/ajax.js +6 -5
  131. data/app/javascript/alchemy_admin/utils/dom_helpers.js +20 -0
  132. data/app/javascript/alchemy_admin/utils/format.js +11 -0
  133. data/app/javascript/alchemy_admin/utils/string_conversions.js +10 -0
  134. data/app/javascript/alchemy_admin.js +70 -13
  135. data/app/javascript/menubar.js +10 -0
  136. data/app/models/alchemy/attachment.rb +9 -11
  137. data/app/models/alchemy/element.rb +11 -0
  138. data/app/models/alchemy/ingredients/audio.rb +0 -11
  139. data/app/models/alchemy/ingredients/datetime.rb +1 -1
  140. data/app/models/alchemy/ingredients/richtext.rb +1 -10
  141. data/app/models/alchemy/ingredients/video.rb +0 -12
  142. data/app/models/alchemy/node.rb +4 -0
  143. data/app/models/alchemy/page/page_elements.rb +2 -11
  144. data/app/models/alchemy/page/page_natures.rb +10 -2
  145. data/app/models/alchemy/page.rb +12 -54
  146. data/app/models/alchemy/picture/url.rb +1 -9
  147. data/app/models/concerns/alchemy/picture_thumbnails.rb +5 -4
  148. data/app/serializers/alchemy/page_tree_serializer.rb +2 -1
  149. data/app/services/alchemy/copy_page.rb +98 -0
  150. data/app/views/alchemy/_menubar.html.erb +17 -13
  151. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +14 -10
  152. data/app/views/alchemy/admin/attachments/_attachment.html.erb +44 -36
  153. data/app/views/alchemy/admin/attachments/_replace_button.html.erb +15 -21
  154. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +0 -1
  155. data/app/views/alchemy/admin/attachments/assign.js.erb +1 -1
  156. data/app/views/alchemy/admin/attachments/index.html.erb +6 -4
  157. data/app/views/alchemy/admin/attachments/show.html.erb +8 -8
  158. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  159. data/app/views/alchemy/admin/clipboard/index.html.erb +3 -7
  160. data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
  161. data/app/views/alchemy/admin/crop.html.erb +1 -1
  162. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  163. data/app/views/alchemy/admin/dashboard/index.html.erb +13 -11
  164. data/app/views/alchemy/admin/dashboard/info.html.erb +7 -7
  165. data/app/views/alchemy/admin/elements/_add_nested_element_form.html.erb +21 -23
  166. data/app/views/alchemy/admin/elements/_element.html.erb +52 -44
  167. data/app/views/alchemy/admin/elements/_footer.html.erb +1 -1
  168. data/app/views/alchemy/admin/elements/_form.html.erb +1 -1
  169. data/app/views/alchemy/admin/elements/_header.html.erb +11 -12
  170. data/app/views/alchemy/admin/elements/_toolbar.html.erb +33 -45
  171. data/app/views/alchemy/admin/elements/create.js.erb +7 -15
  172. data/app/views/alchemy/admin/elements/destroy.js.erb +0 -2
  173. data/app/views/alchemy/admin/elements/index.html.erb +27 -24
  174. data/app/views/alchemy/admin/elements/new.html.erb +9 -11
  175. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +2 -2
  176. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +3 -3
  177. data/app/views/alchemy/admin/ingredients/_video_fields.html.erb +1 -2
  178. data/app/views/alchemy/admin/languages/_form.html.erb +2 -3
  179. data/app/views/alchemy/admin/languages/_language.html.erb +15 -8
  180. data/app/views/alchemy/admin/languages/_table.html.erb +1 -0
  181. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +28 -16
  182. data/app/views/alchemy/admin/layoutpages/edit.html.erb +1 -1
  183. data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
  184. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +12 -8
  185. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
  186. data/app/views/alchemy/admin/nodes/_form.html.erb +20 -21
  187. data/app/views/alchemy/admin/nodes/_node.html.erb +39 -34
  188. data/app/views/alchemy/admin/nodes/index.html.erb +1 -1
  189. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +4 -4
  190. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +2 -2
  191. data/app/views/alchemy/admin/pages/_current_page.html.erb +1 -1
  192. data/app/views/alchemy/admin/pages/_external_link.html.erb +4 -4
  193. data/app/views/alchemy/admin/pages/_file_link.html.erb +5 -5
  194. data/app/views/alchemy/admin/pages/_form.html.erb +10 -21
  195. data/app/views/alchemy/admin/pages/_internal_link.html.erb +4 -4
  196. data/app/views/alchemy/admin/pages/_locked_page.html.erb +2 -2
  197. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +4 -17
  198. data/app/views/alchemy/admin/pages/_page.html.erb +76 -72
  199. data/app/views/alchemy/admin/pages/_page_infos.html.erb +23 -7
  200. data/app/views/alchemy/admin/pages/_page_layout_filter.html.erb +2 -1
  201. data/app/views/alchemy/admin/pages/_page_status.html.erb +11 -21
  202. data/app/views/alchemy/admin/pages/_publication_fields.html.erb +2 -5
  203. data/app/views/alchemy/admin/pages/_table.html.erb +1 -1
  204. data/app/views/alchemy/admin/pages/_table_row.html.erb +43 -39
  205. data/app/views/alchemy/admin/pages/_toolbar.html.erb +43 -38
  206. data/app/views/alchemy/admin/pages/configure.html.erb +12 -14
  207. data/app/views/alchemy/admin/pages/edit.html.erb +80 -103
  208. data/app/views/alchemy/admin/pages/info.html.erb +20 -11
  209. data/app/views/alchemy/admin/pages/link.html.erb +22 -16
  210. data/app/views/alchemy/admin/pages/new.html.erb +9 -11
  211. data/app/views/alchemy/admin/pages/unlock.js.erb +10 -3
  212. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -13
  213. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +3 -5
  214. data/app/views/alchemy/admin/partials/_routes.html.erb +10 -2
  215. data/app/views/alchemy/admin/partials/_site_select.html.erb +6 -5
  216. data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +28 -23
  217. data/app/views/alchemy/admin/pictures/_archive.html.erb +5 -5
  218. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  219. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +21 -23
  220. data/app/views/alchemy/admin/pictures/_infos.html.erb +2 -6
  221. data/app/views/alchemy/admin/pictures/_picture.html.erb +15 -17
  222. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +17 -16
  223. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +1 -1
  224. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +1 -1
  225. data/app/views/alchemy/admin/pictures/assign.js.erb +1 -1
  226. data/app/views/alchemy/admin/pictures/index.html.erb +34 -30
  227. data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
  228. data/app/views/alchemy/admin/resources/_filter.html.erb +2 -2
  229. data/app/views/alchemy/admin/resources/_form.html.erb +2 -2
  230. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +1 -1
  231. data/app/views/alchemy/admin/resources/_resource.html.erb +16 -9
  232. data/app/views/alchemy/admin/resources/_table.html.erb +4 -1
  233. data/app/views/alchemy/admin/resources/index.html.erb +22 -19
  234. data/app/views/alchemy/admin/sites/index.html.erb +2 -1
  235. data/app/views/alchemy/admin/styleguide/index.html.erb +54 -28
  236. data/app/views/alchemy/admin/tags/_tag.html.erb +16 -18
  237. data/app/views/alchemy/admin/tags/index.html.erb +15 -12
  238. data/app/views/alchemy/admin/tinymce/_setup.html.erb +29 -0
  239. data/app/views/alchemy/admin/uploader/_button.html.erb +23 -29
  240. data/app/views/alchemy/admin/uploader/_setup.html.erb +3 -8
  241. data/app/views/alchemy/base/500.html.erb +1 -1
  242. data/app/views/alchemy/base/error_notice.js.erb +0 -1
  243. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
  244. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +2 -3
  245. data/app/views/alchemy/ingredients/_file_editor.html.erb +5 -5
  246. data/app/views/alchemy/ingredients/_link_editor.html.erb +1 -1
  247. data/app/views/alchemy/ingredients/_node_editor.html.erb +6 -19
  248. data/app/views/alchemy/ingredients/_page_editor.html.erb +7 -19
  249. data/app/views/alchemy/ingredients/_picture_editor.html.erb +2 -2
  250. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +6 -15
  251. data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -1
  252. data/app/views/alchemy/ingredients/_text_editor.html.erb +1 -1
  253. data/app/views/alchemy/ingredients/shared/_anchor.html.erb +1 -1
  254. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +10 -20
  255. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +42 -49
  256. data/app/views/kaminari/alchemy/_first_page.html.erb +4 -2
  257. data/app/views/kaminari/alchemy/_gap.html.erb +1 -1
  258. data/app/views/kaminari/alchemy/_last_page.html.erb +4 -2
  259. data/app/views/kaminari/alchemy/_next_page.html.erb +4 -2
  260. data/app/views/kaminari/alchemy/_prev_page.html.erb +4 -2
  261. data/app/views/layouts/alchemy/admin.html.erb +10 -29
  262. data/config/alchemy/modules.yml +30 -30
  263. data/config/importmap.rb +10 -1
  264. data/config/initializers/rails_live_reload.rb +13 -0
  265. data/config/locales/alchemy.en.yml +23 -9
  266. data/config/routes.rb +3 -2
  267. data/lib/alchemy/auth_accessors.rb +6 -1
  268. data/lib/alchemy/controller_actions.rb +17 -4
  269. data/lib/alchemy/dev_support/live_reload_watcher.rb +5 -0
  270. data/lib/alchemy/engine.rb +8 -2
  271. data/lib/alchemy/forms/builder.rb +18 -12
  272. data/lib/alchemy/modules.rb +2 -2
  273. data/lib/alchemy/permissions.rb +1 -1
  274. data/lib/alchemy/resources_helper.rb +3 -3
  275. data/lib/alchemy/routing_constraints.rb +1 -1
  276. data/lib/alchemy/test_support/capybara_helpers.rb +8 -5
  277. data/lib/alchemy/test_support/rspec_matchers.rb +14 -0
  278. data/lib/alchemy/test_support/shared_uploader_examples.rb +1 -1
  279. data/lib/alchemy/tinymce.rb +8 -3
  280. data/lib/alchemy/version.rb +1 -1
  281. data/lib/tasks/alchemy/tidy.rake +1 -0
  282. data/package.json +14 -5
  283. data/vendor/assets/fonts/remixicon.eot +0 -0
  284. data/vendor/assets/fonts/remixicon.svg +7816 -0
  285. data/vendor/assets/fonts/remixicon.ttf +0 -0
  286. data/vendor/assets/fonts/remixicon.woff +0 -0
  287. data/vendor/assets/fonts/remixicon.woff2 +0 -0
  288. data/vendor/assets/stylesheets/remixicon.scss +10480 -0
  289. metadata +87 -97
  290. data/.gem_release.yml +0 -8
  291. data/app/assets/javascripts/alchemy/alchemy.autocomplete.js.coffee +0 -30
  292. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -53
  293. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +0 -45
  294. data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +0 -19
  295. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +0 -59
  296. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +0 -79
  297. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -267
  298. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +0 -27
  299. data/app/assets/javascripts/alchemy/alchemy.spinner.js +0 -32
  300. data/app/assets/javascripts/alchemy/alchemy.tooltips.coffee +0 -10
  301. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +0 -131
  302. data/app/assets/javascripts/alchemy/menubar.js.coffee +0 -8
  303. data/app/assets/javascripts/alchemy/node_select.js +0 -39
  304. data/app/assets/javascripts/alchemy/page_select.js +0 -46
  305. data/app/assets/javascripts/alchemy/templates/node.hbs +0 -16
  306. data/app/assets/javascripts/alchemy/templates/spinner.hbs +0 -7
  307. data/app/assets/stylesheets/alchemy/jquery-ui.scss +0 -435
  308. data/app/javascript/alchemy_admin/datepicker.js +0 -40
  309. data/app/javascript/alchemy_admin/tinymce.js +0 -146
  310. data/app/javascript/alchemy_admin/translations.js +0 -32
  311. data/app/views/alchemy/admin/elements/fold.js.erb +0 -33
  312. data/app/views/alchemy/admin/elements/order.js.erb +0 -11
  313. data/app/views/alchemy/admin/elements/publish.js.erb +0 -21
  314. data/app/views/alchemy/admin/elements/update.js.erb +0 -27
  315. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  316. data/vendor/assets/fonts/fa-regular-400.svg +0 -803
  317. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  318. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  319. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  320. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  321. data/vendor/assets/fonts/fa-solid-900.svg +0 -4938
  322. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  323. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  324. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  325. data/vendor/assets/javascripts/fileupload/jquery.fileupload-process.js +0 -178
  326. data/vendor/assets/javascripts/fileupload/jquery.fileupload-validate.js +0 -125
  327. data/vendor/assets/javascripts/fileupload/jquery.fileupload.js +0 -1502
  328. data/vendor/assets/javascripts/fileupload/jquery.iframe-transport.js +0 -224
  329. data/vendor/assets/javascripts/jquery-ui/data.js +0 -45
  330. data/vendor/assets/javascripts/jquery-ui/ie.js +0 -20
  331. data/vendor/assets/javascripts/jquery-ui/keycode.js +0 -51
  332. data/vendor/assets/javascripts/jquery-ui/plugin.js +0 -49
  333. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +0 -46
  334. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +0 -27
  335. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +0 -50
  336. data/vendor/assets/javascripts/jquery-ui/unique-id.js +0 -54
  337. data/vendor/assets/javascripts/jquery-ui/version.js +0 -20
  338. data/vendor/assets/javascripts/jquery-ui/widget.js +0 -754
  339. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +0 -1268
  340. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +0 -241
  341. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +0 -1623
  342. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +0 -931
  343. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo.min.js +0 -7
  344. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +0 -296
  345. data/vendor/assets/stylesheets/fontawesome/_animated.scss +0 -20
  346. data/vendor/assets/stylesheets/fontawesome/_bordered-pulled.scss +0 -20
  347. data/vendor/assets/stylesheets/fontawesome/_core.scss +0 -21
  348. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +0 -6
  349. data/vendor/assets/stylesheets/fontawesome/_icons.scss +0 -1441
  350. data/vendor/assets/stylesheets/fontawesome/_larger.scss +0 -23
  351. data/vendor/assets/stylesheets/fontawesome/_list.scss +0 -18
  352. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -56
  353. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +0 -24
  354. data/vendor/assets/stylesheets/fontawesome/_screen-reader.scss +0 -5
  355. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +0 -31
  356. data/vendor/assets/stylesheets/fontawesome/_variables.scss +0 -1458
  357. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +0 -16
  358. data/vendor/assets/stylesheets/fontawesome/regular.scss +0 -23
  359. data/vendor/assets/stylesheets/fontawesome/solid.scss +0 -24
@@ -57,7 +57,7 @@ module Alchemy
57
57
  content_tag(:figure, output, {class: ingredient.css_class.presence}.merge(html_options))
58
58
  else
59
59
  output
60
- end.html_safe
60
+ end
61
61
  end
62
62
 
63
63
  private
@@ -15,7 +15,7 @@ module Alchemy
15
15
  ingredient.stripped_body
16
16
  else
17
17
  value.to_s.html_safe
18
- end.html_safe
18
+ end
19
19
  end
20
20
  end
21
21
  end
@@ -24,7 +24,7 @@ module Alchemy
24
24
  target: ((link_target == "blank") ? "_blank" : nil),
25
25
  data: {link_target: link_target}
26
26
  }.merge(html_options))
27
- end.html_safe
27
+ end
28
28
  end
29
29
 
30
30
  private
@@ -6,7 +6,7 @@ module Alchemy
6
6
  def call
7
7
  content_tag(:video, html_options) do
8
8
  tag(:source, src: src, type: attachment.file_mime_type)
9
- end.html_safe
9
+ end
10
10
  end
11
11
 
12
12
  def render?
@@ -31,27 +31,6 @@ module Alchemy
31
31
 
32
32
  private
33
33
 
34
- def safe_redirect_path(path = params[:redirect_to], fallback: admin_path)
35
- if is_safe_redirect_path?(path)
36
- path
37
- elsif is_safe_redirect_path?(fallback)
38
- fallback
39
- else
40
- admin_path
41
- end
42
- end
43
-
44
- def is_safe_redirect_path?(path)
45
- mount_path = alchemy.root_path
46
- path.to_s.match? %r{^#{mount_path}admin/}
47
- end
48
-
49
- def relative_referer_path(referer = request.referer)
50
- return unless referer
51
-
52
- URI(referer).path
53
- end
54
-
55
34
  # Disable layout rendering for xhr requests.
56
35
  def set_layout
57
36
  request.xhr? ? false : "alchemy/admin"
@@ -69,14 +48,13 @@ module Alchemy
69
48
  @error = error
70
49
  # truncate the message, because very long error messages (i.e from mysql2) causes cookie overflow errors
71
50
  @notice = error.message[0..255]
72
- @trace = error.backtrace[0..50]
73
- if request.xhr?
51
+ if request.format.json?
52
+ render json: {message: @notice}, status: 500
53
+ elsif request.xhr?
74
54
  render action: "error_notice"
75
55
  else
76
- respond_to do |format|
77
- format.html { render "500", status: 500 }
78
- format.json { render json: {message: @notice}, status: 500 }
79
- end
56
+ @trace = error.backtrace[0..50]
57
+ render "500", status: 500
80
58
  end
81
59
  end
82
60
 
@@ -128,16 +106,13 @@ module Alchemy
128
106
 
129
107
  # Does redirects for html and js requests
130
108
  #
131
- # Makes sure that the redirect path is safe.
132
- #
133
109
  def do_redirect_to(url_or_path)
134
- redirect_path = safe_redirect_path(url_or_path)
135
110
  respond_to do |format|
136
111
  format.js {
137
- @redirect_url = redirect_path
112
+ @redirect_url = url_or_path
138
113
  render :redirect
139
114
  }
140
- format.html { redirect_to redirect_path }
115
+ format.html { redirect_to url_or_path }
141
116
  end
142
117
  end
143
118
 
@@ -3,7 +3,7 @@
3
3
  module Alchemy
4
4
  module Admin
5
5
  class ElementsController < Alchemy::Admin::BaseController
6
- before_action :load_element, only: [:update, :destroy, :fold, :publish]
6
+ before_action :load_element, only: [:update, :destroy, :collapse, :expand, :publish]
7
7
  authorize_resource class: Alchemy::Element
8
8
 
9
9
  def index
@@ -53,13 +53,25 @@ module Alchemy
53
53
  # Updates the element and all ingredients in the element.
54
54
  #
55
55
  def update
56
- @page = @element.page
57
-
58
56
  if @element.update(element_params)
59
- @element_validated = true
57
+ render json: {
58
+ notice: Alchemy.t(:element_saved),
59
+ previewText: Rails::Html::SafeListSanitizer.new.sanitize(@element.preview_text),
60
+ ingredientAnchors: @element.ingredients.select { |i| i.settings[:anchor] }.map do |ingredient|
61
+ {
62
+ ingredientId: ingredient.id,
63
+ active: ingredient.dom_id.present?
64
+ }
65
+ end
66
+ }
60
67
  else
61
- element_update_error
62
- @error_messages = @element.ingredient_error_messages
68
+ @warning = Alchemy.t("Validation failed")
69
+ render json: {
70
+ warning: @warning,
71
+ errorMessage: Alchemy.t(:ingredient_validations_headline),
72
+ ingredientsWithErrors: @element.ingredients_with_errors.map(&:id),
73
+ errors: @element.ingredient_error_messages
74
+ }
63
75
  end
64
76
  end
65
77
 
@@ -70,37 +82,59 @@ module Alchemy
70
82
  end
71
83
 
72
84
  def publish
73
- @element.update(public: !@element.public?)
85
+ @element.public = !@element.public?
86
+ @element.save(validate: false)
87
+ render json: {
88
+ public: @element.public?,
89
+ label: @element.public? ? Alchemy.t(:hide_element) : Alchemy.t(:show_element)
90
+ }
74
91
  end
75
92
 
76
93
  def order
77
- @parent_element = Element.find_by(id: params[:parent_element_id])
78
- Element.transaction do
79
- params.fetch(:element_ids, []).each.with_index(1) do |element_id, position|
80
- # We need to set the parent_element_id, because we might have dragged the
81
- # element over from another nestable element
82
- Element.find_by(id: element_id).update_columns(
83
- parent_element_id: params[:parent_element_id],
84
- position: position
85
- )
86
- end
87
- # Need to manually touch the parent because Rails does not do it
88
- # with the update_columns above
89
- @parent_element&.touch
94
+ @element = Element.find(params[:element_id])
95
+ @element.update(
96
+ parent_element_id: params[:parent_element_id],
97
+ position: params[:position]
98
+ )
99
+ if params[:parent_element_id].present?
100
+ @parent_element = Element.find_by(id: params[:parent_element_id])
90
101
  end
102
+
103
+ render json: {
104
+ message: Alchemy.t(:successfully_saved_element_position),
105
+ preview_text: @element.preview_text
106
+ }
91
107
  end
92
108
 
93
- # Toggle folds the element and persists the state in the db
109
+ # Collapses the element, all nested elements and persists the state in the db
94
110
  #
95
- def fold
96
- @page = @element.page
111
+ def collapse
97
112
  # We do not want to trigger the touch callback or any validations
98
- @element.update_columns(folded: !@element.folded)
99
- # Fold all nested elements if folded
100
- if @element.folded?
101
- ids = collapse_nested_elements_ids(@element)
102
- Alchemy::Element.where(id: ids).update_all(folded: true)
103
- end
113
+ @element.update_columns(folded: true)
114
+ # Collapse all nested elements
115
+ nested_elements_ids = collapse_nested_elements_ids(@element)
116
+ Alchemy::Element.where(id: nested_elements_ids).update_all(folded: true)
117
+
118
+ render json: {
119
+ nestedElementIds: nested_elements_ids,
120
+ title: Alchemy.t(@element.folded? ? :show_element_content : :hide_element_content)
121
+ }
122
+ end
123
+
124
+ # Expands the element, all parents and persists the state in the db
125
+ #
126
+ def expand
127
+ # We do not want to trigger the touch callback or any validations
128
+ @element.update_columns(folded: false)
129
+ # We want to expand the upper most parent first in order to prevent
130
+ # re-painting issues in the browser
131
+ parent_element_ids = @element.parent_element_ids.reverse
132
+ Alchemy::Element.where(id: parent_element_ids).update_all(folded: false)
133
+
134
+ render json: {
135
+ parentElementIds: parent_element_ids,
136
+ title: Alchemy.t(@element.folded? ? :show_element_content : :hide_element_content)
137
+ }
104
138
  end
105
139
 
106
140
  private
@@ -171,12 +205,6 @@ module Alchemy
171
205
  def create_element_params
172
206
  params.require(:element).permit(:name, :page_version_id, :parent_element_id)
173
207
  end
174
-
175
- def element_update_error
176
- @element_validated = false
177
- @notice = Alchemy.t("Validation failed")
178
- @error_message = "<h2>#{@notice}</h2><p>#{Alchemy.t(:ingredient_validations_headline)}</p>".html_safe
179
- end
180
208
  end
181
209
  end
182
210
  end
@@ -38,9 +38,8 @@ module Alchemy
38
38
  end
39
39
 
40
40
  def switch
41
- @language = set_alchemy_language(params[:language_id])
42
- session[:alchemy_language_id] = @language.id
43
- do_redirect_to relative_referer_path || alchemy.admin_dashboard_path
41
+ set_alchemy_language(params[:language_id])
42
+ do_redirect_to request.referer || alchemy.admin_dashboard_path
44
43
  end
45
44
 
46
45
  private
@@ -17,25 +17,6 @@ module Alchemy
17
17
  def edit
18
18
  @page = Page.find(params[:id])
19
19
  end
20
-
21
- def update
22
- @page = Page.find(params[:id])
23
- if @page.update(page_params)
24
- @notice = Alchemy.t("Page saved", name: @page.name)
25
- render "alchemy/admin/pages/update"
26
- else
27
- render :edit, status: :unprocessable_entity
28
- end
29
- end
30
-
31
- private
32
-
33
- def page_params
34
- params.require(:page).permit(
35
- :name,
36
- :tag_list
37
- )
38
- end
39
20
  end
40
21
  end
41
22
  end
@@ -183,15 +183,14 @@ module Alchemy
183
183
  respond_to do |format|
184
184
  format.js
185
185
  format.html do
186
- redirect_to(unlock_redirect_path, allow_other_host: true)
186
+ redirect_to(
187
+ params[:redirect_to].presence || admin_pages_path,
188
+ allow_other_host: true
189
+ )
187
190
  end
188
191
  end
189
192
  end
190
193
 
191
- def unlock_redirect_path
192
- safe_redirect_path(fallback: admin_pages_path)
193
- end
194
-
195
194
  # Sets the page public and updates the published_at attribute that is used as cache_key
196
195
  #
197
196
  def publish
@@ -78,7 +78,7 @@ module Alchemy
78
78
  flash[:error] = resource_instance_variable.errors.full_messages.join(", ")
79
79
  end
80
80
  flash_notice_for_resource_action
81
- do_redirect_to resource_url_proxy.url_for(search_filter_params.merge(action: "index", only_path: true))
81
+ do_redirect_to resource_url_proxy.url_for(search_filter_params.merge(action: "index"))
82
82
  end
83
83
 
84
84
  def resource_handler
@@ -53,7 +53,9 @@ module Alchemy
53
53
  #{current_alchemy_user.inspect}
54
54
  WARN
55
55
  end
56
- if current_alchemy_user
56
+ if request.format.json?
57
+ render json: {message: Alchemy.t("You are not authorized")}, status: :unauthorized
58
+ elsif current_alchemy_user
57
59
  handle_redirect_for_user
58
60
  else
59
61
  handle_redirect_for_guest
@@ -65,7 +67,7 @@ module Alchemy
65
67
  if can?(:index, :alchemy_admin_dashboard)
66
68
  redirect_or_render_notice
67
69
  else
68
- redirect_to("/")
70
+ redirect_to Alchemy.unauthorized_path
69
71
  end
70
72
  end
71
73
 
@@ -97,7 +97,7 @@ module Alchemy
97
97
  else
98
98
  Language.current_root_page.urlname
99
99
  end
100
- redirect_to alchemy.show_page_path(
100
+ redirect_to show_page_path(
101
101
  urlname: urlname,
102
102
  locale: prefix_locale? ? Language.current.code : nil
103
103
  )
@@ -12,11 +12,7 @@ module Alchemy
12
12
  private
13
13
 
14
14
  def load_current_language
15
- @current_language = if session[:alchemy_language_id].present?
16
- set_alchemy_language(session[:alchemy_language_id])
17
- else
18
- Alchemy::Language.current
19
- end
15
+ @current_language = Alchemy::Language.current
20
16
  if @current_language.nil?
21
17
  flash[:warning] = Alchemy.t("Please create a language first.")
22
18
  redirect_to admin_languages_path
@@ -33,7 +33,7 @@ module Alchemy
33
33
  def uploader_response(file:, message:)
34
34
  {
35
35
  files: [file.to_jq_upload],
36
- growl_message: message
36
+ message: message
37
37
  }
38
38
  end
39
39
  end
@@ -65,8 +65,6 @@ module Alchemy
65
65
 
66
66
  # Tells us, if we should show the element footer and form inputs.
67
67
  def editable?
68
- return false if folded?
69
-
70
68
  ingredient_definitions.any? || taggable?
71
69
  end
72
70
 
@@ -4,17 +4,18 @@ module Alchemy
4
4
  module Admin
5
5
  module AttachmentsHelper
6
6
  include Alchemy::Admin::BaseHelper
7
+ include Alchemy::Filetypes
7
8
 
8
9
  def mime_to_human(mime)
9
10
  Alchemy.t(mime, scope: "mime_types", default: Alchemy.t(:document))
10
11
  end
11
12
 
12
13
  def attachment_preview_size(attachment)
13
- case attachment.icon_css_class
14
- when "image" then "600x475"
15
- when "audio" then "600x190"
16
- when "video" then "600x485"
17
- when "pdf" then "600x500"
14
+ case attachment.file_mime_type
15
+ when *IMAGE_FILE_TYPES then "600x475"
16
+ when *AUDIO_FILE_TYPES then "600x190"
17
+ when *VIDEO_FILE_TYPES then "600x485"
18
+ when "application/pdf" then "600x600"
18
19
  else
19
20
  "600x145"
20
21
  end
@@ -55,7 +55,10 @@ module Alchemy
55
55
  default_options = {modal: true}
56
56
  options = default_options.merge(options)
57
57
  link_to content, url,
58
- html_options.merge("data-alchemy-dialog" => options.to_json)
58
+ html_options.merge(
59
+ "data-dialog-options" => options.to_json,
60
+ :is => "alchemy-dialog-link"
61
+ )
59
62
  end
60
63
 
61
64
  # Used for translations selector in Alchemy cockpit user settings.
@@ -189,7 +192,7 @@ module Alchemy
189
192
  options = {
190
193
  title: Alchemy.t("Delete"),
191
194
  message: Alchemy.t("Are you sure?"),
192
- icon: :minus
195
+ icon: "delete-bin-2"
193
196
  }.merge(options)
194
197
  button_with_confirm(
195
198
  render_icon(options[:icon]),
@@ -322,18 +325,20 @@ module Alchemy
322
325
  date = Time.zone.parse(date) if date.is_a?(String)
323
326
  value = date&.iso8601
324
327
 
325
- text_field object.class.name.demodulize.underscore.to_sym,
326
- method.to_sym, {:type => "text", :class => type, "data-datepicker-type" => type, :value => value}.merge(html_options)
328
+ input_field = text_field object.class.name.demodulize.underscore.to_sym,
329
+ method.to_sym, {type: "text", class: type, value: value}.merge(html_options)
330
+
331
+ content_tag("alchemy-datepicker", input_field, "input-type" => type)
327
332
  end
328
333
 
329
334
  # Render a hint icon with tooltip for given object.
330
335
  # The model class needs to include the hints module
331
- def render_hint_for(element)
336
+ def render_hint_for(element, icon_options = {})
332
337
  return unless element.has_hint?
333
338
 
334
- content_tag :span, class: "hint-with-icon" do
335
- render_icon("question-circle") +
336
- content_tag(:span, element.hint.html_safe, class: "hint-bubble")
339
+ content_tag "sl-tooltip", class: "like-hint-tooltip", placement: "bottom-start" do
340
+ render_icon("question", icon_options) +
341
+ content_tag(:span, element.hint.html_safe, slot: "content")
337
342
  end
338
343
  end
339
344
 
@@ -372,12 +377,12 @@ module Alchemy
372
377
  # <%= hint_with_tooltip('Page layout is missing', icon: 'info') %>
373
378
  #
374
379
  # @param text [String] - The text displayed in the tooltip
375
- # @param icon: 'exclamation-triangle' [String] - Icon name
380
+ # @param icon: 'alert' [String] - Icon name
376
381
  #
377
382
  # @return [String]
378
- def hint_with_tooltip(text, icon: "exclamation-triangle")
379
- content_tag :span, class: "hint-with-icon" do
380
- render_icon(icon) + content_tag(:span, text, class: "hint-bubble")
383
+ def hint_with_tooltip(text, icon: "alert")
384
+ content_tag :"sl-tooltip", class: "like-hint-tooltip", content: text, placement: "bottom" do
385
+ render_icon(icon)
381
386
  end
382
387
  end
383
388
 
@@ -34,7 +34,10 @@ module Alchemy
34
34
  # Renders the label and hint for a ingredient.
35
35
  def ingredient_label(ingredient, column = :value, html_options = {})
36
36
  label_tag ingredient.form_field_id(column), html_options do
37
- [render_ingredient_role(ingredient), render_hint_for(ingredient)].compact.join("&nbsp;").html_safe
37
+ [
38
+ render_ingredient_role(ingredient),
39
+ render_hint_for(ingredient, size: "lg", fixed_width: false)
40
+ ].compact.join("&nbsp;").html_safe
38
41
  end
39
42
  end
40
43
  end
@@ -36,21 +36,15 @@ module Alchemy
36
36
 
37
37
  def page_status_checkbox(page, attribute)
38
38
  label = page.class.human_attribute_name(attribute)
39
-
40
- if page.attribute_fixed?(attribute)
41
- checkbox = check_box(:page, attribute, disabled: true)
42
- hint = content_tag(:span, class: "hint-bubble") do
43
- Alchemy.t(:attribute_fixed, attribute: attribute)
44
- end
45
- content = content_tag(:span, class: "with-hint") do
46
- "#{checkbox}\n#{label}\n#{hint}".html_safe
39
+ checkbox = if page.attribute_fixed?(attribute)
40
+ content_tag("sl-tooltip", class: "like-hint-tooltip", content: Alchemy.t(:attribute_fixed, attribute: attribute), placement: "bottom-start") do
41
+ check_box_tag("page[#{attribute}]", "1", page.send(attribute), disabled: true)
47
42
  end
48
43
  else
49
- checkbox = check_box(:page, attribute)
50
- content = "#{checkbox}\n#{label}".html_safe
44
+ check_box(:page, attribute)
51
45
  end
52
46
 
53
- content_tag(:label, class: "checkbox") { content }
47
+ content_tag(:label, class: "checkbox") { "#{checkbox}\n#{label}".html_safe }
54
48
  end
55
49
  end
56
50
  end
@@ -19,21 +19,21 @@ module Alchemy
19
19
  end
20
20
  end
21
21
 
22
- # Render a Fontawesome icon
22
+ # Render a Remix icon
23
23
  #
24
- # @param icon_class [String] Fontawesome icon name
25
- # @param size: nil [String] Fontawesome icon size
26
- # @param transform: nil [String] Fontawesome transform style
24
+ # @param icon_name [String] icon name
25
+ # @option options - style: nil [String] icon style. line or fill
26
+ # @option options - size: nil [String] icon size
27
27
  #
28
28
  # @return [String]
29
- def render_icon(icon_class, options = {})
30
- options = {style: "solid"}.merge(options)
29
+ def render_icon(icon_name, options = {})
30
+ options = {style: "line", fixed_width: true}.merge(options)
31
+ style = options[:style] && "-#{options[:style]}"
31
32
  classes = [
32
- "icon fa-fw",
33
- "fa-#{icon_class}",
34
- "fa#{options[:style].first}",
35
- options[:size] ? "fa-#{options[:size]}" : nil,
36
- options[:transform] ? "fa-#{options[:transform]}" : nil,
33
+ "icon",
34
+ "ri-#{ri_icon(icon_name)}#{style}",
35
+ options[:size] ? "ri-#{options[:size]}" : nil,
36
+ options[:fixed_width] ? "ri-fw" : nil,
37
37
  options[:class]
38
38
  ].compact
39
39
  content_tag("i", nil, class: classes)
@@ -87,18 +87,52 @@ module Alchemy
87
87
  end
88
88
  end
89
89
 
90
- # Returns the FontAwesome icon name for given message type
90
+ # Returns the icon name for given message type
91
91
  #
92
92
  # @param message_type [String] The message type. One of +warning+, +info+, +notice+, +error+
93
- # @return [String] The FontAwesome icon name
93
+ # @return [String] The icon name
94
94
  def message_icon_class(message_type)
95
95
  case message_type.to_s
96
96
  when "warning", "warn", "alert" then "exclamation"
97
97
  when "notice" then "check"
98
98
  when "error" then "bug"
99
+ when "hint" then "info"
99
100
  else
100
101
  message_type
101
102
  end
102
103
  end
104
+
105
+ private
106
+
107
+ # Returns the Remix icon name for given icon name
108
+ #
109
+ # @param icon_name [String] The icon name.
110
+ # @return [String] The Remix icon class
111
+ def ri_icon(icon_name)
112
+ case icon_name.to_s
113
+ when "minus", "remove", "delete"
114
+ "delete-bin-2"
115
+ when "plus"
116
+ "add"
117
+ when "copy"
118
+ "file-copy"
119
+ when "download"
120
+ "download-2"
121
+ when "upload"
122
+ "upload-2"
123
+ when "exclamation"
124
+ "alert"
125
+ when "info-circle", "info"
126
+ "information"
127
+ when "times"
128
+ "close"
129
+ when "tag"
130
+ "price-tag-3"
131
+ when "cog"
132
+ "settings-3"
133
+ else
134
+ icon_name
135
+ end
136
+ end
103
137
  end
104
138
  end