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
|
@@ -19,7 +19,7 @@ module Alchemy
|
|
|
19
19
|
# Returns one element definition by given name.
|
|
20
20
|
#
|
|
21
21
|
def definition_by_name(name)
|
|
22
|
-
definitions.detect { |d| d[
|
|
22
|
+
definitions.detect { |d| d["name"] == name }
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
private
|
|
@@ -30,21 +30,21 @@ module Alchemy
|
|
|
30
30
|
if ::File.exist?(definitions_file_path)
|
|
31
31
|
::YAML.safe_load(ERB.new(File.read(definitions_file_path)).result, YAML_WHITELIST_CLASSES, [], true) || []
|
|
32
32
|
else
|
|
33
|
-
raise LoadError, "Could not find elements.yml file! Please run `rails generate alchemy:
|
|
33
|
+
raise LoadError, "Could not find elements.yml file! Please run `rails generate alchemy:install`"
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# Returns the +elements.yml+ file path
|
|
38
38
|
#
|
|
39
39
|
def definitions_file_path
|
|
40
|
-
Rails.root.join
|
|
40
|
+
Rails.root.join "config/alchemy/elements.yml"
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
# The definition of this element.
|
|
45
45
|
#
|
|
46
46
|
def definition
|
|
47
|
-
if definition = self.class.definitions.detect { |d| d[
|
|
47
|
+
if definition = self.class.definitions.detect { |d| d["name"] == name }
|
|
48
48
|
definition
|
|
49
49
|
else
|
|
50
50
|
log_warning "Could not find element definition for #{name}. Please check your elements.yml file!"
|
|
@@ -47,6 +47,7 @@ module Alchemy
|
|
|
47
47
|
#
|
|
48
48
|
def update_contents(contents_attributes)
|
|
49
49
|
return true if contents_attributes.nil?
|
|
50
|
+
|
|
50
51
|
contents.each do |content|
|
|
51
52
|
content_hash = contents_attributes[content.id.to_s] || next
|
|
52
53
|
content.update_essence(content_hash) || errors.add(:base, :essence_validation_failed)
|
|
@@ -72,7 +73,7 @@ module Alchemy
|
|
|
72
73
|
# rss_title: true
|
|
73
74
|
#
|
|
74
75
|
def content_for_rss_title
|
|
75
|
-
content_for_rss_meta(
|
|
76
|
+
content_for_rss_meta("title")
|
|
76
77
|
end
|
|
77
78
|
|
|
78
79
|
# Returns the content that is marked as rss description.
|
|
@@ -86,13 +87,14 @@ module Alchemy
|
|
|
86
87
|
# rss_description: true
|
|
87
88
|
#
|
|
88
89
|
def content_for_rss_description
|
|
89
|
-
content_for_rss_meta(
|
|
90
|
+
content_for_rss_meta("description")
|
|
90
91
|
end
|
|
91
92
|
|
|
92
93
|
# Returns the array with the hashes for all element contents in the elements.yml file
|
|
93
94
|
def content_definitions
|
|
94
95
|
return nil if definition.blank?
|
|
95
|
-
|
|
96
|
+
|
|
97
|
+
definition["contents"]
|
|
96
98
|
end
|
|
97
99
|
|
|
98
100
|
# Returns the definition for given content_name
|
|
@@ -101,7 +103,7 @@ module Alchemy
|
|
|
101
103
|
log_warning "Element #{name} is missing the content definition for #{content_name}"
|
|
102
104
|
nil
|
|
103
105
|
else
|
|
104
|
-
content_definitions.detect { |d| d[
|
|
106
|
+
content_definitions.detect { |d| d["name"] == content_name.to_s }
|
|
105
107
|
end
|
|
106
108
|
end
|
|
107
109
|
|
|
@@ -136,12 +138,13 @@ module Alchemy
|
|
|
136
138
|
def content_for_rss_meta(type)
|
|
137
139
|
definition = content_definitions.detect { |c| c["rss_#{type}"] }
|
|
138
140
|
return if definition.blank?
|
|
139
|
-
|
|
141
|
+
|
|
142
|
+
contents.detect { |content| content.name == definition["name"] }
|
|
140
143
|
end
|
|
141
144
|
|
|
142
145
|
# creates the contents for this element as described in the elements.yml
|
|
143
146
|
def create_contents
|
|
144
|
-
definition.fetch(
|
|
147
|
+
definition.fetch("contents", []).each do |attributes|
|
|
145
148
|
Content.create(attributes.merge(element: self))
|
|
146
149
|
end
|
|
147
150
|
end
|
|
@@ -6,6 +6,7 @@ module Alchemy
|
|
|
6
6
|
def ingredient(name)
|
|
7
7
|
content = content_by_name(name)
|
|
8
8
|
return nil if content.blank?
|
|
9
|
+
|
|
9
10
|
content.ingredient
|
|
10
11
|
end
|
|
11
12
|
|
|
@@ -96,12 +97,12 @@ module Alchemy
|
|
|
96
97
|
errors.each do |error|
|
|
97
98
|
messages << Alchemy.t(
|
|
98
99
|
"#{name}.#{content_name}.#{error}",
|
|
99
|
-
scope:
|
|
100
|
+
scope: "content_validations",
|
|
100
101
|
default: [
|
|
101
102
|
"fields.#{content_name}.#{error}".to_sym,
|
|
102
|
-
"errors.#{error}".to_sym
|
|
103
|
+
"errors.#{error}".to_sym,
|
|
103
104
|
],
|
|
104
|
-
field: Content.translated_label_for(content_name, name)
|
|
105
|
+
field: Content.translated_label_for(content_name, name),
|
|
105
106
|
)
|
|
106
107
|
end
|
|
107
108
|
end
|
|
@@ -23,7 +23,7 @@ module Alchemy
|
|
|
23
23
|
# If no translation is found a humanized name is used.
|
|
24
24
|
#
|
|
25
25
|
def display_name_for(name)
|
|
26
|
-
Alchemy.t(name, scope:
|
|
26
|
+
Alchemy.t(name, scope: "element_names", default: name.to_s.humanize)
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -32,7 +32,7 @@ module Alchemy
|
|
|
32
32
|
# @see Alchemy::Element::Presenters#display_name_for
|
|
33
33
|
#
|
|
34
34
|
def display_name
|
|
35
|
-
self.class.display_name_for(definition[
|
|
35
|
+
self.class.display_name_for(definition["name"] || name)
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
# Returns a preview text for element.
|
|
@@ -97,6 +97,7 @@ module Alchemy
|
|
|
97
97
|
|
|
98
98
|
def preview_text_from_nested_elements(maxlength)
|
|
99
99
|
return if all_nested_elements.empty?
|
|
100
|
+
|
|
100
101
|
all_nested_elements.first.preview_text(maxlength)
|
|
101
102
|
end
|
|
102
103
|
|
|
@@ -8,14 +8,12 @@
|
|
|
8
8
|
# value :boolean
|
|
9
9
|
# created_at :datetime not null
|
|
10
10
|
# updated_at :datetime not null
|
|
11
|
-
# creator_id :integer
|
|
12
|
-
# updater_id :integer
|
|
13
11
|
#
|
|
14
12
|
|
|
15
13
|
# Stores boolean values.
|
|
16
14
|
# Provides a checkbox in the editor views.
|
|
17
15
|
module Alchemy
|
|
18
16
|
class EssenceBoolean < BaseRecord
|
|
19
|
-
acts_as_essence ingredient_column:
|
|
17
|
+
acts_as_essence ingredient_column: "value"
|
|
20
18
|
end
|
|
21
19
|
end
|
|
@@ -6,19 +6,18 @@
|
|
|
6
6
|
#
|
|
7
7
|
# id :integer not null, primary key
|
|
8
8
|
# date :datetime
|
|
9
|
-
# creator_id :integer
|
|
10
|
-
# updater_id :integer
|
|
11
9
|
# created_at :datetime not null
|
|
12
10
|
# updated_at :datetime not null
|
|
13
11
|
#
|
|
14
12
|
|
|
15
13
|
module Alchemy
|
|
16
14
|
class EssenceDate < BaseRecord
|
|
17
|
-
acts_as_essence ingredient_column:
|
|
15
|
+
acts_as_essence ingredient_column: "date"
|
|
18
16
|
|
|
19
17
|
# Returns self.date for the Element#preview_text method.
|
|
20
18
|
def preview_text(_maxlength = nil)
|
|
21
19
|
return "" if date.blank?
|
|
20
|
+
|
|
22
21
|
::I18n.l(date, format: :'alchemy.essence_date')
|
|
23
22
|
end
|
|
24
23
|
end
|
|
@@ -8,8 +8,6 @@
|
|
|
8
8
|
# attachment_id :integer
|
|
9
9
|
# title :string
|
|
10
10
|
# css_class :string
|
|
11
|
-
# creator_id :integer
|
|
12
|
-
# updater_id :integer
|
|
13
11
|
# created_at :datetime not null
|
|
14
12
|
# updated_at :datetime not null
|
|
15
13
|
# link_text :string
|
|
@@ -18,19 +16,21 @@
|
|
|
18
16
|
module Alchemy
|
|
19
17
|
class EssenceFile < BaseRecord
|
|
20
18
|
belongs_to :attachment, optional: true
|
|
21
|
-
acts_as_essence ingredient_column:
|
|
19
|
+
acts_as_essence ingredient_column: "attachment"
|
|
22
20
|
|
|
23
21
|
def attachment_url
|
|
24
22
|
return if attachment.nil?
|
|
23
|
+
|
|
25
24
|
routes.download_attachment_path(
|
|
26
25
|
id: attachment.id,
|
|
27
|
-
name: attachment.
|
|
28
|
-
format: attachment.suffix
|
|
26
|
+
name: attachment.slug,
|
|
27
|
+
format: attachment.suffix,
|
|
29
28
|
)
|
|
30
29
|
end
|
|
31
30
|
|
|
32
31
|
def preview_text(max = 30)
|
|
33
32
|
return "" if attachment.blank?
|
|
33
|
+
|
|
34
34
|
attachment.name.to_s[0..max - 1]
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -6,15 +6,13 @@
|
|
|
6
6
|
#
|
|
7
7
|
# id :integer not null, primary key
|
|
8
8
|
# source :text
|
|
9
|
-
# creator_id :integer
|
|
10
|
-
# updater_id :integer
|
|
11
9
|
# created_at :datetime not null
|
|
12
10
|
# updated_at :datetime not null
|
|
13
11
|
#
|
|
14
12
|
|
|
15
13
|
module Alchemy
|
|
16
14
|
class EssenceHtml < BaseRecord
|
|
17
|
-
acts_as_essence ingredient_column:
|
|
15
|
+
acts_as_essence ingredient_column: "source"
|
|
18
16
|
|
|
19
17
|
# Returns the first x (default = 30) (HTML escaped) characters from self.source for the Element#preview_text method.
|
|
20
18
|
def preview_text(maxlength = 30)
|
|
@@ -11,12 +11,10 @@
|
|
|
11
11
|
# link_class_name :string
|
|
12
12
|
# created_at :datetime not null
|
|
13
13
|
# updated_at :datetime not null
|
|
14
|
-
# creator_id :integer
|
|
15
|
-
# updater_id :integer
|
|
16
14
|
#
|
|
17
15
|
|
|
18
16
|
module Alchemy
|
|
19
17
|
class EssenceLink < BaseRecord
|
|
20
|
-
acts_as_essence ingredient_column:
|
|
18
|
+
acts_as_essence ingredient_column: "link"
|
|
21
19
|
end
|
|
22
20
|
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Alchemy
|
|
4
|
+
class EssenceNode < BaseRecord
|
|
5
|
+
acts_as_essence(
|
|
6
|
+
ingredient_column: :node,
|
|
7
|
+
preview_text_column: :node_name,
|
|
8
|
+
belongs_to: {
|
|
9
|
+
class_name: "Alchemy::Node",
|
|
10
|
+
foreign_key: :node_id,
|
|
11
|
+
inverse_of: :essence_nodes,
|
|
12
|
+
optional: true,
|
|
13
|
+
},
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
delegate :name, to: :node, prefix: true, allow_nil: true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -2,28 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
module Alchemy
|
|
4
4
|
class EssencePage < BaseRecord
|
|
5
|
-
PAGE_ID = /\A\d+\z/
|
|
6
|
-
|
|
7
5
|
acts_as_essence(
|
|
8
6
|
ingredient_column: :page,
|
|
9
7
|
preview_text_method: :name,
|
|
10
8
|
belongs_to: {
|
|
11
|
-
class_name:
|
|
9
|
+
class_name: "Alchemy::Page",
|
|
12
10
|
foreign_key: :page_id,
|
|
13
11
|
inverse_of: :essence_pages,
|
|
14
|
-
optional: true
|
|
15
|
-
}
|
|
12
|
+
optional: true,
|
|
13
|
+
},
|
|
16
14
|
)
|
|
17
|
-
|
|
18
|
-
def ingredient=(page)
|
|
19
|
-
case page
|
|
20
|
-
when PAGE_ID
|
|
21
|
-
self.page = Alchemy::Page.new(id: page)
|
|
22
|
-
when Alchemy::Page
|
|
23
|
-
self.page = page
|
|
24
|
-
else
|
|
25
|
-
super
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
15
|
end
|
|
29
16
|
end
|
|
@@ -14,8 +14,6 @@
|
|
|
14
14
|
# link_title :string
|
|
15
15
|
# css_class :string
|
|
16
16
|
# link_target :string
|
|
17
|
-
# creator_id :integer
|
|
18
|
-
# updater_id :integer
|
|
19
17
|
# created_at :datetime not null
|
|
20
18
|
# updated_at :datetime not null
|
|
21
19
|
# crop_from :string
|
|
@@ -26,10 +24,10 @@
|
|
|
26
24
|
module Alchemy
|
|
27
25
|
class EssencePicture < BaseRecord
|
|
28
26
|
acts_as_essence ingredient_column: :picture, belongs_to: {
|
|
29
|
-
class_name:
|
|
27
|
+
class_name: "Alchemy::Picture",
|
|
30
28
|
foreign_key: :picture_id,
|
|
31
29
|
inverse_of: :essence_pictures,
|
|
32
|
-
optional: true
|
|
30
|
+
optional: true,
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
delegate :image_file_width, :image_file_height, :image_file, to: :picture
|
|
@@ -80,7 +78,7 @@ module Alchemy
|
|
|
80
78
|
format: picture.default_render_format,
|
|
81
79
|
crop_from: crop_from.presence,
|
|
82
80
|
crop_size: crop_size.presence,
|
|
83
|
-
size: content.settings[:size]
|
|
81
|
+
size: content.settings[:size],
|
|
84
82
|
}.with_indifferent_access
|
|
85
83
|
end
|
|
86
84
|
|
|
@@ -90,11 +88,11 @@ module Alchemy
|
|
|
90
88
|
# image displayed in the frontend.
|
|
91
89
|
#
|
|
92
90
|
# @return [String]
|
|
93
|
-
def thumbnail_url
|
|
91
|
+
def thumbnail_url
|
|
94
92
|
return if picture.nil?
|
|
95
93
|
|
|
96
|
-
crop = crop_values_present? || content.
|
|
97
|
-
size = render_size || content.
|
|
94
|
+
crop = crop_values_present? || content.settings[:crop]
|
|
95
|
+
size = render_size || content.settings[:size]
|
|
98
96
|
|
|
99
97
|
options = {
|
|
100
98
|
size: thumbnail_size(size, crop),
|
|
@@ -102,7 +100,7 @@ module Alchemy
|
|
|
102
100
|
crop_from: crop_from.presence,
|
|
103
101
|
crop_size: crop_size.presence,
|
|
104
102
|
flatten: true,
|
|
105
|
-
format: picture.image_file_format
|
|
103
|
+
format: picture.image_file_format,
|
|
106
104
|
}
|
|
107
105
|
|
|
108
106
|
picture.url(options)
|
|
@@ -116,6 +114,7 @@ module Alchemy
|
|
|
116
114
|
# @return [String]
|
|
117
115
|
def preview_text(max = 30)
|
|
118
116
|
return "" if picture.nil?
|
|
117
|
+
|
|
119
118
|
picture.name.to_s[0..max - 1]
|
|
120
119
|
end
|
|
121
120
|
|
|
@@ -124,6 +123,7 @@ module Alchemy
|
|
|
124
123
|
# @return [Hash]
|
|
125
124
|
def cropping_mask
|
|
126
125
|
return if crop_from.blank? || crop_size.blank?
|
|
126
|
+
|
|
127
127
|
crop_from = point_from_string(read_attribute(:crop_from))
|
|
128
128
|
crop_size = sizes_from_string(read_attribute(:crop_size))
|
|
129
129
|
|
|
@@ -137,13 +137,13 @@ module Alchemy
|
|
|
137
137
|
picture_url(content.settings)
|
|
138
138
|
end
|
|
139
139
|
|
|
140
|
-
# Show image cropping link for content
|
|
141
|
-
def allow_image_cropping?
|
|
142
|
-
content && content.
|
|
140
|
+
# Show image cropping link for content
|
|
141
|
+
def allow_image_cropping?
|
|
142
|
+
content && content.settings[:crop] && picture &&
|
|
143
143
|
picture.can_be_cropped_to(
|
|
144
|
-
content.
|
|
145
|
-
content.
|
|
146
|
-
)
|
|
144
|
+
content.settings[:size],
|
|
145
|
+
content.settings[:upsample],
|
|
146
|
+
) && !!picture.image_file
|
|
147
147
|
end
|
|
148
148
|
|
|
149
149
|
def crop_values_present?
|
|
@@ -161,16 +161,17 @@ module Alchemy
|
|
|
161
161
|
end
|
|
162
162
|
|
|
163
163
|
def normalize_crop_value(crop_value)
|
|
164
|
-
self[crop_value].split(
|
|
164
|
+
self[crop_value].split("x").map { |n| normalize_number(n) }.join("x")
|
|
165
165
|
end
|
|
166
166
|
|
|
167
167
|
def normalize_number(number)
|
|
168
168
|
number = number.to_f.round
|
|
169
|
-
number
|
|
169
|
+
number.negative? ? 0 : number
|
|
170
170
|
end
|
|
171
171
|
|
|
172
172
|
def replace_newlines
|
|
173
173
|
return nil if caption.nil?
|
|
174
|
+
|
|
174
175
|
caption.gsub!(/(\r\n|\r|\n)/, "<br/>")
|
|
175
176
|
end
|
|
176
177
|
end
|
|
@@ -13,7 +13,7 @@ module Alchemy
|
|
|
13
13
|
show_caption: true,
|
|
14
14
|
disable_link: false,
|
|
15
15
|
srcset: [],
|
|
16
|
-
sizes: []
|
|
16
|
+
sizes: [],
|
|
17
17
|
}.with_indifferent_access
|
|
18
18
|
|
|
19
19
|
def initialize(content, options = {}, html_options = {})
|
|
@@ -33,12 +33,12 @@ module Alchemy
|
|
|
33
33
|
output = link_to(output, url_for(essence.link), {
|
|
34
34
|
title: essence.link_title.presence,
|
|
35
35
|
target: essence.link_target == "blank" ? "_blank" : nil,
|
|
36
|
-
data: {link_target: essence.link_target.presence}
|
|
36
|
+
data: { link_target: essence.link_target.presence },
|
|
37
37
|
})
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
if caption
|
|
41
|
-
content_tag(:figure, output, {class: essence.css_class.presence}.merge(html_options))
|
|
41
|
+
content_tag(:figure, output, { class: essence.css_class.presence }.merge(html_options))
|
|
42
42
|
else
|
|
43
43
|
output
|
|
44
44
|
end
|
|
@@ -48,6 +48,7 @@ module Alchemy
|
|
|
48
48
|
|
|
49
49
|
def caption
|
|
50
50
|
return unless show_caption?
|
|
51
|
+
|
|
51
52
|
@_caption ||= content_tag(:figcaption, essence.caption)
|
|
52
53
|
end
|
|
53
54
|
|
|
@@ -57,8 +58,8 @@ module Alchemy
|
|
|
57
58
|
alt: essence.alt_tag.presence,
|
|
58
59
|
title: essence.title.presence,
|
|
59
60
|
class: caption ? nil : essence.css_class.presence,
|
|
60
|
-
srcset: srcset.join(
|
|
61
|
-
sizes: options[:sizes].join(
|
|
61
|
+
srcset: srcset.join(", ").presence,
|
|
62
|
+
sizes: options[:sizes].join(", ").presence,
|
|
62
63
|
}.merge(caption ? {} : html_options)
|
|
63
64
|
)
|
|
64
65
|
end
|
|
@@ -74,7 +75,7 @@ module Alchemy
|
|
|
74
75
|
def srcset
|
|
75
76
|
options[:srcset].map do |size|
|
|
76
77
|
url = essence.picture_url(size: size)
|
|
77
|
-
width, height = size.split(
|
|
78
|
+
width, height = size.split("x")
|
|
78
79
|
width.present? ? "#{url} #{width}w" : "#{url} #{height}h"
|
|
79
80
|
end
|
|
80
81
|
end
|