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.
- checksums.yaml +4 -4
- data/.github/workflows/backport.yml +36 -0
- data/.github/workflows/brakeman-analysis.yml +5 -13
- data/.github/workflows/lint.yml +2 -9
- data/.github/workflows/stale.yml +2 -5
- data/.github/workflows/test.yml +7 -15
- data/.gitignore +0 -1
- data/.standard.yml +1 -1
- data/CHANGELOG.md +144 -51
- data/Gemfile +7 -18
- data/README.md +10 -8
- data/alchemy_cms.gemspec +4 -3
- data/app/assets/config/alchemy_manifest.js +0 -1
- data/app/assets/javascripts/alchemy/admin.js +1 -19
- data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +2 -3
- data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +19 -34
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +38 -13
- data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +32 -25
- data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +3 -5
- data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +0 -57
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +22 -63
- data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +2 -2
- data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +5 -4
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +5 -5
- data/app/assets/javascripts/alchemy/templates/index.js +0 -2
- data/app/assets/javascripts/alchemy/templates/node_folder.hbs +1 -1
- data/app/assets/javascripts/alchemy/templates/page.hbs +1 -1
- data/app/assets/javascripts/alchemy/templates/page_folder.hbs +2 -2
- data/app/assets/stylesheets/alchemy/_custom-properties.scss +82 -0
- data/app/assets/stylesheets/alchemy/_mixins.scss +38 -30
- data/app/assets/stylesheets/alchemy/_variables.scss +12 -5
- data/app/assets/stylesheets/alchemy/admin.scss +3 -4
- data/app/assets/stylesheets/alchemy/archive.scss +107 -50
- data/app/assets/stylesheets/alchemy/attachments.scss +5 -4
- data/app/assets/stylesheets/alchemy/buttons.scss +38 -164
- data/app/assets/stylesheets/alchemy/dashboard.scss +31 -6
- data/app/assets/stylesheets/alchemy/dialogs.scss +12 -28
- data/app/assets/stylesheets/alchemy/elements.scss +273 -282
- data/app/assets/stylesheets/alchemy/flash.scss +20 -12
- data/app/assets/stylesheets/alchemy/forms.scss +21 -34
- data/app/assets/stylesheets/alchemy/frame.scss +11 -32
- data/app/assets/stylesheets/alchemy/hints.scss +4 -62
- data/app/assets/stylesheets/alchemy/image_library.scss +36 -33
- data/app/assets/stylesheets/alchemy/labels.scss +4 -1
- data/app/assets/stylesheets/alchemy/menubar.scss +7 -6
- data/app/assets/stylesheets/alchemy/navigation.scss +27 -15
- data/app/assets/stylesheets/alchemy/nodes.scss +11 -7
- data/app/assets/stylesheets/alchemy/notices.scss +16 -4
- data/app/assets/stylesheets/alchemy/page-select.scss +10 -2
- data/app/assets/stylesheets/alchemy/pagination.scss +22 -13
- data/app/assets/stylesheets/alchemy/preview_window.scss +4 -8
- data/app/assets/stylesheets/alchemy/resource_info.scss +7 -5
- data/app/assets/stylesheets/alchemy/selects.scss +49 -42
- data/app/assets/stylesheets/alchemy/shoelace.scss +345 -0
- data/app/assets/stylesheets/alchemy/sitemap.scss +24 -14
- data/app/assets/stylesheets/alchemy/spinner.scss +9 -19
- data/app/assets/stylesheets/alchemy/tables.scss +16 -24
- data/app/assets/stylesheets/alchemy/tags.scss +4 -0
- data/app/assets/stylesheets/alchemy/toolbar.scss +29 -25
- data/app/assets/stylesheets/alchemy/upload.scss +140 -89
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +80 -108
- data/app/components/alchemy/admin/node_select.rb +39 -0
- data/app/components/alchemy/admin/page_select.rb +42 -0
- data/app/components/alchemy/ingredients/audio_view.rb +1 -1
- data/app/components/alchemy/ingredients/base_view.rb +1 -1
- data/app/components/alchemy/ingredients/boolean_view.rb +1 -1
- data/app/components/alchemy/ingredients/datetime_view.rb +3 -4
- data/app/components/alchemy/ingredients/file_view.rb +1 -1
- data/app/components/alchemy/ingredients/headline_view.rb +7 -16
- data/app/components/alchemy/ingredients/link_view.rb +1 -1
- data/app/components/alchemy/ingredients/page_view.rb +1 -1
- data/app/components/alchemy/ingredients/picture_view.rb +1 -1
- data/app/components/alchemy/ingredients/richtext_view.rb +1 -1
- data/app/components/alchemy/ingredients/text_view.rb +1 -1
- data/app/components/alchemy/ingredients/video_view.rb +1 -1
- data/app/controllers/alchemy/admin/base_controller.rb +7 -32
- data/app/controllers/alchemy/admin/elements_controller.rb +63 -35
- data/app/controllers/alchemy/admin/languages_controller.rb +2 -3
- data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -19
- data/app/controllers/alchemy/admin/pages_controller.rb +4 -5
- data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
- data/app/controllers/alchemy/base_controller.rb +4 -2
- data/app/controllers/alchemy/messages_controller.rb +1 -1
- data/app/controllers/concerns/alchemy/admin/current_language.rb +1 -5
- data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +1 -1
- data/app/decorators/alchemy/element_editor.rb +0 -2
- data/app/helpers/alchemy/admin/attachments_helper.rb +6 -5
- data/app/helpers/alchemy/admin/base_helper.rb +17 -12
- data/app/helpers/alchemy/admin/ingredients_helper.rb +4 -1
- data/app/helpers/alchemy/admin/pages_helper.rb +5 -11
- data/app/helpers/alchemy/base_helper.rb +47 -13
- data/app/javascript/alchemy_admin/components/alchemy_html_element.js +129 -0
- data/app/javascript/alchemy_admin/components/button.js +59 -0
- data/app/javascript/alchemy_admin/components/char_counter.js +40 -0
- data/app/javascript/alchemy_admin/components/datepicker.js +39 -0
- data/app/javascript/alchemy_admin/components/dialog_link.js +45 -0
- data/app/javascript/alchemy_admin/components/element_editor/publish_element_button.js +36 -0
- data/app/javascript/alchemy_admin/components/element_editor.js +553 -0
- data/app/javascript/alchemy_admin/components/ingredient_group.js +54 -0
- data/app/javascript/alchemy_admin/components/link_buttons/link_button.js +48 -0
- data/app/javascript/alchemy_admin/components/link_buttons/unlink_button.js +38 -0
- data/app/javascript/alchemy_admin/components/link_buttons.js +79 -0
- data/app/javascript/alchemy_admin/components/node_select.js +45 -0
- data/app/javascript/alchemy_admin/components/overlay.js +18 -0
- data/app/javascript/alchemy_admin/components/page_select.js +63 -0
- data/app/javascript/alchemy_admin/components/remote_select.js +134 -0
- data/app/javascript/alchemy_admin/components/select.js +12 -0
- data/app/javascript/alchemy_admin/components/spinner.js +31 -0
- data/app/javascript/alchemy_admin/components/tinymce.js +146 -0
- data/app/javascript/alchemy_admin/components/uploader/file_upload.js +266 -0
- data/app/javascript/alchemy_admin/components/uploader/progress.js +258 -0
- data/app/javascript/alchemy_admin/components/uploader.js +132 -0
- data/app/javascript/alchemy_admin/dirty.js +49 -0
- data/app/javascript/alchemy_admin/file_editors.js +1 -1
- data/app/javascript/alchemy_admin/gui.js +14 -0
- data/app/javascript/alchemy_admin/i18n.js +12 -8
- data/app/javascript/alchemy_admin/image_cropper.js +6 -3
- data/app/javascript/alchemy_admin/image_loader.js +7 -15
- data/app/javascript/alchemy_admin/ingredient_anchor_link.js +2 -5
- data/app/javascript/alchemy_admin/initializer.js +65 -0
- data/app/javascript/alchemy_admin/locales/en.js +31 -0
- data/app/javascript/alchemy_admin/picture_editors.js +2 -2
- data/app/javascript/alchemy_admin/picture_selector.js +38 -0
- data/app/javascript/alchemy_admin/please_wait_overlay.js +8 -0
- data/app/javascript/alchemy_admin/sortable_elements.js +78 -0
- data/app/javascript/alchemy_admin/spinner.js +36 -0
- data/app/javascript/alchemy_admin/tags_autocomplete.js +46 -0
- data/app/javascript/alchemy_admin/utils/ajax.js +6 -5
- data/app/javascript/alchemy_admin/utils/dom_helpers.js +20 -0
- data/app/javascript/alchemy_admin/utils/format.js +11 -0
- data/app/javascript/alchemy_admin/utils/string_conversions.js +10 -0
- data/app/javascript/alchemy_admin.js +70 -13
- data/app/javascript/menubar.js +10 -0
- data/app/models/alchemy/attachment.rb +9 -11
- data/app/models/alchemy/element.rb +11 -0
- data/app/models/alchemy/ingredients/audio.rb +0 -11
- data/app/models/alchemy/ingredients/datetime.rb +1 -1
- data/app/models/alchemy/ingredients/richtext.rb +1 -10
- data/app/models/alchemy/ingredients/video.rb +0 -12
- data/app/models/alchemy/node.rb +4 -0
- data/app/models/alchemy/page/page_elements.rb +2 -11
- data/app/models/alchemy/page/page_natures.rb +10 -2
- data/app/models/alchemy/page.rb +12 -54
- data/app/models/alchemy/picture/url.rb +1 -9
- data/app/models/concerns/alchemy/picture_thumbnails.rb +5 -4
- data/app/serializers/alchemy/page_tree_serializer.rb +2 -1
- data/app/services/alchemy/copy_page.rb +98 -0
- data/app/views/alchemy/_menubar.html.erb +17 -13
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +14 -10
- data/app/views/alchemy/admin/attachments/_attachment.html.erb +44 -36
- data/app/views/alchemy/admin/attachments/_replace_button.html.erb +15 -21
- data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +0 -1
- data/app/views/alchemy/admin/attachments/assign.js.erb +1 -1
- data/app/views/alchemy/admin/attachments/index.html.erb +6 -4
- data/app/views/alchemy/admin/attachments/show.html.erb +8 -8
- data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
- data/app/views/alchemy/admin/clipboard/index.html.erb +3 -7
- data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
- data/app/views/alchemy/admin/crop.html.erb +1 -1
- data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
- data/app/views/alchemy/admin/dashboard/index.html.erb +13 -11
- data/app/views/alchemy/admin/dashboard/info.html.erb +7 -7
- data/app/views/alchemy/admin/elements/_add_nested_element_form.html.erb +21 -23
- data/app/views/alchemy/admin/elements/_element.html.erb +52 -44
- data/app/views/alchemy/admin/elements/_footer.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_form.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_header.html.erb +11 -12
- data/app/views/alchemy/admin/elements/_toolbar.html.erb +33 -45
- data/app/views/alchemy/admin/elements/create.js.erb +7 -15
- data/app/views/alchemy/admin/elements/destroy.js.erb +0 -2
- data/app/views/alchemy/admin/elements/index.html.erb +27 -24
- data/app/views/alchemy/admin/elements/new.html.erb +9 -11
- data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +2 -2
- data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +3 -3
- data/app/views/alchemy/admin/ingredients/_video_fields.html.erb +1 -2
- data/app/views/alchemy/admin/languages/_form.html.erb +2 -3
- data/app/views/alchemy/admin/languages/_language.html.erb +15 -8
- data/app/views/alchemy/admin/languages/_table.html.erb +1 -0
- data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +28 -16
- data/app/views/alchemy/admin/layoutpages/edit.html.erb +1 -1
- data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
- data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +12 -8
- data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
- data/app/views/alchemy/admin/nodes/_form.html.erb +20 -21
- data/app/views/alchemy/admin/nodes/_node.html.erb +39 -34
- data/app/views/alchemy/admin/nodes/index.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_anchor_link.html.erb +4 -4
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_current_page.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_external_link.html.erb +4 -4
- data/app/views/alchemy/admin/pages/_file_link.html.erb +5 -5
- data/app/views/alchemy/admin/pages/_form.html.erb +10 -21
- data/app/views/alchemy/admin/pages/_internal_link.html.erb +4 -4
- data/app/views/alchemy/admin/pages/_locked_page.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +4 -17
- data/app/views/alchemy/admin/pages/_page.html.erb +76 -72
- data/app/views/alchemy/admin/pages/_page_infos.html.erb +23 -7
- data/app/views/alchemy/admin/pages/_page_layout_filter.html.erb +2 -1
- data/app/views/alchemy/admin/pages/_page_status.html.erb +11 -21
- data/app/views/alchemy/admin/pages/_publication_fields.html.erb +2 -5
- data/app/views/alchemy/admin/pages/_table.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_table_row.html.erb +43 -39
- data/app/views/alchemy/admin/pages/_toolbar.html.erb +43 -38
- data/app/views/alchemy/admin/pages/configure.html.erb +12 -14
- data/app/views/alchemy/admin/pages/edit.html.erb +80 -103
- data/app/views/alchemy/admin/pages/info.html.erb +20 -11
- data/app/views/alchemy/admin/pages/link.html.erb +22 -16
- data/app/views/alchemy/admin/pages/new.html.erb +9 -11
- data/app/views/alchemy/admin/pages/unlock.js.erb +10 -3
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -13
- data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +3 -5
- data/app/views/alchemy/admin/partials/_routes.html.erb +10 -2
- data/app/views/alchemy/admin/partials/_site_select.html.erb +6 -5
- data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +28 -23
- data/app/views/alchemy/admin/pictures/_archive.html.erb +5 -5
- data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +21 -23
- data/app/views/alchemy/admin/pictures/_infos.html.erb +2 -6
- data/app/views/alchemy/admin/pictures/_picture.html.erb +15 -17
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +17 -16
- data/app/views/alchemy/admin/pictures/_tag_list.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +1 -1
- data/app/views/alchemy/admin/pictures/assign.js.erb +1 -1
- data/app/views/alchemy/admin/pictures/index.html.erb +34 -30
- data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
- data/app/views/alchemy/admin/resources/_filter.html.erb +2 -2
- data/app/views/alchemy/admin/resources/_form.html.erb +2 -2
- data/app/views/alchemy/admin/resources/_per_page_select.html.erb +1 -1
- data/app/views/alchemy/admin/resources/_resource.html.erb +16 -9
- data/app/views/alchemy/admin/resources/_table.html.erb +4 -1
- data/app/views/alchemy/admin/resources/index.html.erb +22 -19
- data/app/views/alchemy/admin/sites/index.html.erb +2 -1
- data/app/views/alchemy/admin/styleguide/index.html.erb +54 -28
- data/app/views/alchemy/admin/tags/_tag.html.erb +16 -18
- data/app/views/alchemy/admin/tags/index.html.erb +15 -12
- data/app/views/alchemy/admin/tinymce/_setup.html.erb +29 -0
- data/app/views/alchemy/admin/uploader/_button.html.erb +23 -29
- data/app/views/alchemy/admin/uploader/_setup.html.erb +3 -8
- data/app/views/alchemy/base/500.html.erb +1 -1
- data/app/views/alchemy/base/error_notice.js.erb +0 -1
- data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_datetime_editor.html.erb +2 -3
- data/app/views/alchemy/ingredients/_file_editor.html.erb +5 -5
- data/app/views/alchemy/ingredients/_link_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_node_editor.html.erb +6 -19
- data/app/views/alchemy/ingredients/_page_editor.html.erb +7 -19
- data/app/views/alchemy/ingredients/_picture_editor.html.erb +2 -2
- data/app/views/alchemy/ingredients/_richtext_editor.html.erb +6 -15
- data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -1
- data/app/views/alchemy/ingredients/_text_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/shared/_anchor.html.erb +1 -1
- data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +10 -20
- data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +42 -49
- data/app/views/kaminari/alchemy/_first_page.html.erb +4 -2
- data/app/views/kaminari/alchemy/_gap.html.erb +1 -1
- data/app/views/kaminari/alchemy/_last_page.html.erb +4 -2
- data/app/views/kaminari/alchemy/_next_page.html.erb +4 -2
- data/app/views/kaminari/alchemy/_prev_page.html.erb +4 -2
- data/app/views/layouts/alchemy/admin.html.erb +10 -29
- data/config/alchemy/modules.yml +30 -30
- data/config/importmap.rb +10 -1
- data/config/initializers/rails_live_reload.rb +13 -0
- data/config/locales/alchemy.en.yml +23 -9
- data/config/routes.rb +3 -2
- data/lib/alchemy/auth_accessors.rb +6 -1
- data/lib/alchemy/controller_actions.rb +17 -4
- data/lib/alchemy/dev_support/live_reload_watcher.rb +5 -0
- data/lib/alchemy/engine.rb +8 -2
- data/lib/alchemy/forms/builder.rb +18 -12
- data/lib/alchemy/modules.rb +2 -2
- data/lib/alchemy/permissions.rb +1 -1
- data/lib/alchemy/resources_helper.rb +3 -3
- data/lib/alchemy/routing_constraints.rb +1 -1
- data/lib/alchemy/test_support/capybara_helpers.rb +8 -5
- data/lib/alchemy/test_support/rspec_matchers.rb +14 -0
- data/lib/alchemy/test_support/shared_uploader_examples.rb +1 -1
- data/lib/alchemy/tinymce.rb +8 -3
- data/lib/alchemy/version.rb +1 -1
- data/lib/tasks/alchemy/tidy.rake +1 -0
- data/package.json +14 -5
- data/vendor/assets/fonts/remixicon.eot +0 -0
- data/vendor/assets/fonts/remixicon.svg +7816 -0
- data/vendor/assets/fonts/remixicon.ttf +0 -0
- data/vendor/assets/fonts/remixicon.woff +0 -0
- data/vendor/assets/fonts/remixicon.woff2 +0 -0
- data/vendor/assets/stylesheets/remixicon.scss +10480 -0
- metadata +87 -97
- data/.gem_release.yml +0 -8
- data/app/assets/javascripts/alchemy/alchemy.autocomplete.js.coffee +0 -30
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -53
- data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +0 -45
- data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +0 -19
- data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +0 -59
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +0 -79
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -267
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +0 -27
- data/app/assets/javascripts/alchemy/alchemy.spinner.js +0 -32
- data/app/assets/javascripts/alchemy/alchemy.tooltips.coffee +0 -10
- data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +0 -131
- data/app/assets/javascripts/alchemy/menubar.js.coffee +0 -8
- data/app/assets/javascripts/alchemy/node_select.js +0 -39
- data/app/assets/javascripts/alchemy/page_select.js +0 -46
- data/app/assets/javascripts/alchemy/templates/node.hbs +0 -16
- data/app/assets/javascripts/alchemy/templates/spinner.hbs +0 -7
- data/app/assets/stylesheets/alchemy/jquery-ui.scss +0 -435
- data/app/javascript/alchemy_admin/datepicker.js +0 -40
- data/app/javascript/alchemy_admin/tinymce.js +0 -146
- data/app/javascript/alchemy_admin/translations.js +0 -32
- data/app/views/alchemy/admin/elements/fold.js.erb +0 -33
- data/app/views/alchemy/admin/elements/order.js.erb +0 -11
- data/app/views/alchemy/admin/elements/publish.js.erb +0 -21
- data/app/views/alchemy/admin/elements/update.js.erb +0 -27
- data/vendor/assets/fonts/fa-regular-400.eot +0 -0
- data/vendor/assets/fonts/fa-regular-400.svg +0 -803
- data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
- data/vendor/assets/fonts/fa-regular-400.woff +0 -0
- data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
- data/vendor/assets/fonts/fa-solid-900.eot +0 -0
- data/vendor/assets/fonts/fa-solid-900.svg +0 -4938
- data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
- data/vendor/assets/fonts/fa-solid-900.woff +0 -0
- data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
- data/vendor/assets/javascripts/fileupload/jquery.fileupload-process.js +0 -178
- data/vendor/assets/javascripts/fileupload/jquery.fileupload-validate.js +0 -125
- data/vendor/assets/javascripts/fileupload/jquery.fileupload.js +0 -1502
- data/vendor/assets/javascripts/fileupload/jquery.iframe-transport.js +0 -224
- data/vendor/assets/javascripts/jquery-ui/data.js +0 -45
- data/vendor/assets/javascripts/jquery-ui/ie.js +0 -20
- data/vendor/assets/javascripts/jquery-ui/keycode.js +0 -51
- data/vendor/assets/javascripts/jquery-ui/plugin.js +0 -49
- data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +0 -46
- data/vendor/assets/javascripts/jquery-ui/safe-blur.js +0 -27
- data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +0 -50
- data/vendor/assets/javascripts/jquery-ui/unique-id.js +0 -54
- data/vendor/assets/javascripts/jquery-ui/version.js +0 -20
- data/vendor/assets/javascripts/jquery-ui/widget.js +0 -754
- data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +0 -1268
- data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +0 -241
- data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +0 -1623
- data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +0 -931
- data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo.min.js +0 -7
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +0 -296
- data/vendor/assets/stylesheets/fontawesome/_animated.scss +0 -20
- data/vendor/assets/stylesheets/fontawesome/_bordered-pulled.scss +0 -20
- data/vendor/assets/stylesheets/fontawesome/_core.scss +0 -21
- data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +0 -6
- data/vendor/assets/stylesheets/fontawesome/_icons.scss +0 -1441
- data/vendor/assets/stylesheets/fontawesome/_larger.scss +0 -23
- data/vendor/assets/stylesheets/fontawesome/_list.scss +0 -18
- data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -56
- data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +0 -24
- data/vendor/assets/stylesheets/fontawesome/_screen-reader.scss +0 -5
- data/vendor/assets/stylesheets/fontawesome/_stacked.scss +0 -31
- data/vendor/assets/stylesheets/fontawesome/_variables.scss +0 -1458
- data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +0 -16
- data/vendor/assets/stylesheets/fontawesome/regular.scss +0 -23
- data/vendor/assets/stylesheets/fontawesome/solid.scss +0 -24
@@ -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
|
-
|
73
|
-
|
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
|
-
|
77
|
-
|
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 =
|
112
|
+
@redirect_url = url_or_path
|
138
113
|
render :redirect
|
139
114
|
}
|
140
|
-
format.html { redirect_to
|
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, :
|
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
|
-
|
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
|
-
|
62
|
-
|
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.
|
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
|
-
@
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
-
#
|
109
|
+
# Collapses the element, all nested elements and persists the state in the db
|
94
110
|
#
|
95
|
-
def
|
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:
|
99
|
-
#
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
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
|
-
|
42
|
-
|
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(
|
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"
|
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
|
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
|
|
@@ -12,11 +12,7 @@ module Alchemy
|
|
12
12
|
private
|
13
13
|
|
14
14
|
def load_current_language
|
15
|
-
@current_language =
|
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
|
@@ -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.
|
14
|
-
when
|
15
|
-
when
|
16
|
-
when
|
17
|
-
when "pdf" then "
|
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(
|
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:
|
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, {:
|
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
|
335
|
-
render_icon("question
|
336
|
-
content_tag(:span, element.hint.html_safe,
|
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: '
|
380
|
+
# @param icon: 'alert' [String] - Icon name
|
376
381
|
#
|
377
382
|
# @return [String]
|
378
|
-
def hint_with_tooltip(text, icon: "
|
379
|
-
content_tag :
|
380
|
-
render_icon(icon)
|
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
|
-
[
|
37
|
+
[
|
38
|
+
render_ingredient_role(ingredient),
|
39
|
+
render_hint_for(ingredient, size: "lg", fixed_width: false)
|
40
|
+
].compact.join(" ").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
|
-
|
41
|
-
|
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
|
-
|
50
|
-
content = "#{checkbox}\n#{label}".html_safe
|
44
|
+
check_box(:page, attribute)
|
51
45
|
end
|
52
46
|
|
53
|
-
content_tag(:label, class: "checkbox") {
|
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
|
22
|
+
# Render a Remix icon
|
23
23
|
#
|
24
|
-
# @param
|
25
|
-
# @
|
26
|
-
# @
|
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(
|
30
|
-
options = {style: "
|
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
|
33
|
-
"
|
34
|
-
"
|
35
|
-
options[:
|
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
|
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
|
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
|