alchemy_cms 4.6.1 → 5.0.0
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 +30 -9
- data/CHANGELOG.md +102 -1
- data/Gemfile +24 -22
- data/README.md +32 -20
- data/Rakefile +11 -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/navigation.scss +1 -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/alchemy/tags.scss +2 -2
- data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
- data/app/controllers/alchemy/admin/base_controller.rb +13 -33
- 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 +51 -63
- 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 +38 -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 +4 -6
- 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 +4 -3
- data/app/mailers/alchemy/base_mailer.rb +1 -1
- data/app/mailers/alchemy/messages_mailer.rb +1 -1
- data/app/models/alchemy/attachment.rb +24 -19
- data/app/models/alchemy/base_record.rb +2 -5
- data/app/models/alchemy/content.rb +33 -38
- data/app/models/alchemy/content/factory.rb +24 -31
- data/app/models/alchemy/element.rb +45 -53
- 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_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 +5 -5
- 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 +18 -17
- 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.rb +21 -35
- data/app/models/alchemy/language/code.rb +4 -4
- data/app/models/alchemy/legacy_page_url.rb +1 -1
- data/app/models/alchemy/message.rb +3 -3
- data/app/models/alchemy/node.rb +27 -4
- data/app/models/alchemy/page.rb +46 -127
- 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/picture.rb +40 -30
- data/app/models/alchemy/picture/preprocessor.rb +26 -0
- data/app/models/alchemy/picture/transformations.rb +9 -7
- data/app/models/alchemy/picture/url.rb +9 -7
- data/app/models/alchemy/site.rb +6 -36
- data/app/models/alchemy/site/layout.rb +2 -2
- 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/pictures/index.html.erb +18 -3
- data/app/views/alchemy/admin/pictures/show.html.erb +1 -1
- 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/resources/index.html.erb +21 -22
- 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_file_view.html.erb +1 -1
- 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 +23 -16
- 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 +85 -0
- data/lib/alchemy/auth_accessors.rb +8 -7
- data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
- data/lib/alchemy/config.rb +3 -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 +23 -8
- 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/install/tasks.rb +41 -0
- 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 -15
- 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.rb +1 -1
- 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 +21 -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/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.rb +8 -7
- 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/version.rb +1 -1
- data/lib/alchemy_cms.rb +52 -50
- 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 +169 -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 +5 -48
- data/lib/tasks/alchemy/tidy.rake +9 -8
- data/lib/tasks/alchemy/upgrade.rake +18 -116
- data/package.json +45 -0
- 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/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 +112 -88
- 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/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 -85
- data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -43
- data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -148
- data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -28
- 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 -97
- 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
|
@@ -4,12 +4,10 @@ module Alchemy
|
|
|
4
4
|
module Admin
|
|
5
5
|
module PicturesHelper
|
|
6
6
|
def preview_size(size)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
'160x120'
|
|
12
|
-
end
|
|
7
|
+
Alchemy::Picture::THUMBNAIL_SIZES.fetch(
|
|
8
|
+
size,
|
|
9
|
+
Alchemy::Picture::THUMBNAIL_SIZES[:medium]
|
|
10
|
+
)
|
|
13
11
|
end
|
|
14
12
|
end
|
|
15
13
|
end
|
|
@@ -12,17 +12,18 @@ module Alchemy
|
|
|
12
12
|
# A HTML string containing <tt><li></tt> tags
|
|
13
13
|
#
|
|
14
14
|
def render_tag_list(class_name)
|
|
15
|
-
raise ArgumentError,
|
|
15
|
+
raise ArgumentError, "Please provide a String as class_name" if class_name.nil?
|
|
16
|
+
|
|
16
17
|
sorted_tags_from(class_name: class_name).map do |tag|
|
|
17
|
-
content_tag(
|
|
18
|
+
content_tag("li", name: tag.name, class: filtered_by_tag?(tag) ? "active" : nil) do
|
|
18
19
|
link_to(
|
|
19
20
|
"#{tag.name} (#{tag.taggings_count})",
|
|
20
21
|
url_for(
|
|
21
22
|
search_filter_params.except(:page, :tagged_with).merge(
|
|
22
|
-
tagged_with: tags_for_filter(current: tag).presence
|
|
23
|
-
)
|
|
23
|
+
tagged_with: tags_for_filter(current: tag).presence,
|
|
24
|
+
),
|
|
24
25
|
),
|
|
25
|
-
remote: request.xhr
|
|
26
|
+
remote: request.xhr?,
|
|
26
27
|
)
|
|
27
28
|
end
|
|
28
29
|
end.join.html_safe
|
|
@@ -43,13 +44,13 @@ module Alchemy
|
|
|
43
44
|
tags_from_params - Array(current.name)
|
|
44
45
|
else
|
|
45
46
|
tags_from_params.push(current.name)
|
|
46
|
-
end.uniq.join(
|
|
47
|
+
end.uniq.join(",")
|
|
47
48
|
end
|
|
48
49
|
|
|
49
50
|
# Returns tags from params
|
|
50
51
|
# @returns [Array]
|
|
51
52
|
def tags_from_params
|
|
52
|
-
search_filter_params[:tagged_with].to_s.split(
|
|
53
|
+
search_filter_params[:tagged_with].to_s.split(",")
|
|
53
54
|
end
|
|
54
55
|
|
|
55
56
|
def sorted_tags_from(class_name:)
|
|
@@ -27,16 +27,16 @@ module Alchemy
|
|
|
27
27
|
#
|
|
28
28
|
# @return [String]
|
|
29
29
|
def render_icon(icon_class, options = {})
|
|
30
|
-
options = {style:
|
|
30
|
+
options = {style: "solid"}.merge(options)
|
|
31
31
|
classes = [
|
|
32
32
|
"icon fa-fw",
|
|
33
33
|
"fa-#{icon_class}",
|
|
34
34
|
"fa#{options[:style].first}",
|
|
35
35
|
options[:size] ? "fa-#{options[:size]}" : nil,
|
|
36
36
|
options[:transform] ? "fa-#{options[:transform]}" : nil,
|
|
37
|
-
options[:class]
|
|
37
|
+
options[:class],
|
|
38
38
|
].compact
|
|
39
|
-
content_tag(
|
|
39
|
+
content_tag("i", nil, class: classes)
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
# Returns a div with an icon and the passed content
|
|
@@ -64,19 +64,24 @@ module Alchemy
|
|
|
64
64
|
# @param [Symbol] style The style of this flash. Valid values are +:notice+ (default), +:warn+ and +:error+
|
|
65
65
|
#
|
|
66
66
|
def render_flash_notice(notice, style = :notice)
|
|
67
|
-
render(
|
|
67
|
+
render("alchemy/admin/partials/flash", flash_type: style, message: notice)
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# Checks if the given argument is a String or a Page object.
|
|
71
71
|
# If a String is given, it tries to find the page via page_layout
|
|
72
72
|
# Logs a warning if no page is given.
|
|
73
73
|
def page_or_find(page)
|
|
74
|
+
unless Language.current
|
|
75
|
+
warning("No default language set up")
|
|
76
|
+
return nil
|
|
77
|
+
end
|
|
78
|
+
|
|
74
79
|
if page.is_a?(String)
|
|
75
80
|
page = Language.current.pages.find_by(page_layout: page)
|
|
76
81
|
end
|
|
77
82
|
if page.blank?
|
|
78
83
|
warning("No Page found for #{page.inspect}")
|
|
79
|
-
|
|
84
|
+
nil
|
|
80
85
|
else
|
|
81
86
|
page
|
|
82
87
|
end
|
|
@@ -88,9 +93,9 @@ module Alchemy
|
|
|
88
93
|
# @return [String] The FontAwesome icon name
|
|
89
94
|
def message_icon_class(message_type)
|
|
90
95
|
case message_type.to_s
|
|
91
|
-
when
|
|
92
|
-
when
|
|
93
|
-
when
|
|
96
|
+
when "warning", "warn", "alert" then "exclamation"
|
|
97
|
+
when "notice" then "check"
|
|
98
|
+
when "error" then "bug"
|
|
94
99
|
else
|
|
95
100
|
message_type
|
|
96
101
|
end
|
|
@@ -33,7 +33,7 @@ module Alchemy
|
|
|
33
33
|
helpers.render(content, {
|
|
34
34
|
content: content,
|
|
35
35
|
options: options,
|
|
36
|
-
html_options: html_options
|
|
36
|
+
html_options: html_options,
|
|
37
37
|
})
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -62,15 +62,6 @@ module Alchemy
|
|
|
62
62
|
end
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
# Block-level helper class for element editors.
|
|
66
|
-
# @deprecated
|
|
67
|
-
class ElementEditorHelper < BlockHelper
|
|
68
|
-
def edit(name, *args)
|
|
69
|
-
helpers.render_essence_editor_by_name(element, name.to_s, *args)
|
|
70
|
-
end
|
|
71
|
-
deprecate :edit, deprecator: Alchemy::Deprecation
|
|
72
|
-
end
|
|
73
|
-
|
|
74
65
|
# Block-level helper for element views. Constructs a DOM element wrapping
|
|
75
66
|
# your content element and provides a block helper object you can use for
|
|
76
67
|
# concise access to Alchemy's various helpers.
|
|
@@ -116,7 +107,7 @@ module Alchemy
|
|
|
116
107
|
tag: :div,
|
|
117
108
|
id: element_dom_id(element),
|
|
118
109
|
class: element.name,
|
|
119
|
-
tags_formatter: ->(tags) { tags.join(" ") }
|
|
110
|
+
tags_formatter: ->(tags) { tags.join(" ") },
|
|
120
111
|
}.merge(options)
|
|
121
112
|
|
|
122
113
|
# capture inner template block
|
|
@@ -140,25 +131,5 @@ module Alchemy
|
|
|
140
131
|
# that's it!
|
|
141
132
|
output
|
|
142
133
|
end
|
|
143
|
-
|
|
144
|
-
# Block-level helper for element editors. Provides a block helper object
|
|
145
|
-
# you can use for concise access to Alchemy's various helpers.
|
|
146
|
-
#
|
|
147
|
-
# === Example:
|
|
148
|
-
#
|
|
149
|
-
# <%= element_editor_for(element) do |el| %>
|
|
150
|
-
# <%= el.edit :title %>
|
|
151
|
-
# <%= el.edit :body %>
|
|
152
|
-
# <%= el.edit :target_url %>
|
|
153
|
-
# <% end %>
|
|
154
|
-
#
|
|
155
|
-
# @param [Alchemy::Element] element
|
|
156
|
-
# The element to display.
|
|
157
|
-
#
|
|
158
|
-
def element_editor_for(element)
|
|
159
|
-
capture do
|
|
160
|
-
yield ElementEditorHelper.new(self, element: element) if block_given?
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
134
|
end
|
|
164
135
|
end
|
|
@@ -6,7 +6,6 @@ module Alchemy
|
|
|
6
6
|
# The most important helper for frontend developers is the {#render_elements} helper.
|
|
7
7
|
#
|
|
8
8
|
module ElementsHelper
|
|
9
|
-
include Alchemy::EssencesHelper
|
|
10
9
|
include Alchemy::UrlHelper
|
|
11
10
|
include Alchemy::ElementsBlockHelper
|
|
12
11
|
|
|
@@ -92,19 +91,9 @@ module Alchemy
|
|
|
92
91
|
def render_elements(options = {})
|
|
93
92
|
options = {
|
|
94
93
|
from_page: @page,
|
|
95
|
-
render_format:
|
|
94
|
+
render_format: "html",
|
|
96
95
|
}.update(options)
|
|
97
96
|
|
|
98
|
-
if options[:sort_by]
|
|
99
|
-
Alchemy::Deprecation.warn "options[:sort_by] has been removed without replacement. " \
|
|
100
|
-
"Please implement your own element sorting by passing a custom finder instance to options[:finder]."
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
if options[:from_cell]
|
|
104
|
-
Alchemy::Deprecation.warn "options[:from_cell] has been removed without replacement. " \
|
|
105
|
-
"Please `render element.nested_elements` instead."
|
|
106
|
-
end
|
|
107
|
-
|
|
108
97
|
finder = options[:finder] || Alchemy::ElementsFinder.new(options)
|
|
109
98
|
elements = finder.elements(page: options[:from_page])
|
|
110
99
|
|
|
@@ -159,21 +148,10 @@ module Alchemy
|
|
|
159
148
|
# @note If the view partial is not found
|
|
160
149
|
# <tt>alchemy/elements/_view_not_found.html.erb</tt> gets rendered.
|
|
161
150
|
#
|
|
162
|
-
def render_element(
|
|
163
|
-
if args.length == 4
|
|
164
|
-
element, _part, options, counter = *args
|
|
165
|
-
Alchemy::Deprecation.warn "passing a `part` parameter as second argument to `render_element` has been removed without replacement. " \
|
|
166
|
-
"You can safely remove it."
|
|
167
|
-
else
|
|
168
|
-
element, options, counter = *args
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
options ||= {}
|
|
172
|
-
counter ||= 1
|
|
173
|
-
|
|
151
|
+
def render_element(element, options = {}, counter = 1)
|
|
174
152
|
if element.nil?
|
|
175
|
-
warning(
|
|
176
|
-
render "alchemy/elements/view_not_found", {name:
|
|
153
|
+
warning("Element is nil")
|
|
154
|
+
render "alchemy/elements/view_not_found", {name: "nil"}
|
|
177
155
|
return
|
|
178
156
|
end
|
|
179
157
|
|
|
@@ -182,7 +160,7 @@ module Alchemy
|
|
|
182
160
|
render element, {
|
|
183
161
|
element: element,
|
|
184
162
|
counter: counter,
|
|
185
|
-
options: options
|
|
163
|
+
options: options,
|
|
186
164
|
}.merge(options.delete(:locals) || {})
|
|
187
165
|
rescue ActionView::MissingTemplate => e
|
|
188
166
|
warning(%(
|
|
@@ -195,23 +173,20 @@ module Alchemy
|
|
|
195
173
|
# Returns a string for the id attribute of a html element for the given element
|
|
196
174
|
def element_dom_id(element)
|
|
197
175
|
return "" if element.nil?
|
|
176
|
+
|
|
198
177
|
"#{element.name}_#{element.id}".html_safe
|
|
199
178
|
end
|
|
200
179
|
|
|
201
180
|
# Renders the HTML tag attributes required for preview mode.
|
|
202
181
|
def element_preview_code(element)
|
|
203
|
-
|
|
204
|
-
tag_options(element_preview_code_attributes(element))
|
|
205
|
-
else
|
|
206
|
-
# Rails 5.1 uses TagBuilder
|
|
207
|
-
tag_builder.tag_options(element_preview_code_attributes(element))
|
|
208
|
-
end
|
|
182
|
+
tag_builder.tag_options(element_preview_code_attributes(element))
|
|
209
183
|
end
|
|
210
184
|
|
|
211
185
|
# Returns a hash containing the HTML tag attributes required for preview mode.
|
|
212
186
|
def element_preview_code_attributes(element)
|
|
213
187
|
return {} unless element.present? && @preview_mode && element.page == @page
|
|
214
|
-
|
|
188
|
+
|
|
189
|
+
{ "data-alchemy-element" => element.id }
|
|
215
190
|
end
|
|
216
191
|
|
|
217
192
|
# Returns the element's tags information as a string. Parameters and options
|
|
@@ -223,12 +198,7 @@ module Alchemy
|
|
|
223
198
|
# HTML tag attributes containing the element's tag information.
|
|
224
199
|
#
|
|
225
200
|
def element_tags(element, options = {})
|
|
226
|
-
|
|
227
|
-
tag_options(element_tags_attributes(element, options))
|
|
228
|
-
else
|
|
229
|
-
# Rails 5.1 uses TagBuilder
|
|
230
|
-
tag_builder.tag_options(element_tags_attributes(element, options))
|
|
231
|
-
end
|
|
201
|
+
tag_builder.tag_options(element_tags_attributes(element, options))
|
|
232
202
|
end
|
|
233
203
|
|
|
234
204
|
# Returns the element's tags information as an attribute hash.
|
|
@@ -244,28 +214,12 @@ module Alchemy
|
|
|
244
214
|
#
|
|
245
215
|
def element_tags_attributes(element, options = {})
|
|
246
216
|
options = {
|
|
247
|
-
formatter: lambda { |tags| tags.join(
|
|
217
|
+
formatter: lambda { |tags| tags.join(" ") },
|
|
248
218
|
}.merge(options)
|
|
249
219
|
|
|
250
220
|
return {} if !element.taggable? || element.tag_list.blank?
|
|
251
|
-
{ 'data-element-tags' => options[:formatter].call(element.tag_list) }
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
# Sort given elements by content.
|
|
255
|
-
# @deprecated
|
|
256
|
-
# @param [Array] elements - The elements you want to sort
|
|
257
|
-
# @param [String] content_name - The name of the content you want to sort by
|
|
258
|
-
# @param [Boolean] reverse - Reverse the sorted elements order
|
|
259
|
-
#
|
|
260
|
-
# @return [Array]
|
|
261
|
-
def sort_elements_by_content(elements, content_name, reverse = false)
|
|
262
|
-
Alchemy::Deprecation.warn "options[:sort_by] is deprecated. Please implement your own element sorting."
|
|
263
|
-
sorted_elements = elements.sort_by do |element|
|
|
264
|
-
content = element.content_by_name(content_name)
|
|
265
|
-
content ? content.ingredient.to_s : ''
|
|
266
|
-
end
|
|
267
221
|
|
|
268
|
-
|
|
222
|
+
{ "data-element-tags" => options[:formatter].call(element.tag_list) }
|
|
269
223
|
end
|
|
270
224
|
end
|
|
271
225
|
end
|
|
@@ -25,18 +25,19 @@ module Alchemy
|
|
|
25
25
|
#
|
|
26
26
|
def language_links(options = {})
|
|
27
27
|
options = {
|
|
28
|
-
linkname:
|
|
28
|
+
linkname: "name",
|
|
29
29
|
show_title: true,
|
|
30
|
-
spacer:
|
|
31
|
-
reverse: false
|
|
30
|
+
spacer: "",
|
|
31
|
+
reverse: false,
|
|
32
32
|
}.merge(options)
|
|
33
|
-
languages = Language.on_current_site.published.with_root_page.order("name #{options[:reverse] ?
|
|
33
|
+
languages = Language.on_current_site.published.with_root_page.order("name #{options[:reverse] ? "DESC" : "ASC"}")
|
|
34
34
|
return nil if languages.count < 2
|
|
35
|
+
|
|
35
36
|
render(
|
|
36
37
|
partial: "alchemy/language_links/language",
|
|
37
38
|
collection: languages,
|
|
38
39
|
spacer_template: "alchemy/language_links/spacer",
|
|
39
|
-
locals: {languages: languages, options: options}
|
|
40
|
+
locals: { languages: languages, options: options },
|
|
40
41
|
)
|
|
41
42
|
end
|
|
42
43
|
|
|
@@ -50,7 +51,7 @@ module Alchemy
|
|
|
50
51
|
render @page, page: @page
|
|
51
52
|
rescue ActionView::MissingTemplate
|
|
52
53
|
warning("PageLayout: '#{@page.page_layout}' not found. Rendering standard page_layout.")
|
|
53
|
-
render
|
|
54
|
+
render "alchemy/page_layouts/standard", page: @page
|
|
54
55
|
end
|
|
55
56
|
|
|
56
57
|
# Renders a partial for current site
|
|
@@ -72,182 +73,37 @@ module Alchemy
|
|
|
72
73
|
""
|
|
73
74
|
end
|
|
74
75
|
|
|
75
|
-
# Renders the navigation.
|
|
76
|
-
# @deprecated
|
|
77
|
-
#
|
|
78
|
-
# It produces a html <ul><li></li></ul> structure with all necessary classes so you can produce every navigation the web uses today.
|
|
79
|
-
# I.E. dropdown-navigations, simple mainnavigations or even complex nested ones.
|
|
80
|
-
#
|
|
81
|
-
# === HTML output:
|
|
82
|
-
#
|
|
83
|
-
# <ul class="navigation level_1">
|
|
84
|
-
# <li class="first home"><a href="/home" class="active" title="Homepage" lang="en" data-page-id="1">Homepage</a></li>
|
|
85
|
-
# <li class="contact"><a href="/contact" title="Contact" lang="en" data-page-id="2">Contact</a></li>
|
|
86
|
-
# <li class="last imprint"><a href="/imprint" title="Imprint" lang="en" data-page-id="3">Imprint</a></li>
|
|
87
|
-
# </ul>
|
|
88
|
-
#
|
|
89
|
-
# As you can see: Everything you need.
|
|
90
|
-
#
|
|
91
|
-
# Not pleased with the way Alchemy produces the navigation structure?
|
|
92
|
-
#
|
|
93
|
-
# Then feel free to overwrite the partials (_renderer.html.erb and _link.html.erb) found in +views/navigation/+ or pass different partials via the options +:navigation_partial+ and +:navigation_link_partial+.
|
|
94
|
-
#
|
|
95
|
-
# === Passing HTML classes and ids to the renderer
|
|
96
|
-
#
|
|
97
|
-
# A second hash can be passed as html_options to the navigation renderer partial.
|
|
98
|
-
#
|
|
99
|
-
# ==== Example:
|
|
100
|
-
#
|
|
101
|
-
# <%= render_navigation({from_page: 'subnavi'}, {class: 'navigation', id: 'subnavigation'}) %>
|
|
102
|
-
#
|
|
103
|
-
#
|
|
104
|
-
# @option options submenu [Boolean] (false)
|
|
105
|
-
# Do you want a nested <ul> <li> structure for the deeper levels of your navigation, or not?
|
|
106
|
-
# Used to display the subnavigation within the mainnaviagtion. I.e. for dropdown menues.
|
|
107
|
-
#
|
|
108
|
-
# @option options all_sub_menues [Boolean] (false)
|
|
109
|
-
# Renders the whole page tree.
|
|
110
|
-
#
|
|
111
|
-
# @option options from_page [Alchemy::Page] (@root_page)
|
|
112
|
-
# Do you want to render a navigation from a different page then the current page?
|
|
113
|
-
# Then pass an Page instance or a Alchemy::PageLayout name as string.
|
|
114
|
-
#
|
|
115
|
-
# @option options spacer [String] (nil)
|
|
116
|
-
# A spacer for the entries can be passed.
|
|
117
|
-
# Simple string, or even a complex html structure.
|
|
118
|
-
# I.e: "<span class='spacer'>|</spacer>".
|
|
119
|
-
#
|
|
120
|
-
# @option options navigation_partial [String] ("navigation/renderer")
|
|
121
|
-
# Pass a different partial to be taken for the navigation rendering.
|
|
122
|
-
# Alternatively you could override the +app/views/alchemy/navigation/renderer+ partial in your app.
|
|
123
|
-
#
|
|
124
|
-
# @option options navigation_link_partial [String] ("navigation/link")
|
|
125
|
-
# Alchemy places an <a> html link in <li> tags.
|
|
126
|
-
# The tag automatically has an active css class if necessary.
|
|
127
|
-
# So styling is everything. But maybe you don't want this.
|
|
128
|
-
# So feel free to make you own partial and pass the filename here.
|
|
129
|
-
# Alternatively you could override the +app/views/alchemy/navigation/link+ partial in your app.
|
|
130
|
-
#
|
|
131
|
-
# @option options show_nonactive [Boolean] (false)
|
|
132
|
-
# Commonly Alchemy only displays the submenu of the active page (if submenu: true).
|
|
133
|
-
# If you want to display all child pages then pass true (together with submenu: true of course).
|
|
134
|
-
# I.e. for css-driven drop down menues.
|
|
135
|
-
#
|
|
136
|
-
# @option options show_title [Boolean] (true)
|
|
137
|
-
# For our beloved SEOs :)
|
|
138
|
-
# Appends a title attribute to all links and places the +page.title+ content into it.
|
|
139
|
-
#
|
|
140
|
-
# @option options restricted_only [Boolean] (false)
|
|
141
|
-
# Render only restricted pages. I.E for members only navigations.
|
|
142
|
-
#
|
|
143
|
-
# @option options reverse [Boolean] (false)
|
|
144
|
-
# Reverse the output of the pages
|
|
145
|
-
#
|
|
146
|
-
# @option options reverse_children [Boolean] (false)
|
|
147
|
-
# Like reverse option, but only reverse the children of the first level
|
|
148
|
-
#
|
|
149
|
-
# @option options deepness [Fixnum] (nil)
|
|
150
|
-
# Show only pages up to this depth.
|
|
151
|
-
#
|
|
152
|
-
def render_navigation(options = {}, html_options = {})
|
|
153
|
-
options = {
|
|
154
|
-
submenu: false,
|
|
155
|
-
all_sub_menues: false,
|
|
156
|
-
from_page: @root_page || Language.current_root_page,
|
|
157
|
-
spacer: nil,
|
|
158
|
-
navigation_partial: 'alchemy/navigation/renderer',
|
|
159
|
-
navigation_link_partial: 'alchemy/navigation/link',
|
|
160
|
-
show_nonactive: false,
|
|
161
|
-
restricted_only: false,
|
|
162
|
-
show_title: true,
|
|
163
|
-
reverse: false,
|
|
164
|
-
reverse_children: false
|
|
165
|
-
}.merge(options)
|
|
166
|
-
page = page_or_find(options[:from_page])
|
|
167
|
-
return nil if page.blank?
|
|
168
|
-
pages = page.children.accessible_by(current_ability, :see)
|
|
169
|
-
pages = pages.restricted if options.delete(:restricted_only)
|
|
170
|
-
if depth = options[:deepness]
|
|
171
|
-
pages = pages.where('depth <= ?', depth)
|
|
172
|
-
end
|
|
173
|
-
if options[:reverse]
|
|
174
|
-
pages.reverse!
|
|
175
|
-
end
|
|
176
|
-
render options[:navigation_partial],
|
|
177
|
-
options: options,
|
|
178
|
-
pages: pages,
|
|
179
|
-
html_options: html_options
|
|
180
|
-
end
|
|
181
|
-
deprecate render_navigation: 'Create a menu and use render_menu instead', deprecator: Alchemy::Deprecation
|
|
182
|
-
|
|
183
76
|
# Renders a menu partial
|
|
184
77
|
#
|
|
185
78
|
# Menu partials are placed in the `app/views/alchemy/menus` folder
|
|
186
79
|
# Use the `rails g alchemy:menus` generator to create the partials
|
|
187
80
|
#
|
|
188
|
-
# @param [String] -
|
|
81
|
+
# @param [String] - Type of the menu
|
|
189
82
|
# @param [Hash] - A set of options available in your menu partials
|
|
190
|
-
def render_menu(
|
|
191
|
-
root_node = Alchemy::Node.roots.find_by(
|
|
83
|
+
def render_menu(menu_type, options = {})
|
|
84
|
+
root_node = Alchemy::Node.roots.find_by(
|
|
85
|
+
menu_type: menu_type,
|
|
86
|
+
language: Alchemy::Language.current,
|
|
87
|
+
)
|
|
192
88
|
if root_node.nil?
|
|
193
|
-
warning("Menu with
|
|
89
|
+
warning("Menu with type #{menu_type} not found!")
|
|
194
90
|
return
|
|
195
91
|
end
|
|
196
92
|
|
|
197
|
-
options
|
|
198
|
-
node_partial_name: "#{root_node.view_folder_name}/node"
|
|
199
|
-
}.merge(options)
|
|
200
|
-
|
|
201
|
-
render(root_node.to_partial_path, menu: root_node, node: root_node, options: options)
|
|
93
|
+
render("alchemy/menus/#{menu_type}/wrapper", menu: root_node, options: options)
|
|
202
94
|
rescue ActionView::MissingTemplate => e
|
|
203
95
|
warning <<~WARN
|
|
204
|
-
Menu partial not found for #{
|
|
96
|
+
Menu partial not found for #{menu_type}.
|
|
205
97
|
#{e}
|
|
206
98
|
WARN
|
|
207
99
|
end
|
|
208
100
|
|
|
209
|
-
# Renders navigation the children and all siblings of the given page (standard is the current page).
|
|
210
|
-
#
|
|
211
|
-
# Use this helper if you want to render the subnavigation independent from the mainnavigation. I.E. to place it in a different area on your website.
|
|
212
|
-
#
|
|
213
|
-
# This helper passes all its options to the the render_navigation helper.
|
|
214
|
-
#
|
|
215
|
-
# === Options:
|
|
216
|
-
#
|
|
217
|
-
# from_page: @page # The page to render the navigation from
|
|
218
|
-
# submenu: true # Shows the nested children
|
|
219
|
-
# level: 2 # Normally there is no need to change the level parameter, just in a few special cases
|
|
220
|
-
#
|
|
221
|
-
def render_subnavigation(options = {}, html_options = {})
|
|
222
|
-
default_options = {
|
|
223
|
-
from_page: @page,
|
|
224
|
-
submenu: true,
|
|
225
|
-
level: 2
|
|
226
|
-
}
|
|
227
|
-
options = default_options.merge(options)
|
|
228
|
-
if !options[:from_page].nil?
|
|
229
|
-
while options[:from_page].level > options[:level]
|
|
230
|
-
options[:from_page] = options[:from_page].parent
|
|
231
|
-
end
|
|
232
|
-
render_navigation(options, html_options)
|
|
233
|
-
else
|
|
234
|
-
return nil
|
|
235
|
-
end
|
|
236
|
-
end
|
|
237
|
-
deprecate :render_subnavigation, deprecator: Alchemy::Deprecation
|
|
238
|
-
|
|
239
101
|
# Returns true if page is in the active branch
|
|
240
102
|
def page_active?(page)
|
|
241
103
|
@_page_ancestors ||= Page.ancestors_for(@page)
|
|
242
104
|
@_page_ancestors.include?(page)
|
|
243
105
|
end
|
|
244
106
|
|
|
245
|
-
# Returns +'active'+ if the given external page is in the current url path or +nil+.
|
|
246
|
-
def external_page_css_class(page)
|
|
247
|
-
return nil if !page.definition['redirects_to_external']
|
|
248
|
-
request.path.split('/').delete_if(&:blank?).first == page.urlname.gsub(/^\//, '') ? 'active' : nil
|
|
249
|
-
end
|
|
250
|
-
|
|
251
107
|
# Returns page links in a breadcrumb beginning from root to current page.
|
|
252
108
|
#
|
|
253
109
|
# === Options:
|
|
@@ -264,11 +120,11 @@ module Alchemy
|
|
|
264
120
|
page: @page,
|
|
265
121
|
restricted_only: false,
|
|
266
122
|
reverse: false,
|
|
267
|
-
link_active_page: false
|
|
123
|
+
link_active_page: false,
|
|
268
124
|
}.merge(options)
|
|
269
125
|
|
|
270
|
-
pages =
|
|
271
|
-
|
|
126
|
+
pages = options[:page].
|
|
127
|
+
self_and_ancestors.contentpages.
|
|
272
128
|
accessible_by(current_ability, :see)
|
|
273
129
|
|
|
274
130
|
if options.delete(:restricted_only)
|
|
@@ -276,7 +132,7 @@ module Alchemy
|
|
|
276
132
|
end
|
|
277
133
|
|
|
278
134
|
if options.delete(:reverse)
|
|
279
|
-
pages = pages.reorder(
|
|
135
|
+
pages = pages.reorder("lft DESC")
|
|
280
136
|
end
|
|
281
137
|
|
|
282
138
|
if options[:without].present?
|
|
@@ -284,7 +140,7 @@ module Alchemy
|
|
|
284
140
|
pages = pages.where.not(id: without.try(:collect, &:id) || without.id)
|
|
285
141
|
end
|
|
286
142
|
|
|
287
|
-
render
|
|
143
|
+
render "alchemy/breadcrumb/wrapper", pages: pages, options: options
|
|
288
144
|
end
|
|
289
145
|
|
|
290
146
|
# Returns current page title
|
|
@@ -296,10 +152,11 @@ module Alchemy
|
|
|
296
152
|
#
|
|
297
153
|
def page_title(options = {})
|
|
298
154
|
return "" if @page.title.blank?
|
|
155
|
+
|
|
299
156
|
options = {
|
|
300
157
|
prefix: "",
|
|
301
158
|
suffix: "",
|
|
302
|
-
separator: ""
|
|
159
|
+
separator: "",
|
|
303
160
|
}.update(options)
|
|
304
161
|
title_parts = [options[:prefix]]
|
|
305
162
|
if response.status == 200
|
|
@@ -320,14 +177,7 @@ module Alchemy
|
|
|
320
177
|
end
|
|
321
178
|
|
|
322
179
|
def meta_robots
|
|
323
|
-
"#{@page.robot_index? ?
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
# @deprecated
|
|
327
|
-
def render_cell(name, _options = {})
|
|
328
|
-
render_elements(only: name, fixed: true)
|
|
180
|
+
"#{@page.robot_index? ? "" : "no"}index, #{@page.robot_follow? ? "" : "no"}follow"
|
|
329
181
|
end
|
|
330
|
-
deprecate render_cell: 'Use render_elements(only: <cell-name>, fixed: true) instead',
|
|
331
|
-
deprecator: Alchemy::Deprecation
|
|
332
182
|
end
|
|
333
183
|
end
|