alchemy_cms 4.6.7 → 5.0.0.beta1
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/ci.yml +33 -1
- data/.github/workflows/stale.yml +1 -1
- data/.gitignore +20 -2
- data/.hound.yml +2 -1
- data/.prettierrc +6 -0
- data/.rubocop.yml +31 -10
- data/CHANGELOG.md +89 -32
- data/Gemfile +24 -22
- data/README.md +31 -19
- data/Rakefile +10 -8
- data/alchemy_cms.gemspec +6 -5
- data/app/assets/javascripts/alchemy/admin.js +1 -5
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +2 -1
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -2
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +17 -17
- data/app/assets/javascripts/alchemy/node_select.js +39 -0
- data/app/assets/javascripts/alchemy/templates/index.js +1 -0
- data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
- data/app/assets/stylesheets/alchemy/admin.scss +3 -2
- data/app/assets/stylesheets/alchemy/base.scss +0 -1
- data/app/assets/stylesheets/alchemy/elements.scss +1 -1
- data/app/assets/stylesheets/alchemy/forms.scss +5 -0
- data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
- data/app/assets/stylesheets/alchemy/nodes.scss +1 -1
- data/app/assets/stylesheets/alchemy/sitemap.scss +5 -1
- data/app/assets/stylesheets/alchemy/tables.scss +1 -24
- data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +3 -3
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +7 -7
- data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
- data/app/controllers/alchemy/admin/base_controller.rb +16 -42
- data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
- data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
- data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
- data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
- data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
- data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
- data/app/controllers/alchemy/admin/nodes_controller.rb +5 -4
- data/app/controllers/alchemy/admin/pages_controller.rb +50 -62
- data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
- data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
- data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
- data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
- data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
- data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
- data/app/controllers/alchemy/api/base_controller.rb +2 -2
- data/app/controllers/alchemy/api/contents_controller.rb +4 -4
- data/app/controllers/alchemy/api/elements_controller.rb +8 -8
- data/app/controllers/alchemy/api/nodes_controller.rb +37 -1
- data/app/controllers/alchemy/api/pages_controller.rb +14 -23
- data/app/controllers/alchemy/attachments_controller.rb +5 -5
- data/app/controllers/alchemy/base_controller.rb +10 -9
- data/app/controllers/alchemy/messages_controller.rb +16 -23
- data/app/controllers/alchemy/pages_controller.rb +13 -11
- data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
- data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
- data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
- data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
- data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
- data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
- data/app/decorators/alchemy/element_editor.rb +39 -0
- data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
- data/app/helpers/alchemy/admin/base_helper.rb +36 -35
- data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
- data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
- data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
- data/app/helpers/alchemy/admin/form_helper.rb +1 -1
- data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
- data/app/helpers/alchemy/admin/pages_helper.rb +4 -4
- data/app/helpers/alchemy/admin/pictures_helper.rb +3 -3
- data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
- data/app/helpers/alchemy/base_helper.rb +13 -8
- data/app/helpers/alchemy/elements_block_helper.rb +2 -31
- data/app/helpers/alchemy/elements_helper.rb +12 -58
- data/app/helpers/alchemy/pages_helper.rb +24 -174
- data/app/helpers/alchemy/url_helper.rb +2 -1
- data/app/mailers/alchemy/base_mailer.rb +1 -1
- data/app/mailers/alchemy/messages_mailer.rb +1 -1
- data/app/models/alchemy/attachment.rb +21 -19
- data/app/models/alchemy/base_record.rb +2 -5
- data/app/models/alchemy/content/factory.rb +24 -31
- data/app/models/alchemy/content.rb +33 -38
- data/app/models/alchemy/element/definitions.rb +4 -4
- data/app/models/alchemy/element/element_contents.rb +9 -6
- data/app/models/alchemy/element/element_essences.rb +4 -3
- data/app/models/alchemy/element/presenters.rb +3 -2
- data/app/models/alchemy/element.rb +46 -54
- data/app/models/alchemy/element_to_page.rb +1 -1
- data/app/models/alchemy/essence_boolean.rb +1 -3
- data/app/models/alchemy/essence_date.rb +2 -3
- data/app/models/alchemy/essence_file.rb +4 -4
- data/app/models/alchemy/essence_html.rb +1 -3
- data/app/models/alchemy/essence_link.rb +1 -3
- data/app/models/alchemy/essence_node.rb +18 -0
- data/app/models/alchemy/essence_page.rb +3 -16
- data/app/models/alchemy/essence_picture.rb +17 -16
- data/app/models/alchemy/essence_picture_view.rb +7 -6
- data/app/models/alchemy/essence_richtext.rb +1 -3
- data/app/models/alchemy/essence_select.rb +1 -3
- data/app/models/alchemy/essence_text.rb +0 -2
- data/app/models/alchemy/folded_page.rb +1 -0
- data/app/models/alchemy/language/code.rb +4 -4
- data/app/models/alchemy/language.rb +21 -35
- data/app/models/alchemy/legacy_page_url.rb +1 -1
- data/app/models/alchemy/message.rb +3 -3
- data/app/models/alchemy/node.rb +28 -5
- data/app/models/alchemy/page/fixed_attributes.rb +3 -2
- data/app/models/alchemy/page/page_elements.rb +35 -44
- data/app/models/alchemy/page/page_naming.rb +20 -70
- data/app/models/alchemy/page/page_natures.rb +7 -34
- data/app/models/alchemy/page/page_scopes.rb +23 -29
- data/app/models/alchemy/page/url_path.rb +0 -2
- data/app/models/alchemy/page.rb +47 -128
- data/app/models/alchemy/picture/transformations.rb +9 -7
- data/app/models/alchemy/picture/url.rb +5 -5
- data/app/models/alchemy/picture.rb +19 -28
- data/app/models/alchemy/site/layout.rb +2 -2
- data/app/models/alchemy/site.rb +6 -36
- data/app/models/concerns/alchemy/touch_elements.rb +24 -0
- data/app/serializers/alchemy/content_serializer.rb +0 -3
- data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
- data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
- data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
- data/app/serializers/alchemy/node_serializer.rb +2 -0
- data/app/serializers/alchemy/page_tree_serializer.rb +9 -13
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
- data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
- data/app/views/alchemy/admin/contents/create.js.erb +1 -3
- data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
- data/app/views/alchemy/admin/elements/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
- data/app/views/alchemy/admin/elements/index.html.erb +3 -3
- data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
- data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
- data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
- data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
- data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
- data/app/views/alchemy/admin/languages/index.html.erb +23 -4
- data/app/views/alchemy/admin/languages/new.html.erb +1 -0
- data/app/views/alchemy/admin/layoutpages/index.html.erb +3 -3
- data/app/views/alchemy/admin/nodes/_form.html.erb +18 -15
- data/app/views/alchemy/admin/nodes/_node.html.erb +1 -5
- data/app/views/alchemy/admin/nodes/index.html.erb +3 -4
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
- data/app/views/alchemy/admin/pages/_form.html.erb +0 -1
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
- data/app/views/alchemy/admin/pages/_page.html.erb +11 -19
- data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
- data/app/views/alchemy/admin/pages/info.html.erb +0 -9
- data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
- data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
- data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
- data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
- data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
- data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
- data/app/views/alchemy/admin/sites/index.html.erb +21 -9
- data/app/views/alchemy/admin/sites/new.html.erb +1 -0
- data/app/views/alchemy/admin/tags/index.html.erb +2 -2
- data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
- data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
- data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
- data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
- data/app/views/alchemy/pages/show.rss.builder +3 -2
- data/app/views/layouts/alchemy/admin.html.erb +1 -0
- data/babel.config.js +12 -0
- data/bin/rails +5 -4
- data/config/alchemy/config.yml +15 -18
- data/config/brakeman.ignore +1 -1
- data/config/initializers/assets.rb +2 -1
- data/config/initializers/dragonfly.rb +2 -1
- data/config/initializers/mime_types.rb +1 -0
- data/config/initializers/mini_profiler.rb +3 -2
- data/config/initializers/simple_form.rb +6 -6
- data/config/locales/alchemy.en.yml +23 -8
- data/config/routes.rb +25 -24
- data/config/spring.rb +3 -2
- data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
- data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
- data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
- data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
- data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
- data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
- data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
- data/lib/alchemy/admin/locale.rb +3 -1
- data/lib/alchemy/admin/preview_url.rb +64 -0
- data/lib/alchemy/auth_accessors.rb +8 -7
- data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
- data/lib/alchemy/config.rb +1 -5
- data/lib/alchemy/configuration_methods.rb +3 -1
- data/lib/alchemy/controller_actions.rb +6 -5
- data/lib/alchemy/deprecation.rb +2 -1
- data/lib/alchemy/elements_finder.rb +5 -5
- data/lib/alchemy/engine.rb +22 -14
- data/lib/alchemy/errors.rb +0 -7
- data/lib/alchemy/essence.rb +17 -16
- data/lib/alchemy/filetypes.rb +5 -5
- data/lib/alchemy/forms/builder.rb +4 -4
- data/lib/alchemy/hints.rb +1 -1
- data/lib/alchemy/i18n.rb +2 -1
- data/lib/alchemy/modules.rb +12 -12
- data/lib/alchemy/name_conversions.rb +5 -5
- data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
- data/lib/alchemy/page_layout.rb +15 -12
- data/lib/alchemy/paths.rb +1 -1
- data/lib/alchemy/permissions.rb +7 -6
- data/lib/alchemy/resource.rb +25 -17
- data/lib/alchemy/resources_helper.rb +12 -18
- data/lib/alchemy/routing_constraints.rb +1 -1
- data/lib/alchemy/seeder.rb +42 -14
- data/lib/alchemy/shell.rb +13 -10
- data/lib/alchemy/taggable.rb +1 -0
- data/lib/alchemy/tasks/tidy.rb +4 -3
- data/lib/alchemy/test_support/config_stubbing.rb +1 -0
- data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
- data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
- data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
- data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
- data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
- data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
- data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/language_factory.rb +16 -14
- data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
- data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
- data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
- data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
- data/lib/alchemy/test_support/factories.rb +1 -1
- data/lib/alchemy/test_support/integration_helpers.rb +1 -0
- data/lib/alchemy/test_support/shared_contexts.rb +5 -4
- data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
- data/lib/alchemy/tinymce.rb +15 -13
- data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
- data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
- data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
- data/lib/alchemy/upgrader.rb +8 -7
- data/lib/alchemy/userstamp.rb +1 -1
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +52 -51
- data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
- data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
- data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
- data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
- data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
- data/lib/generators/alchemy/install/install_generator.rb +110 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/menus.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +2 -2
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +1 -1
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +1 -1
- data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
- data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
- data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
- data/lib/tasks/alchemy/db.rake +3 -19
- data/lib/tasks/alchemy/install.rake +3 -2
- data/lib/tasks/alchemy/tidy.rake +9 -8
- data/lib/tasks/alchemy/upgrade.rake +18 -120
- data/package/admin.js +14 -0
- data/package/src/__tests__/i18n.spec.js +70 -0
- data/package/src/i18n.js +48 -0
- data/package/src/node_tree.js +72 -0
- data/package/src/translations.js +32 -0
- data/package/src/utils/__tests__/ajax.spec.js +124 -0
- data/package/src/utils/__tests__/events.spec.js +38 -0
- data/package/src/utils/ajax.js +48 -0
- data/package/src/utils/events.js +16 -0
- data/package.json +45 -0
- data/vendor/assets/fonts/fa-regular-400.eot +0 -0
- data/vendor/assets/fonts/fa-regular-400.svg +798 -358
- 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 +4933 -1408
- 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/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
- data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
- data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
- data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
- data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
- data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
- data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
- data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
- data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
- data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
- data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
- metadata +117 -98
- data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
- data/app/assets/javascripts/alchemy/alchemy.node_tree.js +0 -66
- data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
- data/app/assets/javascripts/alchemy/alchemy.utils.js +0 -45
- data/app/helpers/alchemy/essences_helper.rb +0 -119
- data/app/models/concerns/alchemy/content_touching.rb +0 -23
- data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
- data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
- data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -37
- data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
- data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
- data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
- data/app/views/alchemy/navigation/_link.html.erb +0 -19
- data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
- data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
- data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
- data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
- data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
- data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
- data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
- data/lib/alchemy/error_tracking/airbrake_handler.rb +0 -13
- data/lib/alchemy/error_tracking.rb +0 -14
- data/lib/alchemy/ssl_protection.rb +0 -34
- data/lib/alchemy/tasks/helpers.rb +0 -81
- data/lib/alchemy/test_support/controller_requests.rb +0 -93
- data/lib/alchemy/upgrader/four_point_four.rb +0 -52
- data/lib/alchemy/upgrader/four_point_one.rb +0 -42
- data/lib/alchemy/upgrader/four_point_six.rb +0 -50
- data/lib/alchemy/upgrader/four_point_two.rb +0 -86
- data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -45
- data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -166
- data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -32
- data/lib/alchemy/upgrader/tasks/fixed_element_name_finder.rb +0 -31
- data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
- data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
- data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
- data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
- data/lib/tasks/alchemy/convert.rake +0 -98
- data/vendor/assets/javascripts/sortable/Sortable.min.js +0 -2
- data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
- data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Alchemy
|
|
2
3
|
module Admin
|
|
3
4
|
module ArchiveOverlay
|
|
@@ -11,8 +12,8 @@ module Alchemy
|
|
|
11
12
|
@content = Content.find_by(id: params[:content_id])
|
|
12
13
|
|
|
13
14
|
respond_to do |format|
|
|
14
|
-
format.html { render partial:
|
|
15
|
-
format.js { render action:
|
|
15
|
+
format.html { render partial: "archive_overlay" }
|
|
16
|
+
format.js { render action: "archive_overlay" }
|
|
16
17
|
end
|
|
17
18
|
end
|
|
18
19
|
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Alchemy
|
|
4
|
+
module Admin
|
|
5
|
+
module CurrentLanguage
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
before_action :load_current_language
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def load_current_language
|
|
15
|
+
@current_language = Alchemy::Language.current
|
|
16
|
+
if @current_language.nil?
|
|
17
|
+
flash[:warning] = Alchemy.t("Please create a language first.")
|
|
18
|
+
redirect_to admin_languages_path
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -8,12 +8,12 @@ module Alchemy
|
|
|
8
8
|
def successful_uploader_response(file:, status: :created)
|
|
9
9
|
message = Alchemy.t(:upload_success,
|
|
10
10
|
scope: [:uploader, file.class.model_name.i18n_key],
|
|
11
|
-
name: file.name
|
|
11
|
+
name: file.name,
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
{
|
|
15
15
|
json: uploader_response(file: file, message: message),
|
|
16
|
-
status: status
|
|
16
|
+
status: status,
|
|
17
17
|
}
|
|
18
18
|
end
|
|
19
19
|
|
|
@@ -21,12 +21,12 @@ module Alchemy
|
|
|
21
21
|
message = Alchemy.t(:upload_failure,
|
|
22
22
|
scope: [:uploader, file.class.model_name.i18n_key],
|
|
23
23
|
error: file.errors[:file].join,
|
|
24
|
-
name: file.name
|
|
24
|
+
name: file.name,
|
|
25
25
|
)
|
|
26
26
|
|
|
27
27
|
{
|
|
28
28
|
json: uploader_response(file: file, message: message),
|
|
29
|
-
status: :unprocessable_entity
|
|
29
|
+
status: :unprocessable_entity,
|
|
30
30
|
}
|
|
31
31
|
end
|
|
32
32
|
|
|
@@ -35,7 +35,7 @@ module Alchemy
|
|
|
35
35
|
def uploader_response(file:, message:)
|
|
36
36
|
{
|
|
37
37
|
files: [file.to_jq_upload],
|
|
38
|
-
growl_message: message
|
|
38
|
+
growl_message: message,
|
|
39
39
|
}
|
|
40
40
|
end
|
|
41
41
|
end
|
|
@@ -36,18 +36,18 @@ module Alchemy
|
|
|
36
36
|
|
|
37
37
|
alchemy.show_page_path(
|
|
38
38
|
locale: prefix_locale? ? page.language_code : nil,
|
|
39
|
-
urlname: page.urlname
|
|
39
|
+
urlname: page.urlname,
|
|
40
40
|
)
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def legacy_urls
|
|
44
44
|
# /slug/tree => slug/tree
|
|
45
|
-
urlname = (request.fullpath[1..-1] if request.fullpath[0] ==
|
|
45
|
+
urlname = (request.fullpath[1..-1] if request.fullpath[0] == "/") || request.fullpath
|
|
46
46
|
LegacyPageUrl.joins(:page).where(
|
|
47
47
|
urlname: urlname,
|
|
48
48
|
Page.table_name => {
|
|
49
|
-
language_id: Language.current.id
|
|
50
|
-
}
|
|
49
|
+
language_id: Language.current.id,
|
|
50
|
+
},
|
|
51
51
|
)
|
|
52
52
|
end
|
|
53
53
|
|
|
@@ -27,8 +27,7 @@ module Alchemy
|
|
|
27
27
|
# @return NilClass
|
|
28
28
|
#
|
|
29
29
|
def redirect_url
|
|
30
|
-
@_redirect_url ||= public_child_redirect_url ||
|
|
31
|
-
locale_prefixed_url || nil
|
|
30
|
+
@_redirect_url ||= public_child_redirect_url || locale_prefixed_url || nil
|
|
32
31
|
end
|
|
33
32
|
|
|
34
33
|
def locale_prefixed_url
|
|
@@ -48,17 +47,11 @@ module Alchemy
|
|
|
48
47
|
end
|
|
49
48
|
end
|
|
50
49
|
|
|
51
|
-
def controller_and_action_url
|
|
52
|
-
return unless @page.definition['controller']
|
|
53
|
-
|
|
54
|
-
main_app.url_for(@page.controller_and_action)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
50
|
# Page url with or without locale while keeping all additional params
|
|
58
51
|
def page_redirect_url(options = {})
|
|
59
52
|
options = {
|
|
60
53
|
locale: prefix_locale? ? @page.language_code : nil,
|
|
61
|
-
urlname: @page.urlname
|
|
54
|
+
urlname: @page.urlname,
|
|
62
55
|
}.merge(options)
|
|
63
56
|
|
|
64
57
|
alchemy.show_page_path additional_params.merge(options)
|
|
@@ -16,8 +16,8 @@ module Alchemy
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def needs_redirect_to_primary_host?
|
|
19
|
-
current_alchemy_site
|
|
20
|
-
current_alchemy_site.host !=
|
|
19
|
+
current_alchemy_site&.redirect_to_primary_host? &&
|
|
20
|
+
current_alchemy_site.host != "*" &&
|
|
21
21
|
current_alchemy_site.host != request.host
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Alchemy
|
|
4
|
+
class ElementEditor < SimpleDelegator
|
|
5
|
+
alias_method :element, :__getobj__
|
|
6
|
+
|
|
7
|
+
def to_partial_path
|
|
8
|
+
"alchemy/admin/elements/element"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# CSS classes for the element editor partial.
|
|
12
|
+
def css_classes
|
|
13
|
+
[
|
|
14
|
+
"element-editor",
|
|
15
|
+
content_definitions.present? ? "with-contents" : "without-contents",
|
|
16
|
+
nestable_elements.any? ? "nestable" : "not-nestable",
|
|
17
|
+
taggable? ? "taggable" : "not-taggable",
|
|
18
|
+
folded ? "folded" : "expanded",
|
|
19
|
+
compact? ? "compact" : nil,
|
|
20
|
+
fixed? ? "is-fixed" : "not-fixed",
|
|
21
|
+
].join(" ")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Tells us, if we should show the element footer and form inputs.
|
|
25
|
+
def editable?
|
|
26
|
+
return false if folded?
|
|
27
|
+
|
|
28
|
+
content_definitions.present? || taggable?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Fixes Rails partial renderer calling to_model on the object
|
|
32
|
+
# which reveals the delegated element instead of this decorator.
|
|
33
|
+
def respond_to?(method_name)
|
|
34
|
+
return false if method_name == :to_model
|
|
35
|
+
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -6,17 +6,17 @@ module Alchemy
|
|
|
6
6
|
include Alchemy::Admin::BaseHelper
|
|
7
7
|
|
|
8
8
|
def mime_to_human(mime)
|
|
9
|
-
Alchemy.t(mime, scope:
|
|
9
|
+
Alchemy.t(mime, scope: "mime_types", default: Alchemy.t(:document))
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def attachment_preview_size(attachment)
|
|
13
13
|
case attachment.icon_css_class
|
|
14
|
-
when
|
|
15
|
-
when
|
|
16
|
-
when
|
|
17
|
-
when
|
|
14
|
+
when "image" then "600x475"
|
|
15
|
+
when "audio" then "600x190"
|
|
16
|
+
when "video" then "600x485"
|
|
17
|
+
when "pdf" then "600x500"
|
|
18
18
|
else
|
|
19
|
-
|
|
19
|
+
"600x145"
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
end
|
|
@@ -23,7 +23,7 @@ module Alchemy
|
|
|
23
23
|
def current_alchemy_user_name
|
|
24
24
|
name = current_alchemy_user.try(:alchemy_display_name)
|
|
25
25
|
if name.present?
|
|
26
|
-
content_tag :span, "#{Alchemy.t(
|
|
26
|
+
content_tag :span, "#{Alchemy.t("Logged in as")} #{name}", class: "current-user-name"
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -55,7 +55,7 @@ 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("data-alchemy-dialog" => options.to_json)
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
# Used for translations selector in Alchemy cockpit user settings.
|
|
@@ -99,13 +99,13 @@ module Alchemy
|
|
|
99
99
|
#
|
|
100
100
|
def js_filter_field(items, options = {})
|
|
101
101
|
options = {
|
|
102
|
-
class:
|
|
103
|
-
data: {
|
|
102
|
+
class: "js_filter_field",
|
|
103
|
+
data: {"alchemy-list-filter" => items},
|
|
104
104
|
}.merge(options)
|
|
105
|
-
content_tag(:div, class:
|
|
105
|
+
content_tag(:div, class: "js_filter_field_box") do
|
|
106
106
|
concat text_field_tag(nil, nil, options)
|
|
107
107
|
concat render_icon(:search)
|
|
108
|
-
concat link_to(render_icon(:times, size:
|
|
108
|
+
concat link_to(render_icon(:times, size: "xs"), "", class: "js_filter_field_clear", title: Alchemy.t(:click_to_show_all))
|
|
109
109
|
end
|
|
110
110
|
end
|
|
111
111
|
|
|
@@ -136,12 +136,12 @@ module Alchemy
|
|
|
136
136
|
def link_to_confirm_dialog(link_string = "", message = "", url = "", html_options = {})
|
|
137
137
|
link_to(link_string, url,
|
|
138
138
|
html_options.merge(
|
|
139
|
-
|
|
139
|
+
"data-alchemy-confirm-delete" => {
|
|
140
140
|
title: Alchemy.t(:please_confirm),
|
|
141
141
|
message: message,
|
|
142
142
|
ok_label: Alchemy.t("Yes"),
|
|
143
|
-
cancel_label: Alchemy.t("No")
|
|
144
|
-
}.to_json
|
|
143
|
+
cancel_label: Alchemy.t("No"),
|
|
144
|
+
}.to_json,
|
|
145
145
|
)
|
|
146
146
|
)
|
|
147
147
|
end
|
|
@@ -170,10 +170,10 @@ module Alchemy
|
|
|
170
170
|
message: Alchemy.t(:confirm_to_proceed),
|
|
171
171
|
ok_label: Alchemy.t("Yes"),
|
|
172
172
|
title: Alchemy.t(:please_confirm),
|
|
173
|
-
cancel_label: Alchemy.t("No")
|
|
173
|
+
cancel_label: Alchemy.t("No"),
|
|
174
174
|
}.merge(options)
|
|
175
|
-
form_tag url, {method: html_options.delete(:method), class:
|
|
176
|
-
button_tag value, html_options.merge(
|
|
175
|
+
form_tag url, {method: html_options.delete(:method), class: "button-with-confirm"} do
|
|
176
|
+
button_tag value, html_options.merge("data-alchemy-confirm" => options.to_json)
|
|
177
177
|
end
|
|
178
178
|
end
|
|
179
179
|
|
|
@@ -188,18 +188,18 @@ module Alchemy
|
|
|
188
188
|
#
|
|
189
189
|
def delete_button(url, options = {}, html_options = {})
|
|
190
190
|
options = {
|
|
191
|
-
title: Alchemy.t(
|
|
192
|
-
message: Alchemy.t(
|
|
193
|
-
icon: :minus
|
|
191
|
+
title: Alchemy.t("Delete"),
|
|
192
|
+
message: Alchemy.t("Are you sure?"),
|
|
193
|
+
icon: :minus,
|
|
194
194
|
}.merge(options)
|
|
195
195
|
button_with_confirm(
|
|
196
196
|
render_icon(options[:icon]),
|
|
197
197
|
url, {
|
|
198
|
-
message: options[:message]
|
|
198
|
+
message: options[:message],
|
|
199
199
|
}, {
|
|
200
|
-
method:
|
|
200
|
+
method: "delete",
|
|
201
201
|
title: options[:title],
|
|
202
|
-
class: "icon_button #{html_options.delete(:class)}".strip
|
|
202
|
+
class: "icon_button #{html_options.delete(:class)}".strip,
|
|
203
203
|
}.merge(html_options)
|
|
204
204
|
)
|
|
205
205
|
end
|
|
@@ -259,11 +259,11 @@ module Alchemy
|
|
|
259
259
|
active: false,
|
|
260
260
|
link_options: {},
|
|
261
261
|
dialog_options: {},
|
|
262
|
-
loading_indicator: false
|
|
262
|
+
loading_indicator: false,
|
|
263
263
|
}.merge(options.symbolize_keys)
|
|
264
264
|
button = render(
|
|
265
|
-
|
|
266
|
-
options: options
|
|
265
|
+
"alchemy/admin/partials/toolbar_button",
|
|
266
|
+
options: options,
|
|
267
267
|
)
|
|
268
268
|
if options[:skip_permission_check] || can?(*permission_from_options(options))
|
|
269
269
|
button
|
|
@@ -302,13 +302,13 @@ module Alchemy
|
|
|
302
302
|
def toolbar(options = {})
|
|
303
303
|
defaults = {
|
|
304
304
|
buttons: [],
|
|
305
|
-
search: true
|
|
305
|
+
search: true,
|
|
306
306
|
}
|
|
307
307
|
options = defaults.merge(options)
|
|
308
308
|
content_for(:toolbar) do
|
|
309
309
|
content = <<-CONTENT.strip_heredoc
|
|
310
310
|
#{options[:buttons].map { |button_options| toolbar_button(button_options) }.join}
|
|
311
|
-
#{render(
|
|
311
|
+
#{render("alchemy/admin/partials/search_form", url: options[:search_url]) if options[:search]}
|
|
312
312
|
CONTENT
|
|
313
313
|
content.html_safe
|
|
314
314
|
end
|
|
@@ -360,7 +360,7 @@ module Alchemy
|
|
|
360
360
|
# The value the input displays. If you pass a String its parsed with +Time.parse+
|
|
361
361
|
#
|
|
362
362
|
def alchemy_datepicker(object, method, html_options = {})
|
|
363
|
-
type = html_options.delete(:type) ||
|
|
363
|
+
type = html_options.delete(:type) || "date"
|
|
364
364
|
date = html_options.delete(:value) || object.send(method.to_sym).presence
|
|
365
365
|
date = Time.zone.parse(date) if date.is_a?(String)
|
|
366
366
|
value = date ? date.iso8601 : nil
|
|
@@ -373,9 +373,10 @@ module Alchemy
|
|
|
373
373
|
# The model class needs to include the hints module
|
|
374
374
|
def render_hint_for(element)
|
|
375
375
|
return unless element.has_hint?
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
376
|
+
|
|
377
|
+
content_tag :span, class: "hint-with-icon" do
|
|
378
|
+
render_icon("question-circle") +
|
|
379
|
+
content_tag(:span, element.hint.html_safe, class: "hint-bubble")
|
|
379
380
|
end
|
|
380
381
|
end
|
|
381
382
|
|
|
@@ -385,7 +386,7 @@ module Alchemy
|
|
|
385
386
|
controller_name,
|
|
386
387
|
action_name,
|
|
387
388
|
content_for(:main_menu_style),
|
|
388
|
-
content_for(:alchemy_body_class)
|
|
389
|
+
content_for(:alchemy_body_class),
|
|
389
390
|
].compact
|
|
390
391
|
end
|
|
391
392
|
|
|
@@ -404,7 +405,7 @@ module Alchemy
|
|
|
404
405
|
|
|
405
406
|
# Returns the regular expression used for external url validation in link dialog.
|
|
406
407
|
def link_url_regexp
|
|
407
|
-
Alchemy::Config.get(:format_matchers)[
|
|
408
|
+
Alchemy::Config.get(:format_matchers)["link_url"] || /^(mailto:|\/|[a-z]+:\/\/)/
|
|
408
409
|
end
|
|
409
410
|
|
|
410
411
|
# Renders a hint with tooltip
|
|
@@ -417,9 +418,9 @@ module Alchemy
|
|
|
417
418
|
# @param icon: 'exclamation-triangle' [String] - Icon name
|
|
418
419
|
#
|
|
419
420
|
# @return [String]
|
|
420
|
-
def hint_with_tooltip(text, icon:
|
|
421
|
-
content_tag :span, class:
|
|
422
|
-
render_icon(icon) + content_tag(:span, text, class:
|
|
421
|
+
def hint_with_tooltip(text, icon: "exclamation-triangle")
|
|
422
|
+
content_tag :span, class: "hint-with-icon" do
|
|
423
|
+
render_icon(icon) + content_tag(:span, text, class: "hint-bubble")
|
|
423
424
|
end
|
|
424
425
|
end
|
|
425
426
|
|
|
@@ -427,7 +428,7 @@ module Alchemy
|
|
|
427
428
|
# that explains the user that the page layout is missing
|
|
428
429
|
def page_layout_missing_warning
|
|
429
430
|
hint_with_tooltip(
|
|
430
|
-
Alchemy.t(:page_definition_missing)
|
|
431
|
+
Alchemy.t(:page_definition_missing),
|
|
431
432
|
)
|
|
432
433
|
end
|
|
433
434
|
|
|
@@ -442,10 +443,10 @@ module Alchemy
|
|
|
442
443
|
end
|
|
443
444
|
|
|
444
445
|
def permission_array_from_url(options)
|
|
445
|
-
action_controller = options[:url].gsub(/\A\//,
|
|
446
|
+
action_controller = options[:url].gsub(/\A\//, "").split("/")
|
|
446
447
|
[
|
|
447
448
|
action_controller.last.to_sym,
|
|
448
|
-
action_controller[0..action_controller.length - 2].join(
|
|
449
|
+
action_controller[0..action_controller.length - 2].join("_").to_sym,
|
|
449
450
|
]
|
|
450
451
|
end
|
|
451
452
|
end
|
|
@@ -13,7 +13,7 @@ module Alchemy
|
|
|
13
13
|
#
|
|
14
14
|
def render_content_name(content)
|
|
15
15
|
if content.blank?
|
|
16
|
-
warning(
|
|
16
|
+
warning("Content is nil")
|
|
17
17
|
return
|
|
18
18
|
end
|
|
19
19
|
|
|
@@ -23,7 +23,7 @@ module Alchemy
|
|
|
23
23
|
warning("Content #{content.name} is missing its definition")
|
|
24
24
|
|
|
25
25
|
icon = hint_with_tooltip(
|
|
26
|
-
Alchemy.t(:content_definition_missing)
|
|
26
|
+
Alchemy.t(:content_definition_missing),
|
|
27
27
|
)
|
|
28
28
|
|
|
29
29
|
content_name = "#{icon} #{content_name}".html_safe
|
|
@@ -39,7 +39,7 @@ module Alchemy
|
|
|
39
39
|
# Renders the label and a remove link for a content.
|
|
40
40
|
def content_label(content)
|
|
41
41
|
content_tag :label, for: content.form_field_id do
|
|
42
|
-
[render_hint_for(content), render_content_name(content)].compact.join(
|
|
42
|
+
[render_hint_for(content), render_content_name(content)].compact.join(" ").html_safe
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
|
@@ -3,76 +3,9 @@
|
|
|
3
3
|
module Alchemy
|
|
4
4
|
module Admin
|
|
5
5
|
module ElementsHelper
|
|
6
|
-
include Alchemy::ElementsBlockHelper
|
|
7
|
-
include Alchemy::Admin::BaseHelper
|
|
8
6
|
include Alchemy::Admin::ContentsHelper
|
|
9
7
|
include Alchemy::Admin::EssencesHelper
|
|
10
8
|
|
|
11
|
-
# Renders a {Alchemy::Element} editor partial.
|
|
12
|
-
#
|
|
13
|
-
# A element editor partial is the form presented to the content author in page edit mode.
|
|
14
|
-
#
|
|
15
|
-
# The partial is located in <tt>app/views/alchemy/elements</tt>.
|
|
16
|
-
#
|
|
17
|
-
# == Partial naming
|
|
18
|
-
#
|
|
19
|
-
# The partials have to be named after the name of the element as defined in the <tt>elements.yml</tt> file and has to be suffixed with <tt>_editor</tt>.
|
|
20
|
-
#
|
|
21
|
-
# === Example
|
|
22
|
-
#
|
|
23
|
-
# Given a headline element
|
|
24
|
-
#
|
|
25
|
-
# # elements.yml
|
|
26
|
-
# - name: headline
|
|
27
|
-
# contents:
|
|
28
|
-
# - name: text
|
|
29
|
-
# type: EssenceText
|
|
30
|
-
#
|
|
31
|
-
# Then your element editor partial has to be named:
|
|
32
|
-
#
|
|
33
|
-
# app/views/alchemy/elements/_headline_editor.html.{erb|haml|slim}
|
|
34
|
-
#
|
|
35
|
-
# === Element partials generator
|
|
36
|
-
#
|
|
37
|
-
# You can use this handy generator to let Alchemy generate the partials for you:
|
|
38
|
-
#
|
|
39
|
-
# $ rails generate alchemy:elements --skip
|
|
40
|
-
#
|
|
41
|
-
# == Usage
|
|
42
|
-
#
|
|
43
|
-
# <%= render_editor(Alchemy::Element.published.named(:headline).first) %>
|
|
44
|
-
#
|
|
45
|
-
# @param [Alchemy::Element] element
|
|
46
|
-
# The element you want to render the editor for
|
|
47
|
-
#
|
|
48
|
-
# @note If the partial is not found
|
|
49
|
-
# <tt>alchemy/elements/_editor_not_found.html.erb</tt> gets rendered.
|
|
50
|
-
#
|
|
51
|
-
# @deprecated Using element editor partials is deprecated and will be removed in Alchemy 5.0
|
|
52
|
-
def render_editor(element)
|
|
53
|
-
if element.nil?
|
|
54
|
-
warning('Element is nil')
|
|
55
|
-
render "alchemy/elements/editor_not_found", {name: 'nil'}
|
|
56
|
-
return
|
|
57
|
-
end
|
|
58
|
-
Alchemy::Deprecation.warn <<~WARN
|
|
59
|
-
Using element editor partials is deprecated and will be removed in Alchemy 5.0.
|
|
60
|
-
You can delete the `app/views/alchemy/elements/_#{element.name}_editor` partial
|
|
61
|
-
and Alchemy will render the content editors for you.
|
|
62
|
-
WARN
|
|
63
|
-
|
|
64
|
-
render "alchemy/elements/#{element.name}_editor", element: element
|
|
65
|
-
rescue ActionView::MissingTemplate => e
|
|
66
|
-
warning(%(
|
|
67
|
-
Element editor partial not found for #{element.name}.\n
|
|
68
|
-
#{e}
|
|
69
|
-
))
|
|
70
|
-
render "alchemy/elements/editor_not_found", {
|
|
71
|
-
name: element.name,
|
|
72
|
-
error: "Element editor partial not found.<br>Use <code>rails generate alchemy:elements</code> to generate it."
|
|
73
|
-
}
|
|
74
|
-
end
|
|
75
|
-
|
|
76
9
|
# Returns an elements array for select helper.
|
|
77
10
|
#
|
|
78
11
|
# @param [Array] elements definitions
|
|
@@ -80,32 +13,14 @@ module Alchemy
|
|
|
80
13
|
#
|
|
81
14
|
def elements_for_select(elements)
|
|
82
15
|
return [] if elements.nil?
|
|
16
|
+
|
|
83
17
|
elements.collect do |e|
|
|
84
18
|
[
|
|
85
|
-
Element.display_name_for(e[
|
|
86
|
-
e[
|
|
19
|
+
Element.display_name_for(e["name"]),
|
|
20
|
+
e["name"],
|
|
87
21
|
]
|
|
88
22
|
end
|
|
89
23
|
end
|
|
90
|
-
|
|
91
|
-
# CSS classes for the element editor partial.
|
|
92
|
-
def element_editor_classes(element)
|
|
93
|
-
[
|
|
94
|
-
'element-editor',
|
|
95
|
-
element.content_definitions.present? ? 'with-contents' : 'without-contents',
|
|
96
|
-
element.nestable_elements.any? ? 'nestable' : 'not-nestable',
|
|
97
|
-
element.taggable? ? 'taggable' : 'not-taggable',
|
|
98
|
-
element.folded ? 'folded' : 'expanded',
|
|
99
|
-
element.compact? ? 'compact' : nil,
|
|
100
|
-
element.fixed? ? 'is-fixed' : 'not-fixed'
|
|
101
|
-
].join(' ')
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Tells us, if we should show the element footer and form inputs.
|
|
105
|
-
def element_editable?(element)
|
|
106
|
-
return false if element.folded?
|
|
107
|
-
element.content_definitions.present? || element.taggable?
|
|
108
|
-
end
|
|
109
24
|
end
|
|
110
25
|
end
|
|
111
26
|
end
|