lc_alchemy_cms 3.2.0
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 +7 -0
- data/.editorconfig +23 -0
- data/.gitignore +21 -0
- data/.hound.yml +2 -0
- data/.rspec +1 -0
- data/.rubocop.yml +861 -0
- data/.teatro.yml +7 -0
- data/.travis.yml +27 -0
- data/.yardopts +5 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/CONTRIBUTING.md +73 -0
- data/Gemfile +34 -0
- data/LICENSE +27 -0
- data/README.md +297 -0
- data/Rakefile +48 -0
- data/alchemy_cms.gemspec +81 -0
- data/app/assets/fonts/alchemy/icons.eot +0 -0
- data/app/assets/fonts/alchemy/icons.svg +71 -0
- data/app/assets/fonts/alchemy/icons.ttf +0 -0
- data/app/assets/fonts/alchemy/icons.woff +0 -0
- data/app/assets/images/alchemy/alchemy-logo.svg +70 -0
- data/app/assets/images/alchemy/favicon.ico +0 -0
- data/app/assets/images/alchemy/icon.svg +14 -0
- data/app/assets/images/alchemy/icons.png +0 -0
- data/app/assets/images/alchemy/lupe.cur +0 -0
- data/app/assets/images/alchemy/ui-icons_666666_256x240.png +0 -0
- data/app/assets/images/sassy-ie-overlay.png +0 -0
- data/app/assets/javascripts/alchemy/alchemy.autocomplete.js.coffee +30 -0
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +142 -0
- data/app/assets/javascripts/alchemy/alchemy.browser.js.coffee +22 -0
- data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +32 -0
- data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +19 -0
- data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +85 -0
- data/app/assets/javascripts/alchemy/alchemy.custom.js +1 -0
- data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +31 -0
- data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +266 -0
- data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +70 -0
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +84 -0
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +138 -0
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +89 -0
- data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +63 -0
- data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +27 -0
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +22 -0
- data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +49 -0
- data/app/assets/javascripts/alchemy/alchemy.html5.js +22 -0
- data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +26 -0
- data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +44 -0
- data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +63 -0
- data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +42 -0
- data/app/assets/javascripts/alchemy/alchemy.js +52 -0
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +250 -0
- data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +49 -0
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +48 -0
- data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +106 -0
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +58 -0
- data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +50 -0
- data/app/assets/javascripts/alchemy/alchemy.spinner.js.coffee +49 -0
- data/app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee +11 -0
- data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +66 -0
- data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +132 -0
- data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +102 -0
- data/app/assets/javascripts/alchemy/alchemy.windows.js.coffee +42 -0
- data/app/assets/javascripts/alchemy/menubar.js.coffee +8 -0
- data/app/assets/javascripts/alchemy/preview.js +1 -0
- data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +19 -0
- data/app/assets/stylesheets/alchemy/_defaults.scss +8 -0
- data/app/assets/stylesheets/alchemy/_extends.scss +93 -0
- data/app/assets/stylesheets/alchemy/_mixins.scss +112 -0
- data/app/assets/stylesheets/alchemy/_variables.scss +61 -0
- data/app/assets/stylesheets/alchemy/admin.scss +31 -0
- data/app/assets/stylesheets/alchemy/archive.scss +436 -0
- data/app/assets/stylesheets/alchemy/base.scss +609 -0
- data/app/assets/stylesheets/alchemy/buttons.scss +259 -0
- data/app/assets/stylesheets/alchemy/custom.scss +1 -0
- data/app/assets/stylesheets/alchemy/dashboard.scss +104 -0
- data/app/assets/stylesheets/alchemy/dialogs.scss +214 -0
- data/app/assets/stylesheets/alchemy/elements.scss +772 -0
- data/app/assets/stylesheets/alchemy/errors.scss +39 -0
- data/app/assets/stylesheets/alchemy/flash.scss +65 -0
- data/app/assets/stylesheets/alchemy/form_fields.scss +89 -0
- data/app/assets/stylesheets/alchemy/forms.scss +193 -0
- data/app/assets/stylesheets/alchemy/frame.scss +301 -0
- data/app/assets/stylesheets/alchemy/icon-font.scss +67 -0
- data/app/assets/stylesheets/alchemy/icons.scss +324 -0
- data/app/assets/stylesheets/alchemy/jquery-ui.scss +1511 -0
- data/app/assets/stylesheets/alchemy/menubar.scss +81 -0
- data/app/assets/stylesheets/alchemy/modules.scss +33 -0
- data/app/assets/stylesheets/alchemy/notices.scss +64 -0
- data/app/assets/stylesheets/alchemy/pagination.scss +65 -0
- data/app/assets/stylesheets/alchemy/print.scss +34 -0
- data/app/assets/stylesheets/alchemy/search.scss +73 -0
- data/app/assets/stylesheets/alchemy/selects.scss +235 -0
- data/app/assets/stylesheets/alchemy/sitemap.scss +385 -0
- data/app/assets/stylesheets/alchemy/tables.scss +218 -0
- data/app/assets/stylesheets/alchemy/toolbar.scss +146 -0
- data/app/assets/stylesheets/alchemy/upload.scss +121 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +90 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/readme.md +1 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.eot +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.svg +175 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.ttf +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.woff +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.eot +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.svg +153 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.ttf +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.woff +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/img/anchor.gif +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/img/loader.gif +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/img/object.gif +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/img/trans.gif +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/img/wline.gif +0 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.ie7.min.css +1 -0
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +1810 -0
- data/app/controllers/alchemy/admin/attachments_controller.rb +106 -0
- data/app/controllers/alchemy/admin/base_controller.rb +168 -0
- data/app/controllers/alchemy/admin/clipboard_controller.rb +51 -0
- data/app/controllers/alchemy/admin/contents_controller.rb +76 -0
- data/app/controllers/alchemy/admin/dashboard_controller.rb +89 -0
- data/app/controllers/alchemy/admin/elements_controller.rb +190 -0
- data/app/controllers/alchemy/admin/essence_files_controller.rb +47 -0
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +120 -0
- data/app/controllers/alchemy/admin/languages_controller.rb +17 -0
- data/app/controllers/alchemy/admin/layoutpages_controller.rb +19 -0
- data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +39 -0
- data/app/controllers/alchemy/admin/pages_controller.rb +359 -0
- data/app/controllers/alchemy/admin/pictures_controller.rb +168 -0
- data/app/controllers/alchemy/admin/resources_controller.rb +185 -0
- data/app/controllers/alchemy/admin/sites_controller.rb +6 -0
- data/app/controllers/alchemy/admin/tags_controller.rb +76 -0
- data/app/controllers/alchemy/admin/trash_controller.rb +27 -0
- data/app/controllers/alchemy/api/base_controller.rb +19 -0
- data/app/controllers/alchemy/api/contents_controller.rb +35 -0
- data/app/controllers/alchemy/api/elements_controller.rb +29 -0
- data/app/controllers/alchemy/api/pages_controller.rb +32 -0
- data/app/controllers/alchemy/attachments_controller.rb +35 -0
- data/app/controllers/alchemy/base_controller.rb +106 -0
- data/app/controllers/alchemy/elements_controller.rb +27 -0
- data/app/controllers/alchemy/messages_controller.rb +114 -0
- data/app/controllers/alchemy/pages_controller.rb +211 -0
- data/app/controllers/alchemy/pictures_controller.rb +82 -0
- data/app/helpers/alchemy/admin/attachments_helper.rb +12 -0
- data/app/helpers/alchemy/admin/base_helper.rb +471 -0
- data/app/helpers/alchemy/admin/contents_helper.rb +113 -0
- data/app/helpers/alchemy/admin/elements_helper.rb +134 -0
- data/app/helpers/alchemy/admin/essences_helper.rb +120 -0
- data/app/helpers/alchemy/admin/form_helper.rb +30 -0
- data/app/helpers/alchemy/admin/navigation_helper.rb +238 -0
- data/app/helpers/alchemy/admin/pages_helper.rb +70 -0
- data/app/helpers/alchemy/admin/pictures_helper.rb +30 -0
- data/app/helpers/alchemy/admin/tags_helper.rb +102 -0
- data/app/helpers/alchemy/base_helper.rb +81 -0
- data/app/helpers/alchemy/elements_block_helper.rb +162 -0
- data/app/helpers/alchemy/elements_helper.rb +291 -0
- data/app/helpers/alchemy/essences_helper.rb +138 -0
- data/app/helpers/alchemy/pages_helper.rb +417 -0
- data/app/helpers/alchemy/url_helper.rb +76 -0
- data/app/mailers/alchemy/messages.rb +15 -0
- data/app/models/alchemy.rb +7 -0
- data/app/models/alchemy/attachment.rb +129 -0
- data/app/models/alchemy/cell.rb +94 -0
- data/app/models/alchemy/content.rb +255 -0
- data/app/models/alchemy/content/factory.rb +190 -0
- data/app/models/alchemy/element.rb +513 -0
- data/app/models/alchemy/element/definitions.rb +52 -0
- data/app/models/alchemy/element/presenters.rb +87 -0
- data/app/models/alchemy/element_to_page.rb +7 -0
- data/app/models/alchemy/essence_boolean.rb +19 -0
- data/app/models/alchemy/essence_date.rb +24 -0
- data/app/models/alchemy/essence_file.rb +42 -0
- data/app/models/alchemy/essence_html.rb +23 -0
- data/app/models/alchemy/essence_link.rb +20 -0
- data/app/models/alchemy/essence_picture.rb +152 -0
- data/app/models/alchemy/essence_richtext.rb +47 -0
- data/app/models/alchemy/essence_select.rb +18 -0
- data/app/models/alchemy/essence_text.rb +22 -0
- data/app/models/alchemy/folded_page.rb +16 -0
- data/app/models/alchemy/language.rb +144 -0
- data/app/models/alchemy/language/code.rb +22 -0
- data/app/models/alchemy/legacy_page_url.rb +20 -0
- data/app/models/alchemy/message.rb +40 -0
- data/app/models/alchemy/page.rb +409 -0
- data/app/models/alchemy/page/page_cells.rb +71 -0
- data/app/models/alchemy/page/page_elements.rb +272 -0
- data/app/models/alchemy/page/page_naming.rb +122 -0
- data/app/models/alchemy/page/page_natures.rb +114 -0
- data/app/models/alchemy/page/page_scopes.rb +95 -0
- data/app/models/alchemy/page/page_users.rb +58 -0
- data/app/models/alchemy/picture.rb +220 -0
- data/app/models/alchemy/picture/sweeping.rb +17 -0
- data/app/models/alchemy/picture/transformations.rb +256 -0
- data/app/models/alchemy/site.rb +91 -0
- data/app/models/alchemy/site/layout.rb +38 -0
- data/app/models/alchemy/tag.rb +24 -0
- data/app/models/alchemy/translations.rb +7 -0
- data/app/models/alchemy/translations/essence_body_updater.rb +64 -0
- data/app/models/alchemy/translations/translation_pusher.rb +18 -0
- data/app/models/alchemy/tree_node.rb +4 -0
- data/app/serializers/alchemy/attachment_serializer.rb +15 -0
- data/app/serializers/alchemy/cell_serializer.rb +18 -0
- data/app/serializers/alchemy/content_serializer.rb +20 -0
- data/app/serializers/alchemy/element_serializer.rb +20 -0
- data/app/serializers/alchemy/essence_boolean_serializer.rb +11 -0
- data/app/serializers/alchemy/essence_date_serializer.rb +11 -0
- data/app/serializers/alchemy/essence_file_serializer.rb +12 -0
- data/app/serializers/alchemy/essence_html_serializer.rb +11 -0
- data/app/serializers/alchemy/essence_link_serializer.rb +14 -0
- data/app/serializers/alchemy/essence_picture_serializer.rb +28 -0
- data/app/serializers/alchemy/essence_richtext_serializer.rb +12 -0
- data/app/serializers/alchemy/essence_select_serializer.rb +11 -0
- data/app/serializers/alchemy/essence_text_serializer.rb +22 -0
- data/app/serializers/alchemy/legacy_element_serializer.rb +17 -0
- data/app/serializers/alchemy/page_serializer.rb +29 -0
- data/app/serializers/alchemy/picture_serializer.rb +16 -0
- data/app/views/alchemy/_menubar.html.erb +16 -0
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +32 -0
- data/app/views/alchemy/admin/attachments/_attachment.html.erb +63 -0
- data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +15 -0
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +39 -0
- data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +11 -0
- data/app/views/alchemy/admin/attachments/_tag_list.html.erb +14 -0
- data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +7 -0
- data/app/views/alchemy/admin/attachments/create.js.erb +11 -0
- data/app/views/alchemy/admin/attachments/destroy.js.erb +1 -0
- data/app/views/alchemy/admin/attachments/edit.html.erb +10 -0
- data/app/views/alchemy/admin/attachments/index.html.erb +29 -0
- data/app/views/alchemy/admin/attachments/new.html.erb +14 -0
- data/app/views/alchemy/admin/attachments/show.html.erb +3 -0
- data/app/views/alchemy/admin/clipboard/clear.js.erb +3 -0
- data/app/views/alchemy/admin/clipboard/index.html.erb +22 -0
- data/app/views/alchemy/admin/clipboard/insert.js.erb +19 -0
- data/app/views/alchemy/admin/clipboard/remove.js.erb +10 -0
- data/app/views/alchemy/admin/contents/_missing.html.erb +19 -0
- data/app/views/alchemy/admin/contents/create.js.erb +56 -0
- data/app/views/alchemy/admin/contents/destroy.js.erb +4 -0
- data/app/views/alchemy/admin/contents/new.html.erb +11 -0
- data/app/views/alchemy/admin/contents/order.js.erb +3 -0
- data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +38 -0
- data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +22 -0
- data/app/views/alchemy/admin/dashboard/_sites.html.erb +23 -0
- data/app/views/alchemy/admin/dashboard/_users.html.erb +19 -0
- data/app/views/alchemy/admin/dashboard/help.html.erb +21 -0
- data/app/views/alchemy/admin/dashboard/index.html.erb +44 -0
- data/app/views/alchemy/admin/dashboard/info.html.erb +64 -0
- data/app/views/alchemy/admin/elements/_add_picture.html.erb +14 -0
- data/app/views/alchemy/admin/elements/_element.html.erb +23 -0
- data/app/views/alchemy/admin/elements/_element_foot.html.erb +36 -0
- data/app/views/alchemy/admin/elements/_element_head.html.erb +23 -0
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +26 -0
- data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +24 -0
- data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +8 -0
- data/app/views/alchemy/admin/elements/create.js.erb +46 -0
- data/app/views/alchemy/admin/elements/fold.js.erb +28 -0
- data/app/views/alchemy/admin/elements/index.html.erb +26 -0
- data/app/views/alchemy/admin/elements/list.html.erb +16 -0
- data/app/views/alchemy/admin/elements/new.html.erb +25 -0
- data/app/views/alchemy/admin/elements/order.js.erb +14 -0
- data/app/views/alchemy/admin/elements/trash.js.erb +12 -0
- data/app/views/alchemy/admin/elements/update.js.erb +28 -0
- data/app/views/alchemy/admin/essence_files/assign.js.erb +9 -0
- data/app/views/alchemy/admin/essence_files/edit.html.erb +18 -0
- data/app/views/alchemy/admin/essence_pictures/assign.js.erb +18 -0
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +50 -0
- data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +24 -0
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +28 -0
- data/app/views/alchemy/admin/essence_pictures/save_link.js.erb +3 -0
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +9 -0
- data/app/views/alchemy/admin/languages/_form.html.erb +14 -0
- data/app/views/alchemy/admin/languages/_language.html.erb +42 -0
- data/app/views/alchemy/admin/languages/_table.html.erb +37 -0
- data/app/views/alchemy/admin/languages/index.html.erb +23 -0
- data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +63 -0
- data/app/views/alchemy/admin/layoutpages/edit.html.erb +15 -0
- data/app/views/alchemy/admin/layoutpages/index.html.erb +41 -0
- data/app/views/alchemy/admin/leave.html.erb +11 -0
- data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +5 -0
- data/app/views/alchemy/admin/legacy_page_urls/_label.html.erb +1 -0
- data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +13 -0
- data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +20 -0
- data/app/views/alchemy/admin/legacy_page_urls/create.js.erb +10 -0
- data/app/views/alchemy/admin/legacy_page_urls/destroy.js.erb +6 -0
- data/app/views/alchemy/admin/legacy_page_urls/update.js.erb +2 -0
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +54 -0
- data/app/views/alchemy/admin/pages/_external_link.html.erb +31 -0
- data/app/views/alchemy/admin/pages/_file_link.html.erb +31 -0
- data/app/views/alchemy/admin/pages/_form.html.erb +62 -0
- data/app/views/alchemy/admin/pages/_internal_link.html.erb +41 -0
- data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +23 -0
- data/app/views/alchemy/admin/pages/_locked_page.html.erb +24 -0
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +11 -0
- data/app/views/alchemy/admin/pages/_page.html.erb +112 -0
- data/app/views/alchemy/admin/pages/_page_for_links.html.erb +45 -0
- data/app/views/alchemy/admin/pages/_page_status.html.erb +14 -0
- data/app/views/alchemy/admin/pages/_sitemap.html.erb +8 -0
- data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +13 -0
- data/app/views/alchemy/admin/pages/configure.html.erb +16 -0
- data/app/views/alchemy/admin/pages/configure_external.html.erb +33 -0
- data/app/views/alchemy/admin/pages/destroy.js.erb +19 -0
- data/app/views/alchemy/admin/pages/edit.html.erb +206 -0
- data/app/views/alchemy/admin/pages/flush.js.erb +2 -0
- data/app/views/alchemy/admin/pages/fold.js.erb +3 -0
- data/app/views/alchemy/admin/pages/index.html.erb +101 -0
- data/app/views/alchemy/admin/pages/info.html.erb +43 -0
- data/app/views/alchemy/admin/pages/link.html.erb +16 -0
- data/app/views/alchemy/admin/pages/locked.html.erb +3 -0
- data/app/views/alchemy/admin/pages/new.html.erb +26 -0
- data/app/views/alchemy/admin/pages/show.html.erb +1 -0
- data/app/views/alchemy/admin/pages/sort.js.erb +5 -0
- data/app/views/alchemy/admin/pages/unlock.js.erb +8 -0
- data/app/views/alchemy/admin/pages/update.js.erb +37 -0
- data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +1 -0
- data/app/views/alchemy/admin/partials/_flash.html.erb +4 -0
- data/app/views/alchemy/admin/partials/_flash_notices.html.erb +5 -0
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +11 -0
- data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +12 -0
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +33 -0
- data/app/views/alchemy/admin/partials/_routes.html.erb +25 -0
- data/app/views/alchemy/admin/partials/_search_form.html.erb +20 -0
- data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +8 -0
- data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +25 -0
- data/app/views/alchemy/admin/partials/_upload_form.html.erb +67 -0
- data/app/views/alchemy/admin/pictures/_archive.html.erb +53 -0
- data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +14 -0
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +78 -0
- data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +33 -0
- data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +11 -0
- data/app/views/alchemy/admin/pictures/_picture.html.erb +87 -0
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +28 -0
- data/app/views/alchemy/admin/pictures/_tag_list.html.erb +16 -0
- data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +8 -0
- data/app/views/alchemy/admin/pictures/edit.html.erb +13 -0
- data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +30 -0
- data/app/views/alchemy/admin/pictures/flush.js.erb +2 -0
- data/app/views/alchemy/admin/pictures/index.html.erb +109 -0
- data/app/views/alchemy/admin/pictures/index.js.erb +3 -0
- data/app/views/alchemy/admin/pictures/info.html.erb +38 -0
- data/app/views/alchemy/admin/pictures/new.html.erb +16 -0
- data/app/views/alchemy/admin/pictures/show.html.erb +11 -0
- data/app/views/alchemy/admin/resources/_form.html.erb +13 -0
- data/app/views/alchemy/admin/resources/_resource.html.erb +30 -0
- data/app/views/alchemy/admin/resources/_table.html.erb +25 -0
- data/app/views/alchemy/admin/resources/edit.html.erb +1 -0
- data/app/views/alchemy/admin/resources/index.csv.erb +13 -0
- data/app/views/alchemy/admin/resources/index.html.erb +32 -0
- data/app/views/alchemy/admin/resources/new.html.erb +1 -0
- data/app/views/alchemy/admin/sites/index.html.erb +23 -0
- data/app/views/alchemy/admin/tags/_radio_tag.html.erb +6 -0
- data/app/views/alchemy/admin/tags/_tag.html.erb +30 -0
- data/app/views/alchemy/admin/tags/edit.html.erb +24 -0
- data/app/views/alchemy/admin/tags/index.html.erb +52 -0
- data/app/views/alchemy/admin/tags/new.html.erb +7 -0
- data/app/views/alchemy/admin/trash/clear.js.erb +4 -0
- data/app/views/alchemy/admin/trash/index.html.erb +29 -0
- data/app/views/alchemy/attachments/show.html.erb +1 -0
- data/app/views/alchemy/base/500.html.erb +26 -0
- data/app/views/alchemy/base/error_notice.html.erb +1 -0
- data/app/views/alchemy/base/error_notice.js.erb +2 -0
- data/app/views/alchemy/base/permission_denied.js.erb +3 -0
- data/app/views/alchemy/base/redirect.js.erb +12 -0
- data/app/views/alchemy/base/update.js.erb +5 -0
- data/app/views/alchemy/breadcrumb/_page.html.erb +16 -0
- data/app/views/alchemy/breadcrumb/_separator.html.erb +1 -0
- data/app/views/alchemy/breadcrumb/_wrapper.html.erb +13 -0
- data/app/views/alchemy/elements/_editor_not_found.html.erb +5 -0
- data/app/views/alchemy/elements/_view_not_found.html.erb +1 -0
- data/app/views/alchemy/elements/show.html.erb +1 -0
- data/app/views/alchemy/elements/show.js.erb +1 -0
- data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +16 -0
- data/app/views/alchemy/essences/_essence_boolean_view.html.erb +3 -0
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +19 -0
- data/app/views/alchemy/essences/_essence_date_view.html.erb +11 -0
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +57 -0
- data/app/views/alchemy/essences/_essence_file_view.html.erb +10 -0
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +9 -0
- data/app/views/alchemy/essences/_essence_html_view.html.erb +3 -0
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +25 -0
- data/app/views/alchemy/essences/_essence_link_view.html.erb +11 -0
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +59 -0
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +5 -0
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +13 -0
- data/app/views/alchemy/essences/_essence_richtext_view.html.erb +5 -0
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +25 -0
- data/app/views/alchemy/essences/_essence_select_view.html.erb +3 -0
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -0
- data/app/views/alchemy/essences/_essence_text_view.html.erb +18 -0
- data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +61 -0
- data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +19 -0
- data/app/views/alchemy/language_links/_language.html.erb +12 -0
- data/app/views/alchemy/language_links/_spacer.html.erb +1 -0
- data/app/views/alchemy/messages/contact_form_mail.de.text.erb +12 -0
- data/app/views/alchemy/messages/contact_form_mail.en.text.erb +12 -0
- data/app/views/alchemy/messages/contact_form_mail.es.text.erb +12 -0
- data/app/views/alchemy/messages/new.html.erb +1 -0
- data/app/views/alchemy/navigation/_image_link.html.erb +14 -0
- data/app/views/alchemy/navigation/_link.html.erb +20 -0
- data/app/views/alchemy/navigation/_renderer.html.erb +30 -0
- data/app/views/alchemy/pages/show.html.erb +1 -0
- data/app/views/alchemy/pages/show.rss.builder +20 -0
- data/app/views/alchemy/pages/sitemap.xml.erb +6 -0
- data/app/views/kaminari/alchemy/_first_page.html.erb +11 -0
- data/app/views/kaminari/alchemy/_gap.html.erb +8 -0
- data/app/views/kaminari/alchemy/_last_page.html.erb +11 -0
- data/app/views/kaminari/alchemy/_next_page.html.erb +13 -0
- data/app/views/kaminari/alchemy/_page.html.erb +14 -0
- data/app/views/kaminari/alchemy/_paginator.html.erb +23 -0
- data/app/views/kaminari/alchemy/_prev_page.html.erb +13 -0
- data/app/views/layouts/alchemy/admin.html.erb +109 -0
- data/app/views/layouts/alchemy/sitemap.xml.erb +4 -0
- data/bin/alchemy +267 -0
- data/bin/rails +8 -0
- data/config/alchemy/config.yml +189 -0
- data/config/alchemy/modules.yml +88 -0
- data/config/initializers/dragonfly.rb +25 -0
- data/config/initializers/simple_form.rb +144 -0
- data/config/locales/alchemy.de.yml +918 -0
- data/config/locales/alchemy.en.yml +920 -0
- data/config/locales/alchemy.es.yml +958 -0
- data/config/locales/alchemy.fr.yml +942 -0
- data/config/locales/alchemy.nl.yml +921 -0
- data/config/locales/alchemy.ru.yml +837 -0
- data/config/locales/simple_form.de.yml +26 -0
- data/config/locales/simple_form.en.yml +25 -0
- data/config/locales/simple_form.es.yml +6 -0
- data/config/locales/simple_form.fr.yml +26 -0
- data/config/locales/simple_form.nl.yml +25 -0
- data/config/locales/simple_form.ru.yml +25 -0
- data/config/routes.rb +164 -0
- data/db/migrate/20130827094554_alchemy_two_point_six.rb +380 -0
- data/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +5 -0
- data/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +5 -0
- data/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +5 -0
- data/lib/alchemy/auth_accessors.rb +104 -0
- data/lib/alchemy/cache_digests/template_tracker.rb +65 -0
- data/lib/alchemy/config.rb +65 -0
- data/lib/alchemy/configuration_methods.rb +29 -0
- data/lib/alchemy/controller_actions.rb +138 -0
- data/lib/alchemy/engine.rb +104 -0
- data/lib/alchemy/errors.rb +82 -0
- data/lib/alchemy/essence.rb +232 -0
- data/lib/alchemy/filetypes.rb +33 -0
- data/lib/alchemy/forms/builder.rb +23 -0
- data/lib/alchemy/hints.rb +57 -0
- data/lib/alchemy/i18n.rb +70 -0
- data/lib/alchemy/kaminari/scoped_pagination_url_helper.rb +13 -0
- data/lib/alchemy/locale.rb +65 -0
- data/lib/alchemy/logger.rb +15 -0
- data/lib/alchemy/middleware/rescue_old_cookies.rb +27 -0
- data/lib/alchemy/modules.rb +75 -0
- data/lib/alchemy/mount_point.rb +47 -0
- data/lib/alchemy/name_conversions.rb +28 -0
- data/lib/alchemy/on_page_layout.rb +58 -0
- data/lib/alchemy/page_layout.rb +183 -0
- data/lib/alchemy/permissions.rb +221 -0
- data/lib/alchemy/picture_attributes.rb +29 -0
- data/lib/alchemy/resource.rb +238 -0
- data/lib/alchemy/resources_helper.rb +135 -0
- data/lib/alchemy/routing_constraints.rb +49 -0
- data/lib/alchemy/seeder.rb +53 -0
- data/lib/alchemy/shell.rb +102 -0
- data/lib/alchemy/ssl_protection.rb +30 -0
- data/lib/alchemy/tasks/helpers.rb +83 -0
- data/lib/alchemy/test_support/controller_requests.rb +73 -0
- data/lib/alchemy/test_support/essence_shared_examples.rb +286 -0
- data/lib/alchemy/test_support/factories.rb +147 -0
- data/lib/alchemy/test_support/integration_helpers.rb +33 -0
- data/lib/alchemy/tinymce.rb +68 -0
- data/lib/alchemy/touching.rb +41 -0
- data/lib/alchemy/upgrader.rb +80 -0
- data/lib/alchemy/upgrader/three_point_one.rb +54 -0
- data/lib/alchemy/upgrader/three_point_two.rb +69 -0
- data/lib/alchemy/upgrader/three_point_zero.rb +93 -0
- data/lib/alchemy/userstamp.rb +10 -0
- data/lib/alchemy/version.rb +7 -0
- data/lib/alchemy_cms.rb +5 -0
- data/lib/rails/generators/alchemy/base.rb +41 -0
- data/lib/rails/generators/alchemy/elements/elements_generator.rb +37 -0
- data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +14 -0
- data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +13 -0
- data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +12 -0
- data/lib/rails/generators/alchemy/elements/templates/view.html.erb +27 -0
- data/lib/rails/generators/alchemy/elements/templates/view.html.haml +20 -0
- data/lib/rails/generators/alchemy/elements/templates/view.html.slim +20 -0
- data/lib/rails/generators/alchemy/essence/essence_generator.rb +52 -0
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +17 -0
- data/lib/rails/generators/alchemy/essence/templates/view.html.erb +2 -0
- data/lib/rails/generators/alchemy/install/files/_article_editor.html.erb +5 -0
- data/lib/rails/generators/alchemy/install/files/_article_view.html.erb +7 -0
- data/lib/rails/generators/alchemy/install/files/_standard.html.erb +1 -0
- data/lib/rails/generators/alchemy/install/files/alchemy.de.yml +31 -0
- data/lib/rails/generators/alchemy/install/files/alchemy.elements.css.scss +30 -0
- data/lib/rails/generators/alchemy/install/files/alchemy.en.yml +31 -0
- data/lib/rails/generators/alchemy/install/files/alchemy.es.yml +31 -0
- data/lib/rails/generators/alchemy/install/files/application.html.erb +14 -0
- data/lib/rails/generators/alchemy/install/install_generator.rb +69 -0
- data/lib/rails/generators/alchemy/install/templates/elements.yml.tt +21 -0
- data/lib/rails/generators/alchemy/install/templates/page_layouts.yml.tt +10 -0
- data/lib/rails/generators/alchemy/module/module_generator.rb +30 -0
- data/lib/rails/generators/alchemy/module/templates/ability.rb.tt +11 -0
- data/lib/rails/generators/alchemy/module/templates/controller.rb.tt +2 -0
- data/lib/rails/generators/alchemy/module/templates/module_config.rb.tt +17 -0
- data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +24 -0
- data/lib/rails/generators/alchemy/page_layouts/templates/layout.html.erb +1 -0
- data/lib/rails/generators/alchemy/page_layouts/templates/layout.html.haml +1 -0
- data/lib/rails/generators/alchemy/page_layouts/templates/layout.html.slim +1 -0
- data/lib/rails/generators/alchemy/site_layouts/site_layouts_generator.rb +23 -0
- data/lib/rails/generators/alchemy/site_layouts/templates/layout.html.erb +1 -0
- data/lib/rails/generators/alchemy/site_layouts/templates/layout.html.haml +1 -0
- data/lib/rails/generators/alchemy/site_layouts/templates/layout.html.slim +1 -0
- data/lib/rails/generators/alchemy/views/views_generator.rb +41 -0
- data/lib/rails/templates/alchemy.rb +7 -0
- data/lib/tasks/alchemy/convert.rake +39 -0
- data/lib/tasks/alchemy/db.rake +22 -0
- data/lib/tasks/alchemy/install.rake +61 -0
- data/lib/tasks/alchemy/tidy.rake +102 -0
- data/lib/tasks/alchemy/upgrade.rake +28 -0
- data/spec/controllers/admin/attachments_controller_spec.rb +211 -0
- data/spec/controllers/admin/base_controller_spec.rb +74 -0
- data/spec/controllers/admin/clipboard_controller_spec.rb +60 -0
- data/spec/controllers/admin/contents_controller_spec.rb +72 -0
- data/spec/controllers/admin/dashboard_controller_spec.rb +139 -0
- data/spec/controllers/admin/elements_controller_spec.rb +473 -0
- data/spec/controllers/admin/essence_files_controller_spec.rb +71 -0
- data/spec/controllers/admin/essence_pictures_controller_spec.rb +202 -0
- data/spec/controllers/admin/languages_controller_spec.rb +61 -0
- data/spec/controllers/admin/layoutpages_controller_spec.rb +27 -0
- data/spec/controllers/admin/pages_controller_spec.rb +553 -0
- data/spec/controllers/admin/pictures_controller_spec.rb +358 -0
- data/spec/controllers/admin/resources_controller_spec.rb +53 -0
- data/spec/controllers/admin/trash_controller_spec.rb +68 -0
- data/spec/controllers/alchemy/admin/tags_controller_spec.rb +63 -0
- data/spec/controllers/alchemy/api/contents_controller_spec.rb +126 -0
- data/spec/controllers/alchemy/api/elements_controller_spec.rb +125 -0
- data/spec/controllers/alchemy/api/pages_controller_spec.rb +134 -0
- data/spec/controllers/attachments_controller_spec.rb +64 -0
- data/spec/controllers/base_controller_spec.rb +51 -0
- data/spec/controllers/elements_controller_spec.rb +48 -0
- data/spec/controllers/messages_controller_spec.rb +199 -0
- data/spec/controllers/pages_controller_spec.rb +265 -0
- data/spec/controllers/pictures_controller_spec.rb +393 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/admin/events_controller.rb +3 -0
- data/spec/dummy/app/controllers/application_controller.rb +15 -0
- data/spec/dummy/app/controllers/login_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/ability.rb +9 -0
- data/spec/dummy/app/models/dummy_model.rb +3 -0
- data/spec/dummy/app/models/dummy_user.rb +11 -0
- data/spec/dummy/app/models/event.rb +10 -0
- data/spec/dummy/app/models/location.rb +3 -0
- data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_editor.html.erb +11 -0
- data/spec/dummy/app/views/alchemy/elements/_article_editor.html.erb +10 -0
- data/spec/dummy/app/views/alchemy/elements/_article_view.html.erb +25 -0
- data/spec/dummy/app/views/alchemy/elements/_headline_editor.html.erb +1 -0
- data/spec/dummy/app/views/alchemy/elements/_headline_view.html.erb +1 -0
- data/spec/dummy/app/views/alchemy/elements/_news_view.html.erb +11 -0
- data/spec/dummy/app/views/alchemy/page_layouts/_standard.html.erb +14 -0
- data/spec/dummy/app/views/layouts/application.html.erb +17 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/alchemy/cells.yml +5 -0
- data/spec/dummy/config/alchemy/elements.yml +112 -0
- data/spec/dummy/config/alchemy/page_layouts.yml +32 -0
- data/spec/dummy/config/application.rb +32 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +32 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +77 -0
- data/spec/dummy/config/environments/test.rb +43 -0
- data/spec/dummy/config/initializers/alchemy.rb +2 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/routes.rb +12 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/migrate/20121026104128_create_events.rb +20 -0
- data/spec/dummy/db/migrate/20130328101418_create_locations.rb +9 -0
- data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +380 -0
- data/spec/dummy/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +5 -0
- data/spec/dummy/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +5 -0
- data/spec/dummy/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +5 -0
- data/spec/dummy/db/migrate/20131209225243_create_dummy_users.rb +9 -0
- data/spec/dummy/db/migrate/20150122213511_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +31 -0
- data/spec/dummy/db/migrate/20150122213512_add_missing_unique_indices.acts_as_taggable_on_engine.rb +20 -0
- data/spec/dummy/db/migrate/20150122213513_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +15 -0
- data/spec/dummy/db/migrate/20150122213514_add_missing_taggable_index.acts_as_taggable_on_engine.rb +10 -0
- data/spec/dummy/db/migrate/20150412103152_create_dummy_model.rb +7 -0
- data/spec/dummy/db/schema.rb +322 -0
- data/spec/dummy/db/seeds.rb +1 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/features/admin/dashboard_spec.rb +82 -0
- data/spec/features/admin/language_tree_feature_spec.rb +33 -0
- data/spec/features/admin/legacy_page_url_management_spec.rb +62 -0
- data/spec/features/admin/link_overlay_spec.rb +54 -0
- data/spec/features/admin/locale_select_feature_spec.rb +25 -0
- data/spec/features/admin/modules_integration_spec.rb +24 -0
- data/spec/features/admin/navigation_feature_spec.rb +13 -0
- data/spec/features/admin/page_creation_feature_spec.rb +51 -0
- data/spec/features/admin/page_editing_feature_spec.rb +135 -0
- data/spec/features/admin/picture_library_integration_spec.rb +62 -0
- data/spec/features/admin/resources_integration_spec.rb +133 -0
- data/spec/features/admin/site_select_feature_spec.rb +32 -0
- data/spec/features/admin/tinymce_feature_spec.rb +34 -0
- data/spec/features/navigation_spec.rb +9 -0
- data/spec/features/page_feature_spec.rb +287 -0
- data/spec/features/picture_security_spec.rb +35 -0
- data/spec/features/security_spec.rb +24 -0
- data/spec/features/translation_integration_spec.rb +51 -0
- data/spec/fixtures/500x500.png +0 -0
- data/spec/fixtures/80x60.png +0 -0
- data/spec/fixtures/image with spaces.png +0 -0
- data/spec/fixtures/image.png +0 -0
- data/spec/fixtures/image2.PNG +0 -0
- data/spec/fixtures/image3.jpeg +0 -0
- data/spec/helpers/admin/attachments_helper_spec.rb +15 -0
- data/spec/helpers/admin/base_helper_spec.rb +270 -0
- data/spec/helpers/admin/contents_helper_spec.rb +65 -0
- data/spec/helpers/admin/elements_helper_spec.rb +178 -0
- data/spec/helpers/admin/essences_helper_spec.rb +140 -0
- data/spec/helpers/admin/navigation_helper_spec.rb +288 -0
- data/spec/helpers/admin/pages_helper_spec.rb +95 -0
- data/spec/helpers/admin/pictures_helper_spec.rb +29 -0
- data/spec/helpers/admin/tags_helper_spec.rb +113 -0
- data/spec/helpers/base_helper_spec.rb +45 -0
- data/spec/helpers/elements_block_helper_spec.rb +135 -0
- data/spec/helpers/elements_helper_spec.rb +311 -0
- data/spec/helpers/essences_helper_spec.rb +156 -0
- data/spec/helpers/pages_helper_spec.rb +413 -0
- data/spec/helpers/picture_url_helpers_spec.rb +35 -0
- data/spec/helpers/url_helper_spec.rb +174 -0
- data/spec/javascripts/alchemy/dialog_spec.coffee +82 -0
- data/spec/javascripts/alchemy/link_overlay_spec.coffee +25 -0
- data/spec/javascripts/alchemy_integration_spec.coffee +3 -0
- data/spec/javascripts/fixtures/select.html +3 -0
- data/spec/javascripts/helpers/mock-ajax.js +199 -0
- data/spec/javascripts/helpers/test_responses/test_responses.js +1 -0
- data/spec/javascripts/support/jasmine.yml +29 -0
- data/spec/libraries/auth_accessors_spec.rb +40 -0
- data/spec/libraries/config_spec.rb +112 -0
- data/spec/libraries/controller_actions_spec.rb +133 -0
- data/spec/libraries/i18n_spec.rb +30 -0
- data/spec/libraries/kaminari/scoped_pagination_url_helper_spec.rb +30 -0
- data/spec/libraries/modules_spec.rb +67 -0
- data/spec/libraries/mount_point_spec.rb +77 -0
- data/spec/libraries/on_page_layout_spec.rb +112 -0
- data/spec/libraries/page_layout_spec.rb +144 -0
- data/spec/libraries/permissions_spec.rb +261 -0
- data/spec/libraries/resource_spec.rb +371 -0
- data/spec/libraries/resources_helper_spec.rb +144 -0
- data/spec/libraries/shell_spec.rb +125 -0
- data/spec/libraries/template_tracker_spec.rb +94 -0
- data/spec/libraries/tinymce_spec.rb +67 -0
- data/spec/libraries/userstamp_spec.rb +10 -0
- data/spec/mailers/messages_spec.rb +23 -0
- data/spec/models/attachment_spec.rb +227 -0
- data/spec/models/cell_spec.rb +102 -0
- data/spec/models/content_spec.rb +404 -0
- data/spec/models/dummy_model_spec.rb +11 -0
- data/spec/models/element_spec.rb +617 -0
- data/spec/models/element_to_page_spec.rb +14 -0
- data/spec/models/essence_boolean_spec.rb +10 -0
- data/spec/models/essence_date_spec.rb +29 -0
- data/spec/models/essence_file_spec.rb +43 -0
- data/spec/models/essence_html_spec.rb +18 -0
- data/spec/models/essence_link_spec.rb +10 -0
- data/spec/models/essence_picture_spec.rb +183 -0
- data/spec/models/essence_richtext_spec.rb +18 -0
- data/spec/models/essence_select_spec.rb +10 -0
- data/spec/models/essence_text_spec.rb +114 -0
- data/spec/models/language_spec.rb +123 -0
- data/spec/models/legacy_page_url_spec.rb +21 -0
- data/spec/models/message_spec.rb +55 -0
- data/spec/models/page_spec.rb +1896 -0
- data/spec/models/picture_spec.rb +330 -0
- data/spec/models/site_spec.rb +233 -0
- data/spec/models/tag_spec.rb +31 -0
- data/spec/routing/api_routing_spec.rb +150 -0
- data/spec/routing/routing_spec.rb +234 -0
- data/spec/spec_helper.rb +89 -0
- data/spec/support/ci/install_phantomjs +7 -0
- data/spec/support/hint_examples.rb +30 -0
- data/spec/support/rspec-activemodel-mocks_patch.rb +8 -0
- data/spec/support/test_tweaks.rb +31 -0
- data/spec/support/transformation_examples.rb +180 -0
- data/spec/tasks/helpers_spec.rb +219 -0
- data/spec/views/essences/essence_boolean_editor_spec.rb +33 -0
- data/spec/views/essences/essence_boolean_view_spec.rb +25 -0
- data/spec/views/essences/essence_date_view_spec.rb +39 -0
- data/spec/views/essences/essence_file_editor_spec.rb +61 -0
- data/spec/views/essences/essence_file_view_spec.rb +24 -0
- data/spec/views/essences/essence_html_view_spec.rb +22 -0
- data/spec/views/essences/essence_link_view_spec.rb +41 -0
- data/spec/views/essences/essence_picture_view_spec.rb +129 -0
- data/spec/views/essences/essence_richtext_view_spec.rb +32 -0
- data/spec/views/essences/essence_select_view_spec.rb +12 -0
- data/spec/views/essences/essence_text_view_spec.rb +52 -0
- data/vendor/assets/images/Jcrop.gif +0 -0
- data/vendor/assets/javascripts/fileupload/jquery.fileupload-process.js +175 -0
- data/vendor/assets/javascripts/fileupload/jquery.fileupload-validate.js +122 -0
- data/vendor/assets/javascripts/fileupload/jquery.fileupload.js +1467 -0
- data/vendor/assets/javascripts/fileupload/jquery.iframe-transport.js +217 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +22 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.floatThead.min.js +3 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo.min.js +7 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +435 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +296 -0
- data/vendor/assets/javascripts/keymaster.js +296 -0
- data/vendor/assets/javascripts/requestAnimationFrame.js +31 -0
- data/vendor/assets/javascripts/spin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/langs/de.js +200 -0
- data/vendor/assets/javascripts/tinymce/langs/es.js +200 -0
- data/vendor/assets/javascripts/tinymce/langs/fr.js +200 -0
- data/vendor/assets/javascripts/tinymce/langs/nl.js +200 -0
- data/vendor/assets/javascripts/tinymce/langs/ru.js +200 -0
- data/vendor/assets/javascripts/tinymce/license.txt +504 -0
- data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/code/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/link/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -0
- data/vendor/assets/javascripts/tinymce/tinymce.min.js +13 -0
- data/vendor/assets/stylesheets/jquery.Jcrop.min.css +28 -0
- metadata +1453 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module Admin
|
|
3
|
+
module ContentsHelper
|
|
4
|
+
include Alchemy::Admin::BaseHelper
|
|
5
|
+
|
|
6
|
+
# Renders the name of elements content.
|
|
7
|
+
#
|
|
8
|
+
# Displays a warning icon if content is missing its description.
|
|
9
|
+
#
|
|
10
|
+
# Displays a mandatory field indicator, if the content has validations.
|
|
11
|
+
#
|
|
12
|
+
def render_content_name(content)
|
|
13
|
+
if content.blank?
|
|
14
|
+
warning('Content is nil')
|
|
15
|
+
return
|
|
16
|
+
else
|
|
17
|
+
content_name = content.name_for_label
|
|
18
|
+
end
|
|
19
|
+
if content.description.blank?
|
|
20
|
+
warning("Content #{content.name} is missing its description")
|
|
21
|
+
title = _t(:content_description_missing)
|
|
22
|
+
content_name = %(<span class="warning icon" title="#{title}"></span> #{content_name}).html_safe
|
|
23
|
+
end
|
|
24
|
+
if content.has_validations?
|
|
25
|
+
"#{content_name}<span class='validation_indicator'>*</span>".html_safe
|
|
26
|
+
else
|
|
27
|
+
content_name
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Renders a link to show the new content overlay that lets you add additional contents.
|
|
32
|
+
#
|
|
33
|
+
# See +render_create_content_link+ helper for examples on how to define additional contents.
|
|
34
|
+
#
|
|
35
|
+
def render_new_content_link(element)
|
|
36
|
+
link_to_dialog(
|
|
37
|
+
"#{render_icon(:create)} #{_t('add new content')}".html_safe,
|
|
38
|
+
alchemy.new_admin_element_content_path(element),
|
|
39
|
+
{
|
|
40
|
+
size: '310x115',
|
|
41
|
+
title: _t('Select an content'),
|
|
42
|
+
overflow: true
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "add_content_for_element_#{element.id}",
|
|
46
|
+
class: 'button with_icon new_content_link'
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Renders a link that dynamically adds an additional content into your element editor view.
|
|
52
|
+
#
|
|
53
|
+
# NOTE: You have to define additional contents in your elements.yml file first.
|
|
54
|
+
#
|
|
55
|
+
# ==== Example:
|
|
56
|
+
#
|
|
57
|
+
# # config/alchemy/elements.yml
|
|
58
|
+
# - name: downloads:
|
|
59
|
+
# contents:
|
|
60
|
+
# - name: file
|
|
61
|
+
# type: EssenceFile
|
|
62
|
+
# additional_contents:
|
|
63
|
+
# - name: file
|
|
64
|
+
# type: EssenceFile
|
|
65
|
+
#
|
|
66
|
+
# Then add this helper into the elements editor view partial:
|
|
67
|
+
#
|
|
68
|
+
# <%= render_create_content_link(element, 'file') %>
|
|
69
|
+
#
|
|
70
|
+
# Optionally you can pass a label:
|
|
71
|
+
#
|
|
72
|
+
# <%= render_create_content_link(element, 'file', label: 'Add a file') %>
|
|
73
|
+
#
|
|
74
|
+
def render_create_content_link(element, content_name, options = {}, options_for_content = {})
|
|
75
|
+
defaults = {
|
|
76
|
+
label: _t('Add %{name}', name: _t(content_name, scope: :content_names))
|
|
77
|
+
}
|
|
78
|
+
options = defaults.merge(options)
|
|
79
|
+
link_to(render_icon(:create) + options[:label], alchemy.admin_contents_path(
|
|
80
|
+
content: {
|
|
81
|
+
name: content_name,
|
|
82
|
+
element_id: element.id
|
|
83
|
+
},
|
|
84
|
+
options: options_for_content.to_json
|
|
85
|
+
),
|
|
86
|
+
method: :post,
|
|
87
|
+
remote: true,
|
|
88
|
+
id: "add_content_for_element_#{element.id}",
|
|
89
|
+
class: 'button with_icon new_content_link'
|
|
90
|
+
)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Renders a link for removing that content
|
|
94
|
+
def delete_content_link(content)
|
|
95
|
+
link_to_confirm_dialog(
|
|
96
|
+
render_icon('delete-small'),
|
|
97
|
+
_t('Do you really want to delete this content?'),
|
|
98
|
+
alchemy.admin_content_path(content),
|
|
99
|
+
class: 'icon_button small',
|
|
100
|
+
title: _t('Remove this content')
|
|
101
|
+
) if content.settings[:deletable]
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Renders the label and a remove link for a content.
|
|
105
|
+
def label_and_remove_link(content)
|
|
106
|
+
content_tag :label do
|
|
107
|
+
[render_hint_for(content), render_content_name(content), delete_content_link(content)].compact.join(' ').html_safe
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module Admin
|
|
3
|
+
module ElementsHelper
|
|
4
|
+
|
|
5
|
+
include Alchemy::ElementsHelper
|
|
6
|
+
include Alchemy::ElementsBlockHelper
|
|
7
|
+
include Alchemy::Admin::BaseHelper
|
|
8
|
+
include Alchemy::Admin::ContentsHelper
|
|
9
|
+
include Alchemy::Admin::EssencesHelper
|
|
10
|
+
|
|
11
|
+
# Renders the element editor partial
|
|
12
|
+
def render_editor(element)
|
|
13
|
+
render_element(element, :editor)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Renders a drag'n'drop picture gallery editor for all EssencePictures.
|
|
17
|
+
#
|
|
18
|
+
# It brings full functionality for adding images, deleting images and sorting them via drag'n'drop.
|
|
19
|
+
# Just place this helper inside your element editor view, pass the element as parameter and that's it.
|
|
20
|
+
#
|
|
21
|
+
# === Options:
|
|
22
|
+
#
|
|
23
|
+
# :maximum_amount_of_images [Integer] # This option let you handle the amount of images your customer can add to this element.
|
|
24
|
+
#
|
|
25
|
+
def render_picture_gallery_editor(element, options={})
|
|
26
|
+
default_options = {
|
|
27
|
+
:maximum_amount_of_images => nil,
|
|
28
|
+
:grouped => true
|
|
29
|
+
}
|
|
30
|
+
options = default_options.merge(options)
|
|
31
|
+
render(
|
|
32
|
+
:partial => "alchemy/admin/elements/picture_gallery_editor",
|
|
33
|
+
:locals => {
|
|
34
|
+
:pictures => element.contents.gallery_pictures,
|
|
35
|
+
:element => element,
|
|
36
|
+
:options => options
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
alias_method :render_picture_editor, :render_picture_gallery_editor
|
|
41
|
+
|
|
42
|
+
# Returns an elements array for select helper.
|
|
43
|
+
#
|
|
44
|
+
# @param [Array] elements descriptions
|
|
45
|
+
# @return [Array]
|
|
46
|
+
#
|
|
47
|
+
def elements_for_select(elements)
|
|
48
|
+
return [] if elements.nil?
|
|
49
|
+
elements.collect do |e|
|
|
50
|
+
[
|
|
51
|
+
Element.display_name_for(e['name']),
|
|
52
|
+
e['name']
|
|
53
|
+
]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Returns all elements that can be placed on the current page.
|
|
58
|
+
# The elements will be grouped by cell.
|
|
59
|
+
#
|
|
60
|
+
# @param [Array] elements
|
|
61
|
+
# collection of element objects
|
|
62
|
+
# @param [String] object_method
|
|
63
|
+
# method that is called on the element objects used for the select option value
|
|
64
|
+
#
|
|
65
|
+
def grouped_elements_for_select(elements, object_method = 'name')
|
|
66
|
+
return [] if elements.blank?
|
|
67
|
+
cells_definition = @page.cell_definitions
|
|
68
|
+
return [] if cells_definition.blank?
|
|
69
|
+
options = {}
|
|
70
|
+
cells_definition.each do |cell|
|
|
71
|
+
cell_elements = elements_for_cell(elements, cell)
|
|
72
|
+
optgroup_label = Cell.translated_label_for(cell['name'])
|
|
73
|
+
options[optgroup_label] = cell_elements.map do |e|
|
|
74
|
+
element_array_for_options(e, object_method, cell)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
options[_t(:main_content)] = elements_for_main_content(elements).map do |e|
|
|
78
|
+
element_array_for_options(e, object_method)
|
|
79
|
+
end
|
|
80
|
+
options.delete_if { |_cell, elements| elements.blank? } # Throw out empty cells
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def element_array_for_options(e, object_method, cell = nil)
|
|
84
|
+
if e.class.name == 'Alchemy::Element'
|
|
85
|
+
[
|
|
86
|
+
e.display_name_with_preview_text,
|
|
87
|
+
e.send(object_method).to_s + (cell ? "##{cell['name']}" : "")
|
|
88
|
+
]
|
|
89
|
+
else
|
|
90
|
+
[
|
|
91
|
+
Element.display_name_for(e['name']),
|
|
92
|
+
e[object_method] + (cell ? "##{cell['name']}" : "")
|
|
93
|
+
]
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# This helper loads all elements from page that have EssenceSelects in them.
|
|
98
|
+
#
|
|
99
|
+
# It returns a javascript function that replaces all editor partials of this elements.
|
|
100
|
+
#
|
|
101
|
+
# We need this while updating, creating or trashing an element,
|
|
102
|
+
# because another element on the same page could have a element selector in it.
|
|
103
|
+
#
|
|
104
|
+
# In cases like this one wants Ember.js databinding!
|
|
105
|
+
#
|
|
106
|
+
def update_essence_select_elements(page, element)
|
|
107
|
+
elements = page.elements.not_trashed.joins(:contents)
|
|
108
|
+
.where(["#{Content.table_name}.element_id != ?", element.id])
|
|
109
|
+
.where(Content.table_name => {essence_type: "Alchemy::EssenceSelect"})
|
|
110
|
+
return if elements.blank?
|
|
111
|
+
elements.collect do |element|
|
|
112
|
+
render 'alchemy/admin/elements/refresh_editor', element: element
|
|
113
|
+
end.join.html_safe
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
private
|
|
117
|
+
|
|
118
|
+
def elements_for_main_content(elements)
|
|
119
|
+
page_definition = @page.definition['elements']
|
|
120
|
+
elements.select do |e|
|
|
121
|
+
page_definition.include?(e.class.name == 'Element' ? e.name : e['name'])
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def elements_for_cell(elements, cell)
|
|
126
|
+
cell_elements = cell['elements']
|
|
127
|
+
elements.select do |e|
|
|
128
|
+
cell_elements.include?(e.class.name == 'Element' ? e.name : e['name'])
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module Admin
|
|
3
|
+
module EssencesHelper
|
|
4
|
+
|
|
5
|
+
include Alchemy::EssencesHelper
|
|
6
|
+
include Alchemy::Admin::ContentsHelper
|
|
7
|
+
|
|
8
|
+
# Renders the Content editor partial from the given Content.
|
|
9
|
+
# For options see -> render_essence
|
|
10
|
+
def render_essence_editor(content, options = {}, html_options = {})
|
|
11
|
+
render_essence(content, :editor, {for_editor: options}, html_options)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Renders the Content editor partial found in views/contents/ for the content with name inside the passed Element.
|
|
15
|
+
# For options see -> render_essence
|
|
16
|
+
#
|
|
17
|
+
# Content creation on the fly:
|
|
18
|
+
#
|
|
19
|
+
# If you update the elements.yml file after creating an element this helper displays a error message with an option to create the content.
|
|
20
|
+
#
|
|
21
|
+
def render_essence_editor_by_name(element, name, options = {}, html_options = {})
|
|
22
|
+
if element.blank?
|
|
23
|
+
return warning('Element is nil', _t(:no_element_given))
|
|
24
|
+
end
|
|
25
|
+
content = element.content_by_name(name)
|
|
26
|
+
if content.nil?
|
|
27
|
+
render_missing_content(element, name, options)
|
|
28
|
+
else
|
|
29
|
+
render_essence_editor(content, options, html_options)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Returns all public pages from current language as an option tags string suitable or the Rails +select_tag+ helper.
|
|
34
|
+
#
|
|
35
|
+
# @param [Array]
|
|
36
|
+
# A collection of pages so it only returns these pages and does not query the database.
|
|
37
|
+
# @param [String]
|
|
38
|
+
# Pass a +Page#name+ or +Page#id+ as selected item to the +options_for_select+ helper.
|
|
39
|
+
# @param [String]
|
|
40
|
+
# Used as prompt message in the select tag
|
|
41
|
+
# @param [Symbol]
|
|
42
|
+
# Method that is called on the page object to get the value that is passed with the params of the form.
|
|
43
|
+
#
|
|
44
|
+
def pages_for_select(pages = nil, selected = nil, prompt = "Choose page", page_attribute = :id)
|
|
45
|
+
values = [[_t(prompt), ""]]
|
|
46
|
+
pages ||= begin
|
|
47
|
+
nested = true
|
|
48
|
+
Language.current.pages.published.order(:lft)
|
|
49
|
+
end
|
|
50
|
+
values += pages_attributes_for_select(pages, page_attribute, nested)
|
|
51
|
+
options_for_select(values, selected.to_s)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Renders the missing content partial
|
|
55
|
+
#
|
|
56
|
+
def render_missing_content(element, name, options)
|
|
57
|
+
render 'alchemy/admin/contents/missing', {element: element, name: name, options: options}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def essence_picture_thumbnail(content, options)
|
|
61
|
+
return if content.ingredient.blank?
|
|
62
|
+
crop = !(content.essence.crop_size.blank? && content.essence.crop_from.blank?) ||
|
|
63
|
+
(content_settings_value(content, :crop, options) == true || content_settings_value(content, :crop, options) == "true")
|
|
64
|
+
image_options = {
|
|
65
|
+
size: content.essence.thumbnail_size(content.essence.render_size.blank? ? content_settings_value(content, :size, options) : content.essence.render_size, crop),
|
|
66
|
+
crop_from: content.essence.crop_from.blank? ? nil : content.essence.crop_from,
|
|
67
|
+
crop_size: content.essence.crop_size.blank? ? nil : content.essence.crop_size,
|
|
68
|
+
crop: crop ? 'crop' : nil,
|
|
69
|
+
upsample: content_settings_value(content, :upsample, options)
|
|
70
|
+
}
|
|
71
|
+
image_tag(
|
|
72
|
+
alchemy.thumbnail_path({
|
|
73
|
+
id: content.ingredient.id,
|
|
74
|
+
name: content.ingredient.urlname,
|
|
75
|
+
sh: content.ingredient.security_token(image_options)
|
|
76
|
+
}.merge(image_options)),
|
|
77
|
+
alt: content.ingredient.name,
|
|
78
|
+
class: 'img_paddingtop',
|
|
79
|
+
title: _t(:image_name) + ": #{content.ingredient.name}"
|
|
80
|
+
)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
# Returns an Array with page attributes for select options
|
|
86
|
+
#
|
|
87
|
+
# @param [Array]
|
|
88
|
+
# The pages
|
|
89
|
+
# @param [String || Symbol]
|
|
90
|
+
# The attribute that is used as value
|
|
91
|
+
# @param [Boolean] (false)
|
|
92
|
+
# Should the name be indented or not
|
|
93
|
+
#
|
|
94
|
+
def pages_attributes_for_select(pages, page_attribute, indent = false)
|
|
95
|
+
pages.map do |page|
|
|
96
|
+
[
|
|
97
|
+
page_name_attribute_for_select(page, indent),
|
|
98
|
+
page.send(page_attribute).to_s
|
|
99
|
+
]
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Returns the page name for pages_for_select helper
|
|
104
|
+
#
|
|
105
|
+
# @param [Alchemy::Page]
|
|
106
|
+
# The page
|
|
107
|
+
# @param [Boolean] (false)
|
|
108
|
+
# Should the page be indented or not
|
|
109
|
+
#
|
|
110
|
+
def page_name_attribute_for_select(page, indent = false)
|
|
111
|
+
if indent
|
|
112
|
+
(" " * (page.level - 1) + page.name).html_safe
|
|
113
|
+
else
|
|
114
|
+
page.name
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module Admin
|
|
3
|
+
module FormHelper
|
|
4
|
+
|
|
5
|
+
# Use this form helper to render any form in Alchemy admin interface.
|
|
6
|
+
#
|
|
7
|
+
# This is simply a wrapper for `simple_form_for`
|
|
8
|
+
#
|
|
9
|
+
# == Defaults
|
|
10
|
+
#
|
|
11
|
+
# * It uses Alchemy::Forms::Builder as builder
|
|
12
|
+
# * It makes a remote request, if the request was XHR request.
|
|
13
|
+
# * It adds the alchemy class to form
|
|
14
|
+
#
|
|
15
|
+
def alchemy_form_for(object, *args, &block)
|
|
16
|
+
options = args.extract_options!
|
|
17
|
+
options.merge!({
|
|
18
|
+
builder: Alchemy::Forms::Builder,
|
|
19
|
+
remote: request.xhr?,
|
|
20
|
+
html: {
|
|
21
|
+
id: options.delete(:id),
|
|
22
|
+
class: ["alchemy", options.delete(:class)].compact.join(' ')
|
|
23
|
+
}
|
|
24
|
+
})
|
|
25
|
+
simple_form_for(object, *(args << options), &block)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module Admin
|
|
3
|
+
|
|
4
|
+
# This module contains helper methods for rendering the admin navigation.
|
|
5
|
+
#
|
|
6
|
+
module NavigationHelper
|
|
7
|
+
|
|
8
|
+
# Renders one admin main navigation entry
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] alchemy_module
|
|
11
|
+
# The Hash representing a Alchemy module
|
|
12
|
+
#
|
|
13
|
+
def alchemy_main_navigation_entry(alchemy_module)
|
|
14
|
+
render(
|
|
15
|
+
'alchemy/admin/partials/main_navigation_entry',
|
|
16
|
+
alchemy_module: alchemy_module.stringify_keys,
|
|
17
|
+
navigation: module_main_navigation(alchemy_module)
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Renders the subnavigation from current module
|
|
22
|
+
#
|
|
23
|
+
# We find the module from current controller and index action.
|
|
24
|
+
#
|
|
25
|
+
def admin_subnavigation
|
|
26
|
+
if current_alchemy_module.present?
|
|
27
|
+
render(
|
|
28
|
+
'alchemy/admin/partials/sub_navigation',
|
|
29
|
+
entries: current_sub_navigation
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Used for checking the main navi permissions
|
|
35
|
+
#
|
|
36
|
+
# To let your module be navigatable by the user you have to provide an Ability for it.
|
|
37
|
+
#
|
|
38
|
+
# === Example:
|
|
39
|
+
#
|
|
40
|
+
# # module.yml
|
|
41
|
+
# name: 'my_module'
|
|
42
|
+
# navigation: {
|
|
43
|
+
# controller: 'my/admin/posts'
|
|
44
|
+
# action: 'index'
|
|
45
|
+
# }
|
|
46
|
+
#
|
|
47
|
+
# # ability.rb
|
|
48
|
+
# can :index, :my_admin_posts
|
|
49
|
+
#
|
|
50
|
+
def navigate_module(navigation)
|
|
51
|
+
navigation.stringify_keys!
|
|
52
|
+
[
|
|
53
|
+
navigation['action'].to_sym,
|
|
54
|
+
navigation['controller'].to_s.gsub(/\A\//, '').gsub(/\//, '_').to_sym
|
|
55
|
+
]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# CSS classes for main navigation entry.
|
|
59
|
+
#
|
|
60
|
+
def main_navigation_css_classes(navigation)
|
|
61
|
+
[
|
|
62
|
+
'main_navi_entry',
|
|
63
|
+
admin_mainnavi_active?(navigation) ? 'active' : nil
|
|
64
|
+
].compact.join(' ')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns true if given navi entry is in params controller and action
|
|
68
|
+
#
|
|
69
|
+
# == Example
|
|
70
|
+
# <%= entry_active?({controller: 'admin/users', action: 'index'}) %>
|
|
71
|
+
#
|
|
72
|
+
# @param [Hash]
|
|
73
|
+
# A Alchemy module definition navigation entry
|
|
74
|
+
#
|
|
75
|
+
def entry_active?(entry)
|
|
76
|
+
is_entry_controller_active?(entry) && is_entry_action_active?(entry)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Returns url for given Alchemy module.
|
|
80
|
+
#
|
|
81
|
+
# If the module is inside an engine it calls the +url_for+ helper on the engines routing proxy.
|
|
82
|
+
#
|
|
83
|
+
# If the module is inside the host rails app it calls the +url_for+ helper on the main_app routing proxy.
|
|
84
|
+
#
|
|
85
|
+
# @param [Hash]
|
|
86
|
+
# A Alchemy module definition
|
|
87
|
+
#
|
|
88
|
+
def url_for_module(alchemy_module)
|
|
89
|
+
route_from_engine_or_main_app(
|
|
90
|
+
alchemy_module['engine_name'],
|
|
91
|
+
url_options_for_module(alchemy_module)
|
|
92
|
+
)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Returns url for given Alchemy module sub navigation entry.
|
|
96
|
+
#
|
|
97
|
+
# If the module is inside an engine it calls the +url_for+ helper on the engines routing proxy.
|
|
98
|
+
#
|
|
99
|
+
# If the module is inside the host rails app it calls the +url_for+ helper on the main_app routing proxy.
|
|
100
|
+
#
|
|
101
|
+
# @param [Hash]
|
|
102
|
+
# A Alchemy module sub navigation definition
|
|
103
|
+
#
|
|
104
|
+
def url_for_module_sub_navigation(navigation)
|
|
105
|
+
alchemy_module = module_definition_for(navigation)
|
|
106
|
+
return if alchemy_module.nil?
|
|
107
|
+
route_from_engine_or_main_app(
|
|
108
|
+
alchemy_module['engine_name'],
|
|
109
|
+
url_options_for_navigation_entry(navigation)
|
|
110
|
+
)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Alchemy modules for main navigation.
|
|
114
|
+
#
|
|
115
|
+
# Sorted by position attribute, if given.
|
|
116
|
+
#
|
|
117
|
+
def sorted_alchemy_modules
|
|
118
|
+
sorted = []
|
|
119
|
+
not_sorted = []
|
|
120
|
+
alchemy_modules.map do |m|
|
|
121
|
+
if m['position'].blank?
|
|
122
|
+
not_sorted << m
|
|
123
|
+
else
|
|
124
|
+
sorted << m
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
sorted.sort_by { |m| m['position'] } + not_sorted
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
private
|
|
131
|
+
|
|
132
|
+
# Calls +url_for+ helper on engine if present or on host app.
|
|
133
|
+
#
|
|
134
|
+
# @param [String]
|
|
135
|
+
# A name of an engine
|
|
136
|
+
# @param [Hash]
|
|
137
|
+
# url options hash passed to +url_for+ helper
|
|
138
|
+
#
|
|
139
|
+
def route_from_engine_or_main_app(engine_name, url_options)
|
|
140
|
+
if engine_name.present?
|
|
141
|
+
eval(engine_name).url_for(url_options)
|
|
142
|
+
else
|
|
143
|
+
main_app.url_for(url_options)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Returns a url options hash for given Alchemy module.
|
|
148
|
+
#
|
|
149
|
+
# @param [Hash]
|
|
150
|
+
# A Alchemy module definition
|
|
151
|
+
#
|
|
152
|
+
def url_options_for_module(alchemy_module)
|
|
153
|
+
url_options_for_navigation_entry(module_main_navigation(alchemy_module))
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Returns a url options hash for given navigation entry.
|
|
157
|
+
#
|
|
158
|
+
# @param [Hash]
|
|
159
|
+
# A Alchemy module navigation entry
|
|
160
|
+
#
|
|
161
|
+
def url_options_for_navigation_entry(entry)
|
|
162
|
+
entry.stringify_keys!
|
|
163
|
+
{
|
|
164
|
+
controller: entry['controller'],
|
|
165
|
+
action: entry['action'],
|
|
166
|
+
only_path: true,
|
|
167
|
+
params: entry['params']
|
|
168
|
+
}.delete_if { |_k, v| v.nil? }
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Retrieves the current Alchemy module from controller and index action.
|
|
172
|
+
#
|
|
173
|
+
def current_alchemy_module
|
|
174
|
+
module_definition_for(controller: params[:controller], action: 'index')
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Returns the sub navigation for current Alchemy module.
|
|
178
|
+
#
|
|
179
|
+
def current_sub_navigation
|
|
180
|
+
module_sub_navigation(module_main_navigation(current_alchemy_module))
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Returns navigation entries from given module.
|
|
184
|
+
#
|
|
185
|
+
def module_main_navigation(alchemy_module)
|
|
186
|
+
alchemy_module.fetch('navigation', {}).stringify_keys
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Returns sub navigation entries from given module.
|
|
190
|
+
#
|
|
191
|
+
def module_sub_navigation(alchemy_module)
|
|
192
|
+
alchemy_module.fetch('sub_navigation', []).map(&:stringify_keys)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# Returns nested navigation entries for given module.
|
|
196
|
+
#
|
|
197
|
+
def module_nested_navigation(alchemy_module)
|
|
198
|
+
alchemy_module.fetch('nested', []).map(&:stringify_keys)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Returns true if the current controller and action is in a modules navigation definition.
|
|
202
|
+
#
|
|
203
|
+
def admin_mainnavi_active?(main_navigation)
|
|
204
|
+
main_navigation.stringify_keys!
|
|
205
|
+
# Has the given navigation entry a active sub navigation?
|
|
206
|
+
has_active_entry?(module_sub_navigation(main_navigation)) or
|
|
207
|
+
# Has the given navigation entry a active nested navigation?
|
|
208
|
+
has_active_entry?(module_nested_navigation(main_navigation)) or
|
|
209
|
+
# Is the navigation entry active?
|
|
210
|
+
entry_active?(main_navigation)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Returns true if the given entry's controller is current controller
|
|
214
|
+
#
|
|
215
|
+
def is_entry_controller_active?(entry)
|
|
216
|
+
entry['controller'].gsub(/\A\//, '') == params[:controller]
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Returns true if the given entry's action is current controllers action
|
|
220
|
+
#
|
|
221
|
+
# Also checks if given entry has a +nested_actions+ key, if so it checks if one of them is current controller's action
|
|
222
|
+
#
|
|
223
|
+
def is_entry_action_active?(entry)
|
|
224
|
+
entry['action'] == params[:action] || entry['nested_actions'].to_a.include?(params[:action])
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Returns true if an entry of given entries is active.
|
|
228
|
+
#
|
|
229
|
+
# @param [Array]
|
|
230
|
+
# Alchemy module navigation entries.
|
|
231
|
+
#
|
|
232
|
+
def has_active_entry?(entries)
|
|
233
|
+
!entries.detect { |entry| entry_active?(entry) }.nil?
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|