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
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
module Alchemy
|
|
2
|
-
|
|
3
2
|
# Module concerning element definitions
|
|
4
3
|
#
|
|
5
4
|
module Element::Definitions
|
|
6
5
|
extend ActiveSupport::Concern
|
|
7
6
|
|
|
8
7
|
module ClassMethods
|
|
9
|
-
|
|
10
8
|
# Returns the definitions from elements.yml file.
|
|
11
9
|
#
|
|
12
10
|
# Place a +elements.yml+ file inside your apps +config/alchemy+ folder to define
|
|
@@ -15,14 +13,19 @@ module Alchemy
|
|
|
15
13
|
def definitions
|
|
16
14
|
@definitions ||= read_definitions_file
|
|
17
15
|
end
|
|
18
|
-
alias_method :descriptions, :definitions
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
# Returns one element definition by given name.
|
|
18
|
+
#
|
|
19
|
+
def definition_by_name(name)
|
|
20
|
+
definitions.detect { |d| d['name'] == name }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
21
24
|
|
|
22
25
|
# Reads the element definitions file named +elements.yml+ from +config/alchemy/+ folder.
|
|
23
26
|
#
|
|
24
27
|
def read_definitions_file
|
|
25
|
-
if ::File.
|
|
28
|
+
if ::File.exist?(definitions_file_path)
|
|
26
29
|
::YAML.load(ERB.new(File.read(definitions_file_path)).result) || []
|
|
27
30
|
else
|
|
28
31
|
raise LoadError, "Could not find elements.yml file! Please run `rails generate alchemy:scaffold`"
|
|
@@ -42,11 +45,9 @@ module Alchemy
|
|
|
42
45
|
if definition = self.class.definitions.detect { |d| d['name'] == name }
|
|
43
46
|
definition
|
|
44
47
|
else
|
|
45
|
-
log_warning "Could not find element definition for #{
|
|
48
|
+
log_warning "Could not find element definition for #{name}. Please check your elements.yml file!"
|
|
46
49
|
return {}
|
|
47
50
|
end
|
|
48
51
|
end
|
|
49
|
-
alias_method :description, :definition
|
|
50
|
-
|
|
51
52
|
end
|
|
52
53
|
end
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Methods concerning contents for elements
|
|
2
|
+
#
|
|
3
|
+
module Alchemy
|
|
4
|
+
module Element::ElementContents
|
|
5
|
+
# Find first content from element by given name.
|
|
6
|
+
def content_by_name(name)
|
|
7
|
+
contents_by_name(name).first
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Find first content from element by given essence type.
|
|
11
|
+
def content_by_type(essence_type)
|
|
12
|
+
contents_by_type(essence_type).first
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# All contents from element by given name.
|
|
16
|
+
def contents_by_name(name)
|
|
17
|
+
contents.where(name: name)
|
|
18
|
+
end
|
|
19
|
+
alias_method :all_contents_by_name, :contents_by_name
|
|
20
|
+
|
|
21
|
+
# All contents from element by given essence type.
|
|
22
|
+
def contents_by_type(essence_type)
|
|
23
|
+
contents.where(essence_type: Content.normalize_essence_type(essence_type))
|
|
24
|
+
end
|
|
25
|
+
alias_method :all_contents_by_type, :contents_by_type
|
|
26
|
+
|
|
27
|
+
# Updates all related contents by calling +update_essence+ on each of them.
|
|
28
|
+
#
|
|
29
|
+
# @param contents_attributes [Hash]
|
|
30
|
+
# Hash of contents attributes.
|
|
31
|
+
# The keys has to be the #id of the content to update.
|
|
32
|
+
# The values a Hash of attribute names and values
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean]
|
|
35
|
+
# True if +errors+ are blank or +contents_attributes+ hash is nil
|
|
36
|
+
#
|
|
37
|
+
# == Example
|
|
38
|
+
#
|
|
39
|
+
# @element.update_contents(
|
|
40
|
+
# "1" => {ingredient: "Title"},
|
|
41
|
+
# "2" => {link: "https://google.com"}
|
|
42
|
+
# )
|
|
43
|
+
#
|
|
44
|
+
def update_contents(contents_attributes)
|
|
45
|
+
return true if contents_attributes.nil?
|
|
46
|
+
contents.each do |content|
|
|
47
|
+
content_hash = contents_attributes[content.id.to_s] || next
|
|
48
|
+
content.update_essence(content_hash) || errors.add(:base, :essence_validation_failed)
|
|
49
|
+
end
|
|
50
|
+
errors.blank?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Copy current content's contents to given target element
|
|
54
|
+
def copy_contents_to(element)
|
|
55
|
+
contents.map do |content|
|
|
56
|
+
Content.copy(content, element_id: element.id)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Returns the content that is marked as rss title.
|
|
61
|
+
#
|
|
62
|
+
# Mark a content as rss title in your +elements.yml+ file:
|
|
63
|
+
#
|
|
64
|
+
# - name: news
|
|
65
|
+
# contents:
|
|
66
|
+
# - name: headline
|
|
67
|
+
# type: EssenceText
|
|
68
|
+
# rss_title: true
|
|
69
|
+
#
|
|
70
|
+
def content_for_rss_title
|
|
71
|
+
content_for_rss_meta('title')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Returns the content that is marked as rss description.
|
|
75
|
+
#
|
|
76
|
+
# Mark a content as rss description in your +elements.yml+ file:
|
|
77
|
+
#
|
|
78
|
+
# - name: news
|
|
79
|
+
# contents:
|
|
80
|
+
# - name: body
|
|
81
|
+
# type: EssenceRichtext
|
|
82
|
+
# rss_description: true
|
|
83
|
+
#
|
|
84
|
+
def content_for_rss_description
|
|
85
|
+
content_for_rss_meta('description')
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Returns the array with the hashes for all element contents in the elements.yml file
|
|
89
|
+
def content_definitions
|
|
90
|
+
return nil if definition.blank?
|
|
91
|
+
definition['contents']
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Returns the definition for given content_name
|
|
95
|
+
def content_definition_for(content_name)
|
|
96
|
+
if content_definitions.blank?
|
|
97
|
+
log_warning "Element #{name} is missing the content definition for #{content_name}"
|
|
98
|
+
return nil
|
|
99
|
+
else
|
|
100
|
+
content_definitions.detect { |d| d['name'] == content_name }
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Returns an array of all EssenceRichtext contents ids from elements
|
|
105
|
+
#
|
|
106
|
+
# This is used to re-initialize the TinyMCE editor in the element editor.
|
|
107
|
+
#
|
|
108
|
+
def richtext_contents_ids
|
|
109
|
+
# This is not very efficient SQL wise I know, but we need to iterate
|
|
110
|
+
# recursivly through all descendent elements and I don't know how to do this
|
|
111
|
+
# in pure SQL. Anyone with a better idea is welcome to submit a patch.
|
|
112
|
+
ids = contents.select(&:has_tinymce?).collect(&:id)
|
|
113
|
+
expanded_nested_elements = nested_elements.expanded
|
|
114
|
+
if expanded_nested_elements.present?
|
|
115
|
+
ids += expanded_nested_elements.collect(&:richtext_contents_ids)
|
|
116
|
+
end
|
|
117
|
+
ids.flatten
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# True, if any of the element's contents has essence validations defined.
|
|
121
|
+
def has_validations?
|
|
122
|
+
!contents.detect(&:has_validations?).blank?
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# All element contents where the essence validation has failed.
|
|
126
|
+
def contents_with_errors
|
|
127
|
+
contents.select(&:essence_validation_failed?)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
private
|
|
131
|
+
|
|
132
|
+
def content_for_rss_meta(type)
|
|
133
|
+
definition = content_definitions.detect { |c| c["rss_#{type}"] }
|
|
134
|
+
return if definition.blank?
|
|
135
|
+
contents.find_by(name: definition['name'])
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# creates the contents for this element as described in the elements.yml
|
|
139
|
+
def create_contents
|
|
140
|
+
contents = []
|
|
141
|
+
if definition["contents"].blank?
|
|
142
|
+
log_warning "Could not find any content definitions for element: #{name}"
|
|
143
|
+
else
|
|
144
|
+
definition["contents"].each do |content_hash|
|
|
145
|
+
contents << Content.create_from_scratch(self, content_hash.symbolize_keys)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module Element::ElementEssences
|
|
3
|
+
# Returns the contents essence value (aka. ingredient) for passed content name.
|
|
4
|
+
def ingredient(name)
|
|
5
|
+
content = content_by_name(name)
|
|
6
|
+
return nil if content.blank?
|
|
7
|
+
content.ingredient
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# True if the element has a content for given name,
|
|
11
|
+
# that has an essence value (aka. ingredient) that is not blank.
|
|
12
|
+
def has_ingredient?(name)
|
|
13
|
+
ingredient(name).present?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Returns all essence errors in the format of:
|
|
17
|
+
#
|
|
18
|
+
# {
|
|
19
|
+
# content.name => [
|
|
20
|
+
# error_message_for_validation_1,
|
|
21
|
+
# error_message_for_validation_2
|
|
22
|
+
# ]
|
|
23
|
+
# }
|
|
24
|
+
#
|
|
25
|
+
# Get translated error messages with +Element#essence_error_messages+
|
|
26
|
+
#
|
|
27
|
+
def essence_errors
|
|
28
|
+
essence_errors = {}
|
|
29
|
+
contents.each do |content|
|
|
30
|
+
if content.essence_validation_failed?
|
|
31
|
+
essence_errors[content.name] = content.essence.validation_errors
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
essence_errors
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Essence validation errors
|
|
38
|
+
#
|
|
39
|
+
# == Error messages are translated via I18n
|
|
40
|
+
#
|
|
41
|
+
# Inside your translation file add translations like:
|
|
42
|
+
#
|
|
43
|
+
# alchemy:
|
|
44
|
+
# content_validations:
|
|
45
|
+
# name_of_the_element:
|
|
46
|
+
# name_of_the_content:
|
|
47
|
+
# validation_error_type: Error Message
|
|
48
|
+
#
|
|
49
|
+
# NOTE: +validation_error_type+ has to be one of:
|
|
50
|
+
#
|
|
51
|
+
# * blank
|
|
52
|
+
# * taken
|
|
53
|
+
# * invalid
|
|
54
|
+
#
|
|
55
|
+
# === Example:
|
|
56
|
+
#
|
|
57
|
+
# de:
|
|
58
|
+
# alchemy:
|
|
59
|
+
# content_validations:
|
|
60
|
+
# contactform:
|
|
61
|
+
# email:
|
|
62
|
+
# invalid: 'Die Email hat nicht das richtige Format'
|
|
63
|
+
#
|
|
64
|
+
#
|
|
65
|
+
# == Error message translation fallbacks
|
|
66
|
+
#
|
|
67
|
+
# In order to not translate every single content for every element
|
|
68
|
+
# you can provide default error messages per content name:
|
|
69
|
+
#
|
|
70
|
+
# === Example
|
|
71
|
+
#
|
|
72
|
+
# en:
|
|
73
|
+
# alchemy:
|
|
74
|
+
# content_validations:
|
|
75
|
+
# fields:
|
|
76
|
+
# email:
|
|
77
|
+
# invalid: E-Mail has wrong format
|
|
78
|
+
# blank: E-Mail can't be blank
|
|
79
|
+
#
|
|
80
|
+
# And even further you can provide general field agnostic error messages:
|
|
81
|
+
#
|
|
82
|
+
# === Example
|
|
83
|
+
#
|
|
84
|
+
# en:
|
|
85
|
+
# alchemy:
|
|
86
|
+
# content_validations:
|
|
87
|
+
# errors:
|
|
88
|
+
# invalid: %{field} has wrong format
|
|
89
|
+
# blank: %{field} can't be blank
|
|
90
|
+
#
|
|
91
|
+
def essence_error_messages
|
|
92
|
+
messages = []
|
|
93
|
+
essence_errors.each do |content_name, errors|
|
|
94
|
+
errors.each do |error|
|
|
95
|
+
messages << Alchemy.t(
|
|
96
|
+
"#{name}.#{content_name}.#{error}",
|
|
97
|
+
scope: 'content_validations',
|
|
98
|
+
default: [
|
|
99
|
+
"fields.#{content_name}.#{error}".to_sym,
|
|
100
|
+
"errors.#{error}".to_sym
|
|
101
|
+
],
|
|
102
|
+
field: Content.translated_label_for(content_name, name)
|
|
103
|
+
)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
messages
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
module Alchemy
|
|
2
|
-
|
|
3
2
|
# Methods used for presenting an Alchemy Element.
|
|
4
3
|
#
|
|
5
4
|
module Element::Presenters
|
|
6
5
|
extend ActiveSupport::Concern
|
|
7
6
|
|
|
8
7
|
module ClassMethods
|
|
9
|
-
|
|
10
8
|
# Human name for displaying elements in select boxes and element editor views.
|
|
11
9
|
#
|
|
12
10
|
# The name is beeing translated from given name value as described in +config/alchemy/elements.yml+
|
|
@@ -23,7 +21,7 @@ module Alchemy
|
|
|
23
21
|
# If no translation is found a humanized name is used.
|
|
24
22
|
#
|
|
25
23
|
def display_name_for(name)
|
|
26
|
-
|
|
24
|
+
Alchemy.t(name, scope: 'element_names', default: name.to_s.humanize)
|
|
27
25
|
end
|
|
28
26
|
end
|
|
29
27
|
|
|
@@ -32,12 +30,12 @@ module Alchemy
|
|
|
32
30
|
# @see Alchemy::Element::Presenters#display_name_for
|
|
33
31
|
#
|
|
34
32
|
def display_name
|
|
35
|
-
self.class.display_name_for(
|
|
33
|
+
self.class.display_name_for(definition['name'] || name)
|
|
36
34
|
end
|
|
37
35
|
|
|
38
36
|
# Returns a preview text for element.
|
|
39
37
|
#
|
|
40
|
-
# It's taken from the first Content found in the +elements.yml+
|
|
38
|
+
# It's taken from the first Content found in the +elements.yml+ definition file.
|
|
41
39
|
#
|
|
42
40
|
# You can flag a Content as +as_element_title+ to take this as preview.
|
|
43
41
|
#
|
|
@@ -45,7 +43,7 @@ module Alchemy
|
|
|
45
43
|
# Length of characters after the text will be cut off.
|
|
46
44
|
#
|
|
47
45
|
def preview_text(maxlength = 30)
|
|
48
|
-
(
|
|
46
|
+
preview_text_from_preview_content(maxlength) || preview_text_from_nested_elements(maxlength)
|
|
49
47
|
end
|
|
50
48
|
|
|
51
49
|
# Generates a preview text containing Element#display_name and Element#preview_text.
|
|
@@ -82,6 +80,19 @@ module Alchemy
|
|
|
82
80
|
"#{name}_#{id}"
|
|
83
81
|
end
|
|
84
82
|
|
|
85
|
-
|
|
83
|
+
def preview_content
|
|
84
|
+
@_preview_content ||= contents.detect(&:preview_content?)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
86
88
|
|
|
89
|
+
def preview_text_from_nested_elements(maxlength)
|
|
90
|
+
return unless nested_elements.present?
|
|
91
|
+
nested_elements.first.preview_text(maxlength)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def preview_text_from_preview_content(maxlength)
|
|
95
|
+
(preview_content || contents.first).try(:preview_text, maxlength)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
87
98
|
end
|
|
@@ -15,10 +15,9 @@ module Alchemy
|
|
|
15
15
|
acts_as_essence ingredient_column: 'date'
|
|
16
16
|
|
|
17
17
|
# Returns self.date for the Element#preview_text method.
|
|
18
|
-
def preview_text(
|
|
18
|
+
def preview_text(_maxlength = nil)
|
|
19
19
|
return "" if date.blank?
|
|
20
20
|
::I18n.l(date, format: :date)
|
|
21
21
|
end
|
|
22
|
-
|
|
23
22
|
end
|
|
24
23
|
end
|
|
@@ -4,12 +4,13 @@
|
|
|
4
4
|
#
|
|
5
5
|
# id :integer not null, primary key
|
|
6
6
|
# attachment_id :integer
|
|
7
|
-
# title :string
|
|
8
|
-
# css_class :string
|
|
7
|
+
# title :string
|
|
8
|
+
# css_class :string
|
|
9
9
|
# creator_id :integer
|
|
10
10
|
# updater_id :integer
|
|
11
11
|
# created_at :datetime not null
|
|
12
12
|
# updated_at :datetime not null
|
|
13
|
+
# link_text :string
|
|
13
14
|
#
|
|
14
15
|
|
|
15
16
|
module Alchemy
|
|
@@ -19,12 +20,16 @@ module Alchemy
|
|
|
19
20
|
|
|
20
21
|
def attachment_url
|
|
21
22
|
return if attachment.nil?
|
|
22
|
-
routes.download_attachment_path(
|
|
23
|
+
routes.download_attachment_path(
|
|
24
|
+
id: attachment.id,
|
|
25
|
+
name: attachment.urlname,
|
|
26
|
+
format: attachment.suffix
|
|
27
|
+
)
|
|
23
28
|
end
|
|
24
29
|
|
|
25
|
-
def preview_text(max=30)
|
|
30
|
+
def preview_text(max = 30)
|
|
26
31
|
return "" if attachment.blank?
|
|
27
|
-
attachment.name.to_s[0..max-1]
|
|
32
|
+
attachment.name.to_s[0..max - 1]
|
|
28
33
|
end
|
|
29
34
|
|
|
30
35
|
# Returns a serialized ingredient value for json api
|
|
@@ -37,6 +42,5 @@ module Alchemy
|
|
|
37
42
|
def routes
|
|
38
43
|
@routes ||= Engine.routes.url_helpers
|
|
39
44
|
end
|
|
40
|
-
|
|
41
45
|
end
|
|
42
46
|
end
|
|
@@ -66,7 +66,7 @@ module Alchemy
|
|
|
66
66
|
#
|
|
67
67
|
def preview_text(max = 30)
|
|
68
68
|
return "" if picture.nil?
|
|
69
|
-
picture.name.to_s[0..max-1]
|
|
69
|
+
picture.name.to_s[0..max - 1]
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
# A Hash of coordinates suitable for the graphical image cropper.
|
|
@@ -84,6 +84,15 @@ module Alchemy
|
|
|
84
84
|
picture_url(content.settings)
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
+
# Show image cropping link for content and options?
|
|
88
|
+
def allow_image_cropping?(options = {})
|
|
89
|
+
content && content.settings_value(:crop, options) && picture &&
|
|
90
|
+
picture.can_be_cropped_to(
|
|
91
|
+
content.settings_value(:image_size, options),
|
|
92
|
+
content.settings_value(:upsample, options)
|
|
93
|
+
)
|
|
94
|
+
end
|
|
95
|
+
|
|
87
96
|
private
|
|
88
97
|
|
|
89
98
|
def fix_crop_values
|
|
@@ -93,7 +102,7 @@ module Alchemy
|
|
|
93
102
|
end
|
|
94
103
|
|
|
95
104
|
def normalize_crop_value(crop_value)
|
|
96
|
-
|
|
105
|
+
send(crop_value).to_s.split('x').map { |n| normalize_number(n) }.join('x')
|
|
97
106
|
end
|
|
98
107
|
|
|
99
108
|
def normalize_number(number)
|
|
@@ -122,7 +131,7 @@ module Alchemy
|
|
|
122
131
|
name: picture.urlname,
|
|
123
132
|
format: Config.get(:image_output_format)
|
|
124
133
|
}.merge(options)
|
|
125
|
-
if crop_from.present? && crop_size.present?
|
|
134
|
+
if options[:crop] && crop_from.present? && crop_size.present?
|
|
126
135
|
params = {
|
|
127
136
|
crop: true,
|
|
128
137
|
crop_from: crop_from,
|
|
@@ -146,6 +155,5 @@ module Alchemy
|
|
|
146
155
|
secure_attributes += %w(name format sh)
|
|
147
156
|
params.delete_if { |k, v| !secure_attributes.include?(k.to_s) || v.blank? }
|
|
148
157
|
end
|
|
149
|
-
|
|
150
158
|
end
|
|
151
159
|
end
|