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
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require_relative "../base"
|
3
4
|
|
4
5
|
module Alchemy
|
@@ -13,7 +14,6 @@ module Alchemy
|
|
13
14
|
|
14
15
|
@elements.each do |element|
|
15
16
|
@element = element
|
16
|
-
@contents = element["contents"] || []
|
17
17
|
@ingredients = element["ingredients"] || []
|
18
18
|
@element_name = element_name(element)
|
19
19
|
conditional_template "view.html.#{template_engine}", "#{elements_dir}/_#{@element_name}.html.#{template_engine}"
|
@@ -27,7 +27,7 @@ module Alchemy
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def element_name(element)
|
30
|
-
if element["name"]
|
30
|
+
if Alchemy::Element::NAME_REGEXP.match?(element["name"])
|
31
31
|
element["name"].underscore
|
32
32
|
else
|
33
33
|
raise "Element name '#{element["name"]}' has wrong format. Only lowercase and non whitespace characters allowed."
|
@@ -1,14 +1,5 @@
|
|
1
1
|
<%%- cache(<%= @element_name %>) do -%>
|
2
2
|
<%%= element_view_for(<%= @element_name %>) do |el| -%>
|
3
|
-
<%- @contents.each do |content| -%>
|
4
|
-
<%- if @contents.length > 1 -%>
|
5
|
-
<div class="<%= content["name"] %>">
|
6
|
-
<%%= el.render :<%= content["name"] %> %>
|
7
|
-
</div>
|
8
|
-
<%- else -%>
|
9
|
-
<%%= el.render :<%= content["name"] %> %>
|
10
|
-
<%- end -%>
|
11
|
-
<%- end -%>
|
12
3
|
<%- @ingredients.each do |ingredient| -%>
|
13
4
|
<%- if @ingredients.length > 1 -%>
|
14
5
|
<div class="<%= ingredient["role"] %>">
|
@@ -19,7 +10,7 @@
|
|
19
10
|
<%- end -%>
|
20
11
|
<%- end -%>
|
21
12
|
<%- if @element['nestable_elements'].present? -%>
|
22
|
-
<%%= render <%= @element_name %>.nested_elements.
|
13
|
+
<%%= render <%= @element_name %>.nested_elements.published %>
|
23
14
|
<%- end -%>
|
24
15
|
<%%- end -%>
|
25
16
|
<%%- end -%>
|
@@ -1,13 +1,5 @@
|
|
1
1
|
- cache(<%= @element_name -%>) do
|
2
2
|
= element_view_for(<%= @element_name -%>) do |el|
|
3
|
-
<%- @contents.each do |content| -%>
|
4
|
-
<%- if @contents.length > 1 -%>
|
5
|
-
.<%= content["name"] %>
|
6
|
-
= el.render :<%= content["name"] %>
|
7
|
-
<%- else -%>
|
8
|
-
= el.render :<%= content["name"] %>
|
9
|
-
<%- end -%>
|
10
|
-
<%- end -%>
|
11
3
|
<%- @ingredients.each do |ingredient| -%>
|
12
4
|
<%- if @ingredients.length > 1 -%>
|
13
5
|
.<%= ingredient["role"] %>
|
@@ -18,5 +10,5 @@
|
|
18
10
|
<%- end -%>
|
19
11
|
<%- end -%>
|
20
12
|
<%- if @element['nestable_elements'].present? -%>
|
21
|
-
= render <%= @element_name -%>.nested_elements.
|
13
|
+
= render <%= @element_name -%>.nested_elements.published
|
22
14
|
<%- end -%>
|
@@ -1,13 +1,5 @@
|
|
1
1
|
- cache(<%= @element_name -%>) do
|
2
2
|
= element_view_for(<%= @element_name -%>) do |el|
|
3
|
-
<%- @contents.each do |content| -%>
|
4
|
-
<%- if @contents.length > 1 -%>
|
5
|
-
.<%= content["name"] %>
|
6
|
-
= el.render :<%= content["name"] %>
|
7
|
-
<%- else -%>
|
8
|
-
= el.render :<%= content["name"] %>
|
9
|
-
<%- end -%>
|
10
|
-
<%- end -%>
|
11
3
|
<%- @ingredients.each do |ingredient| -%>
|
12
4
|
<%- if @ingredients.length > 1 -%>
|
13
5
|
.<%= ingredient["role"] %>
|
@@ -18,5 +10,5 @@
|
|
18
10
|
<%- end -%>
|
19
11
|
<%- end -%>
|
20
12
|
<%- if @element['nestable_elements'].present? -%>
|
21
|
-
= render <%= @element_name -%>.nested_elements.
|
13
|
+
= render <%= @element_name -%>.nested_elements.published
|
22
14
|
<%- end -%>
|
@@ -1,6 +1,5 @@
|
|
1
1
|
en:
|
2
2
|
alchemy:
|
3
|
-
|
4
3
|
# Translations for page layout names
|
5
4
|
page_layout_names:
|
6
5
|
index: Homepage
|
@@ -9,23 +8,23 @@ en:
|
|
9
8
|
element_names:
|
10
9
|
article: Article
|
11
10
|
|
12
|
-
# Translations for
|
13
|
-
|
11
|
+
# Translations for ingredient roles
|
12
|
+
ingredient_roles:
|
14
13
|
headline: Headline
|
15
14
|
text: Text
|
16
15
|
picture: Picture
|
17
16
|
|
18
|
-
# Default texts for new
|
19
|
-
|
17
|
+
# Default texts for new ingredients created
|
18
|
+
default_ingredient_texts:
|
20
19
|
article_headline: "Welcome to your first Alchemy CMS page"
|
21
|
-
article_text: '<p><strong>How to get started.</strong></p><p>First of all you should read about Alchemy and its architecture in the <a class="external" href="http://guides.alchemy-cms.com/alchemy_approach.html" target="_blank" data-link-target="blank">guidelines</a>.</p><p>The most important things to know about Alchemy are elements and page layouts.</p><p><span style="text-decoration: underline;"><strong>Elements:</strong></span></p><p>With Alchemy you can split pages into content parts, elements. These elements can be defined out of several base content types:
|
20
|
+
article_text: '<p><strong>How to get started.</strong></p><p>First of all you should read about Alchemy and its architecture in the <a class="external" href="http://guides.alchemy-cms.com/alchemy_approach.html" target="_blank" data-link-target="blank">guidelines</a>.</p><p>The most important things to know about Alchemy are elements and page layouts.</p><p><span style="text-decoration: underline;"><strong>Elements:</strong></span></p><p>With Alchemy you can split pages into content parts, elements. These elements can be defined out of several base content types: ingredients. The ingredients are:</p><ul><li>Text - <em>A single line of text</em></li><li>Richtext - <em>A TinyMCE powered formatted text block</em></li><li>Picture - <em>A reference to an image</em></li><li>Html - <em>HTML embed code</em></li><li>Select - <em>A selection of values</em></li><li>Boolean - <em>A checkbox</em></li></ul><p>Elements get defined in a YAML file <strong>config/alchemy/elements.yml</strong></p><p><a class="external" href="http://guides.alchemy-cms.com/elements.html" target="_blank" data-link-target="blank">Read more about elements and how to define them in the guidelines.</a></p><p><span style="text-decoration: underline;"><strong>Page types:</strong></span></p><p>You can define several types of pages, called page layouts. You can assign elements to page layouts and control how elements and the page of a certain layout behave.</p><p>Page layouts get defined in a YAML file <strong>config/alchemy/page_layouts.yml</strong></p><p><a class="external" href="http://guides.alchemy-cms.com/page_layouts.html" target="_blank" data-link-target="blank">Read more about defining page layouts in the guidelines.</a></p>'
|
22
21
|
|
23
22
|
# Hint texts for elements
|
24
23
|
element_hints:
|
25
24
|
article: "This is a hint text for the article element. You can change this text in `config/locales/alchemy.en.yml`. Feel free to change it as you like, it's yours."
|
26
25
|
|
27
|
-
# Hint texts for
|
28
|
-
|
26
|
+
# Hint texts for ingredients
|
27
|
+
ingredient_hints:
|
29
28
|
headline: "This is a single line of unformatable Text"
|
30
29
|
picture: "Pictures are stored in the library. You can assign a picture multiple times throughout your site. Alchemy has an image cropper build right in."
|
31
30
|
text: "This is a rich text block powered by TinyMCE editor. You can change the configuration of the editor. See http://guides.alchemy-cms.com/customize_tinymce.html"
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<%= csp_meta_tag %>
|
7
7
|
|
8
8
|
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
|
9
|
-
<%=
|
9
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
|
10
10
|
</head>
|
11
11
|
|
12
12
|
<body>
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "rails/generators"
|
3
4
|
require "alchemy/install/tasks"
|
4
5
|
require "alchemy/version"
|
@@ -18,11 +19,6 @@ module Alchemy
|
|
18
19
|
default: false,
|
19
20
|
desc: "Skip creation of demo element, page and application layout."
|
20
21
|
|
21
|
-
class_option :skip_webpacker_installer,
|
22
|
-
type: :boolean,
|
23
|
-
default: false,
|
24
|
-
desc: "Skip running the webpacker installer."
|
25
|
-
|
26
22
|
class_option :skip_db_create,
|
27
23
|
type: :boolean,
|
28
24
|
default: false,
|
@@ -62,7 +58,7 @@ module Alchemy
|
|
62
58
|
end
|
63
59
|
|
64
60
|
def copy_yml_files
|
65
|
-
%w
|
61
|
+
%w[elements page_layouts menus].each do |file|
|
66
62
|
template "#{__dir__}/templates/#{file}.yml.tt", app_config_path.join("alchemy", "#{file}.yml")
|
67
63
|
end
|
68
64
|
end
|
@@ -103,27 +99,28 @@ module Alchemy
|
|
103
99
|
rake "gutentag:install:migrations"
|
104
100
|
end
|
105
101
|
|
106
|
-
def run_webpacker_installer
|
107
|
-
unless options[:skip_webpacker_installer]
|
108
|
-
# Webpacker does not create a package.json, but we need one
|
109
|
-
unless File.exist? app_root.join("package.json")
|
110
|
-
in_root { run "echo '{}' > package.json" }
|
111
|
-
end
|
112
|
-
rake("webpacker:install", abort_on_failure: true)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
102
|
def add_npm_package
|
117
|
-
|
103
|
+
if File.exist? app_root.join("package.json")
|
104
|
+
run "yarn add @alchemy_cms/admin@~#{Alchemy.version}"
|
105
|
+
elsif File.exist? app_root.join("config/importmap.rb")
|
106
|
+
run "bin/importmap pin @alchemy_cms/admin@~#{Alchemy.version}"
|
107
|
+
else
|
108
|
+
log("Could not add alchemy admin package! Make sure you have a JS bundler installed", :warning)
|
109
|
+
end
|
118
110
|
end
|
119
111
|
|
120
112
|
def copy_alchemy_entry_point
|
121
|
-
|
122
|
-
File.
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
113
|
+
if Dir.exist? app_root.join("app/javascript")
|
114
|
+
if File.exist? app_root.join("config/importmap.rb")
|
115
|
+
# We want the bundled package if using importmaps
|
116
|
+
create_file app_root.join("app/javascript/alchemy_admin.js"), 'import "@alchemy_cms/dist/admin"'
|
117
|
+
else
|
118
|
+
# We want the normal package if using a bundler locally
|
119
|
+
create_file app_root.join("app/javascript/alchemy_admin.js"), 'import "@alchemy_cms/admin"'
|
120
|
+
end
|
121
|
+
else
|
122
|
+
log("Could not add alchemy admin entry point! Make sure you have a JS bundler installed", :warning)
|
123
|
+
end
|
127
124
|
end
|
128
125
|
|
129
126
|
def set_primary_language
|
@@ -6,16 +6,16 @@
|
|
6
6
|
- name: article
|
7
7
|
hint: true
|
8
8
|
unique: true
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
9
|
+
ingredients:
|
10
|
+
- role: headline
|
11
|
+
type: Text
|
12
|
+
default: :article_headline
|
13
|
+
hint: true
|
14
|
+
- role: picture
|
15
|
+
type: Picture
|
16
|
+
hint: true
|
17
|
+
- role: text
|
18
|
+
type: Richtext
|
19
|
+
default: :article_text
|
20
|
+
hint: true
|
21
21
|
<%- end -%>
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "rails"
|
3
4
|
|
4
5
|
module Alchemy
|
5
6
|
module Generators
|
6
7
|
class ViewsGenerator < ::Rails::Generators::Base
|
7
|
-
ALCHEMY_VIEWS = %w
|
8
|
+
ALCHEMY_VIEWS = %w[breadcrumb language_links messages_mailer]
|
8
9
|
|
9
10
|
desc "Generates Alchemy views for #{ALCHEMY_VIEWS.to_sentence}."
|
10
11
|
|
@@ -2,11 +2,10 @@
|
|
2
2
|
|
3
3
|
namespace :alchemy do
|
4
4
|
namespace :generate do
|
5
|
-
desc "Generates all thumbnails for Alchemy Pictures and
|
5
|
+
desc "Generates all thumbnails for Alchemy Pictures and Picture Ingredients."
|
6
6
|
task thumbnails: [
|
7
7
|
"alchemy:generate:picture_thumbnails",
|
8
|
-
"alchemy:generate:
|
9
|
-
"alchemy:generate:ingredient_picture_thumbnails",
|
8
|
+
"alchemy:generate:ingredient_picture_thumbnails"
|
10
9
|
]
|
11
10
|
|
12
11
|
desc "Generates thumbnails for Alchemy Pictures."
|
@@ -23,30 +22,12 @@ namespace :alchemy do
|
|
23
22
|
puts "Done!"
|
24
23
|
end
|
25
24
|
|
26
|
-
desc "Generates thumbnails for Alchemy EssencePictures."
|
27
|
-
task essence_picture_thumbnails: :environment do
|
28
|
-
essence_pictures = Alchemy::EssencePicture.joins(:content, :ingredient_association)
|
29
|
-
puts "Regenerate #{essence_pictures.count} essence picture thumbnails."
|
30
|
-
puts "Please wait..."
|
31
|
-
|
32
|
-
essence_pictures.find_each do |essence_picture|
|
33
|
-
puts essence_picture.picture_url
|
34
|
-
puts essence_picture.thumbnail_url
|
35
|
-
|
36
|
-
essence_picture.settings.fetch(:srcset, []).each do |src|
|
37
|
-
puts essence_picture.picture_url(src)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
puts "Done!"
|
42
|
-
end
|
43
|
-
|
44
25
|
desc "Generates thumbnails for Alchemy Picture Ingredients (set ELEMENTS=element1,element2 to only generate thumbnails for a subset of elements)."
|
45
26
|
task ingredient_picture_thumbnails: :environment do
|
46
|
-
ingredient_pictures = Alchemy::Ingredients::Picture
|
47
|
-
joins(:element)
|
48
|
-
preload({
|
49
|
-
merge(Alchemy::Element.
|
27
|
+
ingredient_pictures = Alchemy::Ingredients::Picture
|
28
|
+
.joins(:element)
|
29
|
+
.preload({related_object: :thumbs})
|
30
|
+
.merge(Alchemy::Element.published)
|
50
31
|
|
51
32
|
if ENV["ELEMENTS"].present?
|
52
33
|
ingredient_pictures = ingredient_pictures.merge(
|
data/lib/tasks/alchemy/tidy.rake
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "alchemy/tasks/tidy"
|
3
4
|
|
4
5
|
namespace :alchemy do
|
@@ -17,15 +18,9 @@ namespace :alchemy do
|
|
17
18
|
Alchemy::Tidy.update_element_positions
|
18
19
|
end
|
19
20
|
|
20
|
-
desc "
|
21
|
-
task content_positions: [:environment] do
|
22
|
-
Alchemy::Tidy.update_content_positions
|
23
|
-
end
|
24
|
-
|
25
|
-
desc "Remove orphaned records (elements & contents)."
|
21
|
+
desc "Remove orphaned records (elements)."
|
26
22
|
task remove_orphaned_records: [:environment] do
|
27
23
|
Rake::Task["alchemy:tidy:remove_orphaned_elements"].invoke
|
28
|
-
Rake::Task["alchemy:tidy:remove_orphaned_contents"].invoke
|
29
24
|
end
|
30
25
|
|
31
26
|
desc "Remove orphaned elements."
|
@@ -33,11 +28,6 @@ namespace :alchemy do
|
|
33
28
|
Alchemy::Tidy.remove_orphaned_elements
|
34
29
|
end
|
35
30
|
|
36
|
-
desc "Remove orphaned contents."
|
37
|
-
task remove_orphaned_contents: [:environment] do
|
38
|
-
Alchemy::Tidy.remove_orphaned_contents
|
39
|
-
end
|
40
|
-
|
41
31
|
desc "Remove trashed elements."
|
42
32
|
task remove_trashed_elements: [:environment] do
|
43
33
|
Alchemy::Tidy.remove_trashed_elements
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "alchemy/upgrader"
|
3
4
|
require "alchemy/version"
|
4
5
|
|
@@ -6,8 +7,7 @@ namespace :alchemy do
|
|
6
7
|
desc "Upgrades your app to AlchemyCMS v#{Alchemy::VERSION}."
|
7
8
|
task upgrade: [
|
8
9
|
"alchemy:upgrade:prepare",
|
9
|
-
"alchemy:upgrade:
|
10
|
-
"alchemy:upgrade:6.0:run",
|
10
|
+
"alchemy:upgrade:7.0:run"
|
11
11
|
] do
|
12
12
|
Alchemy::Upgrader.display_todos
|
13
13
|
end
|
@@ -17,13 +17,13 @@ namespace :alchemy do
|
|
17
17
|
task prepare: [
|
18
18
|
"alchemy:upgrade:database",
|
19
19
|
"alchemy:upgrade:config",
|
20
|
-
"alchemy:upgrade:package"
|
20
|
+
"alchemy:upgrade:package"
|
21
21
|
]
|
22
22
|
|
23
23
|
desc "Alchemy Upgrader: Prepares the database."
|
24
24
|
task database: [
|
25
25
|
"alchemy:install:migrations",
|
26
|
-
"db:migrate"
|
26
|
+
"db:migrate"
|
27
27
|
]
|
28
28
|
|
29
29
|
desc "Alchemy Upgrader: Copy configuration file."
|
@@ -36,59 +36,23 @@ namespace :alchemy do
|
|
36
36
|
Alchemy::Upgrader.update_npm_package
|
37
37
|
end
|
38
38
|
|
39
|
-
desc "Upgrade Alchemy to
|
40
|
-
task "
|
41
|
-
"alchemy:upgrade:prepare",
|
42
|
-
"alchemy:upgrade:5.0:run",
|
43
|
-
] do
|
44
|
-
Alchemy::Upgrader.display_todos
|
45
|
-
end
|
46
|
-
|
47
|
-
namespace "5.0" do
|
48
|
-
task "run" => [
|
49
|
-
"alchemy:upgrade:5.0:install_gutentag_migrations",
|
50
|
-
"alchemy:upgrade:5.0:remove_layout_roots",
|
51
|
-
"alchemy:upgrade:5.0:remove_root_page",
|
52
|
-
]
|
53
|
-
|
54
|
-
desc "Install Gutentag migrations"
|
55
|
-
task install_gutentag_migrations: [:environment] do
|
56
|
-
Alchemy::Upgrader::FivePointZero.install_gutentag_migrations
|
57
|
-
end
|
58
|
-
|
59
|
-
desc "Remove layout root pages"
|
60
|
-
task remove_layout_roots: [:environment] do
|
61
|
-
Alchemy::Upgrader::FivePointZero.remove_layout_roots
|
62
|
-
end
|
63
|
-
|
64
|
-
desc "Remove root page"
|
65
|
-
task remove_root_page: [:environment] do
|
66
|
-
Alchemy::Upgrader::FivePointZero.remove_root_page
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
desc "Upgrade Alchemy to v6.0"
|
71
|
-
task "6.0" => [
|
39
|
+
desc "Upgrade Alchemy to v7.0"
|
40
|
+
task "7.0" => [
|
72
41
|
"alchemy:upgrade:prepare",
|
73
|
-
"alchemy:upgrade:
|
42
|
+
"alchemy:upgrade:7.0:run"
|
74
43
|
] do
|
75
44
|
Alchemy::Upgrader.display_todos
|
76
45
|
end
|
77
46
|
|
78
|
-
namespace "
|
47
|
+
namespace "7.0" do
|
79
48
|
task "run" => [
|
80
|
-
"alchemy:upgrade:
|
81
|
-
"alchemy:upgrade:6.0:create_ingredients",
|
49
|
+
"alchemy:upgrade:7.0:update_admin_entrypoint"
|
82
50
|
]
|
83
51
|
|
84
|
-
desc "
|
85
|
-
task
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
desc "Create ingredients for elements with ingredients defined"
|
90
|
-
task create_ingredients: [:environment] do
|
91
|
-
Alchemy::Upgrader::SixPointZero.create_ingredients
|
52
|
+
desc "Update alchemy admin entrypoint"
|
53
|
+
task update_admin_entrypoint: [:environment] do
|
54
|
+
puts "adding npm_package..."
|
55
|
+
Alchemy::Upgrader::SevenPointZero.update_admin_entrypoint
|
92
56
|
end
|
93
57
|
end
|
94
58
|
end
|
data/package/admin.js
CHANGED
@@ -8,6 +8,7 @@ import ImageLoader from "./src/image_loader"
|
|
8
8
|
import ImageCropper from "./src/image_cropper"
|
9
9
|
import Datepicker from "./src/datepicker"
|
10
10
|
import Sitemap from "./src/sitemap"
|
11
|
+
import Tinymce from "./src/tinymce"
|
11
12
|
import PagePublicationFields from "./src/page_publication_fields.js"
|
12
13
|
|
13
14
|
// Global Alchemy object
|
@@ -28,5 +29,6 @@ Object.assign(Alchemy, {
|
|
28
29
|
IngredientAnchorLink,
|
29
30
|
Datepicker,
|
30
31
|
Sitemap,
|
32
|
+
Tinymce,
|
31
33
|
PagePublicationFields
|
32
34
|
})
|