alchemy_cms 3.2.1 → 3.3.0.rc1
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/.codeclimate.yml +28 -0
- data/.gitignore +2 -2
- data/.travis.yml +11 -3
- data/CHANGELOG.md +100 -0
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +12 -1
- data/README.md +25 -7
- data/Rakefile +1 -3
- data/alchemy_cms.gemspec +7 -15
- data/app/assets/fonts/alchemy/icons.eot +0 -0
- data/app/assets/fonts/alchemy/icons.svg +28 -66
- data/app/assets/fonts/alchemy/icons.ttf +0 -0
- data/app/assets/fonts/alchemy/icons.woff +0 -0
- data/app/assets/images/alchemy/icons.png +0 -0
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +10 -3
- data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +15 -6
- data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +10 -4
- data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +16 -22
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +69 -32
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +147 -83
- data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +14 -14
- data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +55 -0
- data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +8 -1
- data/app/assets/javascripts/alchemy/alchemy.js +3 -1
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +36 -31
- data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +35 -29
- data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +51 -5
- data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +26 -10
- data/app/assets/javascripts/alchemy/{alchemy.windows.js.coffee → alchemy.trash_window.js.coffee} +1 -13
- data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +15 -17
- data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +3 -3
- data/app/assets/stylesheets/alchemy/_extends.scss +1 -1
- data/app/assets/stylesheets/alchemy/_mixins.scss +27 -0
- data/app/assets/stylesheets/alchemy/_variables.scss +1 -0
- data/app/assets/stylesheets/alchemy/admin.scss +1 -0
- data/app/assets/stylesheets/alchemy/archive.scss +0 -57
- data/app/assets/stylesheets/alchemy/base.scss +1 -18
- data/app/assets/stylesheets/alchemy/buttons.scss +30 -25
- data/app/assets/stylesheets/alchemy/dialogs.scss +25 -9
- data/app/assets/stylesheets/alchemy/elements.scss +182 -126
- data/app/assets/stylesheets/alchemy/form_fields.scss +14 -8
- data/app/assets/stylesheets/alchemy/forms.scss +10 -1
- data/app/assets/stylesheets/alchemy/frame.scss +3 -10
- data/app/assets/stylesheets/alchemy/icon-font.scss +13 -6
- data/app/assets/stylesheets/alchemy/icons.scss +16 -0
- data/app/assets/stylesheets/alchemy/image_library.scss +269 -0
- data/app/assets/stylesheets/alchemy/selects.scss +1 -0
- data/app/assets/stylesheets/alchemy/sitemap.scss +12 -1
- data/app/assets/stylesheets/alchemy/toolbar.scss +2 -2
- data/app/assets/stylesheets/alchemy/upload.scss +97 -87
- data/app/assets/stylesheets/alchemy/welcome.sass +49 -0
- data/app/controllers/alchemy/admin/attachments_controller.rb +21 -29
- data/app/controllers/alchemy/admin/base_controller.rb +23 -4
- data/app/controllers/alchemy/admin/clipboard_controller.rb +0 -1
- data/app/controllers/alchemy/admin/contents_controller.rb +2 -4
- data/app/controllers/alchemy/admin/dashboard_controller.rb +4 -4
- data/app/controllers/alchemy/admin/elements_controller.rb +20 -11
- data/app/controllers/alchemy/admin/essence_files_controller.rb +2 -2
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +10 -9
- data/app/controllers/alchemy/admin/languages_controller.rb +0 -1
- data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -2
- data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +0 -1
- data/app/controllers/alchemy/admin/pages_controller.rb +46 -29
- data/app/controllers/alchemy/admin/pictures_controller.rb +44 -55
- data/app/controllers/alchemy/admin/resources_controller.rb +8 -75
- data/app/controllers/alchemy/admin/tags_controller.rb +10 -8
- data/app/controllers/alchemy/admin/trash_controller.rb +0 -6
- data/app/controllers/alchemy/api/contents_controller.rb +0 -1
- data/app/controllers/alchemy/api/elements_controller.rb +0 -1
- data/app/controllers/alchemy/api/pages_controller.rb +4 -1
- data/app/controllers/alchemy/attachments_controller.rb +4 -5
- data/app/controllers/alchemy/base_controller.rb +6 -5
- data/app/controllers/alchemy/elements_controller.rb +1 -1
- data/app/controllers/alchemy/messages_controller.rb +9 -4
- data/app/controllers/alchemy/pages_controller.rb +133 -137
- data/app/controllers/alchemy/pictures_controller.rb +12 -10
- data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +41 -0
- data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +56 -0
- data/app/controllers/concerns/alchemy/locale_redirects.rb +38 -0
- data/app/controllers/concerns/alchemy/page_redirects.rb +80 -0
- data/app/controllers/concerns/alchemy/site_redirects.rb +22 -0
- data/app/helpers/alchemy/admin/attachments_helper.rb +1 -2
- data/app/helpers/alchemy/admin/base_helper.rb +36 -62
- data/app/helpers/alchemy/admin/contents_helper.rb +6 -80
- data/app/helpers/alchemy/admin/elements_helper.rb +36 -15
- data/app/helpers/alchemy/admin/essences_helper.rb +15 -8
- data/app/helpers/alchemy/admin/form_helper.rb +6 -10
- data/app/helpers/alchemy/admin/navigation_helper.rb +4 -7
- data/app/helpers/alchemy/admin/pages_helper.rb +14 -35
- data/app/helpers/alchemy/admin/pictures_helper.rb +12 -14
- data/app/helpers/alchemy/admin/tags_helper.rb +5 -7
- data/app/helpers/alchemy/base_helper.rb +9 -17
- data/app/helpers/alchemy/elements_block_helper.rb +5 -13
- data/app/helpers/alchemy/elements_helper.rb +6 -6
- data/app/helpers/alchemy/essences_helper.rb +3 -16
- data/app/helpers/alchemy/pages_helper.rb +32 -25
- data/app/helpers/alchemy/url_helper.rb +14 -16
- data/app/mailers/alchemy/messages.rb +0 -2
- data/app/models/alchemy.rb +0 -2
- data/app/models/alchemy/attachment.rb +45 -56
- data/app/models/alchemy/cell.rb +7 -8
- data/app/models/alchemy/content.rb +39 -24
- data/app/models/alchemy/content/factory.rb +27 -44
- data/app/models/alchemy/element.rb +101 -267
- data/app/models/alchemy/element/definitions.rb +9 -8
- data/app/models/alchemy/element/element_contents.rb +150 -0
- data/app/models/alchemy/element/element_essences.rb +109 -0
- data/app/models/alchemy/element/presenters.rb +18 -7
- data/app/models/alchemy/essence_date.rb +1 -2
- data/app/models/alchemy/essence_file.rb +10 -6
- data/app/models/alchemy/essence_html.rb +0 -1
- data/app/models/alchemy/essence_picture.rb +12 -4
- data/app/models/alchemy/essence_richtext.rb +6 -3
- data/app/models/alchemy/language.rb +48 -21
- data/app/models/alchemy/language/code.rb +1 -4
- data/app/models/alchemy/page.rb +33 -35
- data/app/models/alchemy/page/page_cells.rb +6 -10
- data/app/models/alchemy/page/page_elements.rb +130 -100
- data/app/models/alchemy/page/page_naming.rb +2 -3
- data/app/models/alchemy/page/page_natures.rb +50 -16
- data/app/models/alchemy/page/page_scopes.rb +7 -7
- data/app/models/alchemy/page/page_users.rb +3 -3
- data/app/models/alchemy/picture.rb +48 -33
- data/app/models/alchemy/picture/transformations.rb +8 -9
- data/app/models/alchemy/site.rb +19 -17
- data/app/models/alchemy/site/layout.rb +9 -9
- data/app/models/alchemy/tag.rb +0 -2
- data/app/models/alchemy/tree_node.rb +5 -4
- data/app/serializers/alchemy/attachment_serializer.rb +0 -1
- data/app/serializers/alchemy/base_serializer.rb +30 -0
- data/app/serializers/alchemy/cell_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_date_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_file_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_html_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_link_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_picture_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_select_serializer.rb +0 -1
- data/app/serializers/alchemy/essence_text_serializer.rb +0 -1
- data/app/serializers/alchemy/legacy_element_serializer.rb +0 -1
- data/app/serializers/alchemy/page_serializer.rb +0 -1
- data/app/serializers/alchemy/page_tree_serializer.rb +90 -0
- data/app/serializers/alchemy/picture_serializer.rb +0 -1
- data/app/views/alchemy/_menubar.html.erb +3 -3
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +11 -16
- data/app/views/alchemy/admin/attachments/_attachment.html.erb +9 -9
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +7 -15
- data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
- data/app/views/alchemy/admin/attachments/_tag_list.html.erb +2 -2
- data/app/views/alchemy/admin/attachments/edit.html.erb +3 -3
- data/app/views/alchemy/admin/attachments/index.html.erb +10 -17
- data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
- data/app/views/alchemy/admin/clipboard/index.html.erb +3 -3
- data/app/views/alchemy/admin/clipboard/insert.js.erb +3 -3
- data/app/views/alchemy/admin/clipboard/remove.js.erb +2 -2
- data/app/views/alchemy/admin/contents/_missing.html.erb +5 -7
- data/app/views/alchemy/admin/contents/create.js.erb +1 -1
- data/app/views/alchemy/admin/contents/new.html.erb +2 -2
- data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +6 -6
- data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +2 -2
- data/app/views/alchemy/admin/dashboard/_users.html.erb +2 -2
- data/app/views/alchemy/admin/dashboard/help.html.erb +15 -15
- data/app/views/alchemy/admin/dashboard/index.html.erb +6 -6
- data/app/views/alchemy/admin/dashboard/info.html.erb +5 -5
- data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_element.html.erb +52 -18
- data/app/views/alchemy/admin/elements/_element_footer.html.erb +11 -0
- data/app/views/alchemy/admin/elements/{_element_head.html.erb → _element_header.html.erb} +8 -8
- data/app/views/alchemy/admin/elements/_element_toolbar.html.erb +49 -0
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +7 -6
- data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +13 -8
- data/app/views/alchemy/admin/elements/fold.js.erb +12 -7
- data/app/views/alchemy/admin/elements/index.html.erb +12 -8
- data/app/views/alchemy/admin/elements/list.html.erb +3 -3
- data/app/views/alchemy/admin/elements/new.html.erb +4 -4
- data/app/views/alchemy/admin/elements/order.js.erb +3 -4
- data/app/views/alchemy/admin/elements/publish.js.erb +15 -0
- data/app/views/alchemy/admin/elements/trash.js.erb +3 -3
- data/app/views/alchemy/admin/elements/update.js.erb +7 -8
- data/app/views/alchemy/admin/essence_files/edit.html.erb +16 -13
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +3 -3
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +8 -8
- data/app/views/alchemy/admin/languages/_form.html.erb +12 -3
- data/app/views/alchemy/admin/languages/_language.html.erb +8 -2
- data/app/views/alchemy/admin/languages/_table.html.erb +11 -5
- data/app/views/alchemy/admin/languages/index.html.erb +1 -1
- data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +8 -8
- data/app/views/alchemy/admin/layoutpages/edit.html.erb +2 -2
- data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -13
- data/app/views/alchemy/admin/leave.html.erb +5 -5
- data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +1 -1
- data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +4 -4
- data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +9 -9
- data/app/views/alchemy/admin/pages/_external_link.html.erb +6 -6
- data/app/views/alchemy/admin/pages/_file_link.html.erb +6 -6
- data/app/views/alchemy/admin/pages/_form.html.erb +6 -6
- data/app/views/alchemy/admin/pages/_internal_link.html.erb +9 -11
- data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +3 -3
- data/app/views/alchemy/admin/pages/_locked_page.html.erb +4 -4
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_page.html.erb +95 -80
- data/app/views/alchemy/admin/pages/_page_for_links.html.erb +22 -22
- data/app/views/alchemy/admin/pages/_page_infos.html.erb +12 -0
- data/app/views/alchemy/admin/pages/_page_status.html.erb +7 -9
- data/app/views/alchemy/admin/pages/_sitemap.html.erb +35 -6
- data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +0 -3
- data/app/views/alchemy/admin/pages/configure.html.erb +1 -1
- data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
- data/app/views/alchemy/admin/pages/edit.html.erb +39 -44
- data/app/views/alchemy/admin/pages/flush.js.erb +1 -1
- data/app/views/alchemy/admin/pages/fold.js.erb +2 -3
- data/app/views/alchemy/admin/pages/index.html.erb +15 -22
- data/app/views/alchemy/admin/pages/info.html.erb +8 -8
- data/app/views/alchemy/admin/pages/link.html.erb +3 -3
- data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
- data/app/views/alchemy/admin/pages/new.html.erb +4 -4
- data/app/views/alchemy/admin/pages/sort.js.erb +1 -2
- data/app/views/alchemy/admin/pages/unlock.js.erb +1 -1
- data/app/views/alchemy/admin/pages/update.js.erb +3 -3
- data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +9 -15
- data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -13
- data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_archive.html.erb +14 -14
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +30 -36
- data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +5 -5
- data/app/views/alchemy/admin/pictures/{edit.html.erb → _form.html.erb} +7 -6
- data/app/views/alchemy/admin/pictures/_infos.html.erb +50 -0
- data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_picture.html.erb +17 -51
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +6 -6
- data/app/views/alchemy/admin/pictures/index.html.erb +28 -36
- data/app/views/alchemy/admin/pictures/show.html.erb +46 -9
- data/app/views/alchemy/admin/pictures/update.js.erb +6 -0
- data/app/views/alchemy/admin/resources/_form.html.erb +3 -3
- data/app/views/alchemy/admin/resources/_resource.html.erb +4 -4
- data/app/views/alchemy/admin/resources/_table.html.erb +5 -6
- data/app/views/alchemy/admin/resources/index.csv.erb +12 -10
- data/app/views/alchemy/admin/resources/index.html.erb +4 -4
- data/app/views/alchemy/admin/sites/index.html.erb +1 -1
- data/app/views/alchemy/admin/tags/_tag.html.erb +4 -4
- data/app/views/alchemy/admin/tags/edit.html.erb +5 -5
- data/app/views/alchemy/admin/tags/index.html.erb +8 -8
- data/app/views/alchemy/admin/tags/new.html.erb +2 -2
- data/app/views/alchemy/admin/trash/clear.js.erb +1 -1
- data/app/views/alchemy/admin/trash/index.html.erb +8 -6
- data/app/views/alchemy/admin/uploader/_button.html.erb +39 -0
- data/app/views/alchemy/admin/uploader/_setup.html.erb +13 -0
- data/app/views/alchemy/base/500.html.erb +4 -4
- data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +3 -4
- data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +2 -6
- data/app/views/alchemy/essences/_essence_date_view.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +9 -11
- data/app/views/alchemy/essences/_essence_file_view.html.erb +11 -5
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_link_view.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +47 -52
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_richtext_view.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +23 -13
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_text_view.html.erb +1 -1
- data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +29 -36
- data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +5 -5
- data/app/views/alchemy/language_links/_language.html.erb +15 -9
- data/app/views/alchemy/messages/contact_form_mail.de.text.erb +1 -1
- data/app/views/alchemy/messages/contact_form_mail.en.text.erb +1 -1
- data/app/views/alchemy/messages/contact_form_mail.es.text.erb +1 -1
- data/app/views/alchemy/navigation/_link.html.erb +0 -1
- data/app/views/alchemy/pages/show.rss.builder +6 -4
- data/app/views/alchemy/welcome.html.erb +28 -0
- data/app/views/layouts/alchemy/admin.html.erb +14 -10
- data/bin/alchemy +3 -4
- data/bin/rspec +7 -0
- data/bin/spring +15 -0
- data/config/alchemy/config.yml +16 -17
- data/config/initializers/assets.rb +13 -0
- data/config/locales/alchemy.de.yml +27 -29
- data/config/locales/alchemy.en.yml +23 -29
- data/config/locales/alchemy.es.yml +23 -29
- data/config/locales/alchemy.fr.yml +19 -28
- data/config/locales/alchemy.nl.yml +19 -27
- data/config/locales/alchemy.ru.yml +19 -28
- data/config/routes.rb +53 -54
- data/config/spring.rb +2 -0
- data/db/migrate/20130827094554_alchemy_two_point_six.rb +1 -3
- data/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +6 -0
- data/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +5 -0
- data/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +7 -0
- data/lib/alchemy/auth_accessors.rb +1 -1
- data/lib/alchemy/cache_digests/template_tracker.rb +7 -13
- data/lib/alchemy/config.rb +5 -7
- data/lib/alchemy/configuration_methods.rb +11 -1
- data/lib/alchemy/controller_actions.rb +9 -12
- data/lib/alchemy/engine.rb +11 -28
- data/lib/alchemy/errors.rb +0 -1
- data/lib/alchemy/essence.rb +20 -20
- data/lib/alchemy/filetypes.rb +1 -3
- data/lib/alchemy/forms/builder.rb +0 -2
- data/lib/alchemy/hints.rb +1 -3
- data/lib/alchemy/i18n.rb +81 -53
- data/lib/alchemy/kaminari/scoped_pagination_url_helper.rb +0 -2
- data/lib/alchemy/locale.rb +0 -1
- data/lib/alchemy/logger.rb +1 -3
- data/lib/alchemy/modules.rb +3 -3
- data/lib/alchemy/mount_point.rb +0 -2
- data/lib/alchemy/name_conversions.rb +1 -3
- data/lib/alchemy/on_page_layout.rb +37 -23
- data/lib/alchemy/on_page_layout/callbacks_runner.rb +34 -0
- data/lib/alchemy/page_layout.rb +23 -24
- data/lib/alchemy/paths.rb +32 -0
- data/lib/alchemy/permissions.rb +20 -20
- data/lib/alchemy/picture_attributes.rb +0 -3
- data/lib/alchemy/resource.rb +66 -22
- data/lib/alchemy/resources_helper.rb +48 -11
- data/lib/alchemy/routing_constraints.rb +4 -5
- data/lib/alchemy/seeder.rb +1 -4
- data/lib/alchemy/shell.rb +12 -14
- data/lib/alchemy/tasks/helpers.rb +5 -7
- data/lib/alchemy/test_support/essence_shared_examples.rb +24 -24
- data/lib/alchemy/test_support/factories.rb +2 -146
- data/lib/alchemy/test_support/factories/attachment_factory.rb +9 -0
- data/lib/alchemy/test_support/factories/cell_factory.rb +9 -0
- data/lib/alchemy/test_support/factories/content_factory.rb +10 -0
- data/lib/alchemy/test_support/factories/dummy_user_factory.rb +21 -0
- data/lib/alchemy/test_support/factories/element_factory.rb +21 -0
- data/lib/alchemy/test_support/factories/essence_file_factory.rb +8 -0
- data/lib/alchemy/test_support/factories/essence_picture_factory.rb +8 -0
- data/lib/alchemy/test_support/factories/essence_text_factory.rb +7 -0
- data/lib/alchemy/test_support/factories/language_factory.rb +28 -0
- data/lib/alchemy/test_support/factories/page_factory.rb +45 -0
- data/lib/alchemy/test_support/factories/picture_factory.rb +10 -0
- data/lib/alchemy/test_support/factories/site_factory.rb +12 -0
- data/lib/alchemy/test_support/integration_helpers.rb +0 -3
- data/lib/alchemy/tinymce.rb +24 -35
- data/lib/alchemy/touching.rb +5 -6
- data/lib/alchemy/upgrader.rb +3 -5
- data/lib/alchemy/upgrader/tasks/available_contents_upgrader.rb +155 -0
- data/lib/alchemy/upgrader/tasks/nestable_elements_migration.rb +71 -0
- data/lib/alchemy/upgrader/tasks/three_point_two_task.rb +31 -0
- data/lib/alchemy/upgrader/three_point_three.rb +50 -0
- data/lib/alchemy/upgrader/three_point_two.rb +3 -32
- data/lib/alchemy/upgrader/three_point_zero.rb +0 -1
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/base.rb +1 -1
- data/lib/rails/generators/alchemy/elements/elements_generator.rb +1 -7
- data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +5 -7
- data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +6 -8
- data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +6 -7
- data/lib/rails/generators/alchemy/elements/templates/view.html.erb +4 -4
- data/lib/rails/generators/alchemy/elements/templates/view.html.haml +3 -3
- data/lib/rails/generators/alchemy/elements/templates/view.html.slim +3 -3
- data/lib/rails/generators/alchemy/essence/essence_generator.rb +2 -3
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +1 -1
- data/lib/rails/generators/alchemy/install/files/alchemy.de.yml +2 -2
- data/lib/rails/generators/alchemy/install/files/alchemy.en.yml +2 -2
- data/lib/rails/generators/alchemy/install/files/alchemy.es.yml +3 -3
- data/lib/rails/generators/alchemy/install/install_generator.rb +0 -1
- data/lib/rails/generators/alchemy/install/templates/elements.yml.tt +2 -2
- data/lib/rails/generators/alchemy/install/templates/page_layouts.yml.tt +1 -1
- data/lib/rails/generators/alchemy/module/module_generator.rb +1 -1
- data/lib/rails/templates/alchemy.rb +2 -2
- data/lib/tasks/alchemy/convert.rake +4 -8
- data/lib/tasks/alchemy/db.rake +2 -3
- data/lib/tasks/alchemy/install.rake +3 -4
- data/lib/tasks/alchemy/tidy.rake +4 -5
- data/lib/tasks/alchemy/upgrade.rake +2 -4
- data/spec/controllers/{admin → alchemy/admin}/attachments_controller_spec.rb +26 -44
- data/spec/controllers/{admin → alchemy/admin}/base_controller_spec.rb +14 -1
- data/spec/controllers/{admin → alchemy/admin}/clipboard_controller_spec.rb +3 -3
- data/spec/controllers/{admin → alchemy/admin}/contents_controller_spec.rb +4 -4
- data/spec/controllers/{admin → alchemy/admin}/dashboard_controller_spec.rb +11 -6
- data/spec/controllers/{admin → alchemy/admin}/elements_controller_spec.rb +54 -31
- data/spec/controllers/{admin → alchemy/admin}/essence_files_controller_spec.rb +8 -3
- data/spec/controllers/{admin → alchemy/admin}/essence_pictures_controller_spec.rb +3 -3
- data/spec/controllers/{admin → alchemy/admin}/languages_controller_spec.rb +13 -1
- data/spec/controllers/{admin → alchemy/admin}/layoutpages_controller_spec.rb +0 -6
- data/spec/controllers/{admin → alchemy/admin}/pages_controller_spec.rb +103 -35
- data/spec/controllers/{admin → alchemy/admin}/pictures_controller_spec.rb +133 -108
- data/spec/controllers/alchemy/admin/resources_controller_spec.rb +81 -0
- data/spec/controllers/{admin → alchemy/admin}/trash_controller_spec.rb +12 -13
- data/spec/controllers/alchemy/api/contents_controller_spec.rb +12 -13
- data/spec/controllers/alchemy/api/elements_controller_spec.rb +8 -9
- data/spec/controllers/alchemy/api/pages_controller_spec.rb +40 -7
- data/spec/controllers/{attachments_controller_spec.rb → alchemy/attachments_controller_spec.rb} +7 -7
- data/spec/controllers/alchemy/base_controller_spec.rb +106 -0
- data/spec/controllers/{elements_controller_spec.rb → alchemy/elements_controller_spec.rb} +4 -4
- data/spec/controllers/{messages_controller_spec.rb → alchemy/messages_controller_spec.rb} +14 -9
- data/spec/controllers/alchemy/on_page_layout_mixin_spec.rb +330 -0
- data/spec/controllers/{pages_controller_spec.rb → alchemy/pages_controller_spec.rb} +167 -89
- data/spec/controllers/{pictures_controller_spec.rb → alchemy/pictures_controller_spec.rb} +42 -20
- data/spec/dummy/app/models/dummy_user.rb +4 -0
- data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_view.html.erb +31 -0
- data/spec/dummy/app/views/alchemy/elements/_article_editor.html.erb +6 -10
- data/spec/dummy/app/views/alchemy/elements/_article_view.html.erb +9 -24
- data/spec/dummy/app/views/alchemy/elements/_bild_editor.html.erb +3 -0
- data/spec/dummy/app/views/alchemy/elements/_bild_view.html.erb +5 -0
- data/spec/dummy/app/views/alchemy/elements/_contactform_editor.html.erb +6 -0
- data/spec/dummy/app/views/alchemy/elements/_contactform_view.html.erb +16 -0
- data/spec/dummy/app/views/alchemy/elements/_download_editor.html.erb +3 -0
- data/spec/dummy/app/views/alchemy/elements/_download_view.html.erb +5 -0
- data/spec/dummy/app/views/alchemy/elements/_erb_element_editor.html.erb +3 -0
- data/spec/dummy/app/views/alchemy/elements/_erb_element_view.html.erb +5 -0
- data/spec/dummy/app/views/alchemy/elements/_header_editor.html.erb +3 -0
- data/spec/dummy/app/views/alchemy/elements/_header_view.html.erb +5 -0
- data/spec/dummy/app/views/alchemy/elements/_news_editor.html.erb +5 -0
- data/spec/dummy/app/views/alchemy/elements/_search_editor.html.erb +1 -0
- data/spec/dummy/app/views/alchemy/elements/_search_view.html.erb +4 -0
- data/spec/dummy/app/views/alchemy/elements/_slide_editor.html.erb +3 -0
- data/spec/dummy/app/views/alchemy/elements/_slide_view.html.erb +5 -0
- data/spec/dummy/app/views/alchemy/elements/_slider_editor.html.erb +2 -0
- data/spec/dummy/app/views/alchemy/elements/_slider_view.html.erb +4 -0
- data/spec/dummy/app/views/alchemy/elements/_text_editor.html.erb +3 -0
- data/spec/dummy/app/views/alchemy/elements/_text_view.html.erb +5 -0
- data/spec/dummy/app/views/alchemy/page_layouts/_standard.html.erb +1 -0
- data/spec/dummy/config/alchemy/elements.yml +10 -13
- data/spec/dummy/config/alchemy/page_layouts.yml +1 -1
- data/spec/dummy/config/initializers/alchemy.rb +1 -0
- data/spec/dummy/config/locales/kl.yml +2 -0
- data/spec/dummy/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +1 -0
- data/spec/dummy/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +1 -0
- data/spec/dummy/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +1 -0
- data/spec/dummy/db/schema.rb +10 -6
- data/spec/factories.rb +13 -0
- data/spec/features/admin/admin_layout_spec.rb +14 -0
- data/spec/features/admin/dashboard_spec.rb +1 -2
- data/spec/features/admin/edit_elements_feature_spec.rb +36 -0
- data/spec/features/admin/language_tree_feature_spec.rb +7 -8
- data/spec/features/admin/languages_features_spec.rb +65 -0
- data/spec/features/admin/legacy_page_url_management_spec.rb +3 -3
- data/spec/features/admin/link_overlay_spec.rb +16 -17
- data/spec/features/admin/locale_select_feature_spec.rb +1 -1
- data/spec/features/admin/modules_integration_spec.rb +0 -1
- data/spec/features/admin/navigation_feature_spec.rb +11 -2
- data/spec/features/admin/page_creation_feature_spec.rb +5 -5
- data/spec/features/admin/page_editing_feature_spec.rb +6 -6
- data/spec/features/admin/picture_library_integration_spec.rb +3 -3
- data/spec/features/admin/resources_integration_spec.rb +7 -12
- data/spec/features/admin/site_select_feature_spec.rb +1 -2
- data/spec/features/admin/tinymce_feature_spec.rb +0 -1
- data/spec/features/page_feature_spec.rb +57 -158
- data/spec/features/page_redirects_spec.rb +358 -0
- data/spec/features/picture_security_spec.rb +1 -7
- data/spec/fixtures/animated.gif +0 -0
- data/spec/helpers/{admin → alchemy/admin}/attachments_helper_spec.rb +0 -0
- data/spec/helpers/{admin → alchemy/admin}/base_helper_spec.rb +39 -29
- data/spec/helpers/{admin → alchemy/admin}/contents_helper_spec.rb +4 -23
- data/spec/helpers/{admin → alchemy/admin}/elements_helper_spec.rb +141 -5
- data/spec/helpers/{admin → alchemy/admin}/essences_helper_spec.rb +69 -8
- data/spec/helpers/{admin → alchemy/admin}/navigation_helper_spec.rb +43 -37
- data/spec/helpers/{admin → alchemy/admin}/pages_helper_spec.rb +6 -38
- data/spec/helpers/{admin → alchemy/admin}/pictures_helper_spec.rb +0 -1
- data/spec/helpers/{admin → alchemy/admin}/tags_helper_spec.rb +1 -3
- data/spec/helpers/{base_helper_spec.rb → alchemy/base_helper_spec.rb} +1 -2
- data/spec/helpers/{elements_block_helper_spec.rb → alchemy/elements_block_helper_spec.rb} +3 -3
- data/spec/helpers/{elements_helper_spec.rb → alchemy/elements_helper_spec.rb} +18 -19
- data/spec/helpers/alchemy/essences_helper_spec.rb +85 -0
- data/spec/helpers/{pages_helper_spec.rb → alchemy/pages_helper_spec.rb} +125 -39
- data/spec/helpers/alchemy/picture_url_helpers_spec.rb +78 -0
- data/spec/helpers/{url_helper_spec.rb → alchemy/url_helper_spec.rb} +66 -40
- data/spec/libraries/config_spec.rb +2 -3
- data/spec/libraries/controller_actions_spec.rb +18 -18
- data/spec/libraries/i18n_spec.rb +7 -0
- data/spec/libraries/page_layout_spec.rb +13 -7
- data/spec/libraries/paths_spec.rb +15 -0
- data/spec/libraries/permissions_spec.rb +6 -7
- data/spec/libraries/resource_spec.rb +48 -75
- data/spec/libraries/resources_helper_spec.rb +55 -6
- data/spec/libraries/shell_spec.rb +0 -4
- data/spec/libraries/template_tracker_spec.rb +4 -13
- data/spec/libraries/tinymce_spec.rb +53 -9
- data/spec/mailers/{messages_spec.rb → alchemy/messages_spec.rb} +0 -2
- data/spec/models/{attachment_spec.rb → alchemy/attachment_spec.rb} +43 -20
- data/spec/models/{cell_spec.rb → alchemy/cell_spec.rb} +2 -3
- data/spec/models/{content_spec.rb → alchemy/content_spec.rb} +179 -70
- data/spec/models/{element_spec.rb → alchemy/element_spec.rb} +315 -70
- data/spec/models/{element_to_page_spec.rb → alchemy/element_to_page_spec.rb} +0 -1
- data/spec/models/{essence_boolean_spec.rb → alchemy/essence_boolean_spec.rb} +0 -0
- data/spec/models/{essence_date_spec.rb → alchemy/essence_date_spec.rb} +2 -3
- data/spec/models/{essence_file_spec.rb → alchemy/essence_file_spec.rb} +2 -5
- data/spec/models/{essence_html_spec.rb → alchemy/essence_html_spec.rb} +1 -1
- data/spec/models/{essence_link_spec.rb → alchemy/essence_link_spec.rb} +0 -0
- data/spec/models/{essence_picture_spec.rb → alchemy/essence_picture_spec.rb} +101 -29
- data/spec/models/{essence_richtext_spec.rb → alchemy/essence_richtext_spec.rb} +7 -2
- data/spec/models/{essence_select_spec.rb → alchemy/essence_select_spec.rb} +0 -0
- data/spec/models/{essence_text_spec.rb → alchemy/essence_text_spec.rb} +4 -8
- data/spec/models/alchemy/language_spec.rb +243 -0
- data/spec/models/{legacy_page_url_spec.rb → alchemy/legacy_page_url_spec.rb} +1 -1
- data/spec/models/{message_spec.rb → alchemy/message_spec.rb} +0 -0
- data/spec/models/{page_spec.rb → alchemy/page_spec.rb} +460 -248
- data/spec/models/{picture_spec.rb → alchemy/picture_spec.rb} +118 -30
- data/spec/models/{site_spec.rb → alchemy/site_spec.rb} +19 -84
- data/spec/models/{tag_spec.rb → alchemy/tag_spec.rb} +1 -3
- data/spec/models/dummy_model_spec.rb +1 -2
- data/spec/requests/alchemy/admin/resources_requests_spec.rb +26 -0
- data/spec/requests/alchemy/admin/site_requests_spec.rb +19 -0
- data/spec/requests/alchemy/site_requests_spec.rb +18 -0
- data/spec/requests/alchemy/sitemap_spec.rb +56 -0
- data/spec/routing/api_routing_spec.rb +1 -1
- data/spec/routing/routing_spec.rb +121 -15
- data/spec/spec_helper.rb +2 -1
- data/spec/support/hint_examples.rb +1 -3
- data/spec/support/test_tweaks.rb +3 -3
- data/spec/support/transformation_examples.rb +6 -7
- data/spec/tasks/helpers_spec.rb +2 -4
- data/spec/views/admin/pictures/show_spec.rb +43 -0
- data/spec/views/essences/essence_boolean_editor_spec.rb +0 -1
- data/spec/views/essences/essence_boolean_view_spec.rb +2 -4
- data/spec/views/essences/essence_date_view_spec.rb +0 -1
- data/spec/views/essences/essence_file_editor_spec.rb +4 -6
- data/spec/views/essences/essence_file_view_spec.rb +56 -3
- data/spec/views/essences/essence_link_view_spec.rb +1 -1
- data/spec/views/essences/essence_picture_editor_spec.rb +80 -0
- data/spec/views/essences/essence_picture_view_spec.rb +0 -1
- data/spec/views/essences/essence_select_view_spec.rb +0 -1
- data/spec/views/essences/essence_text_view_spec.rb +0 -1
- data/vendor/assets/javascripts/handlebars.js +4608 -0
- data/vendor/assets/javascripts/tinymce/langs/de.js +19 -0
- data/vendor/assets/javascripts/tinymce/langs/es.js +19 -0
- data/vendor/assets/javascripts/tinymce/langs/fr.js +23 -4
- data/vendor/assets/javascripts/tinymce/langs/nl.js +22 -3
- data/vendor/assets/javascripts/tinymce/langs/ru.js +22 -3
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.min.js +12 -13
- metadata +274 -256
- data/app/views/alchemy/admin/attachments/create.js.erb +0 -11
- data/app/views/alchemy/admin/attachments/new.html.erb +0 -14
- data/app/views/alchemy/admin/elements/_element_foot.html.erb +0 -36
- data/app/views/alchemy/admin/partials/_upload_form.html.erb +0 -67
- data/app/views/alchemy/admin/pictures/info.html.erb +0 -38
- data/app/views/alchemy/admin/pictures/new.html.erb +0 -16
- data/lib/alchemy/middleware/rescue_old_cookies.rb +0 -27
- data/spec/controllers/admin/resources_controller_spec.rb +0 -53
- data/spec/controllers/base_controller_spec.rb +0 -51
- data/spec/helpers/essences_helper_spec.rb +0 -156
- data/spec/helpers/picture_url_helpers_spec.rb +0 -35
- data/spec/libraries/on_page_layout_spec.rb +0 -112
- data/spec/models/language_spec.rb +0 -123
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module Admin
|
|
3
|
+
module UploaderResponses
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
def succesful_uploader_response(file:)
|
|
7
|
+
message = Alchemy.t(:upload_success,
|
|
8
|
+
scope: [:uploader, file.class.model_name.i18n_key],
|
|
9
|
+
name: file.name
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
{
|
|
13
|
+
json: uploader_response(file: file, message: message),
|
|
14
|
+
status: :created
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def failed_uploader_response(file:)
|
|
19
|
+
message = Alchemy.t(:upload_failure,
|
|
20
|
+
scope: [:uploader, file.class.model_name.i18n_key],
|
|
21
|
+
error: file.errors[:file].join,
|
|
22
|
+
name: file.name
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
{
|
|
26
|
+
json: uploader_response(file: file, message: message),
|
|
27
|
+
status: :unprocessable_entity
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def uploader_response(file:, message:)
|
|
34
|
+
{
|
|
35
|
+
files: [file.to_jq_upload],
|
|
36
|
+
growl_message: message
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
# Handles Legacy page redirects
|
|
3
|
+
#
|
|
4
|
+
# If the page could not be found via its urlname we try to find
|
|
5
|
+
# a legacy page url for requested url to redirect to.
|
|
6
|
+
#
|
|
7
|
+
module LegacyPageRedirects
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
included do
|
|
11
|
+
before_action :redirect_to_legacy_url,
|
|
12
|
+
if: :redirect_to_legacy_url?,
|
|
13
|
+
only: [:show]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def redirect_to_legacy_url
|
|
19
|
+
redirect_permanently_to legacy_page_redirect_url
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def redirect_to_legacy_url?
|
|
23
|
+
(@page.nil? || request.format.nil?) && last_legacy_url
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Use the bare minimum to redirect to legacy page
|
|
27
|
+
#
|
|
28
|
+
# Don't use query string of legacy urlname.
|
|
29
|
+
# This drops the given query string.
|
|
30
|
+
#
|
|
31
|
+
def legacy_page_redirect_url
|
|
32
|
+
page = last_legacy_url.page
|
|
33
|
+
return unless page
|
|
34
|
+
|
|
35
|
+
alchemy.show_page_path(
|
|
36
|
+
locale: prefix_locale? ? page.language_code : nil,
|
|
37
|
+
urlname: page.urlname
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def legacy_urls
|
|
42
|
+
# /slug/tree => slug/tree
|
|
43
|
+
urlname = (request.fullpath[1..-1] if request.fullpath[0] == '/') || request.fullpath
|
|
44
|
+
LegacyPageUrl.joins(:page).where(
|
|
45
|
+
urlname: urlname,
|
|
46
|
+
Page.table_name => {
|
|
47
|
+
language_id: Language.current.id
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def last_legacy_url
|
|
53
|
+
@_last_legacy_url ||= legacy_urls.last
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
# Handles locale redirects
|
|
3
|
+
#
|
|
4
|
+
# If the current URL has a locale prefix, but should not have one it redirects
|
|
5
|
+
# to url without locale prefix.
|
|
6
|
+
#
|
|
7
|
+
# Situations we don't want a locale prefix:
|
|
8
|
+
#
|
|
9
|
+
# 1. If only one language is published
|
|
10
|
+
# 2. If the requested locale is the current default locale
|
|
11
|
+
#
|
|
12
|
+
module LocaleRedirects
|
|
13
|
+
extend ActiveSupport::Concern
|
|
14
|
+
|
|
15
|
+
included do
|
|
16
|
+
before_action :enforce_no_locale,
|
|
17
|
+
if: :locale_prefix_not_allowed?,
|
|
18
|
+
only: [:index, :show]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
# Redirects to requested action without locale prefixed
|
|
24
|
+
def enforce_no_locale
|
|
25
|
+
redirect_permanently_to additional_params.merge(locale: nil)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Is the requested locale allowed?
|
|
29
|
+
#
|
|
30
|
+
# If Alchemy is not in multi language mode or the requested locale is the default locale,
|
|
31
|
+
# then we want to redirect to a non prefixed url.
|
|
32
|
+
#
|
|
33
|
+
def locale_prefix_not_allowed?
|
|
34
|
+
params[:locale].present? && !multi_language? ||
|
|
35
|
+
params[:locale].presence == ::I18n.default_locale.to_s
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
# Handles page redirect urls
|
|
3
|
+
#
|
|
4
|
+
# Lots of reasons exist to redirect to another URL than the requested one.
|
|
5
|
+
# These module holds the logic behind these needs.
|
|
6
|
+
#
|
|
7
|
+
module PageRedirects
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
included do
|
|
11
|
+
# We need a +@page+ to work with
|
|
12
|
+
before_action :page_not_found!,
|
|
13
|
+
if: -> { @page.blank? },
|
|
14
|
+
only: [:show]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
# Returns an URL to redirect the request to.
|
|
20
|
+
#
|
|
21
|
+
# == Lookup:
|
|
22
|
+
#
|
|
23
|
+
# 1. If the page is not published and we have a published child,
|
|
24
|
+
# we return the url top that page. (Configurable through +redirect_to_public_child+).
|
|
25
|
+
# 2. If the page layout of the page found has a controller and action configured,
|
|
26
|
+
# we return the url to that route. (Configure controller and action in `page_layouts.yml`).
|
|
27
|
+
# 3. If the current page URL has no locale prefixed, but we should have one,
|
|
28
|
+
# we return the prefixed URL.
|
|
29
|
+
# 4. If no redirection is needed returns nil.
|
|
30
|
+
#
|
|
31
|
+
# @return String
|
|
32
|
+
# @return NilClass
|
|
33
|
+
#
|
|
34
|
+
def redirect_url
|
|
35
|
+
@_redirect_url ||= public_child_redirect_url || controller_and_action_url ||
|
|
36
|
+
locale_prefixed_url || nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def locale_prefixed_url
|
|
40
|
+
return unless locale_prefix_missing?
|
|
41
|
+
|
|
42
|
+
page_redirect_url(locale: Language.current.code)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def public_child_redirect_url
|
|
46
|
+
return unless redirect_to_public_child?
|
|
47
|
+
|
|
48
|
+
@page = @page.self_and_descendants.published.not_restricted.first
|
|
49
|
+
@page ? page_redirect_url : page_not_found!
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def controller_and_action_url
|
|
53
|
+
return unless @page.has_controller?
|
|
54
|
+
|
|
55
|
+
main_app.url_for(@page.controller_and_action)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Page url with or without locale while keeping all additional params
|
|
59
|
+
def page_redirect_url(options = {})
|
|
60
|
+
options = {
|
|
61
|
+
locale: prefix_locale? ? @page.language_code : nil,
|
|
62
|
+
urlname: @page.urlname
|
|
63
|
+
}.merge(options)
|
|
64
|
+
|
|
65
|
+
alchemy.show_page_path additional_params.merge(options)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def default_locale?
|
|
69
|
+
Language.current.code.to_sym == ::I18n.default_locale.to_sym
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def locale_prefix_missing?
|
|
73
|
+
multi_language? && params[:locale].blank? && !default_locale?
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def redirect_to_public_child?
|
|
77
|
+
configuration(:redirect_to_public_child) && !@page.public?
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module SiteRedirects
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
before_action :enforce_primary_host_for_site,
|
|
7
|
+
if: :needs_redirect_to_primary_host?
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def enforce_primary_host_for_site
|
|
13
|
+
redirect_to url_for(host: current_alchemy_site.host), status: :moved_permanently
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def needs_redirect_to_primary_host?
|
|
17
|
+
current_alchemy_site.redirect_to_primary_host? &&
|
|
18
|
+
current_alchemy_site.host != '*' &&
|
|
19
|
+
current_alchemy_site.host != request.host
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module Alchemy
|
|
2
2
|
module Admin
|
|
3
|
-
|
|
4
3
|
# This module contains helper methods for rendering dialogs, toolbar buttons and confirmation windows.
|
|
5
4
|
#
|
|
6
5
|
# The most important helpers for module developers are:
|
|
@@ -22,7 +21,7 @@ module Alchemy
|
|
|
22
21
|
def current_alchemy_user_name
|
|
23
22
|
name = current_alchemy_user.try(:alchemy_display_name)
|
|
24
23
|
if name.present?
|
|
25
|
-
content_tag :span, "#{
|
|
24
|
+
content_tag :span, "#{Alchemy.t('Logged in as')} #{name}", class: 'current-user-name'
|
|
26
25
|
end
|
|
27
26
|
end
|
|
28
27
|
|
|
@@ -50,7 +49,7 @@ module Alchemy
|
|
|
50
49
|
# @option options [Boolean] :modal (true)
|
|
51
50
|
# Show as modal window.
|
|
52
51
|
#
|
|
53
|
-
def link_to_dialog(content, url, options={}, html_options={})
|
|
52
|
+
def link_to_dialog(content, url, options = {}, html_options = {})
|
|
54
53
|
default_options = {modal: true}
|
|
55
54
|
options = default_options.merge(options)
|
|
56
55
|
link_to content, url,
|
|
@@ -60,7 +59,7 @@ module Alchemy
|
|
|
60
59
|
# Used for translations selector in Alchemy cockpit user settings.
|
|
61
60
|
def translations_for_select
|
|
62
61
|
Alchemy::I18n.available_locales.map do |locale|
|
|
63
|
-
[
|
|
62
|
+
[Alchemy.t(locale, scope: :translations), locale]
|
|
64
63
|
end
|
|
65
64
|
end
|
|
66
65
|
|
|
@@ -104,8 +103,8 @@ module Alchemy
|
|
|
104
103
|
content_tag(:div, class: 'js_filter_field_box') do
|
|
105
104
|
concat text_field_tag(nil, nil, options)
|
|
106
105
|
concat render_icon(:search)
|
|
107
|
-
concat link_to('', '', class: 'js_filter_field_clear', title:
|
|
108
|
-
concat content_tag(:label,
|
|
106
|
+
concat link_to('', '', class: 'js_filter_field_clear', title: Alchemy.t(:click_to_show_all))
|
|
107
|
+
concat content_tag(:label, Alchemy.t(:search), for: options[:id])
|
|
109
108
|
end
|
|
110
109
|
end
|
|
111
110
|
|
|
@@ -124,23 +123,23 @@ module Alchemy
|
|
|
124
123
|
# @param [Hash] html_options
|
|
125
124
|
# HTML options get passed to the link
|
|
126
125
|
#
|
|
127
|
-
# @option html_options [String] :title (
|
|
126
|
+
# @option html_options [String] :title (Alchemy.t(:please_confirm))
|
|
128
127
|
# The dialog title
|
|
129
128
|
# @option html_options [String] :message (message)
|
|
130
129
|
# The message displayed in the dialog
|
|
131
|
-
# @option html_options [String] :ok_label (
|
|
130
|
+
# @option html_options [String] :ok_label (Alchemy.t("Yes"))
|
|
132
131
|
# The label for the ok button
|
|
133
|
-
# @option html_options [String] :cancel_label (
|
|
132
|
+
# @option html_options [String] :cancel_label (Alchemy.t("No"))
|
|
134
133
|
# The label for the cancel button
|
|
135
134
|
#
|
|
136
135
|
def link_to_confirm_dialog(link_string = "", message = "", url = "", html_options = {})
|
|
137
136
|
link_to(link_string, url,
|
|
138
137
|
html_options.merge(
|
|
139
138
|
'data-alchemy-confirm-delete' => {
|
|
140
|
-
title:
|
|
139
|
+
title: Alchemy.t(:please_confirm),
|
|
141
140
|
message: message,
|
|
142
|
-
ok_label:
|
|
143
|
-
cancel_label:
|
|
141
|
+
ok_label: Alchemy.t("Yes"),
|
|
142
|
+
cancel_label: Alchemy.t("No")
|
|
144
143
|
}.to_json
|
|
145
144
|
)
|
|
146
145
|
)
|
|
@@ -167,10 +166,10 @@ module Alchemy
|
|
|
167
166
|
#
|
|
168
167
|
def button_with_confirm(value = "", url = "", options = {}, html_options = {})
|
|
169
168
|
options = {
|
|
170
|
-
message:
|
|
171
|
-
ok_label:
|
|
172
|
-
title:
|
|
173
|
-
cancel_label:
|
|
169
|
+
message: Alchemy.t(:confirm_to_proceed),
|
|
170
|
+
ok_label: Alchemy.t("Yes"),
|
|
171
|
+
title: Alchemy.t(:please_confirm),
|
|
172
|
+
cancel_label: Alchemy.t("No")
|
|
174
173
|
}.merge(options)
|
|
175
174
|
form_tag url, {method: html_options.delete(:method), class: 'button-with-confirm'} do
|
|
176
175
|
button_tag value, html_options.merge('data-alchemy-confirm' => options.to_json)
|
|
@@ -188,8 +187,8 @@ module Alchemy
|
|
|
188
187
|
#
|
|
189
188
|
def delete_button(url, options = {}, html_options = {})
|
|
190
189
|
options = {
|
|
191
|
-
title:
|
|
192
|
-
message:
|
|
190
|
+
title: Alchemy.t('Delete'),
|
|
191
|
+
message: Alchemy.t('Are you sure?'),
|
|
193
192
|
icon: 'destroy'
|
|
194
193
|
}.merge(options)
|
|
195
194
|
button_with_confirm(
|
|
@@ -209,7 +208,7 @@ module Alchemy
|
|
|
209
208
|
if content_for?(:title)
|
|
210
209
|
title = content_for(:title)
|
|
211
210
|
else
|
|
212
|
-
title =
|
|
211
|
+
title = Alchemy.t(controller_name, scope: :modules)
|
|
213
212
|
end
|
|
214
213
|
"Alchemy CMS - #{title}"
|
|
215
214
|
end
|
|
@@ -283,7 +282,7 @@ module Alchemy
|
|
|
283
282
|
#
|
|
284
283
|
# == Example
|
|
285
284
|
#
|
|
286
|
-
# <% label_title =
|
|
285
|
+
# <% label_title = Alchemy.t("Create #{resource_name}", default: Alchemy.t('Create')) %>
|
|
287
286
|
# <% toolbar(
|
|
288
287
|
# buttons: [
|
|
289
288
|
# {
|
|
@@ -308,43 +307,19 @@ module Alchemy
|
|
|
308
307
|
#
|
|
309
308
|
def toolbar(options = {})
|
|
310
309
|
defaults = {
|
|
311
|
-
:
|
|
312
|
-
:
|
|
310
|
+
buttons: [],
|
|
311
|
+
search: true
|
|
313
312
|
}
|
|
314
313
|
options = defaults.merge(options)
|
|
315
314
|
content_for(:toolbar) do
|
|
316
315
|
content = <<-CONTENT
|
|
317
|
-
#{options[:buttons].map { |button_options| toolbar_button(button_options) }.join
|
|
318
|
-
#{render('alchemy/admin/partials/search_form', :
|
|
316
|
+
#{options[:buttons].map { |button_options| toolbar_button(button_options) }.join}
|
|
317
|
+
#{render('alchemy/admin/partials/search_form', url: options[:search_url]) if options[:search]}
|
|
319
318
|
CONTENT
|
|
320
319
|
content.html_safe
|
|
321
320
|
end
|
|
322
321
|
end
|
|
323
322
|
|
|
324
|
-
# Renders the row for a resource record in the resources table.
|
|
325
|
-
#
|
|
326
|
-
# This helper has a nice fallback. If you create a partial for your record then this partial will be rendered.
|
|
327
|
-
#
|
|
328
|
-
# Otherwise the default +app/views/alchemy/admin/resources/_resource.html.erb+ partial gets rendered.
|
|
329
|
-
#
|
|
330
|
-
# == Example
|
|
331
|
-
#
|
|
332
|
-
# For a resource named +Comment+ you can create a partial named +_comment.html.erb+
|
|
333
|
-
#
|
|
334
|
-
# # app/views/admin/comments/_comment.html.erb
|
|
335
|
-
# <tr>
|
|
336
|
-
# <td><%= comment.title %></td>
|
|
337
|
-
# <td><%= comment.body %></td>
|
|
338
|
-
# </tr>
|
|
339
|
-
#
|
|
340
|
-
# NOTE: Alchemy gives you a local variable named like your resource
|
|
341
|
-
#
|
|
342
|
-
def render_resources
|
|
343
|
-
render :partial => resource_name, :collection => resources_instance_variable
|
|
344
|
-
rescue ActionView::MissingTemplate
|
|
345
|
-
render :partial => 'resource', :collection => resources_instance_variable
|
|
346
|
-
end
|
|
347
|
-
|
|
348
323
|
# (internal) Used by upload form
|
|
349
324
|
def new_asset_path_with_session_information(asset_type)
|
|
350
325
|
session_key = Rails.application.config.session_options[:key]
|
|
@@ -375,7 +350,7 @@ module Alchemy
|
|
|
375
350
|
# @option html_options [String] :value (object.send(method.to_sym).nil? ? nil : l(object.send(method.to_sym), :format => :datepicker))
|
|
376
351
|
# The value the input displays
|
|
377
352
|
#
|
|
378
|
-
def alchemy_datepicker(object, method, html_options={})
|
|
353
|
+
def alchemy_datepicker(object, method, html_options = {})
|
|
379
354
|
value = nil
|
|
380
355
|
if object.send(method.to_sym).present?
|
|
381
356
|
value = l(object.send(method.to_sym), format: :datepicker)
|
|
@@ -392,42 +367,42 @@ module Alchemy
|
|
|
392
367
|
end
|
|
393
368
|
|
|
394
369
|
# Merges the params-hash with the given hash
|
|
395
|
-
def merge_params(p={})
|
|
396
|
-
params.merge(p).delete_if { |
|
|
370
|
+
def merge_params(p = {})
|
|
371
|
+
params.merge(p).delete_if { |_k, v| v.blank? }
|
|
397
372
|
end
|
|
398
373
|
|
|
399
374
|
# Deletes one or several params from the params-hash and merges some new params in
|
|
400
|
-
def merge_params_without(excludes, p={})
|
|
375
|
+
def merge_params_without(excludes, p = {})
|
|
401
376
|
current_params = params.clone.symbolize_keys
|
|
402
377
|
if excludes.is_a?(Array)
|
|
403
378
|
excludes.map { |i| current_params.delete(i.to_sym) }
|
|
404
379
|
else
|
|
405
380
|
current_params.delete(excludes.to_sym)
|
|
406
381
|
end
|
|
407
|
-
current_params.merge(p).delete_if { |
|
|
382
|
+
current_params.merge(p).delete_if { |_k, v| v.blank? }
|
|
408
383
|
end
|
|
409
384
|
|
|
410
385
|
# Deletes all params from the params-hash except the given ones and merges some new params in
|
|
411
|
-
def merge_params_only(includes, p={})
|
|
386
|
+
def merge_params_only(includes, p = {})
|
|
412
387
|
current_params = params.clone.symbolize_keys
|
|
413
388
|
if includes.is_a?(Array)
|
|
414
389
|
symbolized_includes = includes.map(&:to_sym)
|
|
415
|
-
current_params.delete_if { |k,
|
|
390
|
+
current_params.delete_if { |k, _v| !symbolized_includes.include?(k) }
|
|
416
391
|
else
|
|
417
|
-
current_params.delete_if { |k,
|
|
392
|
+
current_params.delete_if { |k, _v| k != includes.to_sym }
|
|
418
393
|
end
|
|
419
|
-
current_params.merge(p).delete_if { |
|
|
394
|
+
current_params.merge(p).delete_if { |_k, v| v.blank? }
|
|
420
395
|
end
|
|
421
396
|
|
|
422
397
|
def render_hint_for(element)
|
|
423
398
|
return unless element.has_hint?
|
|
424
|
-
link_to '#', :
|
|
425
|
-
render_icon(:hint) + content_tag(:span, element.hint.html_safe, :
|
|
399
|
+
link_to '#', class: 'hint' do
|
|
400
|
+
render_icon(:hint) + content_tag(:span, element.hint.html_safe, class: 'bubble')
|
|
426
401
|
end
|
|
427
402
|
end
|
|
428
403
|
|
|
429
404
|
# Appends the current controller and action to body as css class.
|
|
430
|
-
def
|
|
405
|
+
def alchemy_body_class
|
|
431
406
|
"#{controller_name} #{action_name}"
|
|
432
407
|
end
|
|
433
408
|
|
|
@@ -462,10 +437,9 @@ module Alchemy
|
|
|
462
437
|
action_controller = options[:url].gsub(/\A\//, '').split('/')
|
|
463
438
|
[
|
|
464
439
|
action_controller.last.to_sym,
|
|
465
|
-
action_controller[0..action_controller.length-2].join('_').to_sym
|
|
440
|
+
action_controller[0..action_controller.length - 2].join('_').to_sym
|
|
466
441
|
]
|
|
467
442
|
end
|
|
468
|
-
|
|
469
443
|
end
|
|
470
444
|
end
|
|
471
445
|
end
|