alchemy_cms 2.1.beta1 → 2.1.beta5
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.
- data/.gitignore +2 -1
- data/.rspec +2 -2
- data/.travis.yml +2 -1
- data/Gemfile +8 -9
- data/README.md +10 -10
- data/Rakefile +0 -1
- data/alchemy_cms.gemspec +7 -9
- data/app/assets/images/alchemy/icons.png +0 -0
- data/app/assets/javascripts/alchemy/alchemy.base.js +8 -2
- data/app/assets/javascripts/alchemy/{alchemy.dragndrop.js → alchemy.dragndrop.js.erb} +3 -3
- data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +1 -1
- data/app/assets/javascripts/alchemy/alchemy.growler.js +3 -3
- data/app/assets/javascripts/alchemy/alchemy.js +10 -15
- data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +6 -2
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +1 -1
- data/app/assets/javascripts/alchemy/alchemy.preview.js +1 -1
- data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +38 -0
- data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +360 -0
- data/app/assets/javascripts/alchemy/alchemy.windows.js +32 -17
- data/app/assets/javascripts/alchemy/preview.js +1 -0
- data/{vendor → app}/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +0 -0
- data/{vendor → app}/assets/javascripts/tiny_mce/plugins/alchemy_link/langs/de.js +0 -0
- data/{vendor → app}/assets/javascripts/tiny_mce/plugins/alchemy_link/langs/en.js +0 -0
- data/{vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.erb → app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss} +15 -33
- data/app/assets/stylesheets/alchemy/_defaults.scss +4 -16
- data/app/assets/stylesheets/alchemy/alchemy.css +2 -2
- data/app/assets/stylesheets/alchemy/base.css.scss +161 -205
- data/app/assets/stylesheets/alchemy/elements.css.scss +15 -8
- data/app/assets/stylesheets/alchemy/{jquery-ui.alchemy.css → jquery-ui.alchemy.css.scss} +41 -45
- data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +14 -10
- data/app/assets/stylesheets/alchemy/{tinymce_content.css → tinymce_content.css.scss} +7 -6
- data/app/assets/stylesheets/alchemy/{tinymce_dialog.css → tinymce_dialog.css.scss} +7 -7
- data/app/controllers/alchemy/admin/attachments_controller.rb +131 -0
- data/app/controllers/alchemy/admin/base_controller.rb +118 -0
- data/app/controllers/alchemy/admin/clipboard_controller.rb +46 -0
- data/app/controllers/alchemy/admin/contents_controller.rb +55 -0
- data/app/controllers/alchemy/admin/dashboard_controller.rb +15 -0
- data/app/controllers/alchemy/admin/elements_controller.rb +123 -0
- data/app/controllers/alchemy/admin/essence_audios_controller.rb +12 -0
- data/app/controllers/alchemy/admin/essence_files_controller.rb +27 -0
- data/app/controllers/alchemy/admin/essence_flashes_controller.rb +12 -0
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +91 -0
- data/app/controllers/alchemy/admin/essence_videos_controller.rb +12 -0
- data/app/controllers/alchemy/admin/languages_controller.rb +7 -0
- data/app/controllers/alchemy/admin/layoutpages_controller.rb +13 -0
- data/app/controllers/alchemy/admin/pages_controller.rb +253 -0
- data/app/controllers/alchemy/admin/pictures_controller.rb +139 -0
- data/app/controllers/alchemy/admin/resources_controller.rb +132 -0
- data/app/controllers/alchemy/admin/trash_controller.rb +24 -0
- data/app/controllers/alchemy/admin/users_controller.rb +81 -0
- data/app/controllers/alchemy/attachments_controller.rb +30 -0
- data/app/controllers/alchemy/base_controller.rb +137 -0
- data/app/controllers/alchemy/elements_controller.rb +18 -0
- data/app/controllers/alchemy/messages_controller.rb +115 -0
- data/app/controllers/alchemy/pages_controller.rb +169 -0
- data/app/controllers/alchemy/pictures_controller.rb +62 -0
- data/app/controllers/alchemy/user_sessions_controller.rb +80 -0
- data/app/helpers/alchemy/admin/attachments_helper.rb +11 -0
- data/app/helpers/alchemy/admin/base_helper.rb +423 -0
- data/app/helpers/alchemy/admin/contents_helper.rb +75 -0
- data/app/helpers/alchemy/admin/elements_helper.rb +118 -0
- data/app/helpers/alchemy/admin/essences_helper.rb +78 -0
- data/app/helpers/alchemy/admin/pages_helper.rb +46 -0
- data/app/helpers/alchemy/admin/pictures_helper.rb +30 -0
- data/app/helpers/alchemy/base_helper.rb +65 -0
- data/app/helpers/alchemy/elements_helper.rb +173 -0
- data/app/helpers/alchemy/essences_helper.rb +101 -0
- data/app/helpers/alchemy/pages_helper.rb +550 -0
- data/app/mailers/alchemy/messages.rb +17 -0
- data/app/mailers/alchemy/notifications.rb +25 -0
- data/app/models/alchemy.rb +7 -0
- data/app/models/alchemy/attachment.rb +82 -0
- data/app/models/alchemy/cell.rb +61 -0
- data/app/models/alchemy/content.rb +163 -0
- data/app/models/alchemy/element.rb +479 -0
- data/app/models/alchemy/essence_audio.rb +19 -0
- data/app/models/alchemy/essence_date.rb +22 -0
- data/app/models/alchemy/essence_file.rb +19 -0
- data/app/models/alchemy/essence_flash.rb +17 -0
- data/app/models/alchemy/essence_html.rb +21 -0
- data/app/models/alchemy/essence_picture.rb +29 -0
- data/app/models/alchemy/essence_richtext.rb +63 -0
- data/app/models/alchemy/essence_text.rb +40 -0
- data/app/models/alchemy/essence_video.rb +19 -0
- data/app/models/alchemy/folded_page.rb +5 -0
- data/app/models/alchemy/language.rb +90 -0
- data/app/models/alchemy/message.rb +71 -0
- data/app/models/alchemy/page.rb +548 -0
- data/app/models/alchemy/picture.rb +100 -0
- data/app/models/alchemy/user.rb +72 -0
- data/app/models/alchemy/user_session.rb +12 -0
- data/app/sweepers/alchemy/content_sweeper.rb +22 -0
- data/app/sweepers/alchemy/pages_sweeper.rb +49 -0
- data/app/sweepers/alchemy/pictures_sweeper.rb +23 -0
- data/app/views/{admin → alchemy/admin}/attachments/_archive_overlay.html.erb +6 -6
- data/app/views/{admin → alchemy/admin}/attachments/_attachment.html.erb +14 -14
- data/app/views/{admin → alchemy/admin}/attachments/_file_to_assign.html.erb +0 -0
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +25 -0
- data/app/views/{admin → alchemy/admin}/attachments/create.js.erb +0 -0
- data/app/views/{admin → alchemy/admin}/attachments/destroy.js.erb +0 -0
- data/app/views/{admin → alchemy/admin}/attachments/edit.html.erb +2 -2
- data/app/views/alchemy/admin/attachments/index.html.erb +18 -0
- data/app/views/{admin → alchemy/admin}/attachments/new.html.erb +3 -3
- data/app/views/{admin → alchemy/admin}/clipboard/clear.js.erb +1 -1
- data/app/views/alchemy/admin/clipboard/index.html.erb +19 -0
- data/app/views/alchemy/admin/clipboard/insert.js.erb +14 -0
- data/app/views/alchemy/admin/clipboard/remove.js.erb +10 -0
- data/app/views/{admin → alchemy/admin}/contents/_missing.html.erb +4 -4
- data/app/views/{admin → alchemy/admin}/contents/create.js.erb +10 -10
- data/app/views/{admin → alchemy/admin}/contents/destroy.js.erb +0 -0
- data/app/views/{admin → alchemy/admin}/contents/new.html.erb +1 -1
- data/app/views/{admin → alchemy/admin}/contents/order.js.erb +0 -0
- data/app/views/alchemy/admin/dashboard/index.html.erb +96 -0
- data/app/views/{admin → alchemy/admin}/elements/_add_content.html.erb +2 -2
- data/app/views/{admin → alchemy/admin}/elements/_element.html.erb +3 -3
- data/app/views/{admin → alchemy/admin}/elements/_element_foot.html.erb +8 -8
- data/app/views/{admin → alchemy/admin}/elements/_element_head.html.erb +4 -4
- data/app/views/{admin → alchemy/admin}/elements/_elements_select.html.erb +2 -2
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +30 -0
- data/app/views/{admin → alchemy/admin}/elements/_picture_editor.html.erb +3 -3
- data/app/views/{admin → alchemy/admin}/elements/create.js.erb +2 -2
- data/app/views/{admin → alchemy/admin}/elements/destroy.js.erb +1 -1
- data/app/views/{admin → alchemy/admin}/elements/fold.js.erb +2 -2
- data/app/views/{admin → alchemy/admin}/elements/index.html.erb +1 -10
- data/app/views/{admin → alchemy/admin}/elements/list.js.erb +2 -2
- data/app/views/alchemy/admin/elements/new.html.erb +41 -0
- data/app/views/{admin → alchemy/admin}/elements/order.js.erb +1 -1
- data/app/views/{admin → alchemy/admin}/elements/trash.js.erb +1 -1
- data/app/views/{admin → alchemy/admin}/elements/update.js.erb +1 -1
- data/app/views/{admin → alchemy/admin}/essence_files/assign.js.erb +1 -1
- data/app/views/{admin → alchemy/admin}/essence_files/edit.html.erb +23 -23
- data/app/views/{admin → alchemy/admin}/essence_pictures/assign.js.erb +2 -2
- data/app/views/{admin → alchemy/admin}/essence_pictures/crop.html.erb +15 -6
- data/app/views/{admin → alchemy/admin}/essence_pictures/destroy.js.erb +1 -1
- data/app/views/{admin → alchemy/admin}/essence_pictures/edit.html.erb +11 -11
- data/app/views/{admin → alchemy/admin}/essence_pictures/save_link.js.erb +0 -0
- data/app/views/{admin → alchemy/admin}/essence_pictures/update.js.erb +2 -2
- data/app/views/alchemy/admin/languages/_language.html.erb +36 -0
- data/app/views/{admin → alchemy/admin}/layoutpages/_layoutpage.html.erb +18 -18
- data/app/views/alchemy/admin/layoutpages/index.html.erb +65 -0
- data/app/views/{admin → alchemy/admin}/pages/_contactform_links.html.erb +6 -6
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +38 -0
- data/app/views/{admin → alchemy/admin}/pages/_external_link.html.erb +9 -9
- data/app/views/{admin → alchemy/admin}/pages/_file_link.html.erb +13 -13
- data/app/views/{admin → alchemy/admin}/pages/_internal_link.html.erb +8 -8
- data/app/views/{admin → alchemy/admin}/pages/_new_page_form.html.erb +6 -6
- data/app/views/{admin → alchemy/admin}/pages/_page.html.erb +25 -25
- data/app/views/{admin → alchemy/admin}/pages/_page_for_links.html.erb +6 -6
- data/app/views/{admin → alchemy/admin}/pages/_page_infos.html.erb +3 -3
- data/app/views/{admin → alchemy/admin}/pages/_page_status.html.erb +4 -4
- data/app/views/{admin → alchemy/admin}/pages/_sitemap.html.erb +21 -21
- data/app/views/alchemy/admin/pages/configure.html.erb +71 -0
- data/app/views/{admin → alchemy/admin}/pages/configure_external.html.erb +9 -9
- data/app/views/{admin → alchemy/admin}/pages/destroy.js.erb +2 -2
- data/app/views/alchemy/admin/pages/edit.html.erb +181 -0
- data/app/views/alchemy/admin/pages/flush.js.erb +2 -0
- data/app/views/{admin → alchemy/admin}/pages/fold.js.erb +0 -0
- data/app/views/alchemy/admin/pages/index.html.erb +104 -0
- data/app/views/{admin → alchemy/admin}/pages/link.html.erb +4 -4
- data/app/views/alchemy/admin/pages/locked.html.erb +3 -0
- data/app/views/{admin → alchemy/admin}/pages/new.html.erb +8 -8
- data/app/views/{admin → alchemy/admin}/pages/show.html.erb +0 -0
- data/app/views/{admin → alchemy/admin}/pages/sort.js.erb +0 -0
- data/app/views/{admin → alchemy/admin}/pages/unlock.js.erb +1 -1
- data/app/views/{admin → alchemy/admin}/pages/update.js.erb +5 -5
- data/app/views/{admin → alchemy/admin}/partials/_flash.html.erb +0 -0
- data/app/views/{admin → alchemy/admin}/partials/_flash_notices.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +14 -0
- data/app/views/alchemy/admin/partials/_pagination_links.html.erb +5 -0
- data/app/views/{admin → alchemy/admin}/partials/_remote_pagination_links.html.erb +2 -2
- data/app/views/{admin → alchemy/admin}/partials/_remote_search_form.html.erb +2 -2
- data/app/views/{admin → alchemy/admin}/partials/_search_form.html.erb +6 -7
- data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +8 -0
- data/app/views/alchemy/admin/partials/_upload_form.html.erb +129 -0
- data/app/views/{admin → alchemy/admin}/pictures/_archive_overlay.html.erb +3 -3
- data/app/views/{admin → alchemy/admin}/pictures/_filter_and_size_bar.html.erb +15 -15
- data/app/views/{admin → alchemy/admin}/pictures/_picture.html.erb +7 -7
- data/app/views/{admin → alchemy/admin}/pictures/_picture_to_assign.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +14 -0
- data/app/views/{admin → alchemy/admin}/pictures/archive_overlay.js.erb +0 -0
- data/app/views/{admin → alchemy/admin}/pictures/create.js.erb +3 -3
- data/app/views/{admin → alchemy/admin}/pictures/flush.js.erb +0 -0
- data/app/views/alchemy/admin/pictures/index.html.erb +83 -0
- data/app/views/{admin → alchemy/admin}/pictures/new.html.erb +3 -3
- data/app/views/alchemy/admin/pictures/show_in_window.html.erb +1 -0
- data/app/views/{admin → alchemy/admin}/pictures/update.js.erb +0 -0
- data/app/views/alchemy/admin/resources/_form.html.erb +20 -0
- data/app/views/alchemy/admin/resources/_resource.html.erb +35 -0
- data/app/views/alchemy/admin/resources/_table.html.erb +23 -0
- data/app/views/alchemy/admin/resources/destroy.js.erb +1 -0
- data/app/views/{admin/languages → alchemy/admin/resources}/edit.html.erb +0 -0
- data/app/views/alchemy/admin/resources/index.html.erb +19 -0
- data/app/views/{admin/languages → alchemy/admin/resources}/new.html.erb +0 -0
- data/app/views/{admin → alchemy/admin}/trash/clear.js.erb +1 -1
- data/app/views/{admin → alchemy/admin}/trash/index.html.erb +4 -4
- data/app/views/alchemy/admin/users/_table.html.erb +54 -0
- data/app/views/{admin → alchemy/admin}/users/_user.html.erb +14 -12
- data/app/views/{admin → alchemy/admin}/users/edit.html.erb +0 -0
- data/app/views/alchemy/admin/users/index.html.erb +41 -0
- data/app/views/{admin → alchemy/admin}/users/new.html.erb +1 -1
- data/app/views/{attachments → alchemy/attachments}/show.html.erb +0 -0
- data/app/views/alchemy/base/500.html.erb +5 -0
- data/app/views/alchemy/base/error_notice.js.erb +2 -0
- data/app/views/alchemy/base/permission_denied.js.erb +2 -0
- data/app/views/alchemy/{redirect.js.erb → base/redirect.js.erb} +0 -0
- data/app/views/alchemy/{remote_errors.js.erb → base/remote_errors.js.erb} +0 -0
- data/app/views/alchemy/{update.js.erb → base/update.js.erb} +0 -0
- data/app/views/{elements → alchemy/elements}/_article_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_article_view.html.erb +1 -1
- data/app/views/{elements → alchemy/elements}/_bild_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_bild_text_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_bild_text_view.html.erb +1 -1
- data/app/views/{elements → alchemy/elements}/_bild_view.html.erb +1 -1
- data/app/views/{elements → alchemy/elements}/_claim_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_claim_view.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_contactform_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_contactform_view.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_editor_not_found.html.erb +1 -1
- data/app/views/{elements → alchemy/elements}/_footnote_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_footnote_view.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_header_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_header_view.html.erb +1 -1
- data/app/views/{elements → alchemy/elements}/_headline_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_headline_view.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_image_mosaic_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_image_mosaic_view.html.erb +1 -1
- data/app/views/{elements → alchemy/elements}/_intro_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_intro_image_text_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_intro_image_text_view.html.erb +1 -1
- data/app/views/{elements → alchemy/elements}/_intro_view.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_news_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_news_view.html.erb +0 -0
- data/app/views/alchemy/elements/_searchresult_editor.html.erb +1 -0
- data/app/views/alchemy/elements/_searchresult_view.html.erb +4 -0
- data/app/views/alchemy/elements/_sitemap_editor.html.erb +3 -0
- data/app/views/{elements → alchemy/elements}/_sitemap_view.html.erb +2 -2
- data/app/views/{elements → alchemy/elements}/_sitename_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_sitename_view.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_subheadline_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_subheadline_view.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_text_editor.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_text_view.html.erb +0 -0
- data/app/views/{elements → alchemy/elements}/_view_not_found.html.erb +0 -0
- data/app/views/alchemy/elements/show.html.erb +6 -0
- data/app/views/{elements → alchemy/elements}/show.js.erb +1 -1
- data/app/views/alchemy/essences/_essence_audio_editor.html.erb +1 -0
- data/app/views/{essences → alchemy/essences}/_essence_audio_view.html.erb +0 -0
- data/app/views/{essences → alchemy/essences}/_essence_date_editor.html.erb +0 -0
- data/app/views/{essences → alchemy/essences}/_essence_date_view.html.erb +0 -0
- data/app/views/{essences → alchemy/essences}/_essence_file_editor.html.erb +9 -9
- data/app/views/{essences → alchemy/essences}/_essence_file_view.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_flash_editor.html.erb +1 -0
- data/app/views/{essences → alchemy/essences}/_essence_flash_view.html.erb +0 -0
- data/app/views/{essences → alchemy/essences}/_essence_html_editor.html.erb +0 -0
- data/app/views/{essences → alchemy/essences}/_essence_html_view.html.erb +0 -0
- data/app/views/{essences → alchemy/essences}/_essence_picture_editor.html.erb +8 -8
- data/app/views/{essences → alchemy/essences}/_essence_picture_tools.html.erb +11 -11
- data/app/views/{essences → alchemy/essences}/_essence_picture_view.html.erb +2 -4
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +11 -0
- data/app/views/{essences → alchemy/essences}/_essence_richtext_view.html.erb +0 -0
- data/app/views/{essences → alchemy/essences}/_essence_text_editor.html.erb +6 -6
- data/app/views/{essences → alchemy/essences}/_essence_text_view.html.erb +0 -0
- data/app/views/alchemy/essences/_essence_video_editor.html.erb +1 -0
- data/app/views/{essences → alchemy/essences}/_essence_video_view.html.erb +1 -1
- data/app/views/{messages → alchemy/messages}/contact_form_mail.html.erb +0 -0
- data/app/views/{messages → alchemy/messages}/contact_form_mail.text.erb +0 -0
- data/app/views/{messages → alchemy/messages}/new.html.erb +0 -0
- data/app/views/{navigation → alchemy/navigation}/_image_link.html.erb +0 -0
- data/app/views/{navigation → alchemy/navigation}/_link.html.erb +1 -1
- data/app/views/{navigation → alchemy/navigation}/_renderer.html.erb +0 -0
- data/app/views/alchemy/notifications/admin_user_created.text.erb +13 -0
- data/app/views/alchemy/notifications/registered_user_created.text.erb +10 -0
- data/app/views/{page_layouts → alchemy/page_layouts}/_contact.html.erb +0 -0
- data/app/views/{page_layouts → alchemy/page_layouts}/_external.html.erb +0 -0
- data/app/views/{page_layouts → alchemy/page_layouts}/_intro.html.erb +0 -0
- data/app/views/{page_layouts → alchemy/page_layouts}/_layout_footer.html.erb +0 -0
- data/app/views/{page_layouts → alchemy/page_layouts}/_layout_header.html.erb +0 -0
- data/app/views/{page_layouts → alchemy/page_layouts}/_news.html.erb +0 -0
- data/app/views/{_newsletter_layout.html.erb → alchemy/page_layouts/_newsletter_layout.html.erb} +0 -0
- data/app/views/{page_layouts → alchemy/page_layouts}/_search.html.erb +0 -0
- data/app/views/{page_layouts → alchemy/page_layouts}/_standard.html.erb +0 -0
- data/app/views/{pages → alchemy/pages}/show.html.erb +0 -0
- data/app/views/{pages → alchemy/pages}/show.rss.builder +0 -0
- data/app/views/{pages → alchemy/pages}/sitemap.xml.erb +0 -0
- data/app/views/{pictures → alchemy/pictures}/show.gif.flexi +0 -0
- data/app/views/{pictures → alchemy/pictures}/show.jpg.flexi +0 -0
- data/app/views/{pictures → alchemy/pictures}/show.png.flexi +0 -0
- data/app/views/{pictures → alchemy/pictures}/thumbnail.png.flexi +0 -0
- data/app/views/{pictures → alchemy/pictures}/zoom.png.flexi +0 -0
- data/app/views/alchemy/search/_result.html.erb +9 -0
- data/app/views/alchemy/user_sessions/leave.html.erb +11 -0
- data/app/views/alchemy/user_sessions/login.html.erb +47 -0
- data/app/views/alchemy/user_sessions/logout.html.erb +3 -0
- data/app/views/alchemy/user_sessions/signup.html.erb +14 -0
- data/app/views/layouts/{alchemy.html.erb → alchemy/admin.html.erb} +23 -17
- data/app/views/layouts/alchemy/login.html.erb +37 -0
- data/app/views/layouts/alchemy/pages.html.erb +29 -0
- data/app/views/layouts/{sitemap.xml.erb → alchemy/sitemap.xml.erb} +0 -0
- data/config/alchemy/config.yml +2 -80
- data/config/alchemy/modules.yml +70 -0
- data/config/alchemy/page_layouts.yml +2 -0
- data/config/authorization_rules.rb +32 -39
- data/config/locales/alchemy.de.yml +789 -0
- data/config/locales/alchemy.en.yml +587 -0
- data/config/routes.rb +144 -142
- data/db/migrate/20111116125112_namespace_models.rb +23 -0
- data/lib/alchemy/auth_engine.rb +7 -0
- data/lib/alchemy/capistrano.rb +4 -1
- data/lib/alchemy/engine.rb +39 -25
- data/lib/alchemy/essence.rb +5 -1
- data/lib/alchemy/i18n.rb +47 -0
- data/lib/alchemy/modules.rb +38 -0
- data/lib/alchemy/page_layout.rb +98 -56
- data/lib/alchemy/seeder.rb +60 -110
- data/lib/alchemy/tinymce.rb +2 -2
- data/lib/alchemy/version.rb +3 -3
- data/lib/alchemy_cms.rb +23 -23
- data/lib/rails/generators/alchemy/elements/elements_generator.rb +1 -1
- data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +1 -1
- data/lib/rails/generators/alchemy/elements/templates/view.html.erb +2 -2
- data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +1 -1
- data/lib/rails/generators/alchemy/plugin/plugin_generator.rb +0 -1
- data/lib/rails/generators/alchemy/scaffold/files/pages.html.erb +1 -1
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +34 -34
- data/lib/tasks/install.rake +2 -9
- data/lib/tasks/upgrade.rake +69 -208
- data/spec/controllers/admin/clipboard_controller_spec.rb +33 -35
- data/spec/controllers/admin/contents_controller_spec.rb +5 -5
- data/spec/controllers/admin/elements_controller_spec.rb +22 -0
- data/spec/controllers/admin/trash_controller_spec.rb +5 -5
- data/spec/controllers/base_controller_spec.rb +67 -0
- data/spec/controllers/pages_controller_spec.rb +6 -6
- data/spec/dummy/config/application.rb +1 -8
- data/spec/dummy/config/routes.rb +2 -57
- data/spec/dummy/db/schema.rb +27 -27
- data/spec/factories.rb +8 -8
- data/spec/helpers/{alchemy_helper_spec.rb → admin/base_helper_spec.rb} +8 -1
- data/spec/helpers/admin/contents_helper_spec.rb +25 -0
- data/spec/helpers/admin/elements_helper_spec.rb +31 -3
- data/spec/helpers/admin/essences_helper_spec.rb +27 -0
- data/spec/helpers/elements_helper_spec.rb +99 -21
- data/spec/helpers/essences_helper_spec.rb +1 -18
- data/spec/helpers/pages_helper_spec.rb +212 -26
- data/spec/integration/admin/pages_controller_spec.rb +56 -0
- data/spec/integration/navigation_spec.rb +1 -1
- data/spec/integration/pages_controller_spec.rb +85 -68
- data/spec/integration/security_spec.rb +49 -22
- data/spec/models/content_spec.rb +3 -3
- data/spec/models/element_spec.rb +19 -11
- data/spec/models/essence_richtext_spec.rb +2 -2
- data/spec/models/language_spec.rb +36 -7
- data/spec/models/page_spec.rb +57 -13
- data/spec/models/user_spec.rb +1 -1
- data/spec/page_layout_spec.rb +13 -3
- data/spec/routing_spec.rb +12 -8
- data/spec/spec_helper.rb +8 -9
- data/spec/support/controller_hacks.rb +37 -0
- data/vendor/assets/javascripts/swfupload/SWFObject License.txt +4 -0
- data/vendor/assets/javascripts/swfupload/swfupload.cookies.js +53 -0
- data/vendor/assets/javascripts/swfupload/swfupload.js +1 -1
- data/vendor/assets/javascripts/swfupload/{queue.js → swfupload.queue.js} +97 -97
- data/vendor/assets/javascripts/swfupload/swfupload.speed.js +342 -0
- data/vendor/assets/javascripts/swfupload/swfupload.swfobject.js +111 -0
- data/vendor/assets/javascripts/tiny_mce/license.txt +504 -504
- data/vendor/assets/javascripts/tiny_mce/plugins/autoresize/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +110 -110
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +387 -387
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +36 -36
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +51 -51
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +26 -26
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +21 -21
- data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +180 -180
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +16 -16
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +25 -25
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +13 -13
- data/vendor/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +319 -319
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +27 -27
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +237 -237
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +484 -450
- data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +32 -32
- data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +158 -158
- data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +188 -188
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +52 -52
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +26 -26
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +55 -51
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +74 -74
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +80 -80
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +73 -73
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +43 -43
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +363 -355
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +329 -329
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +251 -251
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +153 -153
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +56 -56
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +57 -57
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +47 -47
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +50 -50
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +117 -117
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +214 -214
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +24 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +105 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +48 -48
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +117 -117
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +217 -217
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +7 -7
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -5
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +25 -25
- data/vendor/assets/javascripts/tiny_mce/tiny_mce.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +70 -70
- data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +210 -210
- data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +161 -161
- data/vendor/assets/javascripts/tiny_mce/utils/validate.js +252 -252
- metadata +432 -465
- data/app/controllers/admin/attachments_controller.rb +0 -136
- data/app/controllers/admin/clipboard_controller.rb +0 -43
- data/app/controllers/admin/contents_controller.rb +0 -60
- data/app/controllers/admin/elements_controller.rb +0 -134
- data/app/controllers/admin/essence_audios_controller.rb +0 -10
- data/app/controllers/admin/essence_files_controller.rb +0 -25
- data/app/controllers/admin/essence_flashes_controller.rb +0 -10
- data/app/controllers/admin/essence_pictures_controller.rb +0 -84
- data/app/controllers/admin/essence_videos_controller.rb +0 -10
- data/app/controllers/admin/languages_controller.rb +0 -64
- data/app/controllers/admin/layoutpages_controller.rb +0 -12
- data/app/controllers/admin/pages_controller.rb +0 -251
- data/app/controllers/admin/pictures_controller.rb +0 -143
- data/app/controllers/admin/trash_controller.rb +0 -28
- data/app/controllers/admin/users_controller.rb +0 -73
- data/app/controllers/admin_controller.rb +0 -76
- data/app/controllers/alchemy_controller.rb +0 -245
- data/app/controllers/attachments_controller.rb +0 -28
- data/app/controllers/elements_controller.rb +0 -16
- data/app/controllers/messages_controller.rb +0 -113
- data/app/controllers/pages_controller.rb +0 -150
- data/app/controllers/pictures_controller.rb +0 -63
- data/app/helpers/admin/attachments_helper.rb +0 -7
- data/app/helpers/admin/elements_helper.rb +0 -112
- data/app/helpers/admin/pages_helper.rb +0 -38
- data/app/helpers/admin/pictures_helper.rb +0 -26
- data/app/helpers/alchemy_helper.rb +0 -379
- data/app/helpers/contents_helper.rb +0 -69
- data/app/helpers/elements_helper.rb +0 -170
- data/app/helpers/essences_helper.rb +0 -167
- data/app/helpers/layout_helper.rb +0 -37
- data/app/helpers/pages_helper.rb +0 -503
- data/app/mailers/messages.rb +0 -15
- data/app/mailers/notifications.rb +0 -23
- data/app/models/attachment.rb +0 -80
- data/app/models/cell.rb +0 -59
- data/app/models/content.rb +0 -145
- data/app/models/element.rb +0 -476
- data/app/models/essence_audio.rb +0 -17
- data/app/models/essence_date.rb +0 -20
- data/app/models/essence_file.rb +0 -17
- data/app/models/essence_flash.rb +0 -15
- data/app/models/essence_html.rb +0 -19
- data/app/models/essence_picture.rb +0 -27
- data/app/models/essence_richtext.rb +0 -61
- data/app/models/essence_text.rb +0 -38
- data/app/models/essence_video.rb +0 -17
- data/app/models/folded_page.rb +0 -3
- data/app/models/language.rb +0 -83
- data/app/models/message.rb +0 -69
- data/app/models/page.rb +0 -545
- data/app/models/picture.rb +0 -98
- data/app/models/user.rb +0 -70
- data/app/models/user_session.rb +0 -10
- data/app/sweepers/content_sweeper.rb +0 -20
- data/app/sweepers/pages_sweeper.rb +0 -47
- data/app/sweepers/pictures_sweeper.rb +0 -21
- data/app/views/_contact.html.erb +0 -3
- data/app/views/_intro.html.erb +0 -3
- data/app/views/_news.html.erb +0 -3
- data/app/views/_search.html.erb +0 -3
- data/app/views/_standard.html.erb +0 -1
- data/app/views/admin/attachments/_files_list.html.erb +0 -24
- data/app/views/admin/attachments/index.html.erb +0 -30
- data/app/views/admin/clipboard/index.html.erb +0 -19
- data/app/views/admin/clipboard/insert.js.erb +0 -14
- data/app/views/admin/clipboard/remove.js.erb +0 -10
- data/app/views/admin/elements/_new_element_form.html.erb +0 -25
- data/app/views/admin/elements/new.html.erb +0 -33
- data/app/views/admin/index.html.erb +0 -102
- data/app/views/admin/infos.html.erb +0 -5
- data/app/views/admin/languages/_form.html.erb +0 -34
- data/app/views/admin/languages/_language.html.erb +0 -35
- data/app/views/admin/languages/destroy.js.erb +0 -1
- data/app/views/admin/languages/index.html.erb +0 -41
- data/app/views/admin/layoutpages/index.html.erb +0 -75
- data/app/views/admin/leave.html.erb +0 -11
- data/app/views/admin/login.html.erb +0 -46
- data/app/views/admin/logout.html.erb +0 -5
- data/app/views/admin/pages/_create_language_form.html.erb +0 -43
- data/app/views/admin/pages/configure.html.erb +0 -71
- data/app/views/admin/pages/edit.html.erb +0 -185
- data/app/views/admin/pages/flush.js.erb +0 -2
- data/app/views/admin/pages/index.html.erb +0 -108
- data/app/views/admin/pages/locked.html.erb +0 -3
- data/app/views/admin/partials/_mainnavigation_entry.html.erb +0 -27
- data/app/views/admin/partials/_pagination_links.html.erb +0 -5
- data/app/views/admin/partials/_per_page_links.html.erb +0 -17
- data/app/views/admin/partials/_sub_navigation.html.erb +0 -14
- data/app/views/admin/partials/_upload_form.html.erb +0 -119
- data/app/views/admin/pictures/_pictures_list.html.erb +0 -12
- data/app/views/admin/pictures/index.html.erb +0 -89
- data/app/views/admin/pictures/show_in_window.html.erb +0 -1
- data/app/views/admin/signup.html.erb +0 -16
- data/app/views/admin/users/_table.html.erb +0 -54
- data/app/views/admin/users/index.html.erb +0 -41
- data/app/views/alchemy/error_notice.js.erb +0 -1
- data/app/views/alchemy/permission_denied.js.erb +0 -2
- data/app/views/elements/_searchresult_editor.html.erb +0 -1
- data/app/views/elements/_searchresult_view.html.erb +0 -49
- data/app/views/elements/_sitemap_editor.html.erb +0 -3
- data/app/views/elements/show.html.erb +0 -6
- data/app/views/essences/_essence_audio_editor.html.erb +0 -1
- data/app/views/essences/_essence_flash_editor.html.erb +0 -1
- data/app/views/essences/_essence_richtext_editor.html.erb +0 -9
- data/app/views/essences/_essence_video_editor.html.erb +0 -1
- data/app/views/layouts/login.html.erb +0 -59
- data/app/views/layouts/pages.html.erb +0 -29
- data/app/views/notifications/admin_user_created.text.erb +0 -13
- data/app/views/notifications/registered_user_created.text.erb +0 -10
- data/app/views/page_layouts/_newsletter_layout.html.erb +0 -1
- data/config/initializers/authorization.rb +0 -4
- data/config/initializers/fast_gettext.rb +0 -3
- data/config/locales/de.yml +0 -377
- data/config/locales/en.yml +0 -371
- data/lib/alchemy/controller.rb +0 -79
- data/lib/rails/generators/alchemy/plugin/templates/gettext.rb +0 -2
- data/lib/tasks/gettext.rake +0 -120
- data/lib/translation_extras/alchemy_core_modules.rb +0 -11
- data/locale/alchemy.pot +0 -1749
- data/locale/de/alchemy.po +0 -1795
- data/locale/en/alchemy.po +0 -1745
- data/locale/missing_translations.rb +0 -4
- data/locale/model_attributes.rb +0 -56
- data/spec/helpers/contents_helper_spec.rb +0 -27
- data/vendor/assets/javascripts/jquery-1.6.2.min.js +0 -18
- data/vendor/assets/javascripts/jquery-ui-custom-1.8.16.min.js +0 -550
- data/vendor/assets/javascripts/swfupload/fileprogress.js +0 -203
- data/vendor/assets/javascripts/swfupload/handlers.js +0 -171
- data/vendor/assets/javascripts/tiny_mce/jquery.tinymce.js +0 -1
data/app/mailers/messages.rb
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
class Messages < ActionMailer::Base
|
|
2
|
-
|
|
3
|
-
default :from => Alchemy::Config.get(:mailer)[:mail_from]
|
|
4
|
-
|
|
5
|
-
def contact_form_mail(message, mail_to, mail_from, subject)
|
|
6
|
-
@message = message
|
|
7
|
-
mail(
|
|
8
|
-
:from => mail_from,
|
|
9
|
-
:to => mail_to,
|
|
10
|
-
:reply_to => message.email,
|
|
11
|
-
:subject => subject
|
|
12
|
-
)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
class Notifications < ActionMailer::Base
|
|
2
|
-
|
|
3
|
-
default :from => Alchemy::Config.get(:mailer)[:mail_from]
|
|
4
|
-
|
|
5
|
-
def registered_user_created(user)
|
|
6
|
-
@user = user
|
|
7
|
-
@url = login_url
|
|
8
|
-
mail(
|
|
9
|
-
:to => user.email,
|
|
10
|
-
:subject => I18n.t("alchemy.mailer.new_user_mail.subject")
|
|
11
|
-
)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def admin_user_created(user)
|
|
15
|
-
@user = user
|
|
16
|
-
@url = admin_url
|
|
17
|
-
mail(
|
|
18
|
-
:to => user.email,
|
|
19
|
-
:subject => _("Your Alchemy Login")
|
|
20
|
-
)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
end
|
data/app/models/attachment.rb
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
class Attachment < ActiveRecord::Base
|
|
2
|
-
|
|
3
|
-
stampable
|
|
4
|
-
|
|
5
|
-
has_attachment(
|
|
6
|
-
:storage => :file_system,
|
|
7
|
-
:file_system_path => 'uploads/attachments',
|
|
8
|
-
:size => 0.kilobytes..1000.megabytes
|
|
9
|
-
)
|
|
10
|
-
validates_as_attachment
|
|
11
|
-
|
|
12
|
-
def name
|
|
13
|
-
read_attribute(:name).split('.').first
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def extension
|
|
17
|
-
filename.split(".").last
|
|
18
|
-
end
|
|
19
|
-
alias_method :suffix, :extension
|
|
20
|
-
|
|
21
|
-
def icon_css_class
|
|
22
|
-
case content_type
|
|
23
|
-
when "application/x-flash-video"
|
|
24
|
-
then "video"
|
|
25
|
-
when "video/x-flv"
|
|
26
|
-
then "video"
|
|
27
|
-
when "video/mp4"
|
|
28
|
-
then "video"
|
|
29
|
-
when "video/mpeg"
|
|
30
|
-
then "video"
|
|
31
|
-
when "video/quicktime"
|
|
32
|
-
then "video"
|
|
33
|
-
when "video/x-msvideo"
|
|
34
|
-
then "video"
|
|
35
|
-
when "video/x-ms-wmv"
|
|
36
|
-
then "video"
|
|
37
|
-
when "application/zip"
|
|
38
|
-
then "archive"
|
|
39
|
-
when "application/x-rar"
|
|
40
|
-
then "archive"
|
|
41
|
-
when "audio/mpeg"
|
|
42
|
-
then "audio"
|
|
43
|
-
when "audio/mp4"
|
|
44
|
-
then "audio"
|
|
45
|
-
when "audio/wav"
|
|
46
|
-
then "audio"
|
|
47
|
-
when "audio/x-wav"
|
|
48
|
-
then "audio"
|
|
49
|
-
when "application/x-shockwave-flash"
|
|
50
|
-
then "flash"
|
|
51
|
-
when "image/gif"
|
|
52
|
-
then "image"
|
|
53
|
-
when "image/jpeg"
|
|
54
|
-
then "image"
|
|
55
|
-
when "image/png"
|
|
56
|
-
then "image"
|
|
57
|
-
when "image/tiff"
|
|
58
|
-
then "image"
|
|
59
|
-
when "image/x-psd"
|
|
60
|
-
then "psd"
|
|
61
|
-
when "text/plain"
|
|
62
|
-
then "text"
|
|
63
|
-
when "application/rtf"
|
|
64
|
-
then "rtf"
|
|
65
|
-
when "application/pdf"
|
|
66
|
-
then "pdf"
|
|
67
|
-
when "application/msword"
|
|
68
|
-
then "word"
|
|
69
|
-
when "application/vnd.ms-excel"
|
|
70
|
-
then "excel"
|
|
71
|
-
when "text/x-vcard"
|
|
72
|
-
then "vcard"
|
|
73
|
-
when "application/vcard"
|
|
74
|
-
then "vcard"
|
|
75
|
-
else
|
|
76
|
-
"file"
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
end
|
data/app/models/cell.rb
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# A cell is a group of elements that are rendered inside a specific area on your page_layout.
|
|
2
|
-
# Think of it like a column, or section in your layout. I.e. a header or right column.
|
|
3
|
-
#
|
|
4
|
-
# Elements are displayed in tabs inside the elements window in page edit view.
|
|
5
|
-
# Every cell is a list of elements with the position scoped to +cell_id+ and +page_id+.
|
|
6
|
-
#
|
|
7
|
-
# Define cells inside a +cells.yml+ file located in the +config/alchermy+ folder of your project.
|
|
8
|
-
#
|
|
9
|
-
# Render cells with the +render_cell+ helper
|
|
10
|
-
#
|
|
11
|
-
# Views for cells are inside the +app/views/cells+ folder in you project.
|
|
12
|
-
#
|
|
13
|
-
class Cell < ActiveRecord::Base
|
|
14
|
-
|
|
15
|
-
belongs_to :page
|
|
16
|
-
has_many :elements, :dependent => :destroy, :order => :position
|
|
17
|
-
|
|
18
|
-
def self.definitions
|
|
19
|
-
cell_yml = File.join(Rails.root, 'config', 'alchemy', 'cells.yml')
|
|
20
|
-
YAML.load_file(cell_yml) if File.exist?(cell_yml)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def self.definition_for(cellname)
|
|
24
|
-
return nil if cellname.blank?
|
|
25
|
-
definitions.detect { |c| c['name'] == cellname }
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def self.all_definitions_for(cellnames)
|
|
29
|
-
definitions.select { |c| cellnames.include? c['name'] }
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def self.all_element_definitions_for(cellnames)
|
|
33
|
-
element_names = []
|
|
34
|
-
all_definitions_for(cellnames).each do |cell|
|
|
35
|
-
element_names += cell['elements']
|
|
36
|
-
end
|
|
37
|
-
Element.all_definitions_for(element_names.uniq)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def self.definitions_for_element(element_name)
|
|
41
|
-
return [] if definitions.blank?
|
|
42
|
-
definitions.select { |d| d['elements'].include?(element_name) }
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def self.names_for_element(element_name)
|
|
46
|
-
definitions = definitions_for_element(element_name)
|
|
47
|
-
return nil if definitions.blank?
|
|
48
|
-
definitions.collect { |d| d['name'] }
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def name_for_label
|
|
52
|
-
self.class.translated_label_for(self.name)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def self.translated_label_for(cell_name)
|
|
56
|
-
I18n.t("alchemy.cell_names.#{cell_name}", :default => cell_name.camelcase)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
end
|
data/app/models/content.rb
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
class Content < ActiveRecord::Base
|
|
2
|
-
|
|
3
|
-
belongs_to :essence, :polymorphic => true, :dependent => :destroy
|
|
4
|
-
belongs_to :element
|
|
5
|
-
stampable :stamper_class_name => :user
|
|
6
|
-
acts_as_list
|
|
7
|
-
|
|
8
|
-
def scope_condition
|
|
9
|
-
"element_id = '#{element_id}' AND essence_type = '#{essence_type}'"
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
validates_uniqueness_of :position, :scope => [:element_id, :essence_type]
|
|
13
|
-
|
|
14
|
-
# Creates a new Content as descriped in the elements.yml file
|
|
15
|
-
def self.create_from_scratch(element, essences_hash)
|
|
16
|
-
if essences_hash[:name].blank? && !essences_hash[:essence_type].blank?
|
|
17
|
-
essences_of_same_type = element.contents.find_all_by_essence_type(essences_hash[:essence_type])
|
|
18
|
-
description = {
|
|
19
|
-
'type' => essences_hash[:essence_type],
|
|
20
|
-
'name' => "#{essences_hash[:essence_type].underscore}_#{essences_of_same_type.length + 1}"
|
|
21
|
-
}
|
|
22
|
-
else
|
|
23
|
-
description = element.content_description_for(essences_hash[:name])
|
|
24
|
-
description = element.available_content_description_for(essences_hash[:name]) if description.blank?
|
|
25
|
-
end
|
|
26
|
-
raise "No description found in elements.yml for #{essences_hash.inspect} and #{element.inspect}" if description.blank?
|
|
27
|
-
essence_class = ObjectSpace.const_get(description['type'])
|
|
28
|
-
content = self.new(:name => description['name'], :element_id => element.id)
|
|
29
|
-
if description['type'] == "EssenceRichtext" || description['type'] == "EssenceText"
|
|
30
|
-
essence = essence_class.create(:do_not_index => !description['do_not_index'].nil?)
|
|
31
|
-
else
|
|
32
|
-
essence = essence_class.create
|
|
33
|
-
end
|
|
34
|
-
if essence
|
|
35
|
-
content.essence = essence
|
|
36
|
-
content.save
|
|
37
|
-
else
|
|
38
|
-
content = nil
|
|
39
|
-
end
|
|
40
|
-
return content
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Settings from the elements.yml definition
|
|
44
|
-
def settings
|
|
45
|
-
return {} if description.blank?
|
|
46
|
-
settings = description['settings']
|
|
47
|
-
return {} if settings.blank?
|
|
48
|
-
settings.symbolize_keys
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# makes a copy of source and copies the polymorphic associated essence
|
|
52
|
-
def self.copy(source, differences = {})
|
|
53
|
-
differences[:position] = nil
|
|
54
|
-
differences[:id] = nil
|
|
55
|
-
attributes = source.attributes.merge(differences)
|
|
56
|
-
content = self.create!(attributes.except("id"))
|
|
57
|
-
new_essence = content.essence.clone
|
|
58
|
-
new_essence.save
|
|
59
|
-
content.essence_id = new_essence.id
|
|
60
|
-
content
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Returns my description hash from elements.yml
|
|
64
|
-
# Returns the description from available_contents if my own description is blank
|
|
65
|
-
def description
|
|
66
|
-
if self.element.blank?
|
|
67
|
-
logger.warn("\n+++++++++++ Warning: Content with id #{self.id} is missing its Element\n")
|
|
68
|
-
return nil
|
|
69
|
-
else
|
|
70
|
-
desc = self.element.content_description_for(self.name)
|
|
71
|
-
if desc.blank?
|
|
72
|
-
desc = self.element.available_content_description_for(self.name)
|
|
73
|
-
else
|
|
74
|
-
return desc
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Gets the ingredient from essence
|
|
80
|
-
def ingredient
|
|
81
|
-
return nil if self.essence.nil?
|
|
82
|
-
self.essence.ingredient
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# Calls essence.save_ingredient. Called from ElementController#update for each content in element.
|
|
86
|
-
# Adding errors if essence validation fails.
|
|
87
|
-
def save_essence(params, options = {})
|
|
88
|
-
if essence.save_ingredient(params, options)
|
|
89
|
-
return true
|
|
90
|
-
else
|
|
91
|
-
errors.add(:base, :essence_validation_failed)
|
|
92
|
-
return false
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def essence_validation_failed?
|
|
97
|
-
!essence.essence_errors.blank?
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def has_validations?
|
|
101
|
-
return false if description.blank?
|
|
102
|
-
!description['validate'].blank?
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# Returns a string to be passed to Rails form field tags to ensure we have same params layout everywhere.
|
|
106
|
-
#
|
|
107
|
-
# Example:
|
|
108
|
-
# ========
|
|
109
|
-
# <%= text_field_tag content.form_field_name, content.ingredient %>
|
|
110
|
-
#
|
|
111
|
-
# Options:
|
|
112
|
-
# ========
|
|
113
|
-
# You can pass an Essence column_name. Default is self.essence.ingredient_column
|
|
114
|
-
#
|
|
115
|
-
# Example:
|
|
116
|
-
# =======
|
|
117
|
-
# <%= text_field_tag content.form_field_name(:link), content.ingredient %>
|
|
118
|
-
#
|
|
119
|
-
def form_field_name(essence_column = self.essence.ingredient_column)
|
|
120
|
-
"contents[content_#{self.id}][#{essence_column}]"
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def form_field_id(essence_column = self.essence.ingredient_column)
|
|
124
|
-
"contents_content_#{self.id}_#{essence_column}"
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# Returns the translated name for displaying in labels, etc.
|
|
128
|
-
def name_for_label
|
|
129
|
-
self.class.translated_label_for(self.name, self.element.name)
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# Translates a name from string. Optional: pass an element_name to namespacing.
|
|
133
|
-
def self.translated_label_for(content_name, element_name = nil)
|
|
134
|
-
if element_name.blank?
|
|
135
|
-
I18n.t("alchemy.content_names.#{content_name}", :default => content_name.capitalize)
|
|
136
|
-
else
|
|
137
|
-
I18n.t("alchemy.content_names.#{element_name}.#{content_name}", :default => ["alchemy.content_names.#{content_name}".to_sym, content_name.capitalize])
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def linked?
|
|
142
|
-
essence && !essence.link.blank?
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
end
|
data/app/models/element.rb
DELETED
|
@@ -1,476 +0,0 @@
|
|
|
1
|
-
class Element < ActiveRecord::Base
|
|
2
|
-
|
|
3
|
-
# All Elements inside a cell are a list. All Elements not in cell are in the cell_id.nil list.
|
|
4
|
-
acts_as_list :scope => [:page_id, :cell_id]
|
|
5
|
-
stampable :stamper_class_name => :user
|
|
6
|
-
|
|
7
|
-
has_many :contents, :order => :position, :dependent => :destroy
|
|
8
|
-
belongs_to :cell
|
|
9
|
-
belongs_to :page
|
|
10
|
-
has_and_belongs_to_many :to_be_sweeped_pages, :class_name => 'Page', :uniq => true
|
|
11
|
-
|
|
12
|
-
validates_uniqueness_of :position, :scope => [:page_id, :cell_id]
|
|
13
|
-
validates_presence_of :name, :on => :create, :message => N_("Please choose an element.")
|
|
14
|
-
|
|
15
|
-
attr_accessor :create_contents_after_create
|
|
16
|
-
after_create :create_contents, :unless => Proc.new { |m| m.create_contents_after_create == false }
|
|
17
|
-
|
|
18
|
-
# TODO: add a trashed column to elements table
|
|
19
|
-
scope :trashed, where(:page_id => nil).order('updated_at DESC')
|
|
20
|
-
scope :not_trashed, where('`elements`.`page_id` IS NOT NULL')
|
|
21
|
-
scope :published, where(:public => true)
|
|
22
|
-
scope :named, lambda { |names| where(arel_table[:name].in(names)) }
|
|
23
|
-
scope :excluded, lambda { |names| where(arel_table[:name].not_in(names)) }
|
|
24
|
-
|
|
25
|
-
# Returns next Element on self.page or nil. Pass a Element.name to get next of this kind.
|
|
26
|
-
def next(name = nil)
|
|
27
|
-
if name.nil?
|
|
28
|
-
find_conditions = ["public = 1 AND page_id = ? AND position > ?", self.page.id, self.position]
|
|
29
|
-
else
|
|
30
|
-
find_conditions = ["public = 1 AND page_id = ? AND name = ? AND position > ?", self.page.id, name, self.position]
|
|
31
|
-
end
|
|
32
|
-
self.class.where(find_conditions).order("position ASC").limit(1)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Returns previous Element on self.page or nil. Pass a Element.name to get previous of this kind.
|
|
36
|
-
def prev(name = nil)
|
|
37
|
-
if name.nil?
|
|
38
|
-
find_conditions = ["public = 1 AND page_id = ? AND position < ?", self.page.id, self.position]
|
|
39
|
-
else
|
|
40
|
-
find_conditions = ["public = 1 AND page_id = ? AND name = ? AND position < ?", self.page.id, name, self.position]
|
|
41
|
-
end
|
|
42
|
-
self.class.where(find_conditions).order("position DESC").limit(1)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Stores the page into `to_be_sweeped_pages` (Pages that have to be sweeped after updating element).
|
|
46
|
-
def store_page(page)
|
|
47
|
-
return true if page.nil?
|
|
48
|
-
unless self.to_be_sweeped_pages.include? page
|
|
49
|
-
self.to_be_sweeped_pages << page
|
|
50
|
-
self.save
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# nullifies the page_id aka. trashs it.
|
|
55
|
-
def trash
|
|
56
|
-
self.attributes = {
|
|
57
|
-
:page_id => nil,
|
|
58
|
-
:cell_id => nil,
|
|
59
|
-
:folded => true,
|
|
60
|
-
:public => false
|
|
61
|
-
}
|
|
62
|
-
# If we validate the element, it will not get trashed if another element with same postion is already trashed.
|
|
63
|
-
# And we cannot remove the position, because it will not be reordered in the list if its position is nil.
|
|
64
|
-
self.remove_from_list
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def trashed?
|
|
68
|
-
page_id.nil?
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def content_by_name(name)
|
|
72
|
-
self.contents.find_by_name(name)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def content_by_type(essence_type)
|
|
76
|
-
self.contents.find_by_essence_type(essence_type)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def all_contents_by_name(name)
|
|
80
|
-
self.contents.find_all_by_name(name)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def all_contents_by_type(essence_type)
|
|
84
|
-
self.contents.find_all_by_essence_type(essence_type)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Returns the content that is marked as rss title.
|
|
88
|
-
#
|
|
89
|
-
# Mark a content as rss title in your +elements.yml+ file:
|
|
90
|
-
#
|
|
91
|
-
# - name: news
|
|
92
|
-
# contents:
|
|
93
|
-
# - name: headline
|
|
94
|
-
# type: EssenceText
|
|
95
|
-
# rss_title: true
|
|
96
|
-
#
|
|
97
|
-
def content_for_rss_title
|
|
98
|
-
rss_title = content_descriptions.detect { |c| c['rss_title'] }
|
|
99
|
-
contents.find_by_name(rss_title['name'])
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Returns the content that is marked as rss description.
|
|
103
|
-
#
|
|
104
|
-
# Mark a content as rss description in your +elements.yml+ file:
|
|
105
|
-
#
|
|
106
|
-
# - name: news
|
|
107
|
-
# contents:
|
|
108
|
-
# - name: body
|
|
109
|
-
# type: EssenceRichtext
|
|
110
|
-
# rss_description: true
|
|
111
|
-
#
|
|
112
|
-
def content_for_rss_description
|
|
113
|
-
rss_title = content_descriptions.detect { |c| c['rss_description'] }
|
|
114
|
-
contents.find_by_name(rss_title['name'])
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Inits a new element for page as described in /config/alchemy/elements.yml from element_name
|
|
118
|
-
def self.new_from_scratch(attributes)
|
|
119
|
-
attributes.stringify_keys!
|
|
120
|
-
return Element.new if attributes['name'].blank?
|
|
121
|
-
element_descriptions = Element.descriptions
|
|
122
|
-
return if element_descriptions.blank?
|
|
123
|
-
element_scratch = element_descriptions.select{ |m| m["name"] == attributes['name'].split('#').first }.first
|
|
124
|
-
element = Element.new(
|
|
125
|
-
element_scratch.except('contents', 'available_contents', 'display_name').merge({
|
|
126
|
-
:page_id => attributes['page_id']
|
|
127
|
-
})
|
|
128
|
-
)
|
|
129
|
-
element
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# Inits a new element for page as described in /config/alchemy/elements.yml from element_name and saves it
|
|
133
|
-
def self.create_from_scratch(attributes)
|
|
134
|
-
element = Element.new_from_scratch(attributes)
|
|
135
|
-
element.save if element
|
|
136
|
-
return element
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# pastes a element from the clipboard in the session to page
|
|
140
|
-
def self.paste_from_clipboard(page_id, element, method, position)
|
|
141
|
-
copy = self.copy(element, :page_id => page_id)
|
|
142
|
-
copy.insert_at(position)
|
|
143
|
-
if method == "move" && copy.valid?
|
|
144
|
-
element.destroy
|
|
145
|
-
end
|
|
146
|
-
copy
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
# Returns the descriptions from elements.yml file.
|
|
150
|
-
# Alchemy comes with its own elements.yml file. As so called standard set.
|
|
151
|
-
# Place a elements.yml file inside your apps config/alchemy folder to define
|
|
152
|
-
# your own set of elements
|
|
153
|
-
def self.descriptions
|
|
154
|
-
if File.exists? "#{Rails.root}/config/alchemy/elements.yml"
|
|
155
|
-
element_definitions = YAML.load_file( "#{Rails.root}/config/alchemy/elements.yml" )
|
|
156
|
-
end
|
|
157
|
-
if !element_definitions
|
|
158
|
-
if File.exists?(File.join(File.dirname(__FILE__), "../../config/alchemy/elements.yml"))
|
|
159
|
-
element_definitions = YAML.load_file( File.join(File.dirname(__FILE__), "../../config/alchemy/elements.yml") )
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
if !element_definitions
|
|
163
|
-
raise LoadError, "Could not find elements.yml file! Please run: rails generate alchemy:scaffold"
|
|
164
|
-
end
|
|
165
|
-
element_definitions
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def self.definitions
|
|
169
|
-
self.descriptions
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
# Returns the array with the hashes for all element contents in the elements.yml file
|
|
173
|
-
def content_descriptions
|
|
174
|
-
return nil if description.blank?
|
|
175
|
-
description['contents']
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
# Returns the array with the hashes for all element available_contents in the elements.yml file
|
|
179
|
-
def available_content_descriptions
|
|
180
|
-
return nil if description.blank?
|
|
181
|
-
description['available_contents']
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
# Returns the description for given content_name
|
|
185
|
-
def content_description_for(content_name)
|
|
186
|
-
if content_descriptions.blank?
|
|
187
|
-
logger.warn("\n+++++++++++ Warning: Element #{self.name} is missing the content description for #{content_name}\n")
|
|
188
|
-
return nil
|
|
189
|
-
else
|
|
190
|
-
content_descriptions.detect { |d| d['name'] == content_name }
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
# Returns the description for given content_name inside the available_contents
|
|
195
|
-
def available_content_description_for(content_name)
|
|
196
|
-
return nil if available_content_descriptions.blank?
|
|
197
|
-
available_content_descriptions.detect { |d| d['name'] == content_name }
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
# returns the description of the element with my name in element.yml
|
|
201
|
-
def description
|
|
202
|
-
self.class.descriptions.detect{ |d| d['name'] == self.name }
|
|
203
|
-
end
|
|
204
|
-
alias_method :definition, :description
|
|
205
|
-
|
|
206
|
-
# Human name for displaying in selectboxes and element editor views.
|
|
207
|
-
# The name is beeing translated from elements name value as described in config/alchemy/elements.yml
|
|
208
|
-
#
|
|
209
|
-
# Translate the name in your config/locales language file. Example:
|
|
210
|
-
#
|
|
211
|
-
# de:
|
|
212
|
-
# element_names:
|
|
213
|
-
# contactform: 'Kontakt Formular'
|
|
214
|
-
#
|
|
215
|
-
# If no translation is found the capitalized name is used!
|
|
216
|
-
#
|
|
217
|
-
def display_name
|
|
218
|
-
return name.capitalize if description.blank?
|
|
219
|
-
I18n.t(description['name'], :scope => 'alchemy.element_names', :default => name.capitalize)
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
# Gets the preview text from the first Content found in the +elements.yml+ Element description file.
|
|
223
|
-
# You can flag a Content as +take_me_for_preview+ to take this as preview.
|
|
224
|
-
def preview_text(maxlength = 30)
|
|
225
|
-
return "" if description.blank?
|
|
226
|
-
my_contents = description["contents"]
|
|
227
|
-
return "" if my_contents.blank?
|
|
228
|
-
content_flagged_as_preview = my_contents.select{ |a| a["take_me_for_preview"] }.first
|
|
229
|
-
if content_flagged_as_preview.blank?
|
|
230
|
-
content_to_take_as_preview = my_contents.first
|
|
231
|
-
else
|
|
232
|
-
content_to_take_as_preview = content_flagged_as_preview
|
|
233
|
-
end
|
|
234
|
-
preview_content = self.contents.select{ |content| content.name == content_to_take_as_preview["name"] }.first
|
|
235
|
-
return "" if preview_content.blank? || preview_content.essence.blank?
|
|
236
|
-
text = preview_content.essence.preview_text(maxlength)
|
|
237
|
-
text.size > maxlength ? "#{text[0..maxlength]}..." : text
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
# Generates a preview text containing Element#display_name and Element#preview_text.
|
|
241
|
-
# It is displayed inside the head of the Element in the Elements.list overlay window from the Alchemy Admin::Page#edit view.
|
|
242
|
-
#
|
|
243
|
-
# === Example
|
|
244
|
-
#
|
|
245
|
-
# A Element described as:
|
|
246
|
-
#
|
|
247
|
-
# - name: funky_element
|
|
248
|
-
# display_name: Funky Element
|
|
249
|
-
# contents:
|
|
250
|
-
# - name: headline
|
|
251
|
-
# type: EssenceText
|
|
252
|
-
# - name: text
|
|
253
|
-
# type EssenceRichtext
|
|
254
|
-
# take_me_for_preview: true
|
|
255
|
-
#
|
|
256
|
-
# With "I want to tell you a funky story" as stripped_body for the EssenceRichtext Content produces:
|
|
257
|
-
#
|
|
258
|
-
# Funky Element: I want to tell ...
|
|
259
|
-
#
|
|
260
|
-
# Options:
|
|
261
|
-
#
|
|
262
|
-
# maxlength(integer). [Default 30] : Length of characters after the text will be cut off.
|
|
263
|
-
#
|
|
264
|
-
def display_name_with_preview_text(maxlength = 30)
|
|
265
|
-
"#{display_name}: #{preview_text(maxlength)}"
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
def dom_id
|
|
269
|
-
"#{name}_#{id}"
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
# List all elements by from page_layout
|
|
273
|
-
def self.elements_for_layout(layout)
|
|
274
|
-
element_descriptions = Element.descriptions
|
|
275
|
-
elements = []
|
|
276
|
-
page_layout = Alchemy::PageLayout.get(layout)
|
|
277
|
-
layout_elements = page_layout["elements"]
|
|
278
|
-
return element_descriptions if layout_elements == "all"
|
|
279
|
-
element_descriptions.each do |element|
|
|
280
|
-
if layout_elements.include?(element["name"])
|
|
281
|
-
elements << element
|
|
282
|
-
end
|
|
283
|
-
end
|
|
284
|
-
return elements
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
def self.get_from_clipboard(clipboard)
|
|
288
|
-
return nil if clipboard.blank?
|
|
289
|
-
self.find_by_id(clipboard[:element_id])
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
def self.all_from_clipboard(clipboard)
|
|
293
|
-
return [] if clipboard.nil?
|
|
294
|
-
self.find_all_by_id(clipboard.collect { |i| i[:id] })
|
|
295
|
-
end
|
|
296
|
-
|
|
297
|
-
def self.all_from_clipboard_for_page(clipboard, page)
|
|
298
|
-
return [] if clipboard.nil? || page.nil?
|
|
299
|
-
allowed_elements = self.all_for_page(page)
|
|
300
|
-
clipboard_elements = self.all_from_clipboard(clipboard)
|
|
301
|
-
allowed_element_names = allowed_elements.collect { |e| e['name'] }
|
|
302
|
-
clipboard_elements.select { |ce| allowed_element_names.include?(ce.name) }
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
# returns the collection of available essence_types that can be created for this element depending on its description in elements.yml
|
|
306
|
-
def available_contents
|
|
307
|
-
description['available_contents']
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
# Returns the contents ingredient for passed content name.
|
|
311
|
-
def ingredient(name)
|
|
312
|
-
content = content_by_name(name)
|
|
313
|
-
return nil if content.blank?
|
|
314
|
-
content.ingredient
|
|
315
|
-
end
|
|
316
|
-
|
|
317
|
-
def has_ingredient?(name)
|
|
318
|
-
!self.ingredient(name).blank?
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
def save_contents(params)
|
|
322
|
-
contents.each do |content|
|
|
323
|
-
unless content.save_essence(params[:contents]["content_#{content.id}"], :public => !params["public"].nil?)
|
|
324
|
-
errors.add(:base, :essence_validation_failed)
|
|
325
|
-
end
|
|
326
|
-
end
|
|
327
|
-
return errors.blank?
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
def essences
|
|
331
|
-
return [] if contents.blank?
|
|
332
|
-
contents.collect(&:essence)
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
# Returns all essence_errors in the format:
|
|
336
|
-
#
|
|
337
|
-
# {
|
|
338
|
-
# essence.content.name => [error_message_for_validation_1, error_message_for_validation_2]
|
|
339
|
-
# }
|
|
340
|
-
#
|
|
341
|
-
# Get translated error messages with Element#essence_error_messages
|
|
342
|
-
#
|
|
343
|
-
def essence_errors
|
|
344
|
-
essence_errors = {}
|
|
345
|
-
essences.each do |essence|
|
|
346
|
-
unless essence.essence_errors.blank?
|
|
347
|
-
essence_errors[essence.content.name] = essence.essence_errors
|
|
348
|
-
end
|
|
349
|
-
end
|
|
350
|
-
essence_errors
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
# Essence validation errors messages are translated via I18n.
|
|
354
|
-
# Inside your translation file add translations like:
|
|
355
|
-
#
|
|
356
|
-
# alchemy:
|
|
357
|
-
# content_validations:
|
|
358
|
-
# name_of_the_element:
|
|
359
|
-
# name_of_the_content:
|
|
360
|
-
# validation_error_type: Error Message
|
|
361
|
-
#
|
|
362
|
-
# validation_error_type has to be one of:
|
|
363
|
-
#
|
|
364
|
-
# * blank
|
|
365
|
-
# * taken
|
|
366
|
-
# * wrong_format
|
|
367
|
-
#
|
|
368
|
-
# Example:
|
|
369
|
-
#
|
|
370
|
-
# de:
|
|
371
|
-
# alchemy:
|
|
372
|
-
# content_validations:
|
|
373
|
-
# contact:
|
|
374
|
-
# email:
|
|
375
|
-
# wrong_format: 'Die Email hat nicht das richtige Format'
|
|
376
|
-
#
|
|
377
|
-
def essence_error_messages
|
|
378
|
-
messages = []
|
|
379
|
-
essence_errors.each do |content_name, errors|
|
|
380
|
-
errors.each do |error|
|
|
381
|
-
messages << I18n.t(
|
|
382
|
-
"alchemy.content_validations.#{self.name}.#{content_name}.#{error}",
|
|
383
|
-
:default => [
|
|
384
|
-
"alchemy.content_validations.fields.#{content_name}.#{error}".to_sym,
|
|
385
|
-
"alchemy.content_validations.errors.#{error}".to_sym
|
|
386
|
-
]
|
|
387
|
-
) % {:field => Content.translated_label_for(content_name)}
|
|
388
|
-
end
|
|
389
|
-
end
|
|
390
|
-
messages
|
|
391
|
-
end
|
|
392
|
-
|
|
393
|
-
def contents_with_errors
|
|
394
|
-
contents.select(&:essence_validation_failed?)
|
|
395
|
-
end
|
|
396
|
-
|
|
397
|
-
def has_validations?
|
|
398
|
-
!contents.detect(&:has_validations?).blank?
|
|
399
|
-
end
|
|
400
|
-
|
|
401
|
-
def rtf_contents
|
|
402
|
-
contents.select { |content| content.essence_type == 'EssenceRichtext' }
|
|
403
|
-
end
|
|
404
|
-
alias_method :richtext_contents, :rtf_contents
|
|
405
|
-
|
|
406
|
-
# The name of the cell the element could be placed in.
|
|
407
|
-
def belonging_cellnames(page)
|
|
408
|
-
cellnames = Cell.names_for_element(name)
|
|
409
|
-
if cellnames.blank? || !page.has_cells?
|
|
410
|
-
return ['for_other_elements']
|
|
411
|
-
else
|
|
412
|
-
return cellnames
|
|
413
|
-
end
|
|
414
|
-
end
|
|
415
|
-
|
|
416
|
-
private
|
|
417
|
-
|
|
418
|
-
# List all elements for page_layout
|
|
419
|
-
def self.all_for_page(page)
|
|
420
|
-
raise TypeError if page.class != Page
|
|
421
|
-
# if page_layout has cells, collect elements from cells and group them by cellname
|
|
422
|
-
page_layout = Alchemy::PageLayout.get(page.page_layout)
|
|
423
|
-
if page_layout.blank?
|
|
424
|
-
logger.warn "\n++++++\nWARNING! Could not find page_layout description for page: #{page.name}\n++++++++\n"
|
|
425
|
-
return []
|
|
426
|
-
end
|
|
427
|
-
elements_for_layout = []
|
|
428
|
-
elements_for_layout += all_definitions_for(page_layout['elements'])
|
|
429
|
-
return [] if elements_for_layout.blank?
|
|
430
|
-
# all unique elements from this layout
|
|
431
|
-
unique_elements = elements_for_layout.select{ |m| m["unique"] == true }
|
|
432
|
-
elements_already_on_the_page = page.elements
|
|
433
|
-
# delete all elements from the elements that could be placed that are unique and already and the page
|
|
434
|
-
unique_elements.each do |unique_element|
|
|
435
|
-
elements_already_on_the_page.each do |already_placed_element|
|
|
436
|
-
if already_placed_element.name == unique_element["name"]
|
|
437
|
-
elements_for_layout.delete(unique_element)
|
|
438
|
-
end
|
|
439
|
-
end
|
|
440
|
-
end
|
|
441
|
-
return elements_for_layout
|
|
442
|
-
end
|
|
443
|
-
|
|
444
|
-
def self.all_definitions_for(element_names)
|
|
445
|
-
return [] if element_names.blank?
|
|
446
|
-
if element_names.to_s == "all"
|
|
447
|
-
return element_descriptions
|
|
448
|
-
else
|
|
449
|
-
return definitions.select { |e| element_names.include? e['name'] }
|
|
450
|
-
end
|
|
451
|
-
end
|
|
452
|
-
|
|
453
|
-
# makes a copy of source and makes copies of the contents from source
|
|
454
|
-
def self.copy(source, differences = {})
|
|
455
|
-
attributes = source.attributes.except("id").merge(differences)
|
|
456
|
-
element = self.create!(attributes.merge(:create_contents_after_create => false, :id => nil, :position => nil))
|
|
457
|
-
source.contents.each do |content|
|
|
458
|
-
new_content = Content.copy(content, :element_id => element.id)
|
|
459
|
-
new_content.move_to_bottom
|
|
460
|
-
end
|
|
461
|
-
element
|
|
462
|
-
end
|
|
463
|
-
|
|
464
|
-
# creates the contents for this element as described in the elements.yml
|
|
465
|
-
def create_contents
|
|
466
|
-
contents = []
|
|
467
|
-
if description["contents"].blank?
|
|
468
|
-
logger.warn "\n++++++\nWARNING! Could not find any content descriptions for element: #{self.name}\n++++++++\n"
|
|
469
|
-
else
|
|
470
|
-
description["contents"].each do |content_hash|
|
|
471
|
-
contents << Content.create_from_scratch(self, content_hash.symbolize_keys)
|
|
472
|
-
end
|
|
473
|
-
end
|
|
474
|
-
end
|
|
475
|
-
|
|
476
|
-
end
|