alchemy_cms 6.1.5 → 7.0.0.pre.b
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/brakeman-analysis.yml +2 -2
- data/.github/workflows/ci.yml +7 -10
- data/.github/workflows/lint.yml +17 -0
- data/.gitignore +1 -6
- data/.hound.yml +2 -3
- data/.rubocop.yml +4 -350
- data/.standard.yml +3 -0
- data/CHANGELOG.md +49 -19
- data/Gemfile +4 -2
- data/README.md +7 -9
- data/Rakefile +12 -7
- data/alchemy_cms.gemspec +3 -3
- data/app/assets/javascripts/alchemy/admin.js +0 -1
- data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +18 -32
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +2 -2
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +2 -2
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +33 -30
- data/app/assets/stylesheets/alchemy/elements.scss +16 -35
- data/app/assets/stylesheets/alchemy/forms.scss +0 -4
- data/app/assets/stylesheets/alchemy/node-select.scss +2 -2
- data/app/components/alchemy/ingredients/audio_view.rb +37 -0
- data/app/components/alchemy/ingredients/base_view.rb +38 -0
- data/app/components/alchemy/ingredients/boolean_view.rb +13 -0
- data/app/components/alchemy/ingredients/datetime_view.rb +22 -0
- data/app/components/alchemy/ingredients/file_view.rb +40 -0
- data/app/components/alchemy/ingredients/headline_view.rb +20 -0
- data/app/components/alchemy/ingredients/html_view.rb +9 -0
- data/app/components/alchemy/ingredients/link_view.rb +25 -0
- data/app/components/alchemy/ingredients/node_view.rb +11 -0
- data/app/components/alchemy/ingredients/page_view.rb +15 -0
- data/app/components/alchemy/ingredients/picture_view.rb +108 -0
- data/app/components/alchemy/ingredients/richtext_view.rb +22 -0
- data/app/components/alchemy/ingredients/select_view.rb +6 -0
- data/app/components/alchemy/ingredients/text_view.rb +41 -0
- data/app/components/alchemy/ingredients/video_view.rb +39 -0
- data/app/controllers/alchemy/admin/attachments_controller.rb +3 -4
- data/app/controllers/alchemy/admin/base_controller.rb +7 -7
- data/app/controllers/alchemy/admin/clipboard_controller.rb +2 -2
- data/app/controllers/alchemy/admin/elements_controller.rb +33 -43
- data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
- data/app/controllers/alchemy/admin/nodes_controller.rb +2 -2
- data/app/controllers/alchemy/admin/pages_controller.rb +11 -11
- data/app/controllers/alchemy/admin/pictures_controller.rb +15 -15
- data/app/controllers/alchemy/admin/resources_controller.rb +28 -46
- data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
- data/app/controllers/alchemy/admin/tags_controller.rb +11 -11
- data/app/controllers/alchemy/api/base_controller.rb +2 -2
- data/app/controllers/alchemy/api/elements_controller.rb +11 -13
- data/app/controllers/alchemy/api/ingredients_controller.rb +1 -1
- data/app/controllers/alchemy/api/nodes_controller.rb +1 -1
- data/app/controllers/alchemy/api/pages_controller.rb +14 -12
- data/app/controllers/alchemy/attachments_controller.rb +3 -3
- data/app/controllers/alchemy/base_controller.rb +1 -1
- data/app/controllers/alchemy/messages_controller.rb +18 -18
- data/app/controllers/alchemy/pages_controller.rb +10 -16
- data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +1 -0
- data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -7
- data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +5 -5
- data/app/decorators/alchemy/element_editor.rb +13 -33
- data/app/decorators/alchemy/ingredient_editor.rb +6 -6
- data/app/helpers/alchemy/admin/attachments_helper.rb +1 -1
- data/app/helpers/alchemy/admin/base_helper.rb +21 -22
- data/app/helpers/alchemy/admin/elements_helper.rb +1 -3
- data/app/helpers/alchemy/admin/form_helper.rb +1 -1
- data/app/helpers/alchemy/admin/navigation_helper.rb +7 -7
- data/app/helpers/alchemy/admin/pages_helper.rb +2 -2
- data/app/helpers/alchemy/admin/tags_helper.rb +3 -3
- data/app/helpers/alchemy/base_helper.rb +2 -2
- data/app/helpers/alchemy/elements_block_helper.rb +13 -48
- data/app/helpers/alchemy/elements_helper.rb +15 -23
- data/app/helpers/alchemy/pages_helper.rb +11 -15
- data/app/helpers/alchemy/url_helper.rb +1 -1
- data/app/mailers/alchemy/messages_mailer.rb +1 -1
- data/app/models/alchemy/attachment.rb +12 -9
- data/app/models/alchemy/base_record.rb +3 -0
- data/app/models/alchemy/eager_loading.rb +6 -7
- data/app/models/alchemy/element/definitions.rb +1 -1
- data/app/models/alchemy/element/element_ingredients.rb +4 -11
- data/app/models/alchemy/element/presenters.rb +9 -25
- data/app/models/alchemy/element.rb +4 -19
- data/app/models/alchemy/elements_repository.rb +1 -1
- data/app/models/alchemy/image_cropper_settings.rb +2 -2
- data/app/models/alchemy/ingredient.rb +29 -16
- data/app/models/alchemy/ingredient_validator.rb +1 -1
- data/app/models/alchemy/ingredients/audio.rb +2 -0
- data/app/models/alchemy/ingredients/datetime.rb +3 -1
- data/app/models/alchemy/ingredients/file.rb +7 -0
- data/app/models/alchemy/ingredients/headline.rb +6 -0
- data/app/models/alchemy/ingredients/link.rb +2 -0
- data/app/models/alchemy/ingredients/node.rb +2 -0
- data/app/models/alchemy/ingredients/page.rb +2 -0
- data/app/models/alchemy/ingredients/picture.rb +29 -0
- data/app/models/alchemy/ingredients/richtext.rb +17 -8
- data/app/models/alchemy/ingredients/select.rb +1 -0
- data/app/models/alchemy/ingredients/text.rb +8 -0
- data/app/models/alchemy/ingredients/video.rb +2 -0
- data/app/models/alchemy/language/code.rb +1 -1
- data/app/models/alchemy/language.rb +4 -4
- data/app/models/alchemy/legacy_page_url.rb +1 -1
- data/app/models/alchemy/node.rb +11 -8
- data/app/models/alchemy/page/page_elements.rb +19 -40
- data/app/models/alchemy/page/page_layouts.rb +0 -14
- data/app/models/alchemy/page/page_naming.rb +4 -4
- data/app/models/alchemy/page/page_natures.rb +1 -11
- data/app/models/alchemy/page/page_scopes.rb +5 -5
- data/app/models/alchemy/page.rb +11 -19
- data/app/models/alchemy/picture/calculations.rb +2 -2
- data/app/models/alchemy/picture/transformations.rb +2 -32
- data/app/models/alchemy/picture/url.rb +5 -5
- data/app/models/alchemy/picture.rb +22 -20
- data/app/models/alchemy/picture_thumb/create.rb +7 -18
- data/app/models/alchemy/picture_thumb/file_store.rb +33 -0
- data/app/models/alchemy/picture_thumb.rb +11 -11
- data/app/models/alchemy/picture_variant.rb +2 -3
- data/app/models/alchemy/tag.rb +8 -0
- data/app/models/concerns/alchemy/picture_thumbnails.rb +8 -8
- data/app/serializers/alchemy/base_serializer.rb +1 -1
- data/app/serializers/alchemy/element_serializer.rb +1 -6
- data/app/serializers/alchemy/page_tree_serializer.rb +7 -7
- data/app/services/alchemy/delete_elements.rb +1 -7
- data/app/services/alchemy/duplicate_element.rb +2 -7
- data/app/services/alchemy/tag_validations.rb +1 -1
- data/app/views/alchemy/admin/elements/_element.html.erb +8 -22
- data/app/views/alchemy/admin/elements/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/fold.js.erb +2 -2
- data/app/views/alchemy/admin/elements/order.js.erb +1 -1
- data/app/views/alchemy/admin/elements/update.js.erb +1 -2
- data/app/views/alchemy/admin/pages/_external_link.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_file_link.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_internal_link.html.erb +2 -2
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -4
- data/app/views/alchemy/admin/pages/update.js.erb +10 -4
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -3
- data/app/views/alchemy/admin/pictures/_infos.html.erb +4 -6
- data/app/views/alchemy/ingredients/_audio_view.html.erb +1 -14
- data/app/views/alchemy/ingredients/_boolean_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_boolean_view.html.erb +1 -1
- data/app/views/alchemy/ingredients/_datetime_view.html.erb +3 -9
- data/app/views/alchemy/ingredients/_file_view.html.erb +3 -16
- data/app/views/alchemy/ingredients/_headline_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_headline_view.html.erb +4 -10
- data/app/views/alchemy/ingredients/_html_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_html_view.html.erb +1 -1
- data/app/views/alchemy/ingredients/_link_view.html.erb +4 -9
- data/app/views/alchemy/ingredients/_node_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_node_view.html.erb +1 -1
- data/app/views/alchemy/ingredients/_page_view.html.erb +1 -4
- data/app/views/alchemy/ingredients/_picture_editor.html.erb +4 -4
- data/app/views/alchemy/ingredients/_picture_view.html.erb +4 -5
- data/app/views/alchemy/ingredients/_richtext_editor.html.erb +11 -2
- data/app/views/alchemy/ingredients/_richtext_view.html.erb +3 -3
- data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -2
- data/app/views/alchemy/ingredients/_select_view.html.erb +1 -1
- data/app/views/alchemy/ingredients/_text_editor.html.erb +1 -1
- data/app/views/alchemy/ingredients/_text_view.html.erb +3 -19
- data/app/views/alchemy/ingredients/_video_view.html.erb +3 -18
- data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +4 -3
- data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +1 -0
- data/app/views/alchemy/pages/_meta_data.html.erb +0 -1
- data/app/views/layouts/alchemy/admin.html.erb +10 -8
- data/bin/setup +37 -0
- data/bin/start +17 -0
- data/config/alchemy/config.yml +6 -6
- data/config/brakeman.ignore +56 -57
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/dragonfly.rb +1 -0
- data/config/initializers/mime_types.rb +1 -0
- data/config/initializers/mini_profiler.rb +1 -0
- data/config/initializers/simple_form.rb +3 -2
- data/config/locales/alchemy.en.yml +98 -112
- data/config/routes.rb +22 -36
- data/config/spring.rb +1 -0
- data/db/migrate/20230121212637_alchemy_six_point_one.rb +248 -0
- data/db/migrate/20230505132743_add_indexes_to_alchemy_pictures.rb +6 -0
- data/lib/alchemy/admin/locale.rb +3 -3
- data/lib/alchemy/admin/preview_url.rb +2 -2
- data/lib/alchemy/auth_accessors.rb +1 -1
- data/lib/alchemy/cache_digests/template_tracker.rb +6 -7
- data/lib/alchemy/config.rb +3 -3
- data/lib/alchemy/controller_actions.rb +4 -4
- data/lib/alchemy/deprecation.rb +2 -1
- data/lib/alchemy/dragonfly/processors/thumbnail.rb +1 -1
- data/lib/alchemy/element_definition.rb +2 -2
- data/lib/alchemy/engine.rb +2 -1
- data/lib/alchemy/errors.rb +0 -11
- data/lib/alchemy/filetypes.rb +7 -7
- data/lib/alchemy/forms/builder.rb +4 -4
- data/lib/alchemy/hints.rb +10 -10
- data/lib/alchemy/i18n.rb +6 -4
- data/lib/alchemy/install/tasks.rb +2 -1
- data/lib/alchemy/name_conversions.rb +1 -1
- data/lib/alchemy/page_layout.rb +1 -1
- data/lib/alchemy/permissions.rb +5 -17
- data/lib/alchemy/resource.rb +10 -10
- data/lib/alchemy/resources_helper.rb +7 -7
- data/lib/alchemy/routing_constraints.rb +5 -5
- data/lib/alchemy/searchable_resource.rb +38 -0
- data/lib/alchemy/seeder.rb +4 -3
- data/lib/alchemy/shell.rb +2 -1
- data/lib/alchemy/taggable.rb +3 -2
- data/lib/alchemy/tasks/tidy.rb +1 -38
- data/lib/alchemy/test_support/capybara_helpers.rb +69 -0
- data/lib/alchemy/test_support/config_stubbing.rb +1 -0
- data/lib/alchemy/test_support/factories/element_factory.rb +2 -4
- data/lib/alchemy/test_support/factories/ingredient_factory.rb +1 -1
- data/lib/alchemy/test_support/factories/page_factory.rb +5 -3
- data/lib/alchemy/test_support/having_crop_action_examples.rb +9 -9
- data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +33 -33
- data/lib/alchemy/test_support/integration_helpers.rb +4 -3
- data/lib/alchemy/test_support/shared_contexts.rb +2 -1
- data/lib/alchemy/test_support/shared_dom_ids_examples.rb +10 -10
- data/lib/alchemy/test_support/shared_ingredient_examples.rb +13 -7
- data/lib/alchemy/test_support/shared_uploader_examples.rb +1 -0
- data/lib/alchemy/tinymce.rb +3 -43
- data/lib/alchemy/upgrader/seven_point_zero.rb +45 -0
- data/lib/alchemy/upgrader/tasks/.keep +0 -0
- data/lib/alchemy/upgrader.rb +9 -3
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy.rb +0 -19
- data/lib/alchemy_cms.rb +2 -2
- data/lib/generators/alchemy/base.rb +3 -2
- data/lib/generators/alchemy/elements/elements_generator.rb +2 -2
- data/lib/generators/alchemy/elements/templates/view.html.erb +1 -10
- data/lib/generators/alchemy/elements/templates/view.html.haml +1 -9
- data/lib/generators/alchemy/elements/templates/view.html.slim +1 -9
- data/lib/generators/alchemy/ingredient/ingredient_generator.rb +1 -0
- data/lib/generators/alchemy/install/files/alchemy.en.yml +7 -8
- data/lib/generators/alchemy/install/files/application.html.erb +1 -1
- data/lib/generators/alchemy/install/install_generator.rb +20 -23
- data/lib/generators/alchemy/install/templates/elements.yml.tt +12 -12
- data/lib/generators/alchemy/module/module_generator.rb +1 -0
- data/lib/generators/alchemy/page_layouts/page_layouts_generator.rb +1 -0
- data/lib/generators/alchemy/site_layouts/site_layouts_generator.rb +1 -0
- data/lib/generators/alchemy/views/views_generator.rb +2 -1
- data/lib/tasks/alchemy/thumbnails.rake +6 -25
- data/lib/tasks/alchemy/tidy.rake +2 -12
- data/lib/tasks/alchemy/upgrade.rake +13 -49
- data/package/admin.js +2 -0
- data/package/dist/admin.js +16 -0
- data/package/dist/admin.js.map +7 -0
- data/package/src/datepicker.js +1 -0
- data/package/src/tinymce.js +142 -0
- data/package.json +5 -3
- metadata +41 -135
- data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +0 -93
- data/app/controllers/alchemy/admin/contents_controller.rb +0 -21
- data/app/controllers/alchemy/admin/essence_audios_controller.rb +0 -30
- data/app/controllers/alchemy/admin/essence_files_controller.rb +0 -31
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +0 -43
- data/app/controllers/alchemy/admin/essence_videos_controller.rb +0 -34
- data/app/controllers/alchemy/api/contents_controller.rb +0 -52
- data/app/decorators/alchemy/content_editor.rb +0 -119
- data/app/helpers/alchemy/admin/contents_helper.rb +0 -42
- data/app/helpers/alchemy/admin/essences_helper.rb +0 -31
- data/app/models/alchemy/content/factory.rb +0 -143
- data/app/models/alchemy/content.rb +0 -247
- data/app/models/alchemy/element/element_contents.rb +0 -200
- data/app/models/alchemy/element/element_essences.rb +0 -133
- data/app/models/alchemy/essence_audio.rb +0 -13
- data/app/models/alchemy/essence_boolean.rb +0 -20
- data/app/models/alchemy/essence_date.rb +0 -25
- data/app/models/alchemy/essence_file.rb +0 -49
- data/app/models/alchemy/essence_headline.rb +0 -41
- data/app/models/alchemy/essence_html.rb +0 -23
- data/app/models/alchemy/essence_link.rb +0 -21
- data/app/models/alchemy/essence_node.rb +0 -19
- data/app/models/alchemy/essence_page.rb +0 -17
- data/app/models/alchemy/essence_picture.rb +0 -67
- data/app/models/alchemy/essence_picture_view.rb +0 -90
- data/app/models/alchemy/essence_richtext.rb +0 -44
- data/app/models/alchemy/essence_select.rb +0 -19
- data/app/models/alchemy/essence_text.rb +0 -23
- data/app/models/alchemy/essence_video.rb +0 -13
- data/app/presenters/alchemy/picture_view.rb +0 -88
- data/app/serializers/alchemy/content_serializer.rb +0 -17
- data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -10
- data/app/serializers/alchemy/essence_date_serializer.rb +0 -10
- data/app/serializers/alchemy/essence_file_serializer.rb +0 -13
- data/app/serializers/alchemy/essence_html_serializer.rb +0 -10
- data/app/serializers/alchemy/essence_link_serializer.rb +0 -13
- data/app/serializers/alchemy/essence_picture_serializer.rb +0 -28
- data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -11
- data/app/serializers/alchemy/essence_select_serializer.rb +0 -10
- data/app/serializers/alchemy/essence_text_serializer.rb +0 -22
- data/app/views/alchemy/admin/contents/create.js.erb +0 -21
- data/app/views/alchemy/admin/essence_audios/edit.html.erb +0 -7
- data/app/views/alchemy/admin/essence_files/edit.html.erb +0 -21
- data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +0 -5
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +0 -30
- data/app/views/alchemy/admin/essence_pictures/save_link.js.erb +0 -3
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +0 -8
- data/app/views/alchemy/admin/essence_videos/edit.html.erb +0 -12
- data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +0 -13
- data/app/views/alchemy/essences/_essence_audio_editor.html.erb +0 -4
- data/app/views/alchemy/essences/_essence_audio_view.html.erb +0 -15
- data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +0 -11
- data/app/views/alchemy/essences/_essence_boolean_view.html.erb +0 -2
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +0 -16
- data/app/views/alchemy/essences/_essence_date_view.html.erb +0 -10
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +0 -54
- data/app/views/alchemy/essences/_essence_file_view.html.erb +0 -18
- data/app/views/alchemy/essences/_essence_headline_editor.html.erb +0 -36
- data/app/views/alchemy/essences/_essence_headline_view.html.erb +0 -10
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +0 -10
- data/app/views/alchemy/essences/_essence_html_view.html.erb +0 -2
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +0 -30
- data/app/views/alchemy/essences/_essence_link_view.html.erb +0 -10
- data/app/views/alchemy/essences/_essence_node_editor.html.erb +0 -27
- data/app/views/alchemy/essences/_essence_node_view.html.erb +0 -1
- data/app/views/alchemy/essences/_essence_page_editor.html.erb +0 -26
- data/app/views/alchemy/essences/_essence_page_view.html.erb +0 -5
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +0 -59
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +0 -6
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +0 -14
- data/app/views/alchemy/essences/_essence_richtext_view.html.erb +0 -4
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +0 -28
- data/app/views/alchemy/essences/_essence_select_view.html.erb +0 -2
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +0 -29
- data/app/views/alchemy/essences/_essence_text_view.html.erb +0 -17
- data/app/views/alchemy/essences/_essence_video_editor.html.erb +0 -4
- data/app/views/alchemy/essences/_essence_video_view.html.erb +0 -19
- data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +0 -59
- data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +0 -20
- data/app/views/alchemy/pages/show.rss.builder +0 -21
- data/db/migrate/20200226213334_alchemy_four_point_four.rb +0 -313
- data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +0 -11
- data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +0 -28
- data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +0 -8
- data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +0 -27
- data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +0 -6
- data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +0 -24
- data/db/migrate/20200617110713_create_alchemy_picture_thumbs.rb +0 -22
- data/db/migrate/20200907111332_remove_tri_state_booleans.rb +0 -33
- data/db/migrate/20201207131309_create_page_versions.rb +0 -19
- data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +0 -76
- data/db/migrate/20210205143548_rename_public_on_and_public_until_on_alchemy_pages.rb +0 -10
- data/db/migrate/20210326105046_add_sanitized_body_to_alchemy_essence_richtexts.rb +0 -7
- data/db/migrate/20210406093436_add_alchemy_essence_headlines.rb +0 -12
- data/db/migrate/20210506135919_create_essence_audios.rb +0 -19
- data/db/migrate/20210506140258_create_essence_videos.rb +0 -23
- data/db/migrate/20210508091432_create_alchemy_ingredients.rb +0 -22
- data/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb +0 -13
- data/db/migrate/20220622130905_add_playsinline_to_alchemy_essence_videos.rb +0 -9
- data/lib/alchemy/essence.rb +0 -250
- data/lib/alchemy/test_support/essence_shared_examples.rb +0 -271
- data/lib/alchemy/test_support/factories/content_factory.rb +0 -20
- data/lib/alchemy/test_support/factories/essence_audio_factory.rb +0 -7
- data/lib/alchemy/test_support/factories/essence_file_factory.rb +0 -7
- data/lib/alchemy/test_support/factories/essence_page_factory.rb +0 -7
- data/lib/alchemy/test_support/factories/essence_picture_factory.rb +0 -11
- data/lib/alchemy/test_support/factories/essence_text_factory.rb +0 -7
- data/lib/alchemy/test_support/factories/essence_video_factory.rb +0 -7
- data/lib/alchemy/upgrader/five_point_zero.rb +0 -41
- data/lib/alchemy/upgrader/six_point_zero.rb +0 -21
- data/lib/alchemy/upgrader/tasks/add_page_versions.rb +0 -33
- data/lib/alchemy/upgrader/tasks/element_views_updater.rb +0 -34
- data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +0 -29
- data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +0 -74
- data/lib/generators/alchemy/essence/essence_generator.rb +0 -49
- data/lib/generators/alchemy/essence/templates/editor.html.erb +0 -17
- data/lib/generators/alchemy/essence/templates/view.html.erb +0 -2
data/Rakefile
CHANGED
@@ -48,9 +48,10 @@ namespace :alchemy do
|
|
48
48
|
bin/rake db:create && \
|
49
49
|
bin/rake db:environment:set && \
|
50
50
|
bin/rake db:migrate:reset && \
|
51
|
+
bin/rails javascript:install:esbuild && \
|
51
52
|
bin/rails g alchemy:install --skip --skip-demo-files --auto-accept --skip-db-create && \
|
52
53
|
yarn link @alchemy_cms/admin && \
|
53
|
-
|
54
|
+
bin/rails javascript:build && \
|
54
55
|
cd -
|
55
56
|
BASH
|
56
57
|
) || fail
|
@@ -63,13 +64,17 @@ namespace :alchemy do
|
|
63
64
|
original_file = "./CHANGELOG.md"
|
64
65
|
new_file = original_file + ".new"
|
65
66
|
backup = original_file + ".old"
|
66
|
-
changes = `git rev-list v#{ENV["PREVIOUS_VERSION"]}..HEAD | bundle exec github_fast_changelog AlchemyCMS/alchemy_cms
|
67
|
-
File.
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
changes = `git rev-list v#{ENV["PREVIOUS_VERSION"]}..HEAD | bundle exec github_fast_changelog AlchemyCMS/alchemy_cms`.split("\n")
|
68
|
+
changelog = File.read(original_file)
|
69
|
+
File.open(new_file, "w") do |file|
|
70
|
+
changes.each do |change|
|
71
|
+
next if changelog.include?(change)
|
72
|
+
file.puts change
|
71
73
|
end
|
72
|
-
|
74
|
+
File.foreach(original_file) do |line|
|
75
|
+
file.puts line
|
76
|
+
end
|
77
|
+
file.puts ""
|
73
78
|
end
|
74
79
|
File.rename(original_file, backup)
|
75
80
|
File.rename(new_file, original_file)
|
data/alchemy_cms.gemspec
CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.summary = "A powerful, userfriendly and flexible CMS for Rails"
|
15
15
|
gem.description = "Alchemy is a powerful, userfriendly and flexible Rails CMS."
|
16
16
|
gem.requirements << "ImageMagick (libmagick), v6.6 or greater."
|
17
|
-
gem.required_ruby_version = ">=
|
17
|
+
gem.required_ruby_version = ">= 3.0.0"
|
18
18
|
gem.license = "BSD New"
|
19
19
|
gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) }
|
20
20
|
gem.require_paths = ["lib"]
|
@@ -45,14 +45,14 @@ Gem::Specification.new do |gem|
|
|
45
45
|
gem.add_runtime_dependency "jquery-ui-rails", ["~> 6.0"]
|
46
46
|
gem.add_runtime_dependency "kaminari", ["~> 1.1"]
|
47
47
|
gem.add_runtime_dependency "originator", ["~> 3.1"]
|
48
|
-
gem.add_runtime_dependency "ransack", [">= 1.8", "<
|
48
|
+
gem.add_runtime_dependency "ransack", [">= 1.8", "< 5.0"]
|
49
49
|
gem.add_runtime_dependency "request_store", ["~> 1.2"]
|
50
50
|
gem.add_runtime_dependency "responders", [">= 2.0", "< 4.0"]
|
51
51
|
gem.add_runtime_dependency "sassc-rails", ["~> 2.1"]
|
52
52
|
gem.add_runtime_dependency "simple_form", [">= 4.0", "< 6"]
|
53
53
|
gem.add_runtime_dependency "sprockets", [">= 3.0", "< 5"]
|
54
54
|
gem.add_runtime_dependency "turbolinks", [">= 2.5"]
|
55
|
-
gem.add_runtime_dependency "
|
55
|
+
gem.add_runtime_dependency "view_component", ["~> 3.0"]
|
56
56
|
|
57
57
|
gem.add_development_dependency "capybara", ["~> 3.0"]
|
58
58
|
gem.add_development_dependency "capybara-screenshot", ["~> 1.0"]
|
@@ -38,7 +38,6 @@
|
|
38
38
|
//= require alchemy/alchemy.uploader
|
39
39
|
//= require alchemy/alchemy.preview_window
|
40
40
|
//= require alchemy/alchemy.spinner
|
41
|
-
//= require alchemy/alchemy.tinymce
|
42
41
|
//= require alchemy/alchemy.tooltips
|
43
42
|
//= require alchemy/page_select
|
44
43
|
//= require alchemy/node_select
|
@@ -20,7 +20,7 @@ $.extend Alchemy,
|
|
20
20
|
setElementClean: (element) ->
|
21
21
|
$element = $(element)
|
22
22
|
$element.removeClass('dirty')
|
23
|
-
$element.find('> .element-
|
23
|
+
$element.find('> .element-body .dirty').removeClass('dirty')
|
24
24
|
window.onbeforeunload = undefined
|
25
25
|
|
26
26
|
isPageDirty: ->
|
@@ -15,7 +15,7 @@ Alchemy.ElementEditors =
|
|
15
15
|
init: ->
|
16
16
|
@element_area = $("#element_area")
|
17
17
|
@bindEvents()
|
18
|
-
@
|
18
|
+
@expandIngredientGroups()
|
19
19
|
return
|
20
20
|
|
21
21
|
# Binds click events on several DOM elements from element editors
|
@@ -29,27 +29,25 @@ Alchemy.ElementEditors =
|
|
29
29
|
@onDoubleClickElement(e)
|
30
30
|
@element_area.on "click", "[data-element-toggle]", (e) =>
|
31
31
|
@onClickToggle(e)
|
32
|
-
@element_area.on "click", '[data-create-missing-content]', (e) =>
|
33
|
-
@onClickMissingContent(e)
|
34
32
|
# Binds the custom FocusElementEditor event
|
35
33
|
@element_area.on "FocusElementEditor.Alchemy", '.element-editor', (e) =>
|
36
34
|
@onFocusElement(e)
|
37
35
|
# Binds the custom SaveElement event
|
38
36
|
@element_area.on "SaveElement.Alchemy", '.element-editor', (e, data) =>
|
39
37
|
@onSaveElement(e, data)
|
40
|
-
@element_area.on "click", '[data-toggle-
|
41
|
-
@
|
38
|
+
@element_area.on "click", '[data-toggle-ingredient-group]', (e) =>
|
39
|
+
@onToggleIngredientGroup(e)
|
42
40
|
# Listen to postMessage messages from the preview frame
|
43
41
|
window.addEventListener 'message', (e) =>
|
44
42
|
@onMessage(e.data)
|
45
43
|
true
|
46
44
|
return
|
47
45
|
|
48
|
-
# Expands
|
49
|
-
|
50
|
-
if $
|
51
|
-
for header_id in JSON.parse($
|
52
|
-
$('#' + header_id).closest('.
|
46
|
+
# Expands ingredient groups that are stored in sessionStorage as expanded
|
47
|
+
expandIngredientGroups: ->
|
48
|
+
if $expanded_ingredient_groups = sessionStorage.getItem('Alchemy.expanded_ingredient_groups')
|
49
|
+
for header_id in JSON.parse($expanded_ingredient_groups) then do (header_id) =>
|
50
|
+
$('#' + header_id).closest('.ingredient-group').addClass('expanded');
|
53
51
|
|
54
52
|
# Selects and scrolls to element with given id in the preview window.
|
55
53
|
#
|
@@ -179,21 +177,21 @@ Alchemy.ElementEditors =
|
|
179
177
|
Alchemy.Buttons.enable($element)
|
180
178
|
true
|
181
179
|
|
182
|
-
# Toggle visibility of the
|
183
|
-
|
184
|
-
$group_div = $(event.currentTarget).closest('.
|
180
|
+
# Toggle visibility of the ingredient fields in the group
|
181
|
+
onToggleIngredientGroup: (event) ->
|
182
|
+
$group_div = $(event.currentTarget).closest('.ingredient-group');
|
185
183
|
$group_div.toggleClass('expanded');
|
186
184
|
|
187
|
-
$
|
188
|
-
# Add or remove depending on whether this
|
185
|
+
$expanded_ingredient_groups = JSON.parse(sessionStorage.getItem('Alchemy.expanded_ingredient_groups') || '[]');
|
186
|
+
# Add or remove depending on whether this ingredient group is expanded
|
189
187
|
if $group_div.hasClass('expanded')
|
190
|
-
if $
|
191
|
-
$
|
188
|
+
if $expanded_ingredient_groups.indexOf(event.currentTarget.id) == -1
|
189
|
+
$expanded_ingredient_groups.push(event.currentTarget.id);
|
192
190
|
else
|
193
|
-
$
|
191
|
+
$expanded_ingredient_groups = $expanded_ingredient_groups.filter (value) ->
|
194
192
|
value != event.currentTarget.id
|
195
193
|
|
196
|
-
sessionStorage.setItem('Alchemy.
|
194
|
+
sessionStorage.setItem('Alchemy.expanded_ingredient_groups', JSON.stringify($expanded_ingredient_groups))
|
197
195
|
false
|
198
196
|
|
199
197
|
# Event handlers
|
@@ -248,22 +246,10 @@ Alchemy.ElementEditors =
|
|
248
246
|
e.stopPropagation()
|
249
247
|
false
|
250
248
|
|
251
|
-
# Handles the missing content button click events.
|
252
|
-
#
|
253
|
-
# Ensures that the links query string is converted into post body and send
|
254
|
-
# the request via a real ajax post to server, to allow long query strings.
|
255
|
-
#
|
256
|
-
onClickMissingContent: (e) ->
|
257
|
-
link = e.target
|
258
|
-
url = link.pathname
|
259
|
-
querystring = link.search.replace(/\?/, '')
|
260
|
-
$.post(url, querystring)
|
261
|
-
false
|
262
|
-
|
263
249
|
# private
|
264
250
|
|
265
251
|
_shouldUpdateTitle: (element, event) ->
|
266
|
-
editors = element.find('> .element-
|
252
|
+
editors = element.find('> .element-body .element-ingredient-editors').children()
|
267
253
|
if @_hasParents(element)
|
268
254
|
editors.length != 0
|
269
255
|
else if @_isParent(element) && @_isFirstChild $(event.target)
|
@@ -50,8 +50,8 @@ Alchemy.ElementsWindow =
|
|
50
50
|
$.get @url, (data) =>
|
51
51
|
@element_area.html data
|
52
52
|
Alchemy.GUI.init(@element_area)
|
53
|
-
Alchemy.fileEditors(@element_area.find(".
|
54
|
-
Alchemy.pictureEditors(@element_area.find(".
|
53
|
+
Alchemy.fileEditors(@element_area.find(".ingredient-editor.file, .ingredient-editor.audio, .ingredient-editor.video").selector)
|
54
|
+
Alchemy.pictureEditors(@element_area.find(".ingredient-editor.picture").selector)
|
55
55
|
if @callback
|
56
56
|
@callback.call()
|
57
57
|
.fail (xhr, status, error) =>
|
@@ -23,5 +23,5 @@ Alchemy.GUI =
|
|
23
23
|
Alchemy.ElementDirtyObserver($el)
|
24
24
|
Alchemy.GUI.init($el && $el.selector)
|
25
25
|
Alchemy.ImageLoader($el[0])
|
26
|
-
Alchemy.fileEditors($el.find(".
|
27
|
-
Alchemy.pictureEditors($el.find(".
|
26
|
+
Alchemy.fileEditors($el.find(".ingredient-editor.file, .ingredient-editor.audio, .ingredient-editor.video").selector)
|
27
|
+
Alchemy.pictureEditors($el.find(".ingredient-editor.picture").selector)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Represents the link Dialog that appears, if a user clicks the link buttons
|
2
|
-
# in TinyMCE or on an
|
2
|
+
# in TinyMCE or on an Ingredient that has links enabled (e.g. Picture)
|
3
3
|
#
|
4
4
|
class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
5
5
|
|
@@ -25,37 +25,29 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
|
25
25
|
# attach events we handle
|
26
26
|
@attachEvents()
|
27
27
|
# Store some jQuery objects for further reference
|
28
|
-
@$
|
28
|
+
@$internal_link = $('#internal_link', @dialog_body)
|
29
29
|
@$element_anchor = $('#element_anchor', @dialog_body)
|
30
30
|
@$anchor_link = $('#anchor_link', @dialog_body)
|
31
|
-
@$
|
32
|
-
@$
|
31
|
+
@$external_link = $('#external_link', @dialog_body)
|
32
|
+
@$file_link = $('#file_link', @dialog_body)
|
33
33
|
@$overlay_tabs = $('#overlay_tabs', @dialog_body)
|
34
34
|
@$page_container = $('#page_selector_container')
|
35
|
+
@initAnchorLinks()
|
35
36
|
# if we edit an existing link
|
36
37
|
if @link_object
|
37
38
|
# we select the correct tab
|
38
39
|
@selectTab()
|
39
40
|
@initPageSelect()
|
40
|
-
|
41
|
+
return
|
41
42
|
|
42
43
|
# Attaches click events to several buttons in the link dialog.
|
43
44
|
attachEvents: ->
|
44
45
|
# The ok buttons
|
45
46
|
$('.create-link.button', @dialog_body).click (e) =>
|
46
47
|
@link_type = $(e.target).data('link-type')
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
url = @$external_url.val()
|
51
|
-
when 'file'
|
52
|
-
url = @$public_filename.val()
|
53
|
-
when 'anchor'
|
54
|
-
url = @$anchor_link.val()
|
55
|
-
else
|
56
|
-
url = @$page_urlname.val()
|
57
|
-
if @$element_anchor.val() != ''
|
58
|
-
url += "##{@$element_anchor.val()}"
|
48
|
+
url = $("##{@link_type}_link").val()
|
49
|
+
if @link_type == 'internal' && @$element_anchor.val() != ''
|
50
|
+
url += "##{@$element_anchor.val()}"
|
59
51
|
# Create the link
|
60
52
|
@createLink
|
61
53
|
url: url
|
@@ -67,12 +59,17 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
|
67
59
|
initPageSelect: ->
|
68
60
|
pageTemplate = HandlebarsTemplates.page
|
69
61
|
element_anchor_placeholder = @$element_anchor.attr('placeholder')
|
70
|
-
|
62
|
+
if @link_object.dataset.languageId
|
63
|
+
api_url = "#{Alchemy.routes.api_pages_path}?language_id=#{@link_object.dataset.languageId}"
|
64
|
+
else
|
65
|
+
api_url = Alchemy.routes.api_pages_path
|
66
|
+
|
67
|
+
@$internal_link.select2
|
71
68
|
placeholder: Alchemy.t('Search page')
|
72
69
|
allowClear: true
|
73
70
|
minimumInputLength: 3
|
74
71
|
ajax:
|
75
|
-
url:
|
72
|
+
url: api_url
|
76
73
|
datatype: 'json'
|
77
74
|
quietMillis: 300
|
78
75
|
data: (term, page) ->
|
@@ -142,7 +139,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
|
142
139
|
@setLink(options.url, options.title, options.target)
|
143
140
|
@close()
|
144
141
|
|
145
|
-
# Sets the link either in TinyMCE or on an
|
142
|
+
# Sets the link either in TinyMCE or on an Ingredient.
|
146
143
|
setLink: (url, title, target) ->
|
147
144
|
Alchemy.setElementDirty(@$link_object.closest('.element-editor'))
|
148
145
|
if @link_object.editor
|
@@ -162,7 +159,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
|
162
159
|
editor.selection.collapse()
|
163
160
|
true
|
164
161
|
|
165
|
-
# Sets a link on an
|
162
|
+
# Sets a link on an Ingredient (e.g. Picture).
|
166
163
|
setLinkFields: (url, title, target) ->
|
167
164
|
@link_value_field.value = url
|
168
165
|
@link_value_field.dispatchEvent(new Event("change"))
|
@@ -176,10 +173,10 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
|
176
173
|
|
177
174
|
# Selects the correct tab for link type and fills all fields.
|
178
175
|
selectTab: ->
|
179
|
-
# Creating an temporary anchor node if we are linking an
|
176
|
+
# Creating an temporary anchor node if we are linking an Picture Ingredient.
|
180
177
|
if (@link_object.nodeType)
|
181
178
|
@$link = @createTempLink()
|
182
|
-
# Restoring the bookmarked selection inside the TinyMCE of an
|
179
|
+
# Restoring the bookmarked selection inside the TinyMCE of an Richtext.
|
183
180
|
else if (@link_object.node.nodeName == 'A')
|
184
181
|
@$link = $(@link_object.node)
|
185
182
|
@link_object.selection.moveToBookmark(@link_object.bookmark)
|
@@ -192,27 +189,33 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
|
192
189
|
if @$link.hasClass('external')
|
193
190
|
# Handles an external link.
|
194
191
|
tab = $('#overlay_tab_external_link')
|
195
|
-
@$
|
192
|
+
@$external_link.val(@$link.attr('href'))
|
196
193
|
else if @$link.hasClass('file')
|
197
194
|
# Handles a file link.
|
198
195
|
tab = $('#overlay_tab_file_link')
|
199
|
-
@$
|
196
|
+
@$file_link.select2('val', @$link[0].pathname + @$link[0].search)
|
200
197
|
else if @$link.attr('href').match(/^#/)
|
201
198
|
# Handles an anchor link.
|
202
199
|
tab = $('#overlay_tab_anchor_link')
|
203
200
|
@$anchor_link.select2('val', @$link.attr('href'))
|
204
|
-
else
|
201
|
+
else if @$link.hasClass('internal')
|
205
202
|
# Handles an internal link.
|
206
203
|
tab = $('#overlay_tab_internal_link')
|
207
204
|
@initInternalLinkTab()
|
208
|
-
|
209
|
-
|
205
|
+
else
|
206
|
+
# Emit an event to allow extensions hook into the link overlay.
|
207
|
+
@$overlay_tabs.trigger 'SelectLinkTab.Alchemy',
|
208
|
+
link: @$link
|
209
|
+
if tab
|
210
|
+
# activate the tab jquery ui 1.10 style o.O
|
211
|
+
@$overlay_tabs.tabs('option', 'active', $('#overlay_tabs > div').index(tab))
|
212
|
+
return
|
210
213
|
|
211
214
|
# Handles actions for internal link tab.
|
212
215
|
initInternalLinkTab: ->
|
213
216
|
url = @$link.attr('href').split('#')
|
214
217
|
# update the url field
|
215
|
-
@$
|
218
|
+
@$internal_link.val(url[0])
|
216
219
|
# store the anchor
|
217
220
|
@$element_anchor.val(url[1])
|
218
221
|
|
@@ -251,7 +254,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
|
251
254
|
|
252
255
|
# Public class methods
|
253
256
|
|
254
|
-
# Removes link from
|
257
|
+
# Removes link from Ingredient.
|
255
258
|
@removeLink = (link, parent_selector) ->
|
256
259
|
parent = document.querySelector(parent_selector)
|
257
260
|
link_value_field = parent.querySelector("[data-link-value]")
|
@@ -275,11 +275,10 @@
|
|
275
275
|
}
|
276
276
|
}
|
277
277
|
|
278
|
-
.element-
|
278
|
+
.element-body {
|
279
279
|
margin: 4px 8px;
|
280
280
|
}
|
281
281
|
|
282
|
-
.content_editor,
|
283
282
|
.ingredient-editor,
|
284
283
|
.picture_thumbnail {
|
285
284
|
width: 100%;
|
@@ -303,7 +302,7 @@
|
|
303
302
|
}
|
304
303
|
}
|
305
304
|
|
306
|
-
.element-
|
305
|
+
.element-body {
|
307
306
|
margin: 2 * $default-padding;
|
308
307
|
}
|
309
308
|
|
@@ -414,7 +413,7 @@
|
|
414
413
|
}
|
415
414
|
}
|
416
415
|
|
417
|
-
.
|
416
|
+
.ingredient-group {
|
418
417
|
width: 100%;
|
419
418
|
padding: $default-padding 0;
|
420
419
|
position: relative;
|
@@ -425,7 +424,7 @@
|
|
425
424
|
padding-bottom: 0;
|
426
425
|
}
|
427
426
|
|
428
|
-
.
|
427
|
+
.ingredient-group-header {
|
429
428
|
display: flex;
|
430
429
|
align-items: center;
|
431
430
|
justify-content: space-between;
|
@@ -434,22 +433,21 @@
|
|
434
433
|
padding: $default-padding 1px;
|
435
434
|
}
|
436
435
|
|
437
|
-
.
|
436
|
+
.ingredient-group-ingredients {
|
438
437
|
display: none;
|
439
438
|
}
|
440
439
|
|
441
440
|
&.expanded {
|
442
|
-
.
|
441
|
+
.ingredient-group-ingredients {
|
443
442
|
display: block;
|
444
443
|
}
|
445
444
|
|
446
|
-
.
|
445
|
+
.ingredient-group-expand {
|
447
446
|
@extend .fa-angle-up;
|
448
447
|
}
|
449
448
|
}
|
450
449
|
}
|
451
450
|
|
452
|
-
.element-content-editors,
|
453
451
|
.element-ingredient-editors {
|
454
452
|
display: flex;
|
455
453
|
flex-wrap: wrap;
|
@@ -467,7 +465,7 @@
|
|
467
465
|
min-height: 100px;
|
468
466
|
}
|
469
467
|
|
470
|
-
.
|
468
|
+
.ingredient_link_buttons {
|
471
469
|
display: flex;
|
472
470
|
position: absolute;
|
473
471
|
bottom: 2 * $default-margin;
|
@@ -495,7 +493,7 @@
|
|
495
493
|
background-color: $form-field-disabled-bg-color;
|
496
494
|
}
|
497
495
|
|
498
|
-
&.linked.link-
|
496
|
+
&.linked.link-ingredient {
|
499
497
|
@include linked-button(
|
500
498
|
$border-radius: 0,
|
501
499
|
$line-height: 30px,
|
@@ -507,7 +505,7 @@
|
|
507
505
|
}
|
508
506
|
}
|
509
507
|
|
510
|
-
&.linked.unlink-
|
508
|
+
&.linked.unlink-ingredient {
|
511
509
|
@include linked-button(
|
512
510
|
$border-radius: 0 $default-border-radius $default-border-radius 0,
|
513
511
|
$line-height: 30px,
|
@@ -519,7 +517,7 @@
|
|
519
517
|
}
|
520
518
|
}
|
521
519
|
|
522
|
-
&.unlink-
|
520
|
+
&.unlink-ingredient {
|
523
521
|
border-left-width: 0;
|
524
522
|
@extend .right-rounded-border;
|
525
523
|
}
|
@@ -561,7 +559,6 @@
|
|
561
559
|
}
|
562
560
|
}
|
563
561
|
|
564
|
-
.essence_picture,
|
565
562
|
.ingredient-editor.picture {
|
566
563
|
position: relative;
|
567
564
|
|
@@ -586,7 +583,7 @@
|
|
586
583
|
}
|
587
584
|
}
|
588
585
|
|
589
|
-
.
|
586
|
+
.picture_ingredient_css_class {
|
590
587
|
position: absolute;
|
591
588
|
z-index: 1;
|
592
589
|
bottom: 24px;
|
@@ -639,9 +636,6 @@
|
|
639
636
|
}
|
640
637
|
}
|
641
638
|
|
642
|
-
.content_editor.essence_audio,
|
643
|
-
.content_editor.essence_file,
|
644
|
-
.content_editor.essence_video,
|
645
639
|
.ingredient-editor.audio,
|
646
640
|
.ingredient-editor.file,
|
647
641
|
.ingredient-editor.video {
|
@@ -681,8 +675,7 @@
|
|
681
675
|
}
|
682
676
|
}
|
683
677
|
|
684
|
-
.file_tools
|
685
|
-
.essence_file_tools {
|
678
|
+
.file_tools {
|
686
679
|
display: flex;
|
687
680
|
align-items: center;
|
688
681
|
margin-left: auto;
|
@@ -717,7 +710,6 @@ select.long {
|
|
717
710
|
padding: 0;
|
718
711
|
}
|
719
712
|
|
720
|
-
.content_editor,
|
721
713
|
.ingredient-editor {
|
722
714
|
width: 100%;
|
723
715
|
padding: $default-padding 0;
|
@@ -828,7 +820,6 @@ select.long {
|
|
828
820
|
}
|
829
821
|
}
|
830
822
|
|
831
|
-
&.essence_select,
|
832
823
|
&.select {
|
833
824
|
label {
|
834
825
|
margin-bottom: 2 * $default-margin;
|
@@ -843,8 +834,7 @@ select.long {
|
|
843
834
|
}
|
844
835
|
}
|
845
836
|
|
846
|
-
select.ingredient-editor-select
|
847
|
-
select.essence_editor_select {
|
837
|
+
select.ingredient-editor-select {
|
848
838
|
border-radius: $default-border-radius;
|
849
839
|
background: white;
|
850
840
|
border: 1px solid $button-border-color;
|
@@ -871,13 +861,11 @@ select.long {
|
|
871
861
|
}
|
872
862
|
}
|
873
863
|
|
874
|
-
&.essence_picture,
|
875
864
|
&.picture {
|
876
865
|
width: 50%;
|
877
866
|
padding-left: 1px; // Compensate the box shadow
|
878
867
|
padding-right: $default-padding;
|
879
868
|
|
880
|
-
+ .essence_picture,
|
881
869
|
+ .picture {
|
882
870
|
padding-left: $default-padding;
|
883
871
|
padding-right: 1px; // Compensate the box shadow
|
@@ -885,10 +873,6 @@ select.long {
|
|
885
873
|
}
|
886
874
|
}
|
887
875
|
|
888
|
-
.content_rtf_text_area {
|
889
|
-
display: none;
|
890
|
-
}
|
891
|
-
|
892
876
|
div.pictures_for_element {
|
893
877
|
overflow: auto;
|
894
878
|
margin-top: 4px;
|
@@ -898,7 +882,7 @@ textarea.has_tinymce {
|
|
898
882
|
visibility: hidden;
|
899
883
|
}
|
900
884
|
|
901
|
-
.
|
885
|
+
.ingredient-editor.html textarea {
|
902
886
|
font-family: $mono-font-family;
|
903
887
|
resize: vertical;
|
904
888
|
font-size: $form-field-font-size;
|
@@ -928,8 +912,6 @@ textarea.has_tinymce {
|
|
928
912
|
}
|
929
913
|
}
|
930
914
|
|
931
|
-
.content_editor .hint-with-icon,
|
932
|
-
.content_editor .with-hint,
|
933
915
|
.ingredient-editor .hint-with-icon,
|
934
916
|
.ingredient-editor .with-hint,
|
935
917
|
.element-handle .hint-with-icon {
|
@@ -946,7 +928,7 @@ textarea.has_tinymce {
|
|
946
928
|
}
|
947
929
|
|
948
930
|
.is-fixed {
|
949
|
-
&.with-
|
931
|
+
&.with-ingredients {
|
950
932
|
> .element-footer {
|
951
933
|
border-top: 0;
|
952
934
|
border-bottom: 1px solid $medium-gray;
|
@@ -992,7 +974,6 @@ textarea.has_tinymce {
|
|
992
974
|
}
|
993
975
|
|
994
976
|
.ingredient-date--label,
|
995
|
-
.essence_date--label,
|
996
977
|
.edit-ingredient-anchor-link {
|
997
978
|
position: absolute;
|
998
979
|
right: 2 * $default-padding;
|
@@ -35,9 +35,9 @@
|
|
35
35
|
}
|
36
36
|
|
37
37
|
// The container of the rendered node is slightly larger than other a line of
|
38
|
-
// text, as it would be for the Alchemy::
|
38
|
+
// text, as it would be for the Alchemy::Ingredients::Page. Reducing the padding here from 0.6em
|
39
39
|
// to 0.4em centers the content nicely.
|
40
|
-
.
|
40
|
+
.ingredient-editor.node {
|
41
41
|
.select2-container.alchemy_selectbox .select2-choice {
|
42
42
|
padding: 0.4em 0.75em;
|
43
43
|
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Alchemy
|
2
|
+
module Ingredients
|
3
|
+
class AudioView < BaseView
|
4
|
+
def call
|
5
|
+
content_tag(:audio, **html_options) do
|
6
|
+
tag(:source, src: src, type: type)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def render?
|
11
|
+
!!ingredient.attachment
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def src
|
17
|
+
alchemy.show_attachment_path(
|
18
|
+
ingredient.attachment,
|
19
|
+
format: ingredient.attachment.suffix
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
def type
|
24
|
+
ingredient.attachment.file_mime_type
|
25
|
+
end
|
26
|
+
|
27
|
+
def html_options
|
28
|
+
{
|
29
|
+
controls: ingredient.controls,
|
30
|
+
autoplay: ingredient.autoplay,
|
31
|
+
loop: ingredient.loop,
|
32
|
+
muted: ingredient.muted
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Alchemy
|
2
|
+
module Ingredients
|
3
|
+
class BaseView < ViewComponent::Base
|
4
|
+
attr_reader :ingredient, :html_options
|
5
|
+
|
6
|
+
delegate :alchemy, to: :helpers
|
7
|
+
delegate :settings, :value, to: :ingredient
|
8
|
+
|
9
|
+
# @param ingredient [Alchemy::Ingredient]
|
10
|
+
# @param html_options [Hash] Options that will be passed to the wrapper tag.
|
11
|
+
def initialize(ingredient, html_options: {})
|
12
|
+
raise ArgumentError, "Ingredient missing!" if ingredient.nil?
|
13
|
+
|
14
|
+
@ingredient = ingredient
|
15
|
+
@html_options = html_options
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
value
|
20
|
+
end
|
21
|
+
|
22
|
+
def render?
|
23
|
+
value.present?
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# Fetches value from ingredient settings and allows to merge a value on top of it
|
29
|
+
#
|
30
|
+
# @param key [Symbol] - The settings key you want to fetch the value from
|
31
|
+
# @param value [Object] - A optional value that can override the setting.
|
32
|
+
# Normally passed as into the ingredient view.
|
33
|
+
def settings_value(key, value: nil, default: nil)
|
34
|
+
value.nil? ? settings.fetch(key, default) : value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|