alchemy_cms 4.6.7 → 5.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +33 -1
- data/.github/workflows/stale.yml +1 -1
- data/.gitignore +20 -2
- data/.hound.yml +2 -1
- data/.prettierrc +6 -0
- data/.rubocop.yml +31 -10
- data/CHANGELOG.md +89 -32
- data/Gemfile +24 -22
- data/README.md +31 -19
- data/Rakefile +10 -8
- data/alchemy_cms.gemspec +6 -5
- data/app/assets/javascripts/alchemy/admin.js +1 -5
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +2 -1
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -2
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +17 -17
- data/app/assets/javascripts/alchemy/node_select.js +39 -0
- data/app/assets/javascripts/alchemy/templates/index.js +1 -0
- data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
- data/app/assets/stylesheets/alchemy/admin.scss +3 -2
- data/app/assets/stylesheets/alchemy/base.scss +0 -1
- data/app/assets/stylesheets/alchemy/elements.scss +1 -1
- data/app/assets/stylesheets/alchemy/forms.scss +5 -0
- data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
- data/app/assets/stylesheets/alchemy/nodes.scss +1 -1
- data/app/assets/stylesheets/alchemy/sitemap.scss +5 -1
- data/app/assets/stylesheets/alchemy/tables.scss +1 -24
- data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +3 -3
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +7 -7
- data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
- data/app/controllers/alchemy/admin/base_controller.rb +16 -42
- data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
- data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
- data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
- data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
- data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
- data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
- data/app/controllers/alchemy/admin/nodes_controller.rb +5 -4
- data/app/controllers/alchemy/admin/pages_controller.rb +50 -62
- data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
- data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
- data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
- data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
- data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
- data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
- data/app/controllers/alchemy/api/base_controller.rb +2 -2
- data/app/controllers/alchemy/api/contents_controller.rb +4 -4
- data/app/controllers/alchemy/api/elements_controller.rb +8 -8
- data/app/controllers/alchemy/api/nodes_controller.rb +37 -1
- data/app/controllers/alchemy/api/pages_controller.rb +14 -23
- data/app/controllers/alchemy/attachments_controller.rb +5 -5
- data/app/controllers/alchemy/base_controller.rb +10 -9
- data/app/controllers/alchemy/messages_controller.rb +16 -23
- data/app/controllers/alchemy/pages_controller.rb +13 -11
- data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
- data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
- data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
- data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
- data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
- data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
- data/app/decorators/alchemy/element_editor.rb +39 -0
- data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
- data/app/helpers/alchemy/admin/base_helper.rb +36 -35
- data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
- data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
- data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
- data/app/helpers/alchemy/admin/form_helper.rb +1 -1
- data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
- data/app/helpers/alchemy/admin/pages_helper.rb +4 -4
- data/app/helpers/alchemy/admin/pictures_helper.rb +3 -3
- data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
- data/app/helpers/alchemy/base_helper.rb +13 -8
- data/app/helpers/alchemy/elements_block_helper.rb +2 -31
- data/app/helpers/alchemy/elements_helper.rb +12 -58
- data/app/helpers/alchemy/pages_helper.rb +24 -174
- data/app/helpers/alchemy/url_helper.rb +2 -1
- data/app/mailers/alchemy/base_mailer.rb +1 -1
- data/app/mailers/alchemy/messages_mailer.rb +1 -1
- data/app/models/alchemy/attachment.rb +21 -19
- data/app/models/alchemy/base_record.rb +2 -5
- data/app/models/alchemy/content/factory.rb +24 -31
- data/app/models/alchemy/content.rb +33 -38
- data/app/models/alchemy/element/definitions.rb +4 -4
- data/app/models/alchemy/element/element_contents.rb +9 -6
- data/app/models/alchemy/element/element_essences.rb +4 -3
- data/app/models/alchemy/element/presenters.rb +3 -2
- data/app/models/alchemy/element.rb +46 -54
- data/app/models/alchemy/element_to_page.rb +1 -1
- data/app/models/alchemy/essence_boolean.rb +1 -3
- data/app/models/alchemy/essence_date.rb +2 -3
- data/app/models/alchemy/essence_file.rb +4 -4
- data/app/models/alchemy/essence_html.rb +1 -3
- data/app/models/alchemy/essence_link.rb +1 -3
- data/app/models/alchemy/essence_node.rb +18 -0
- data/app/models/alchemy/essence_page.rb +3 -16
- data/app/models/alchemy/essence_picture.rb +17 -16
- data/app/models/alchemy/essence_picture_view.rb +7 -6
- data/app/models/alchemy/essence_richtext.rb +1 -3
- data/app/models/alchemy/essence_select.rb +1 -3
- data/app/models/alchemy/essence_text.rb +0 -2
- data/app/models/alchemy/folded_page.rb +1 -0
- data/app/models/alchemy/language/code.rb +4 -4
- data/app/models/alchemy/language.rb +21 -35
- data/app/models/alchemy/legacy_page_url.rb +1 -1
- data/app/models/alchemy/message.rb +3 -3
- data/app/models/alchemy/node.rb +28 -5
- data/app/models/alchemy/page/fixed_attributes.rb +3 -2
- data/app/models/alchemy/page/page_elements.rb +35 -44
- data/app/models/alchemy/page/page_naming.rb +20 -70
- data/app/models/alchemy/page/page_natures.rb +7 -34
- data/app/models/alchemy/page/page_scopes.rb +23 -29
- data/app/models/alchemy/page/url_path.rb +0 -2
- data/app/models/alchemy/page.rb +47 -128
- data/app/models/alchemy/picture/transformations.rb +9 -7
- data/app/models/alchemy/picture/url.rb +5 -5
- data/app/models/alchemy/picture.rb +19 -28
- data/app/models/alchemy/site/layout.rb +2 -2
- data/app/models/alchemy/site.rb +6 -36
- data/app/models/concerns/alchemy/touch_elements.rb +24 -0
- data/app/serializers/alchemy/content_serializer.rb +0 -3
- data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
- data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
- data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
- data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
- data/app/serializers/alchemy/node_serializer.rb +2 -0
- data/app/serializers/alchemy/page_tree_serializer.rb +9 -13
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
- data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
- data/app/views/alchemy/admin/contents/create.js.erb +1 -3
- data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
- data/app/views/alchemy/admin/elements/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
- data/app/views/alchemy/admin/elements/index.html.erb +3 -3
- data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
- data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
- data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
- data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
- data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
- data/app/views/alchemy/admin/languages/index.html.erb +23 -4
- data/app/views/alchemy/admin/languages/new.html.erb +1 -0
- data/app/views/alchemy/admin/layoutpages/index.html.erb +3 -3
- data/app/views/alchemy/admin/nodes/_form.html.erb +18 -15
- data/app/views/alchemy/admin/nodes/_node.html.erb +1 -5
- data/app/views/alchemy/admin/nodes/index.html.erb +3 -4
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
- data/app/views/alchemy/admin/pages/_form.html.erb +0 -1
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
- data/app/views/alchemy/admin/pages/_page.html.erb +11 -19
- data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
- data/app/views/alchemy/admin/pages/info.html.erb +0 -9
- data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
- data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
- data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
- data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
- data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
- data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
- data/app/views/alchemy/admin/sites/index.html.erb +21 -9
- data/app/views/alchemy/admin/sites/new.html.erb +1 -0
- data/app/views/alchemy/admin/tags/index.html.erb +2 -2
- data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
- data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
- data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
- data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
- data/app/views/alchemy/pages/show.rss.builder +3 -2
- data/app/views/layouts/alchemy/admin.html.erb +1 -0
- data/babel.config.js +12 -0
- data/bin/rails +5 -4
- data/config/alchemy/config.yml +15 -18
- data/config/brakeman.ignore +1 -1
- data/config/initializers/assets.rb +2 -1
- data/config/initializers/dragonfly.rb +2 -1
- data/config/initializers/mime_types.rb +1 -0
- data/config/initializers/mini_profiler.rb +3 -2
- data/config/initializers/simple_form.rb +6 -6
- data/config/locales/alchemy.en.yml +23 -8
- data/config/routes.rb +25 -24
- data/config/spring.rb +3 -2
- data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
- data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
- data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
- data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
- data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
- data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
- data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
- data/lib/alchemy/admin/locale.rb +3 -1
- data/lib/alchemy/admin/preview_url.rb +64 -0
- data/lib/alchemy/auth_accessors.rb +8 -7
- data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
- data/lib/alchemy/config.rb +1 -5
- data/lib/alchemy/configuration_methods.rb +3 -1
- data/lib/alchemy/controller_actions.rb +6 -5
- data/lib/alchemy/deprecation.rb +2 -1
- data/lib/alchemy/elements_finder.rb +5 -5
- data/lib/alchemy/engine.rb +22 -14
- data/lib/alchemy/errors.rb +0 -7
- data/lib/alchemy/essence.rb +17 -16
- data/lib/alchemy/filetypes.rb +5 -5
- data/lib/alchemy/forms/builder.rb +4 -4
- data/lib/alchemy/hints.rb +1 -1
- data/lib/alchemy/i18n.rb +2 -1
- data/lib/alchemy/modules.rb +12 -12
- data/lib/alchemy/name_conversions.rb +5 -5
- data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
- data/lib/alchemy/page_layout.rb +15 -12
- data/lib/alchemy/paths.rb +1 -1
- data/lib/alchemy/permissions.rb +7 -6
- data/lib/alchemy/resource.rb +25 -17
- data/lib/alchemy/resources_helper.rb +12 -18
- data/lib/alchemy/routing_constraints.rb +1 -1
- data/lib/alchemy/seeder.rb +42 -14
- data/lib/alchemy/shell.rb +13 -10
- data/lib/alchemy/taggable.rb +1 -0
- data/lib/alchemy/tasks/tidy.rb +4 -3
- data/lib/alchemy/test_support/config_stubbing.rb +1 -0
- data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
- data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
- data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
- data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
- data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
- data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
- data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
- data/lib/alchemy/test_support/factories/language_factory.rb +16 -14
- data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
- data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
- data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
- data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
- data/lib/alchemy/test_support/factories.rb +1 -1
- data/lib/alchemy/test_support/integration_helpers.rb +1 -0
- data/lib/alchemy/test_support/shared_contexts.rb +5 -4
- data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
- data/lib/alchemy/tinymce.rb +15 -13
- data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
- data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
- data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
- data/lib/alchemy/upgrader.rb +8 -7
- data/lib/alchemy/userstamp.rb +1 -1
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +52 -51
- data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
- data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
- data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
- data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
- data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
- data/lib/generators/alchemy/install/install_generator.rb +110 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/menus.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +2 -2
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +1 -1
- data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +1 -1
- data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
- data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
- data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
- data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
- data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
- data/lib/tasks/alchemy/db.rake +3 -19
- data/lib/tasks/alchemy/install.rake +3 -2
- data/lib/tasks/alchemy/tidy.rake +9 -8
- data/lib/tasks/alchemy/upgrade.rake +18 -120
- data/package/admin.js +14 -0
- data/package/src/__tests__/i18n.spec.js +70 -0
- data/package/src/i18n.js +48 -0
- data/package/src/node_tree.js +72 -0
- data/package/src/translations.js +32 -0
- data/package/src/utils/__tests__/ajax.spec.js +124 -0
- data/package/src/utils/__tests__/events.spec.js +38 -0
- data/package/src/utils/ajax.js +48 -0
- data/package/src/utils/events.js +16 -0
- data/package.json +45 -0
- data/vendor/assets/fonts/fa-regular-400.eot +0 -0
- data/vendor/assets/fonts/fa-regular-400.svg +798 -358
- data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
- data/vendor/assets/fonts/fa-regular-400.woff +0 -0
- data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
- data/vendor/assets/fonts/fa-solid-900.eot +0 -0
- data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
- data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
- data/vendor/assets/fonts/fa-solid-900.woff +0 -0
- data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
- data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
- data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
- data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
- data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
- data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
- data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
- data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
- data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
- data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
- data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
- metadata +117 -98
- data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
- data/app/assets/javascripts/alchemy/alchemy.node_tree.js +0 -66
- data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
- data/app/assets/javascripts/alchemy/alchemy.utils.js +0 -45
- data/app/helpers/alchemy/essences_helper.rb +0 -119
- data/app/models/concerns/alchemy/content_touching.rb +0 -23
- data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
- data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
- data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -37
- data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
- data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
- data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
- data/app/views/alchemy/navigation/_link.html.erb +0 -19
- data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
- data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
- data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
- data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
- data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
- data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
- data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
- data/lib/alchemy/error_tracking/airbrake_handler.rb +0 -13
- data/lib/alchemy/error_tracking.rb +0 -14
- data/lib/alchemy/ssl_protection.rb +0 -34
- data/lib/alchemy/tasks/helpers.rb +0 -81
- data/lib/alchemy/test_support/controller_requests.rb +0 -93
- data/lib/alchemy/upgrader/four_point_four.rb +0 -52
- data/lib/alchemy/upgrader/four_point_one.rb +0 -42
- data/lib/alchemy/upgrader/four_point_six.rb +0 -50
- data/lib/alchemy/upgrader/four_point_two.rb +0 -86
- data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -45
- data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -166
- data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -32
- data/lib/alchemy/upgrader/tasks/fixed_element_name_finder.rb +0 -31
- data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
- data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
- data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
- data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
- data/lib/tasks/alchemy/convert.rake +0 -98
- data/vendor/assets/javascripts/sortable/Sortable.min.js +0 -2
- data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
- data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
|
@@ -17,7 +17,7 @@ module Alchemy
|
|
|
17
17
|
@parent_element = Element.find_by(id: params[:parent_element_id])
|
|
18
18
|
@elements = @page.available_elements_within_current_scope(@parent_element)
|
|
19
19
|
@element = @page.elements.build
|
|
20
|
-
@clipboard = get_clipboard(
|
|
20
|
+
@clipboard = get_clipboard("elements")
|
|
21
21
|
@clipboard_items = Element.all_from_clipboard_for_page(@clipboard, @page)
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -30,7 +30,7 @@ module Alchemy
|
|
|
30
30
|
else
|
|
31
31
|
@element = Element.create(create_element_params)
|
|
32
32
|
end
|
|
33
|
-
if @page.definition[
|
|
33
|
+
if @page.definition["insert_elements_at"] == "top"
|
|
34
34
|
@insert_at_top = true
|
|
35
35
|
@element.move_to_top
|
|
36
36
|
end
|
|
@@ -40,7 +40,7 @@ module Alchemy
|
|
|
40
40
|
else
|
|
41
41
|
@element.page = @page
|
|
42
42
|
@elements = @page.available_element_definitions
|
|
43
|
-
@clipboard = get_clipboard(
|
|
43
|
+
@clipboard = get_clipboard("elements")
|
|
44
44
|
@clipboard_items = Element.all_from_clipboard_for_page(@clipboard, @page)
|
|
45
45
|
render :new
|
|
46
46
|
end
|
|
@@ -56,7 +56,7 @@ module Alchemy
|
|
|
56
56
|
@element_validated = @element.update(element_params)
|
|
57
57
|
else
|
|
58
58
|
@element_validated = false
|
|
59
|
-
@notice = Alchemy.t(
|
|
59
|
+
@notice = Alchemy.t("Validation failed")
|
|
60
60
|
@error_message = "<h2>#{@notice}</h2><p>#{Alchemy.t(:content_validations_headline)}</p>".html_safe
|
|
61
61
|
end
|
|
62
62
|
end
|
|
@@ -81,7 +81,7 @@ module Alchemy
|
|
|
81
81
|
Element.where(id: element_id).update_all(
|
|
82
82
|
page_id: params[:page_id],
|
|
83
83
|
parent_element_id: params[:parent_element_id],
|
|
84
|
-
position: idx + 1
|
|
84
|
+
position: idx + 1,
|
|
85
85
|
)
|
|
86
86
|
end
|
|
87
87
|
@parent_element.try!(:touch)
|
|
@@ -100,20 +100,20 @@ module Alchemy
|
|
|
100
100
|
[
|
|
101
101
|
{
|
|
102
102
|
contents: {
|
|
103
|
-
essence: :ingredient_association
|
|
104
|
-
}
|
|
103
|
+
essence: :ingredient_association,
|
|
104
|
+
},
|
|
105
105
|
},
|
|
106
106
|
:tags,
|
|
107
107
|
{
|
|
108
108
|
all_nested_elements: [
|
|
109
109
|
{
|
|
110
110
|
contents: {
|
|
111
|
-
essence: :ingredient_association
|
|
112
|
-
}
|
|
111
|
+
essence: :ingredient_association,
|
|
112
|
+
},
|
|
113
113
|
},
|
|
114
|
-
:tags
|
|
115
|
-
]
|
|
116
|
-
}
|
|
114
|
+
:tags,
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
117
|
]
|
|
118
118
|
end
|
|
119
119
|
|
|
@@ -123,20 +123,20 @@ module Alchemy
|
|
|
123
123
|
|
|
124
124
|
def element_from_clipboard
|
|
125
125
|
@element_from_clipboard ||= begin
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
@clipboard = get_clipboard("elements")
|
|
127
|
+
@clipboard.detect { |item| item["id"].to_i == params[:paste_from_clipboard].to_i }
|
|
128
|
+
end
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
def paste_element_from_clipboard
|
|
132
|
-
@source_element = Element.find(element_from_clipboard[
|
|
132
|
+
@source_element = Element.find(element_from_clipboard["id"])
|
|
133
133
|
element = Element.copy(@source_element, {
|
|
134
134
|
parent_element_id: create_element_params[:parent_element_id],
|
|
135
|
-
page_id: @page.id
|
|
136
|
-
)
|
|
137
|
-
if element_from_clipboard[
|
|
135
|
+
page_id: @page.id,
|
|
136
|
+
})
|
|
137
|
+
if element_from_clipboard["action"] == "cut"
|
|
138
138
|
@cut_element_id = @source_element.id
|
|
139
|
-
@clipboard.delete_if { |item| item[
|
|
139
|
+
@clipboard.delete_if { |item| item["id"] == @source_element.id.to_s }
|
|
140
140
|
@source_element.destroy
|
|
141
141
|
end
|
|
142
142
|
element
|
|
@@ -9,9 +9,9 @@ module Alchemy
|
|
|
9
9
|
before_action :load_essence_picture, only: [:edit, :crop, :update]
|
|
10
10
|
before_action :load_content, only: [:edit, :update, :assign]
|
|
11
11
|
|
|
12
|
-
helper
|
|
13
|
-
helper
|
|
14
|
-
helper
|
|
12
|
+
helper "alchemy/admin/contents"
|
|
13
|
+
helper "alchemy/admin/essences"
|
|
14
|
+
helper "alchemy/url"
|
|
15
15
|
|
|
16
16
|
def edit
|
|
17
17
|
end
|
|
@@ -19,10 +19,8 @@ module Alchemy
|
|
|
19
19
|
def crop
|
|
20
20
|
if @picture = @essence_picture.picture
|
|
21
21
|
@content = @essence_picture.content
|
|
22
|
-
options_from_params[:format] ||= (configuration(:image_store_format) || 'png')
|
|
23
|
-
|
|
24
22
|
@min_size = sizes_from_essence_or_params
|
|
25
|
-
@ratio =
|
|
23
|
+
@ratio = ratio_from_size_or_settings
|
|
26
24
|
infer_width_or_height_from_ratio
|
|
27
25
|
|
|
28
26
|
@default_box = @essence_picture.default_mask(@min_size)
|
|
@@ -70,26 +68,26 @@ module Alchemy
|
|
|
70
68
|
|
|
71
69
|
# Gets the minimum size of the image to be rendered.
|
|
72
70
|
#
|
|
73
|
-
# The +render_size+ attribute has preference over the +size+
|
|
71
|
+
# The +render_size+ attribute has preference over the contents +size+ setting.
|
|
74
72
|
#
|
|
75
73
|
def sizes_from_essence_or_params
|
|
76
74
|
if @essence_picture.render_size?
|
|
77
75
|
@essence_picture.sizes_from_string(@essence_picture.render_size)
|
|
78
|
-
elsif
|
|
79
|
-
@essence_picture.sizes_from_string(
|
|
76
|
+
elsif @essence_picture.content.settings[:size]
|
|
77
|
+
@essence_picture.sizes_from_string(@essence_picture.content.settings[:size])
|
|
80
78
|
else
|
|
81
79
|
{ width: 0, height: 0 }
|
|
82
80
|
end
|
|
83
81
|
end
|
|
84
82
|
|
|
85
|
-
# Infers the aspect ratio from size or
|
|
83
|
+
# Infers the aspect ratio from size or contents settings. If you don't want a fixed
|
|
86
84
|
# aspect ratio, don't specify a size or only width or height.
|
|
87
85
|
#
|
|
88
|
-
def
|
|
89
|
-
if @min_size.value?(0) &&
|
|
90
|
-
|
|
86
|
+
def ratio_from_size_or_settings
|
|
87
|
+
if @min_size.value?(0) && @essence_picture.content.settings[:fixed_ratio].to_s =~ FLOAT_REGEX
|
|
88
|
+
@essence_picture.content.settings[:fixed_ratio].to_f
|
|
91
89
|
elsif !@min_size[:width].zero? && !@min_size[:height].zero?
|
|
92
|
-
@min_size[:width].to_f / @min_size[:height]
|
|
90
|
+
@min_size[:width].to_f / @min_size[:height]
|
|
93
91
|
else
|
|
94
92
|
false
|
|
95
93
|
end
|
|
@@ -3,21 +3,54 @@
|
|
|
3
3
|
module Alchemy
|
|
4
4
|
module Admin
|
|
5
5
|
class LanguagesController < ResourcesController
|
|
6
|
+
before_action :load_current_site, only: %i[index new]
|
|
7
|
+
|
|
6
8
|
def index
|
|
7
|
-
@query = Language.
|
|
9
|
+
@query = Language.on_site(@current_site).ransack(search_filter_params[:q])
|
|
10
|
+
@query.sorts = default_sort_order if @query.sorts.empty?
|
|
8
11
|
@languages = @query.result.page(params[:page] || 1).per(items_per_page)
|
|
9
12
|
end
|
|
10
13
|
|
|
11
14
|
def new
|
|
12
15
|
@language = Language.new(
|
|
13
|
-
|
|
16
|
+
site: @current_site,
|
|
17
|
+
page_layout: Config.get(:default_language)["page_layout"],
|
|
14
18
|
)
|
|
15
19
|
end
|
|
16
20
|
|
|
21
|
+
def create
|
|
22
|
+
@language = Alchemy::Language.new(resource_params)
|
|
23
|
+
if @language.save
|
|
24
|
+
flash[:notice] = Alchemy.t("Language successfully created")
|
|
25
|
+
redirect_to alchemy.admin_pages_path(language_id: @language)
|
|
26
|
+
else
|
|
27
|
+
render :new
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def destroy
|
|
32
|
+
if @language.destroy
|
|
33
|
+
flash[:notice] = Alchemy.t("Language successfully removed")
|
|
34
|
+
else
|
|
35
|
+
flash[:warning] = @language.errors.full_messages.to_sentence
|
|
36
|
+
end
|
|
37
|
+
do_redirect_to alchemy.admin_languages_path
|
|
38
|
+
end
|
|
39
|
+
|
|
17
40
|
def switch
|
|
18
41
|
set_alchemy_language(params[:language_id])
|
|
19
42
|
do_redirect_to request.referer || alchemy.admin_dashboard_path
|
|
20
43
|
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def load_current_site
|
|
48
|
+
@current_site = Alchemy::Site.current
|
|
49
|
+
if @current_site.nil?
|
|
50
|
+
flash[:warning] = Alchemy.t("Please create a site first.")
|
|
51
|
+
redirect_to admin_sites_path
|
|
52
|
+
end
|
|
53
|
+
end
|
|
21
54
|
end
|
|
22
55
|
end
|
|
23
56
|
end
|
|
@@ -4,16 +4,19 @@ module Alchemy
|
|
|
4
4
|
module Admin
|
|
5
5
|
class LayoutpagesController < Alchemy::Admin::BaseController
|
|
6
6
|
authorize_resource class: :alchemy_admin_layoutpages
|
|
7
|
+
|
|
8
|
+
include Alchemy::Admin::CurrentLanguage
|
|
9
|
+
|
|
7
10
|
helper Alchemy::Admin::PagesHelper
|
|
8
11
|
|
|
9
12
|
def index
|
|
10
|
-
@
|
|
13
|
+
@layout_pages = Page.layoutpages.where(language: @current_language)
|
|
11
14
|
@languages = Language.on_current_site
|
|
12
15
|
end
|
|
13
16
|
|
|
14
17
|
def edit
|
|
15
18
|
@page = Page.find(params[:id])
|
|
16
|
-
@page_layouts = PageLayout.layouts_with_own_for_select(@page.page_layout,
|
|
19
|
+
@page_layouts = PageLayout.layouts_with_own_for_select(@page.page_layout, @current_language.id, true)
|
|
17
20
|
end
|
|
18
21
|
end
|
|
19
22
|
end
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
module Alchemy
|
|
4
4
|
module Admin
|
|
5
5
|
class NodesController < Admin::ResourcesController
|
|
6
|
+
include Alchemy::Admin::CurrentLanguage
|
|
7
|
+
|
|
6
8
|
def index
|
|
7
9
|
@root_nodes = Node.language_root_nodes
|
|
8
10
|
end
|
|
9
11
|
|
|
10
12
|
def new
|
|
11
13
|
@node = Node.new(
|
|
12
|
-
site: Alchemy::Site.current,
|
|
13
14
|
parent_id: params[:parent_id],
|
|
14
|
-
language:
|
|
15
|
+
language: @current_language,
|
|
15
16
|
)
|
|
16
17
|
end
|
|
17
18
|
|
|
@@ -19,7 +20,7 @@ module Alchemy
|
|
|
19
20
|
|
|
20
21
|
def resource_params
|
|
21
22
|
params.require(:node).permit(
|
|
22
|
-
:
|
|
23
|
+
:menu_type,
|
|
23
24
|
:parent_id,
|
|
24
25
|
:language_id,
|
|
25
26
|
:page_id,
|
|
@@ -27,7 +28,7 @@ module Alchemy
|
|
|
27
28
|
:url,
|
|
28
29
|
:title,
|
|
29
30
|
:nofollow,
|
|
30
|
-
:external
|
|
31
|
+
:external,
|
|
31
32
|
)
|
|
32
33
|
end
|
|
33
34
|
end
|
|
@@ -5,29 +5,31 @@ module Alchemy
|
|
|
5
5
|
class PagesController < Alchemy::Admin::BaseController
|
|
6
6
|
include OnPageLayout::CallbacksRunner
|
|
7
7
|
|
|
8
|
-
helper
|
|
8
|
+
helper "alchemy/pages"
|
|
9
|
+
|
|
10
|
+
before_action :load_page, except: [:index, :flush, :new, :order, :create, :copy_language_tree, :link, :sort]
|
|
11
|
+
|
|
12
|
+
authorize_resource class: Alchemy::Page, except: [:index, :tree]
|
|
13
|
+
|
|
14
|
+
before_action only: [:index, :tree, :flush, :new, :order, :create, :copy_language_tree] do
|
|
15
|
+
authorize! :index, :alchemy_admin_pages
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
include Alchemy::Admin::CurrentLanguage
|
|
9
19
|
|
|
10
20
|
before_action :set_translation,
|
|
11
21
|
except: [:show]
|
|
12
22
|
|
|
13
|
-
before_action :load_page,
|
|
14
|
-
only: [:show, :info, :unlock, :visit, :publish, :configure, :edit, :update, :destroy, :fold,
|
|
15
|
-
:tree]
|
|
16
|
-
|
|
17
23
|
before_action :set_root_page,
|
|
18
24
|
only: [:index, :show, :sort, :order]
|
|
19
25
|
|
|
20
|
-
authorize_resource class: Alchemy::Page, except: [:index, :tree]
|
|
21
|
-
|
|
22
26
|
before_action :run_on_page_layout_callbacks,
|
|
23
27
|
if: :run_on_page_layout_callbacks?,
|
|
24
28
|
only: [:show]
|
|
25
29
|
|
|
26
30
|
def index
|
|
27
|
-
authorize! :index, :alchemy_admin_pages
|
|
28
|
-
|
|
29
31
|
if !@page_root
|
|
30
|
-
@language =
|
|
32
|
+
@language = @current_language
|
|
31
33
|
@languages_with_page_tree = Language.on_current_site.with_root_page
|
|
32
34
|
@page_layouts = PageLayout.layouts_for_select(@language.id)
|
|
33
35
|
end
|
|
@@ -36,8 +38,6 @@ module Alchemy
|
|
|
36
38
|
# Returns all pages as a tree from the root given by the id parameter
|
|
37
39
|
#
|
|
38
40
|
def tree
|
|
39
|
-
authorize! :tree, :alchemy_admin_pages
|
|
40
|
-
|
|
41
41
|
render json: serialized_page_tree
|
|
42
42
|
end
|
|
43
43
|
|
|
@@ -48,7 +48,7 @@ module Alchemy
|
|
|
48
48
|
Page.current_preview = @page
|
|
49
49
|
# Setting the locale to pages language, so the page content has it's correct translations.
|
|
50
50
|
::I18n.locale = @page.language.locale
|
|
51
|
-
render(layout: Alchemy::Config.get(:admin_page_preview_layout) ||
|
|
51
|
+
render(layout: Alchemy::Config.get(:admin_page_preview_layout) || "application")
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
def info
|
|
@@ -56,10 +56,10 @@ module Alchemy
|
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def new
|
|
59
|
-
@page
|
|
60
|
-
@page_layouts = PageLayout.layouts_for_select(
|
|
61
|
-
@clipboard = get_clipboard(
|
|
62
|
-
@clipboard_items = Page.all_from_clipboard_for_select(@clipboard,
|
|
59
|
+
@page ||= Page.new(layoutpage: params[:layoutpage] == "true", parent_id: params[:parent_id])
|
|
60
|
+
@page_layouts = PageLayout.layouts_for_select(@current_language.id, @page.layoutpage?)
|
|
61
|
+
@clipboard = get_clipboard("pages")
|
|
62
|
+
@clipboard_items = Page.all_from_clipboard_for_select(@clipboard, @current_language.id, @page.layoutpage?)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
def create
|
|
@@ -68,9 +68,7 @@ module Alchemy
|
|
|
68
68
|
flash[:notice] = Alchemy.t("Page created", name: @page.name)
|
|
69
69
|
do_redirect_to(redirect_path_after_create_page)
|
|
70
70
|
else
|
|
71
|
-
|
|
72
|
-
@clipboard = get_clipboard('pages')
|
|
73
|
-
@clipboard_items = Page.all_from_clipboard_for_select(@clipboard, Language.current.id, @page.layoutpage?)
|
|
71
|
+
new
|
|
74
72
|
render :new
|
|
75
73
|
end
|
|
76
74
|
end
|
|
@@ -82,18 +80,18 @@ module Alchemy
|
|
|
82
80
|
def edit
|
|
83
81
|
# fetching page via before filter
|
|
84
82
|
if page_is_locked?
|
|
85
|
-
flash[:warning] = Alchemy.t(
|
|
83
|
+
flash[:warning] = Alchemy.t("This page is locked", name: @page.locker_name)
|
|
86
84
|
redirect_to admin_pages_path
|
|
87
85
|
elsif page_needs_lock?
|
|
88
86
|
@page.lock_to!(current_alchemy_user)
|
|
89
87
|
end
|
|
88
|
+
@preview_url = Alchemy::Admin::PREVIEW_URL.url_for(@page)
|
|
90
89
|
@layoutpage = @page.layoutpage?
|
|
91
90
|
end
|
|
92
91
|
|
|
93
92
|
# Set page configuration like page names, meta tags and states.
|
|
94
93
|
def configure
|
|
95
|
-
@page_layouts = PageLayout.layouts_with_own_for_select(@page.page_layout,
|
|
96
|
-
render @page.definition['redirects_to_external'] ? 'configure_external' : 'configure'
|
|
94
|
+
@page_layouts = PageLayout.layouts_with_own_for_select(@page.page_layout, @current_language.id, @page.layoutpage?)
|
|
97
95
|
end
|
|
98
96
|
|
|
99
97
|
# Updates page
|
|
@@ -105,7 +103,7 @@ module Alchemy
|
|
|
105
103
|
@old_page_layout = @page.page_layout
|
|
106
104
|
if @page.update(page_params)
|
|
107
105
|
@notice = Alchemy.t("Page saved", name: @page.name)
|
|
108
|
-
@while_page_edit = request.referer.include?(
|
|
106
|
+
@while_page_edit = request.referer.include?("edit")
|
|
109
107
|
|
|
110
108
|
unless @while_page_edit
|
|
111
109
|
@tree = serialized_page_tree
|
|
@@ -121,17 +119,17 @@ module Alchemy
|
|
|
121
119
|
flash[:notice] = Alchemy.t("Page deleted", name: @page.name)
|
|
122
120
|
|
|
123
121
|
# Remove page from clipboard
|
|
124
|
-
clipboard = get_clipboard(
|
|
125
|
-
clipboard.delete_if { |item| item[
|
|
122
|
+
clipboard = get_clipboard("pages")
|
|
123
|
+
clipboard.delete_if { |item| item["id"] == @page.id.to_s }
|
|
126
124
|
end
|
|
127
125
|
|
|
128
126
|
respond_to do |format|
|
|
129
127
|
format.js do
|
|
130
128
|
@redirect_url = if @page.layoutpage?
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
129
|
+
alchemy.admin_layoutpages_path
|
|
130
|
+
else
|
|
131
|
+
alchemy.admin_pages_path
|
|
132
|
+
end
|
|
135
133
|
|
|
136
134
|
render :redirect
|
|
137
135
|
end
|
|
@@ -171,7 +169,7 @@ module Alchemy
|
|
|
171
169
|
redirect_to show_page_url(
|
|
172
170
|
urlname: @page.urlname,
|
|
173
171
|
locale: prefix_locale? ? @page.language_code : nil,
|
|
174
|
-
host: @page.site.host == "*" ? request.host : @page.site.host
|
|
172
|
+
host: @page.site.host == "*" ? request.host : @page.site.host,
|
|
175
173
|
)
|
|
176
174
|
end
|
|
177
175
|
|
|
@@ -212,24 +210,22 @@ module Alchemy
|
|
|
212
210
|
end
|
|
213
211
|
|
|
214
212
|
def flush
|
|
215
|
-
|
|
213
|
+
@current_language.pages.flushables.update_all(published_at: Time.current)
|
|
216
214
|
# We need to ensure, that also all layoutpages get the +published_at+ timestamp set,
|
|
217
215
|
# but not set to public true, because the cache_key for an element is +published_at+
|
|
218
216
|
# and we don't want the layout pages to be present in +Page.published+ scope.
|
|
219
|
-
|
|
217
|
+
@current_language.pages.flushable_layoutpages.update_all(published_at: Time.current)
|
|
220
218
|
respond_to { |format| format.js }
|
|
221
219
|
end
|
|
222
220
|
|
|
223
221
|
private
|
|
224
222
|
|
|
225
223
|
def copy_of_language_root
|
|
226
|
-
|
|
224
|
+
Page.copy(
|
|
227
225
|
language_root_to_copy_from,
|
|
228
226
|
language_id: params[:languages][:new_lang_id],
|
|
229
|
-
language_code:
|
|
227
|
+
language_code: @current_language.code,
|
|
230
228
|
)
|
|
231
|
-
page_copy.move_to_child_of Page.root
|
|
232
|
-
page_copy
|
|
233
229
|
end
|
|
234
230
|
|
|
235
231
|
def language_root_to_copy_from
|
|
@@ -259,14 +255,14 @@ module Alchemy
|
|
|
259
255
|
def visit_nodes(nodes, my_left, parent, depth, tree, url, restricted)
|
|
260
256
|
nodes.each do |item|
|
|
261
257
|
my_right = my_left + 1
|
|
262
|
-
my_restricted = item[
|
|
258
|
+
my_restricted = item["restricted"] || restricted
|
|
263
259
|
urls = process_url(url, item)
|
|
264
260
|
|
|
265
|
-
if item[
|
|
266
|
-
my_right, tree = visit_nodes(item[
|
|
261
|
+
if item["children"]
|
|
262
|
+
my_right, tree = visit_nodes(item["children"], my_left + 1, item["id"], depth + 1, tree, urls[:children_path], my_restricted)
|
|
267
263
|
end
|
|
268
264
|
|
|
269
|
-
tree[item[
|
|
265
|
+
tree[item["id"]] = TreeNode.new(my_left, my_right, parent, depth, urls[:my_urlname], my_restricted)
|
|
270
266
|
my_left = my_right + 1
|
|
271
267
|
end
|
|
272
268
|
|
|
@@ -295,24 +291,14 @@ module Alchemy
|
|
|
295
291
|
# This function will add a node's own slug into their ancestor's path
|
|
296
292
|
# in order to create the full URL of a node
|
|
297
293
|
#
|
|
298
|
-
# NOTE: external and invisible pages are not part of the full path of their children
|
|
299
|
-
#
|
|
300
294
|
# @param [String]
|
|
301
295
|
# The node's ancestors path
|
|
302
296
|
# @param [Hash]
|
|
303
297
|
# A children node
|
|
304
298
|
#
|
|
305
299
|
def process_url(ancestors_path, item)
|
|
306
|
-
default_urlname = (ancestors_path.blank? ? "" : "#{ancestors_path}/") + item[
|
|
307
|
-
|
|
308
|
-
pair = {my_urlname: default_urlname, children_path: default_urlname}
|
|
309
|
-
|
|
310
|
-
if item['external'] == true || item['visible'] == false
|
|
311
|
-
# children ignore an ancestor in their path if external or invisible
|
|
312
|
-
pair[:children_path] = ancestors_path
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
pair
|
|
300
|
+
default_urlname = (ancestors_path.blank? ? "" : "#{ancestors_path}/") + item["slug"].to_s
|
|
301
|
+
{ my_urlname: default_urlname, children_path: default_urlname }
|
|
316
302
|
end
|
|
317
303
|
|
|
318
304
|
def load_page
|
|
@@ -320,19 +306,19 @@ module Alchemy
|
|
|
320
306
|
end
|
|
321
307
|
|
|
322
308
|
def pages_from_raw_request
|
|
323
|
-
request.raw_post.split(
|
|
324
|
-
parts = i.split(
|
|
309
|
+
request.raw_post.split("&").map do |i|
|
|
310
|
+
parts = i.split("=")
|
|
325
311
|
{
|
|
326
|
-
parts[0].gsub(/[^0-9]/,
|
|
312
|
+
parts[0].gsub(/[^0-9]/, "") => parts[1],
|
|
327
313
|
}
|
|
328
314
|
end
|
|
329
315
|
end
|
|
330
316
|
|
|
331
317
|
def redirect_path_after_create_page
|
|
332
|
-
if @page.
|
|
333
|
-
admin_pages_path
|
|
334
|
-
else
|
|
318
|
+
if @page.editable_by?(current_alchemy_user)
|
|
335
319
|
params[:redirect_to] || edit_admin_page_path(@page)
|
|
320
|
+
else
|
|
321
|
+
admin_pages_path
|
|
336
322
|
end
|
|
337
323
|
end
|
|
338
324
|
|
|
@@ -351,30 +337,32 @@ module Alchemy
|
|
|
351
337
|
def page_is_locked?
|
|
352
338
|
return false if !@page.locker.try(:logged_in?)
|
|
353
339
|
return false if !current_alchemy_user.respond_to?(:id)
|
|
340
|
+
|
|
354
341
|
@page.locked? && @page.locker.id != current_alchemy_user.id
|
|
355
342
|
end
|
|
356
343
|
|
|
357
344
|
def page_needs_lock?
|
|
358
345
|
return true unless @page.locker
|
|
346
|
+
|
|
359
347
|
@page.locker.try!(:id) != current_alchemy_user.try!(:id)
|
|
360
348
|
end
|
|
361
349
|
|
|
362
350
|
def paste_from_clipboard
|
|
363
351
|
if params[:paste_from_clipboard]
|
|
364
352
|
source = Page.find(params[:paste_from_clipboard])
|
|
365
|
-
parent = Page.find_by(id: params[:page][:parent_id])
|
|
353
|
+
parent = Page.find_by(id: params[:page][:parent_id])
|
|
366
354
|
Page.copy_and_paste(source, parent, params[:page][:name])
|
|
367
355
|
end
|
|
368
356
|
end
|
|
369
357
|
|
|
370
358
|
def set_root_page
|
|
371
|
-
@page_root =
|
|
359
|
+
@page_root = @current_language.root_page
|
|
372
360
|
end
|
|
373
361
|
|
|
374
362
|
def serialized_page_tree
|
|
375
363
|
PageTreeSerializer.new(@page, ability: current_ability,
|
|
376
364
|
user: current_alchemy_user,
|
|
377
|
-
full: params[:full] ==
|
|
365
|
+
full: params[:full] == "true")
|
|
378
366
|
end
|
|
379
367
|
end
|
|
380
368
|
end
|
|
@@ -6,7 +6,7 @@ module Alchemy
|
|
|
6
6
|
include UploaderResponses
|
|
7
7
|
include ArchiveOverlay
|
|
8
8
|
|
|
9
|
-
helper
|
|
9
|
+
helper "alchemy/admin/tags"
|
|
10
10
|
|
|
11
11
|
before_action :load_resource,
|
|
12
12
|
only: [:show, :edit, :update, :destroy, :info]
|
|
@@ -14,12 +14,12 @@ module Alchemy
|
|
|
14
14
|
authorize_resource class: Alchemy::Picture
|
|
15
15
|
|
|
16
16
|
def index
|
|
17
|
-
@size = params[:size].present? ? params[:size] :
|
|
17
|
+
@size = params[:size].present? ? params[:size] : "medium"
|
|
18
18
|
@query = Picture.ransack(search_filter_params[:q])
|
|
19
19
|
@pictures = Picture.search_by(
|
|
20
20
|
search_filter_params,
|
|
21
21
|
@query,
|
|
22
|
-
items_per_page
|
|
22
|
+
items_per_page,
|
|
23
23
|
)
|
|
24
24
|
|
|
25
25
|
if in_overlay?
|
|
@@ -31,7 +31,7 @@ module Alchemy
|
|
|
31
31
|
@previous = @picture.previous(params)
|
|
32
32
|
@next = @picture.next(params)
|
|
33
33
|
@assignments = @picture.essence_pictures.joins(content: {element: :page})
|
|
34
|
-
render action:
|
|
34
|
+
render action: "show"
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def create
|
|
@@ -46,19 +46,19 @@ module Alchemy
|
|
|
46
46
|
|
|
47
47
|
def edit_multiple
|
|
48
48
|
@pictures = Picture.where(id: params[:picture_ids])
|
|
49
|
-
@tags = @pictures.collect(&:tag_list).flatten.uniq.join(
|
|
49
|
+
@tags = @pictures.collect(&:tag_list).flatten.uniq.join(", ")
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
def update
|
|
53
53
|
if @picture.update(picture_params)
|
|
54
54
|
@message = {
|
|
55
55
|
body: Alchemy.t(:picture_updated_successfully, name: @picture.name),
|
|
56
|
-
type:
|
|
56
|
+
type: "notice",
|
|
57
57
|
}
|
|
58
58
|
else
|
|
59
59
|
@message = {
|
|
60
60
|
body: Alchemy.t(:picture_update_failed),
|
|
61
|
-
type:
|
|
61
|
+
type: "error",
|
|
62
62
|
}
|
|
63
63
|
end
|
|
64
64
|
render :update
|
|
@@ -89,7 +89,7 @@ module Alchemy
|
|
|
89
89
|
if not_deletable.any?
|
|
90
90
|
flash[:warn] = Alchemy.t(
|
|
91
91
|
"These pictures could not be deleted, because they were in use",
|
|
92
|
-
names: not_deletable.to_sentence
|
|
92
|
+
names: not_deletable.to_sentence,
|
|
93
93
|
)
|
|
94
94
|
else
|
|
95
95
|
flash[:notice] = Alchemy.t("Pictures deleted successfully", names: names.to_sentence)
|
|
@@ -116,15 +116,15 @@ module Alchemy
|
|
|
116
116
|
def items_per_page
|
|
117
117
|
if in_overlay?
|
|
118
118
|
case params[:size]
|
|
119
|
-
when
|
|
120
|
-
when
|
|
119
|
+
when "small" then 25
|
|
120
|
+
when "large" then 4
|
|
121
121
|
else
|
|
122
122
|
9
|
|
123
123
|
end
|
|
124
124
|
else
|
|
125
125
|
cookies[:alchemy_pictures_per_page] = params[:per_page] ||
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
cookies[:alchemy_pictures_per_page] ||
|
|
127
|
+
pictures_per_page_for_size(params[:size])
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
130
|
|
|
@@ -137,8 +137,8 @@ module Alchemy
|
|
|
137
137
|
|
|
138
138
|
def pictures_per_page_for_size(size)
|
|
139
139
|
case size
|
|
140
|
-
when
|
|
141
|
-
when
|
|
140
|
+
when "small" then 60
|
|
141
|
+
when "large" then 12
|
|
142
142
|
else
|
|
143
143
|
20
|
|
144
144
|
end
|
|
@@ -154,8 +154,8 @@ module Alchemy
|
|
|
154
154
|
:size,
|
|
155
155
|
:element_id,
|
|
156
156
|
:swap,
|
|
157
|
-
:content_id
|
|
158
|
-
]
|
|
157
|
+
:content_id,
|
|
158
|
+
],
|
|
159
159
|
)
|
|
160
160
|
end
|
|
161
161
|
|