nate-browsercms 3.0.210
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/LICENSE.txt +165 -0
- data/README.markdown +79 -0
- data/app/controllers/application_controller.rb +14 -0
- data/app/controllers/cms/application_controller.rb +78 -0
- data/app/controllers/cms/attachments_controller.rb +11 -0
- data/app/controllers/cms/base_controller.rb +13 -0
- data/app/controllers/cms/cache_controller.rb +22 -0
- data/app/controllers/cms/categories_controller.rb +2 -0
- data/app/controllers/cms/category_types_controller.rb +5 -0
- data/app/controllers/cms/connectors_controller.rb +63 -0
- data/app/controllers/cms/content_block_controller.rb +256 -0
- data/app/controllers/cms/content_controller.rb +211 -0
- data/app/controllers/cms/content_types_controller.rb +7 -0
- data/app/controllers/cms/dashboard_controller.rb +9 -0
- data/app/controllers/cms/dynamic_views_controller.rb +65 -0
- data/app/controllers/cms/email_messages_controller.rb +14 -0
- data/app/controllers/cms/email_page_portlet_controller.rb +14 -0
- data/app/controllers/cms/error_handling.rb +18 -0
- data/app/controllers/cms/file_blocks_controller.rb +2 -0
- data/app/controllers/cms/groups_controller.rb +26 -0
- data/app/controllers/cms/home_controller.rb +5 -0
- data/app/controllers/cms/html_blocks_controller.rb +2 -0
- data/app/controllers/cms/image_blocks_controller.rb +2 -0
- data/app/controllers/cms/links_controller.rb +59 -0
- data/app/controllers/cms/missing_asset_controller.rb +6 -0
- data/app/controllers/cms/page_route_conditions_controller.rb +2 -0
- data/app/controllers/cms/page_route_options_controller.rb +56 -0
- data/app/controllers/cms/page_route_requirements_controller.rb +2 -0
- data/app/controllers/cms/page_routes_controller.rb +45 -0
- data/app/controllers/cms/pages_controller.rb +124 -0
- data/app/controllers/cms/portlet_controller.rb +62 -0
- data/app/controllers/cms/portlets_controller.rb +32 -0
- data/app/controllers/cms/redirects_controller.rb +19 -0
- data/app/controllers/cms/resource_controller.rb +108 -0
- data/app/controllers/cms/routes_controller.rb +23 -0
- data/app/controllers/cms/section_nodes_controller.rb +40 -0
- data/app/controllers/cms/sections_controller.rb +125 -0
- data/app/controllers/cms/sessions_controller.rb +64 -0
- data/app/controllers/cms/tags_controller.rb +9 -0
- data/app/controllers/cms/tasks_controller.rb +52 -0
- data/app/controllers/cms/toolbar_controller.rb +12 -0
- data/app/controllers/cms/users_controller.rb +98 -0
- data/app/helpers/application_helper.rb +3 -0
- data/app/helpers/cms/application_helper.rb +187 -0
- data/app/helpers/cms/form_builder.rb +98 -0
- data/app/helpers/cms/form_tag_helper.rb +32 -0
- data/app/helpers/cms/menu_helper.rb +172 -0
- data/app/helpers/cms/page_helper.rb +60 -0
- data/app/helpers/cms/path_helper.rb +48 -0
- data/app/helpers/cms/section_nodes_helper.rb +13 -0
- data/app/models/abstract_file_block.rb +13 -0
- data/app/models/attachment.rb +203 -0
- data/app/models/category.rb +40 -0
- data/app/models/category_type.rb +34 -0
- data/app/models/connector.rb +72 -0
- data/app/models/content_type.rb +95 -0
- data/app/models/content_type_group.rb +3 -0
- data/app/models/dynamic_view.rb +73 -0
- data/app/models/email_message.rb +31 -0
- data/app/models/email_message_mailer.rb +11 -0
- data/app/models/file_block.rb +21 -0
- data/app/models/group.rb +30 -0
- data/app/models/group_permission.rb +7 -0
- data/app/models/group_section.rb +4 -0
- data/app/models/group_type.rb +12 -0
- data/app/models/group_type_permission.rb +4 -0
- data/app/models/guest_user.rb +39 -0
- data/app/models/html_block.rb +40 -0
- data/app/models/image_block.rb +22 -0
- data/app/models/link.rb +35 -0
- data/app/models/page.rb +293 -0
- data/app/models/page_partial.rb +22 -0
- data/app/models/page_route.rb +58 -0
- data/app/models/page_route_condition.rb +2 -0
- data/app/models/page_route_option.rb +3 -0
- data/app/models/page_route_requirement.rb +2 -0
- data/app/models/page_template.rb +48 -0
- data/app/models/permission.rb +10 -0
- data/app/models/portlet.rb +108 -0
- data/app/models/redirect.rb +4 -0
- data/app/models/section.rb +140 -0
- data/app/models/section_node.rb +101 -0
- data/app/models/site.rb +41 -0
- data/app/models/tag.rb +62 -0
- data/app/models/tagging.rb +9 -0
- data/app/models/task.rb +67 -0
- data/app/models/user.rb +125 -0
- data/app/models/user_group_membership.rb +4 -0
- data/app/portlets/dynamic_portlet.rb +7 -0
- data/app/portlets/email_page_portlet.rb +10 -0
- data/app/portlets/login_portlet.rb +10 -0
- data/app/portlets/tag_cloud_portlet.rb +13 -0
- data/app/views/cms/blocks/_hidden_fields.html.erb +10 -0
- data/app/views/cms/blocks/_toolbar.html.erb +9 -0
- data/app/views/cms/blocks/_toolbar_for_collection.html.erb +26 -0
- data/app/views/cms/blocks/_toolbar_for_member.html.erb +38 -0
- data/app/views/cms/blocks/edit.html.erb +25 -0
- data/app/views/cms/blocks/index.html.erb +122 -0
- data/app/views/cms/blocks/new.html.erb +21 -0
- data/app/views/cms/blocks/show.html.erb +30 -0
- data/app/views/cms/blocks/usages.html.erb +34 -0
- data/app/views/cms/blocks/versions.html.erb +102 -0
- data/app/views/cms/cache/show.html.erb +12 -0
- data/app/views/cms/categories/_form.html.erb +36 -0
- data/app/views/cms/category_types/_form.html.erb +1 -0
- data/app/views/cms/connectors/new.html.erb +71 -0
- data/app/views/cms/content/show.html.erb +21 -0
- data/app/views/cms/content_types/index.html.erb +14 -0
- data/app/views/cms/dashboard/_page_drafts.html.erb +49 -0
- data/app/views/cms/dashboard/_tasks.html.erb +54 -0
- data/app/views/cms/dashboard/index.html.erb +15 -0
- data/app/views/cms/dynamic_views/_form.html.erb +11 -0
- data/app/views/cms/dynamic_views/edit.html.erb +3 -0
- data/app/views/cms/dynamic_views/index.html.erb +48 -0
- data/app/views/cms/dynamic_views/new.html.erb +3 -0
- data/app/views/cms/email_messages/index.html.erb +41 -0
- data/app/views/cms/email_messages/show.html.erb +57 -0
- data/app/views/cms/file_blocks/_form.html.erb +30 -0
- data/app/views/cms/file_blocks/render.html.erb +5 -0
- data/app/views/cms/form_builder/_cms_date_picker.html.erb +12 -0
- data/app/views/cms/form_builder/_cms_drop_down.html.erb +19 -0
- data/app/views/cms/form_builder/_cms_file_field.html.erb +30 -0
- data/app/views/cms/form_builder/_cms_tag_list.html.erb +15 -0
- data/app/views/cms/form_builder/_cms_text_area.html.erb +13 -0
- data/app/views/cms/form_builder/_cms_text_editor.html.erb +18 -0
- data/app/views/cms/form_builder/_cms_text_field.html.erb +12 -0
- data/app/views/cms/groups/_form.html.erb +45 -0
- data/app/views/cms/groups/_permissions.html.erb +36 -0
- data/app/views/cms/groups/_sections.html.erb +18 -0
- data/app/views/cms/groups/edit.html.erb +4 -0
- data/app/views/cms/groups/index.html.erb +60 -0
- data/app/views/cms/groups/new.html.erb +4 -0
- data/app/views/cms/html_blocks/_form.html.erb +3 -0
- data/app/views/cms/html_blocks/render.html.erb +1 -0
- data/app/views/cms/image_blocks/_form.html.erb +30 -0
- data/app/views/cms/image_blocks/render.html.erb +1 -0
- data/app/views/cms/links/_form.html.erb +15 -0
- data/app/views/cms/links/destroy.js.rjs +2 -0
- data/app/views/cms/links/edit.html.erb +14 -0
- data/app/views/cms/links/new.html.erb +15 -0
- data/app/views/cms/page_routes/_form.html.erb +11 -0
- data/app/views/cms/page_routes/edit.html.erb +3 -0
- data/app/views/cms/page_routes/index.html.erb +50 -0
- data/app/views/cms/page_routes/new.html.erb +3 -0
- data/app/views/cms/page_routes/show.html.erb +14 -0
- data/app/views/cms/pages/_edit_connector.html.erb +16 -0
- data/app/views/cms/pages/_edit_container.html.erb +8 -0
- data/app/views/cms/pages/_form.html.erb +53 -0
- data/app/views/cms/pages/edit.html.erb +23 -0
- data/app/views/cms/pages/new.html.erb +36 -0
- data/app/views/cms/pages/versions.html.erb +82 -0
- data/app/views/cms/redirects/_form.html.erb +15 -0
- data/app/views/cms/redirects/edit.html.erb +3 -0
- data/app/views/cms/redirects/index.html.erb +45 -0
- data/app/views/cms/redirects/new.html.erb +3 -0
- data/app/views/cms/routes/index.html.erb +36 -0
- data/app/views/cms/section_nodes/_link.html.erb +11 -0
- data/app/views/cms/section_nodes/_node.html.erb +34 -0
- data/app/views/cms/section_nodes/_page.html.erb +14 -0
- data/app/views/cms/section_nodes/_section.html.erb +12 -0
- data/app/views/cms/section_nodes/_section_node.html.erb +10 -0
- data/app/views/cms/section_nodes/index.html.erb +31 -0
- data/app/views/cms/sections/_form.html.erb +58 -0
- data/app/views/cms/sections/_page.html.erb +4 -0
- data/app/views/cms/sections/_section.html.erb +8 -0
- data/app/views/cms/sections/destroy.js.rjs +2 -0
- data/app/views/cms/sections/edit.html.erb +10 -0
- data/app/views/cms/sections/file_browser.xml.builder +14 -0
- data/app/views/cms/sections/index.html.erb +23 -0
- data/app/views/cms/sections/new.html.erb +22 -0
- data/app/views/cms/sessions/new.html.erb +32 -0
- data/app/views/cms/shared/_admin_sidebar.html.erb +30 -0
- data/app/views/cms/shared/_exception.html.erb +6 -0
- data/app/views/cms/shared/_pagination.html.erb +31 -0
- data/app/views/cms/shared/_version_conflict_diff.html.erb +11 -0
- data/app/views/cms/shared/_version_conflict_error.html.erb +6 -0
- data/app/views/cms/shared/error.html.erb +40 -0
- data/app/views/cms/tags/_form.html.erb +1 -0
- data/app/views/cms/tags/render.html.erb +53 -0
- data/app/views/cms/tasks/new.html.erb +36 -0
- data/app/views/cms/toolbar/index.html.erb +12 -0
- data/app/views/cms/users/_form.html.erb +12 -0
- data/app/views/cms/users/_groups.html.erb +11 -0
- data/app/views/cms/users/_password.html.erb +8 -0
- data/app/views/cms/users/_toolbar.html.erb +20 -0
- data/app/views/cms/users/_user_fields.html.erb +20 -0
- data/app/views/cms/users/change_password.html.erb +19 -0
- data/app/views/cms/users/edit.html.erb +16 -0
- data/app/views/cms/users/index.html.erb +62 -0
- data/app/views/cms/users/new.html.erb +13 -0
- data/app/views/layouts/_cms_toolbar.html.erb +21 -0
- data/app/views/layouts/_page_toolbar.html.erb +86 -0
- data/app/views/layouts/application.html.erb +11 -0
- data/app/views/layouts/cms/_footer.erb +4 -0
- data/app/views/layouts/cms/_head.html.erb +21 -0
- data/app/views/layouts/cms/administration.html.erb +34 -0
- data/app/views/layouts/cms/application.html.erb +25 -0
- data/app/views/layouts/cms/content_library.html.erb +94 -0
- data/app/views/layouts/cms/dashboard.html.erb +16 -0
- data/app/views/layouts/cms/login.html.erb +30 -0
- data/app/views/layouts/cms/section_nodes.html.erb +20 -0
- data/app/views/layouts/cms/thickbox.html.erb +24 -0
- data/app/views/layouts/cms/toolbar.html.erb +23 -0
- data/app/views/portlets/dynamic/_form.html.erb +3 -0
- data/app/views/portlets/email_page/_form.html.erb +7 -0
- data/app/views/portlets/email_page/render.html.erb +17 -0
- data/app/views/portlets/login/_form.html.erb +6 -0
- data/app/views/portlets/login/render.html.erb +27 -0
- data/app/views/portlets/portlets/_form.html.erb +19 -0
- data/app/views/portlets/tag_cloud/_form.html.erb +4 -0
- data/app/views/portlets/tag_cloud/render.html.erb +5 -0
- data/db/demo/data.rb +96 -0
- data/db/demo/page_partials/_footer.html.erb +6 -0
- data/db/demo/page_partials/_header.html.erb +24 -0
- data/db/demo/page_templates/home_page.html.erb +49 -0
- data/db/demo/page_templates/sub_page.html.erb +37 -0
- data/db/migrate/20080815014337_create_users.rb +24 -0
- data/db/migrate/20080815014733_create_dynamic_views.rb +17 -0
- data/db/migrate/20080815014735_create_pages.rb +21 -0
- data/db/migrate/20080815014736_create_content_type_groups.rb +14 -0
- data/db/migrate/20080815014737_create_content_types.rb +14 -0
- data/db/migrate/20080815014738_create_category_types.rb +14 -0
- data/db/migrate/20080815014739_create_categories.rb +16 -0
- data/db/migrate/20080815214539_create_connectors.rb +19 -0
- data/db/migrate/20080815220350_create_html_blocks.rb +13 -0
- data/db/migrate/20080819193254_create_sections.rb +15 -0
- data/db/migrate/20080819213733_create_portlets.rb +25 -0
- data/db/migrate/20080917222336_create_redirects.rb +14 -0
- data/db/migrate/20080922203815_create_attachments.rb +16 -0
- data/db/migrate/20080922215729_create_file_blocks.rb +16 -0
- data/db/migrate/20081007190155_create_group_types.rb +15 -0
- data/db/migrate/20081007190156_create_groups.rb +20 -0
- data/db/migrate/20081008182341_create_permissions.rb +28 -0
- data/db/migrate/20081009202349_create_group_sections.rb +12 -0
- data/db/migrate/20081013181547_create_sites.rb +15 -0
- data/db/migrate/20081020152051_create_section_nodes.rb +16 -0
- data/db/migrate/20081031140510_create_links.rb +15 -0
- data/db/migrate/20081031140511_create_tags.rb +14 -0
- data/db/migrate/20081031140512_create_taggings.rb +16 -0
- data/db/migrate/20081114172307_load_seed_data.rb +92 -0
- data/db/migrate/20090130171546_create_email_messages.rb +20 -0
- data/db/migrate/20090212164201_create_tasks.rb +18 -0
- data/db/migrate/20090410193133_create_page_routes.rb +16 -0
- data/db/migrate/20090410193312_create_page_route_options.rb +16 -0
- data/lib/acts_as_list.rb +252 -0
- data/lib/browser_cms.rb +12 -0
- data/lib/cms/acts/content_block.rb +31 -0
- data/lib/cms/authentication/controller.rb +194 -0
- data/lib/cms/authentication/model.rb +116 -0
- data/lib/cms/behaviors/archiving.rb +43 -0
- data/lib/cms/behaviors/attaching.rb +179 -0
- data/lib/cms/behaviors/categorizing.rb +31 -0
- data/lib/cms/behaviors/connecting.rb +94 -0
- data/lib/cms/behaviors/dynamic_attributes.rb +362 -0
- data/lib/cms/behaviors/flush_cache_on_change.rb +33 -0
- data/lib/cms/behaviors/hiding.rb +46 -0
- data/lib/cms/behaviors/pagination.rb +209 -0
- data/lib/cms/behaviors/publishing.rb +84 -0
- data/lib/cms/behaviors/rendering.rb +133 -0
- data/lib/cms/behaviors/searching.rb +49 -0
- data/lib/cms/behaviors/soft_deleting.rb +73 -0
- data/lib/cms/behaviors/taggable.rb +56 -0
- data/lib/cms/behaviors/userstamping.rb +37 -0
- data/lib/cms/behaviors/versioning.rb +172 -0
- data/lib/cms/behaviors.rb +33 -0
- data/lib/cms/caching.rb +20 -0
- data/lib/cms/data_loader.rb +28 -0
- data/lib/cms/extensions/action_view/base.rb +13 -0
- data/lib/cms/extensions/active_record/base.rb +16 -0
- data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +63 -0
- data/lib/cms/extensions/active_record/errors.rb +12 -0
- data/lib/cms/extensions/active_support/cache/file_store.rb +9 -0
- data/lib/cms/extensions/hash.rb +21 -0
- data/lib/cms/extensions/integer.rb +16 -0
- data/lib/cms/extensions/nil.rb +19 -0
- data/lib/cms/extensions/string.rb +19 -0
- data/lib/cms/extensions.rb +4 -0
- data/lib/cms/init.rb +85 -0
- data/lib/cms/routes.rb +131 -0
- data/lib/initial_data.rb +30 -0
- data/lib/sequence.rb +6 -0
- data/lib/tasks/cms.rake +94 -0
- data/lib/tasks/db.rake +67 -0
- data/lib/tasks/dev.rake +20 -0
- data/public/fckeditor/editor/css/behaviors/disablehandles.htc +15 -0
- data/public/fckeditor/editor/css/behaviors/showtableborders.htc +36 -0
- data/public/fckeditor/editor/css/fck_editorarea.css +110 -0
- data/public/fckeditor/editor/css/fck_internal.css +199 -0
- data/public/fckeditor/editor/css/fck_showtableborders_gecko.css +49 -0
- data/public/fckeditor/editor/css/images/block_address.png +0 -0
- data/public/fckeditor/editor/css/images/block_blockquote.png +0 -0
- data/public/fckeditor/editor/css/images/block_div.png +0 -0
- data/public/fckeditor/editor/css/images/block_h1.png +0 -0
- data/public/fckeditor/editor/css/images/block_h2.png +0 -0
- data/public/fckeditor/editor/css/images/block_h3.png +0 -0
- data/public/fckeditor/editor/css/images/block_h4.png +0 -0
- data/public/fckeditor/editor/css/images/block_h5.png +0 -0
- data/public/fckeditor/editor/css/images/block_h6.png +0 -0
- data/public/fckeditor/editor/css/images/block_p.png +0 -0
- data/public/fckeditor/editor/css/images/block_pre.png +0 -0
- data/public/fckeditor/editor/css/images/fck_anchor.gif +0 -0
- data/public/fckeditor/editor/css/images/fck_flashlogo.gif +0 -0
- data/public/fckeditor/editor/css/images/fck_hiddenfield.gif +0 -0
- data/public/fckeditor/editor/css/images/fck_pagebreak.gif +0 -0
- data/public/fckeditor/editor/css/images/fck_plugin.gif +0 -0
- data/public/fckeditor/editor/dialog/common/fck_dialog_common.css +85 -0
- data/public/fckeditor/editor/dialog/common/fck_dialog_common.js +311 -0
- data/public/fckeditor/editor/dialog/common/images/locked.gif +0 -0
- data/public/fckeditor/editor/dialog/common/images/reset.gif +0 -0
- data/public/fckeditor/editor/dialog/common/images/unlocked.gif +0 -0
- data/public/fckeditor/editor/dialog/fck_about/logo_fckeditor.gif +0 -0
- data/public/fckeditor/editor/dialog/fck_about/logo_fredck.gif +0 -0
- data/public/fckeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif +0 -0
- data/public/fckeditor/editor/dialog/fck_about.html +161 -0
- data/public/fckeditor/editor/dialog/fck_anchor.html +220 -0
- data/public/fckeditor/editor/dialog/fck_button.html +104 -0
- data/public/fckeditor/editor/dialog/fck_checkbox.html +104 -0
- data/public/fckeditor/editor/dialog/fck_colorselector.html +172 -0
- data/public/fckeditor/editor/dialog/fck_div.html +364 -0
- data/public/fckeditor/editor/dialog/fck_docprops/fck_document_preview.html +113 -0
- data/public/fckeditor/editor/dialog/fck_docprops.html +600 -0
- data/public/fckeditor/editor/dialog/fck_flash/fck_flash.js +300 -0
- data/public/fckeditor/editor/dialog/fck_flash/fck_flash_preview.html +50 -0
- data/public/fckeditor/editor/dialog/fck_flash.html +152 -0
- data/public/fckeditor/editor/dialog/fck_form.html +109 -0
- data/public/fckeditor/editor/dialog/fck_hiddenfield.html +115 -0
- data/public/fckeditor/editor/dialog/fck_image/fck_image.js +512 -0
- data/public/fckeditor/editor/dialog/fck_image/fck_image_preview.html +72 -0
- data/public/fckeditor/editor/dialog/fck_image.html +258 -0
- data/public/fckeditor/editor/dialog/fck_link/fck_link.js +893 -0
- data/public/fckeditor/editor/dialog/fck_link.html +295 -0
- data/public/fckeditor/editor/dialog/fck_listprop.html +120 -0
- data/public/fckeditor/editor/dialog/fck_paste.html +346 -0
- data/public/fckeditor/editor/dialog/fck_radiobutton.html +104 -0
- data/public/fckeditor/editor/dialog/fck_replace.html +648 -0
- data/public/fckeditor/editor/dialog/fck_select/fck_select.js +194 -0
- data/public/fckeditor/editor/dialog/fck_select.html +180 -0
- data/public/fckeditor/editor/dialog/fck_smiley.html +111 -0
- data/public/fckeditor/editor/dialog/fck_source.html +68 -0
- data/public/fckeditor/editor/dialog/fck_specialchar.html +121 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html +0 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js +87 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html +153 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm +148 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php +199 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl +181 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js +461 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html +71 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css +49 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js +272 -0
- data/public/fckeditor/editor/dialog/fck_spellerpages.html +70 -0
- data/public/fckeditor/editor/dialog/fck_table.html +298 -0
- data/public/fckeditor/editor/dialog/fck_tablecell.html +257 -0
- data/public/fckeditor/editor/dialog/fck_template/images/template1.gif +0 -0
- data/public/fckeditor/editor/dialog/fck_template/images/template2.gif +0 -0
- data/public/fckeditor/editor/dialog/fck_template/images/template3.gif +0 -0
- data/public/fckeditor/editor/dialog/fck_template.html +242 -0
- data/public/fckeditor/editor/dialog/fck_textarea.html +94 -0
- data/public/fckeditor/editor/dialog/fck_textfield.html +136 -0
- data/public/fckeditor/editor/dtd/fck_dtd_test.html +41 -0
- data/public/fckeditor/editor/dtd/fck_xhtml10strict.js +116 -0
- data/public/fckeditor/editor/dtd/fck_xhtml10transitional.js +140 -0
- data/public/fckeditor/editor/fckdebug.html +153 -0
- data/public/fckeditor/editor/fckdialog.html +812 -0
- data/public/fckeditor/editor/fckeditor.html +317 -0
- data/public/fckeditor/editor/fckeditor.original.html +424 -0
- data/public/fckeditor/editor/filemanager/browser/default/browser.css +87 -0
- data/public/fckeditor/editor/filemanager/browser/default/browser.html +200 -0
- data/public/fckeditor/editor/filemanager/browser/default/frmactualfolder.html +95 -0
- data/public/fckeditor/editor/filemanager/browser/default/frmcreatefolder.html +114 -0
- data/public/fckeditor/editor/filemanager/browser/default/frmfolders.html +198 -0
- data/public/fckeditor/editor/filemanager/browser/default/frmresourceslist.html +169 -0
- data/public/fckeditor/editor/filemanager/browser/default/frmresourcetype.html +68 -0
- data/public/fckeditor/editor/filemanager/browser/default/frmupload.html +115 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/Folder.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/Folder32.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/FolderUp.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/ai.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/avi.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/cs.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/dll.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/doc.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/exe.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/fla.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/gif.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/htm.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/html.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/js.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/png.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/swf.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/swt.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/txt.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/xls.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/xml.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/icons/zip.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/images/spacer.gif +0 -0
- data/public/fckeditor/editor/filemanager/browser/default/js/common.js +88 -0
- data/public/fckeditor/editor/filemanager/browser/default/js/fckxml.js +147 -0
- data/public/fckeditor/editor/images/anchor.gif +0 -0
- data/public/fckeditor/editor/images/arrow_ltr.gif +0 -0
- data/public/fckeditor/editor/images/arrow_rtl.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/angel_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/angry_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/broken_heart.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/cake.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/confused_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/cry_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/devil_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/embaressed_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/envelope.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/heart.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/kiss.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/lightbulb.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/omg_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/regular_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/sad_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/shades_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/teeth_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/thumbs_down.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/thumbs_up.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/tounge_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif +0 -0
- data/public/fckeditor/editor/images/smiley/msn/wink_smile.gif +0 -0
- data/public/fckeditor/editor/images/spacer.gif +0 -0
- data/public/fckeditor/editor/js/fckadobeair.js +176 -0
- data/public/fckeditor/editor/js/fckeditorcode_gecko.js +108 -0
- data/public/fckeditor/editor/js/fckeditorcode_ie.js +109 -0
- data/public/fckeditor/editor/lang/_translationstatus.txt +78 -0
- data/public/fckeditor/editor/lang/af.js +526 -0
- data/public/fckeditor/editor/lang/ar.js +526 -0
- data/public/fckeditor/editor/lang/bg.js +526 -0
- data/public/fckeditor/editor/lang/bn.js +526 -0
- data/public/fckeditor/editor/lang/bs.js +526 -0
- data/public/fckeditor/editor/lang/ca.js +526 -0
- data/public/fckeditor/editor/lang/cs.js +526 -0
- data/public/fckeditor/editor/lang/da.js +526 -0
- data/public/fckeditor/editor/lang/de.js +526 -0
- data/public/fckeditor/editor/lang/el.js +526 -0
- data/public/fckeditor/editor/lang/en-au.js +526 -0
- data/public/fckeditor/editor/lang/en-ca.js +526 -0
- data/public/fckeditor/editor/lang/en-uk.js +526 -0
- data/public/fckeditor/editor/lang/en.js +526 -0
- data/public/fckeditor/editor/lang/eo.js +526 -0
- data/public/fckeditor/editor/lang/es.js +526 -0
- data/public/fckeditor/editor/lang/et.js +526 -0
- data/public/fckeditor/editor/lang/eu.js +527 -0
- data/public/fckeditor/editor/lang/fa.js +526 -0
- data/public/fckeditor/editor/lang/fi.js +526 -0
- data/public/fckeditor/editor/lang/fo.js +526 -0
- data/public/fckeditor/editor/lang/fr-ca.js +526 -0
- data/public/fckeditor/editor/lang/fr.js +526 -0
- data/public/fckeditor/editor/lang/gl.js +526 -0
- data/public/fckeditor/editor/lang/gu.js +526 -0
- data/public/fckeditor/editor/lang/he.js +526 -0
- data/public/fckeditor/editor/lang/hi.js +526 -0
- data/public/fckeditor/editor/lang/hr.js +526 -0
- data/public/fckeditor/editor/lang/hu.js +526 -0
- data/public/fckeditor/editor/lang/it.js +526 -0
- data/public/fckeditor/editor/lang/ja.js +526 -0
- data/public/fckeditor/editor/lang/km.js +526 -0
- data/public/fckeditor/editor/lang/ko.js +526 -0
- data/public/fckeditor/editor/lang/lt.js +526 -0
- data/public/fckeditor/editor/lang/lv.js +526 -0
- data/public/fckeditor/editor/lang/mn.js +526 -0
- data/public/fckeditor/editor/lang/ms.js +526 -0
- data/public/fckeditor/editor/lang/nb.js +526 -0
- data/public/fckeditor/editor/lang/nl.js +526 -0
- data/public/fckeditor/editor/lang/no.js +526 -0
- data/public/fckeditor/editor/lang/pl.js +526 -0
- data/public/fckeditor/editor/lang/pt-br.js +526 -0
- data/public/fckeditor/editor/lang/pt.js +526 -0
- data/public/fckeditor/editor/lang/ro.js +526 -0
- data/public/fckeditor/editor/lang/ru.js +526 -0
- data/public/fckeditor/editor/lang/sk.js +526 -0
- data/public/fckeditor/editor/lang/sl.js +526 -0
- data/public/fckeditor/editor/lang/sr-latn.js +526 -0
- data/public/fckeditor/editor/lang/sr.js +526 -0
- data/public/fckeditor/editor/lang/sv.js +526 -0
- data/public/fckeditor/editor/lang/th.js +526 -0
- data/public/fckeditor/editor/lang/tr.js +526 -0
- data/public/fckeditor/editor/lang/uk.js +526 -0
- data/public/fckeditor/editor/lang/vi.js +526 -0
- data/public/fckeditor/editor/lang/zh-cn.js +526 -0
- data/public/fckeditor/editor/lang/zh.js +526 -0
- data/public/fckeditor/editor/plugins/autogrow/fckplugin.js +99 -0
- data/public/fckeditor/editor/plugins/bbcode/_sample/sample.config.js +26 -0
- data/public/fckeditor/editor/plugins/bbcode/_sample/sample.html +67 -0
- data/public/fckeditor/editor/plugins/bbcode/fckplugin.js +123 -0
- data/public/fckeditor/editor/plugins/dragresizetable/fckplugin.js +524 -0
- data/public/fckeditor/editor/plugins/placeholder/fck_placeholder.html +105 -0
- data/public/fckeditor/editor/plugins/placeholder/fckplugin.js +187 -0
- data/public/fckeditor/editor/plugins/placeholder/lang/de.js +27 -0
- data/public/fckeditor/editor/plugins/placeholder/lang/en.js +27 -0
- data/public/fckeditor/editor/plugins/placeholder/lang/es.js +27 -0
- data/public/fckeditor/editor/plugins/placeholder/lang/fr.js +27 -0
- data/public/fckeditor/editor/plugins/placeholder/lang/it.js +27 -0
- data/public/fckeditor/editor/plugins/placeholder/lang/pl.js +27 -0
- data/public/fckeditor/editor/plugins/placeholder/placeholder.gif +0 -0
- data/public/fckeditor/editor/plugins/simplecommands/fckplugin.js +29 -0
- data/public/fckeditor/editor/plugins/tablecommands/fckplugin.js +33 -0
- data/public/fckeditor/editor/skins/_fckviewstrips.html +121 -0
- data/public/fckeditor/editor/skins/default/fck_dialog.css +402 -0
- data/public/fckeditor/editor/skins/default/fck_dialog_ie6.js +110 -0
- data/public/fckeditor/editor/skins/default/fck_editor.css +464 -0
- data/public/fckeditor/editor/skins/default/fck_strip.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/dialog.sides.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/dialog.sides.png +0 -0
- data/public/fckeditor/editor/skins/default/images/dialog.sides.rtl.png +0 -0
- data/public/fckeditor/editor/skins/default/images/sprites.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/sprites.png +0 -0
- data/public/fckeditor/editor/skins/default/images/toolbar.arrowright.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/toolbar.collapse.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/toolbar.end.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/toolbar.expand.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/toolbar.separator.gif +0 -0
- data/public/fckeditor/editor/skins/default/images/toolbar.start.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/fck_dialog.css +402 -0
- data/public/fckeditor/editor/skins/office2003/fck_dialog_ie6.js +110 -0
- data/public/fckeditor/editor/skins/office2003/fck_editor.css +476 -0
- data/public/fckeditor/editor/skins/office2003/fck_strip.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/dialog.sides.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/dialog.sides.png +0 -0
- data/public/fckeditor/editor/skins/office2003/images/dialog.sides.rtl.png +0 -0
- data/public/fckeditor/editor/skins/office2003/images/sprites.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/sprites.png +0 -0
- data/public/fckeditor/editor/skins/office2003/images/toolbar.arrowright.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/toolbar.bg.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/toolbar.collapse.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/toolbar.end.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/toolbar.expand.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/toolbar.separator.gif +0 -0
- data/public/fckeditor/editor/skins/office2003/images/toolbar.start.gif +0 -0
- data/public/fckeditor/editor/skins/silver/fck_dialog.css +402 -0
- data/public/fckeditor/editor/skins/silver/fck_dialog_ie6.js +110 -0
- data/public/fckeditor/editor/skins/silver/fck_editor.css +473 -0
- data/public/fckeditor/editor/skins/silver/fck_strip.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/dialog.sides.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/dialog.sides.png +0 -0
- data/public/fckeditor/editor/skins/silver/images/dialog.sides.rtl.png +0 -0
- data/public/fckeditor/editor/skins/silver/images/sprites.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/sprites.png +0 -0
- data/public/fckeditor/editor/skins/silver/images/toolbar.arrowright.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/toolbar.buttonarrow.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/toolbar.buttonbg.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/toolbar.collapse.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/toolbar.end.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/toolbar.expand.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/toolbar.separator.gif +0 -0
- data/public/fckeditor/editor/skins/silver/images/toolbar.start.gif +0 -0
- data/public/fckeditor/fckconfig.js +364 -0
- data/public/fckeditor/fckdebug.html +153 -0
- data/public/fckeditor/fckdialog.html +812 -0
- data/public/fckeditor/fckeditor.html +317 -0
- data/public/fckeditor/fckeditor.js +328 -0
- data/public/fckeditor/fckeditor.original.html +424 -0
- data/public/fckeditor/fckpackager.xml +262 -0
- data/public/fckeditor/fckstyles.xml +111 -0
- data/public/fckeditor/fcktemplates.xml +103 -0
- data/public/images/cms/administration/user_browser_bg.gif +0 -0
- data/public/images/cms/bg.png +0 -0
- data/public/images/cms/bl_curve.png +0 -0
- data/public/images/cms/bottom_cap.png +0 -0
- data/public/images/cms/bottom_cap_content.png +0 -0
- data/public/images/cms/browse.gif +0 -0
- data/public/images/cms/browser_media_logo.png +0 -0
- data/public/images/cms/browsercms_logo.png +0 -0
- data/public/images/cms/buttons/button.png +0 -0
- data/public/images/cms/buttons/button_bg.png +0 -0
- data/public/images/cms/buttons/button_cap.png +0 -0
- data/public/images/cms/buttons/button_cap_h.png +0 -0
- data/public/images/cms/buttons/button_cap_off.gif +0 -0
- data/public/images/cms/buttons/button_h.png +0 -0
- data/public/images/cms/buttons/button_off.png +0 -0
- data/public/images/cms/buttons/delete_x.png +0 -0
- data/public/images/cms/buttons/delete_x_disabled.png +0 -0
- data/public/images/cms/buttons/delete_x_h.png +0 -0
- data/public/images/cms/buttons/sm_button.gif +0 -0
- data/public/images/cms/buttons/sm_button_2.gif +0 -0
- data/public/images/cms/buttons/sm_button_2_h.gif +0 -0
- data/public/images/cms/buttons/sm_button_h.gif +0 -0
- data/public/images/cms/containers/add.gif +0 -0
- data/public/images/cms/containers/alpha.png +0 -0
- data/public/images/cms/containers/beta.png +0 -0
- data/public/images/cms/containers/delete.gif +0 -0
- data/public/images/cms/containers/down.gif +0 -0
- data/public/images/cms/containers/edit.gif +0 -0
- data/public/images/cms/containers/up.gif +0 -0
- data/public/images/cms/containers/view.gif +0 -0
- data/public/images/cms/content_bg.gif +0 -0
- data/public/images/cms/dashboard/bottom_cap.png +0 -0
- data/public/images/cms/dashboard/bottom_cap_content.png +0 -0
- data/public/images/cms/dashboard/header_bg.gif +0 -0
- data/public/images/cms/dashboard/header_left_bg.gif +0 -0
- data/public/images/cms/dashboard/table_header_bg.gif +0 -0
- data/public/images/cms/dashboard/top_cap.png +0 -0
- data/public/images/cms/dashed.gif +0 -0
- data/public/images/cms/datepicker/clear.gif +0 -0
- data/public/images/cms/datepicker/close.gif +0 -0
- data/public/images/cms/dk_button_l.gif +0 -0
- data/public/images/cms/dk_button_r.gif +0 -0
- data/public/images/cms/dot.png +0 -0
- data/public/images/cms/draft_status.gif +0 -0
- data/public/images/cms/gray_long_bg.gif +0 -0
- data/public/images/cms/icons/actions/add.png +0 -0
- data/public/images/cms/icons/actions/config.png +0 -0
- data/public/images/cms/icons/actions/connect.png +0 -0
- data/public/images/cms/icons/actions/delete.png +0 -0
- data/public/images/cms/icons/actions/down.png +0 -0
- data/public/images/cms/icons/actions/edit.png +0 -0
- data/public/images/cms/icons/actions/folder.png +0 -0
- data/public/images/cms/icons/actions/folder_add.png +0 -0
- data/public/images/cms/icons/actions/folder_delete.png +0 -0
- data/public/images/cms/icons/actions/folder_edit.png +0 -0
- data/public/images/cms/icons/actions/folder_move.png +0 -0
- data/public/images/cms/icons/actions/folder_open.png +0 -0
- data/public/images/cms/icons/actions/history.png +0 -0
- data/public/images/cms/icons/actions/home.png +0 -0
- data/public/images/cms/icons/actions/left.png +0 -0
- data/public/images/cms/icons/actions/link.png +0 -0
- data/public/images/cms/icons/actions/page.png +0 -0
- data/public/images/cms/icons/actions/page_add.png +0 -0
- data/public/images/cms/icons/actions/page_edit.png +0 -0
- data/public/images/cms/icons/actions/page_move.png +0 -0
- data/public/images/cms/icons/actions/redo.png +0 -0
- data/public/images/cms/icons/actions/refresh.png +0 -0
- data/public/images/cms/icons/actions/right.png +0 -0
- data/public/images/cms/icons/actions/root_folder.png +0 -0
- data/public/images/cms/icons/actions/root_link.png +0 -0
- data/public/images/cms/icons/actions/root_page.png +0 -0
- data/public/images/cms/icons/actions/undo.png +0 -0
- data/public/images/cms/icons/actions/up.png +0 -0
- data/public/images/cms/icons/actions/view.png +0 -0
- data/public/images/cms/icons/file_types/doc.png +0 -0
- data/public/images/cms/icons/file_types/file.png +0 -0
- data/public/images/cms/icons/file_types/gif.png +0 -0
- data/public/images/cms/icons/file_types/htm.png +0 -0
- data/public/images/cms/icons/file_types/pdf.png +0 -0
- data/public/images/cms/icons/file_types/ppt.png +0 -0
- data/public/images/cms/icons/file_types/swf.png +0 -0
- data/public/images/cms/icons/file_types/txt.png +0 -0
- data/public/images/cms/icons/file_types/xls.png +0 -0
- data/public/images/cms/icons/file_types/xml.png +0 -0
- data/public/images/cms/icons/file_types/zip.png +0 -0
- data/public/images/cms/icons/status/archived.gif +0 -0
- data/public/images/cms/icons/status/draft.gif +0 -0
- data/public/images/cms/icons/status/hidden.gif +0 -0
- data/public/images/cms/icons/status/locked.gif +0 -0
- data/public/images/cms/icons/status/published.gif +0 -0
- data/public/images/cms/icons/status/unlocked.gif +0 -0
- data/public/images/cms/icons/user.png +0 -0
- data/public/images/cms/login_bg.jpg +0 -0
- data/public/images/cms/login_bottom.jpg +0 -0
- data/public/images/cms/login_top.gif +0 -0
- data/public/images/cms/lt_button_bg.gif +0 -0
- data/public/images/cms/lt_button_l.gif +0 -0
- data/public/images/cms/lt_button_r.gif +0 -0
- data/public/images/cms/menu/block_cap_h.gif +0 -0
- data/public/images/cms/menu/bottom_cap.png +0 -0
- data/public/images/cms/menu/bottom_cap_menu.png +0 -0
- data/public/images/cms/menu/bottom_cap_menu_first.png +0 -0
- data/public/images/cms/menu/menu_header_first_bg.gif +0 -0
- data/public/images/cms/menu/selected_block_cap.gif +0 -0
- data/public/images/cms/menu/top_cap.png +0 -0
- data/public/images/cms/menu/top_cap_menu_header.png +0 -0
- data/public/images/cms/menu.png +0 -0
- data/public/images/cms/menu_h.gif +0 -0
- data/public/images/cms/menu_header.png +0 -0
- data/public/images/cms/menu_open.png +0 -0
- data/public/images/cms/menu_open_bg.gif +0 -0
- data/public/images/cms/nav/on_bg.gif +0 -0
- data/public/images/cms/nav.png +0 -0
- data/public/images/cms/nav_cap.png +0 -0
- data/public/images/cms/nav_cap_h.gif +0 -0
- data/public/images/cms/nav_h.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_bg.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_bg.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_draft_bg.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_draft_l.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_draft_r.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_l.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_published_bg.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_published_l.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_published_r.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_r.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_l.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_r.gif +0 -0
- data/public/images/cms/page_toolbar/status_draft_bg.gif +0 -0
- data/public/images/cms/page_toolbar/status_draft_l.gif +0 -0
- data/public/images/cms/page_toolbar/status_l.gif +0 -0
- data/public/images/cms/page_toolbar/status_published_bg.gif +0 -0
- data/public/images/cms/page_toolbar/status_published_l.gif +0 -0
- data/public/images/cms/page_toolbar/visual_editor_bg.gif +0 -0
- data/public/images/cms/page_toolbar/visual_editor_end.gif +0 -0
- data/public/images/cms/page_toolbar/visual_editor_r.gif +0 -0
- data/public/images/cms/page_toolbar/visual_editor_state_bg.gif +0 -0
- data/public/images/cms/pages/add_connectable.gif +0 -0
- data/public/images/cms/pages/connect_connectable.gif +0 -0
- data/public/images/cms/pages/container_border.gif +0 -0
- data/public/images/cms/pages/container_border_l.gif +0 -0
- data/public/images/cms/pages/container_border_r.gif +0 -0
- data/public/images/cms/pages/delete_connectable.gif +0 -0
- data/public/images/cms/pages/down_connectable.gif +0 -0
- data/public/images/cms/pages/down_connectable_disabled.gif +0 -0
- data/public/images/cms/pages/edit_connectable.gif +0 -0
- data/public/images/cms/pages/edit_connectable_2.gif +0 -0
- data/public/images/cms/pages/show_connectable.gif +0 -0
- data/public/images/cms/pages/up_connectable.gif +0 -0
- data/public/images/cms/pages/up_connectable_disabled.gif +0 -0
- data/public/images/cms/pagination/first.gif +0 -0
- data/public/images/cms/pagination/first_h.gif +0 -0
- data/public/images/cms/pagination/input.gif +0 -0
- data/public/images/cms/pagination/last.gif +0 -0
- data/public/images/cms/pagination/last_h.gif +0 -0
- data/public/images/cms/pagination/next.gif +0 -0
- data/public/images/cms/pagination/next_h.gif +0 -0
- data/public/images/cms/pagination/previous.gif +0 -0
- data/public/images/cms/pagination/previous_h.gif +0 -0
- data/public/images/cms/published_status.gif +0 -0
- data/public/images/cms/search.png +0 -0
- data/public/images/cms/search_submit.gif +0 -0
- data/public/images/cms/search_submit_h.gif +0 -0
- data/public/images/cms/searchbox_gradient.gif +0 -0
- data/public/images/cms/select_bg.gif +0 -0
- data/public/images/cms/select_bg_2.gif +0 -0
- data/public/images/cms/sitemap/bottom_cap.png +0 -0
- data/public/images/cms/sitemap/buffer_caps.png +0 -0
- data/public/images/cms/sitemap/contract.png +0 -0
- data/public/images/cms/sitemap/corners.gif +0 -0
- data/public/images/cms/sitemap/corners_hover.gif +0 -0
- data/public/images/cms/sitemap/divider.gif +0 -0
- data/public/images/cms/sitemap/expand.png +0 -0
- data/public/images/cms/sitemap/gradient.gif +0 -0
- data/public/images/cms/sitemap/gray_contract.png +0 -0
- data/public/images/cms/sitemap/gray_expand.png +0 -0
- data/public/images/cms/sitemap/no_contents.png +0 -0
- data/public/images/cms/sitemap/site_root_cap.png +0 -0
- data/public/images/cms/sitemap/tooltip.gif +0 -0
- data/public/images/cms/sitemap/top_cap_content.png +0 -0
- data/public/images/cms/solid.gif +0 -0
- data/public/images/cms/table/bl.gif +0 -0
- data/public/images/cms/table/br.gif +0 -0
- data/public/images/cms/table/divider.gif +0 -0
- data/public/images/cms/table/td_cap_first_h.gif +0 -0
- data/public/images/cms/table/td_cap_first_s.gif +0 -0
- data/public/images/cms/table/td_cap_last_h.gif +0 -0
- data/public/images/cms/table/td_cap_last_s.gif +0 -0
- data/public/images/cms/table/td_last_bg.gif +0 -0
- data/public/images/cms/table/th_bg.gif +0 -0
- data/public/images/cms/table/th_divider.gif +0 -0
- data/public/images/cms/table/th_last_bg.gif +0 -0
- data/public/images/cms/table/tl.gif +0 -0
- data/public/images/cms/table/tr.gif +0 -0
- data/public/images/cms/table/tr_bg.gif +0 -0
- data/public/images/cms/thickbox/loadingAnimation.gif +0 -0
- data/public/images/cms/thickbox/macFFBgHack.png +0 -0
- data/public/images/cms/toolbar_bg.png +0 -0
- data/public/images/cms/top_cap.png +0 -0
- data/public/images/cms/top_cap_content.png +0 -0
- data/public/images/cms/top_cap_menu_header.png +0 -0
- data/public/images/cms/user_search_submit.gif +0 -0
- data/public/images/cms/usercontrols_bg.png +0 -0
- data/public/images/cms/usercontrols_bg_cap.png +0 -0
- data/public/javascripts/cms/application.js +145 -0
- data/public/javascripts/cms/editor.js +56 -0
- data/public/javascripts/cms/sitemap.js +426 -0
- data/public/javascripts/jquery-ui.js +591 -0
- data/public/javascripts/jquery.contextMenu.js +211 -0
- data/public/javascripts/jquery.cookie.js +96 -0
- data/public/javascripts/jquery.dimensions.js +119 -0
- data/public/javascripts/jquery.js +11 -0
- data/public/javascripts/jquery.selectbox-0.5.js +209 -0
- data/public/javascripts/jquery.taglist.js +136 -0
- data/public/javascripts/jquery.thickbox.js +10 -0
- data/public/site/customconfig.js +1 -0
- data/public/stylesheets/cms/administration.css +91 -0
- data/public/stylesheets/cms/application.css +166 -0
- data/public/stylesheets/cms/block.css +26 -0
- data/public/stylesheets/cms/buttons.css +111 -0
- data/public/stylesheets/cms/content_library.css +138 -0
- data/public/stylesheets/cms/content_types.css +4 -0
- data/public/stylesheets/cms/dashboard.css +118 -0
- data/public/stylesheets/cms/data_table.css +156 -0
- data/public/stylesheets/cms/date_picker.css +73 -0
- data/public/stylesheets/cms/form_layout.css +255 -0
- data/public/stylesheets/cms/jquery.contextMenu.css +61 -0
- data/public/stylesheets/cms/login.css +78 -0
- data/public/stylesheets/cms/menu.css +116 -0
- data/public/stylesheets/cms/nav.css +111 -0
- data/public/stylesheets/cms/page_toolbar.css +135 -0
- data/public/stylesheets/cms/reset.css +46 -0
- data/public/stylesheets/cms/selectbox.css +56 -0
- data/public/stylesheets/cms/sitemap.css +374 -0
- data/public/stylesheets/cms/taglist.css +18 -0
- data/public/stylesheets/cms/thickbox.css +163 -0
- data/public/themes/blue_steel/images/logo.jpg +0 -0
- data/public/themes/blue_steel/images/splash.jpg +0 -0
- data/public/themes/blue_steel/stylesheets/style.css +257 -0
- data/rails/init.rb +3 -0
- data/rails_generators/browser_cms/USAGE +2 -0
- data/rails_generators/browser_cms/browser_cms_generator.rb +35 -0
- data/rails_generators/browser_cms/templates/README +1 -0
- data/rails_generators/browser_cms_demo_site/USAGE +1 -0
- data/rails_generators/browser_cms_demo_site/browser_cms_demo_site_generator.rb +62 -0
- data/rails_generators/browser_cms_demo_site/templates/migration.rb +21 -0
- data/rails_generators/content_block/USAGE +19 -0
- data/rails_generators/content_block/content_block_generator.rb +62 -0
- data/rails_generators/content_block/templates/_form.html.erb +16 -0
- data/rails_generators/content_block/templates/content_block.rb +27 -0
- data/rails_generators/content_block/templates/controller.rb +2 -0
- data/rails_generators/content_block/templates/migration.rb +37 -0
- data/rails_generators/content_block/templates/render.html.erb +10 -0
- data/rails_generators/portlet/USAGE +14 -0
- data/rails_generators/portlet/portlet_generator.rb +27 -0
- data/rails_generators/portlet/templates/_form.html.erb +1 -0
- data/rails_generators/portlet/templates/portlet.rb +7 -0
- data/rails_generators/portlet/templates/render.html.erb +1 -0
- data/test/custom_assertions.rb +68 -0
- data/test/factories.rb +109 -0
- data/test/functional/cms/cache_controller_test.rb +14 -0
- data/test/functional/cms/categories_controller_test.rb +25 -0
- data/test/functional/cms/connectors_controller_test.rb +49 -0
- data/test/functional/cms/content_controller_test.rb +327 -0
- data/test/functional/cms/content_types_controller_test.rb +18 -0
- data/test/functional/cms/dashboard_controller_test.rb +17 -0
- data/test/functional/cms/file_blocks_controller_test.rb +32 -0
- data/test/functional/cms/groups_controller_test.rb +50 -0
- data/test/functional/cms/home_controller_test.rb +156 -0
- data/test/functional/cms/html_blocks_controller_test.rb +146 -0
- data/test/functional/cms/image_blocks_controller_test.rb +62 -0
- data/test/functional/cms/links_controller_test.rb +49 -0
- data/test/functional/cms/pages_controller_test.rb +61 -0
- data/test/functional/cms/portlets_controller_test.rb +36 -0
- data/test/functional/cms/section_nodes_controller_test.rb +44 -0
- data/test/functional/cms/sections_controller_test.rb +78 -0
- data/test/functional/cms/sessions_controller_test.rb +52 -0
- data/test/functional/cms/users_controller_test.rb +184 -0
- data/test/integration/login_test.rb +14 -0
- data/test/test_helper.rb +159 -0
- data/test/test_logging.rb +64 -0
- data/test/unit/behaviors/attaching_test.rb +355 -0
- data/test/unit/behaviors/dynamic_attributes_test.rb +38 -0
- data/test/unit/behaviors/publishable_test.rb +64 -0
- data/test/unit/behaviors/searching_test.rb +57 -0
- data/test/unit/behaviors/taggable_test.rb +90 -0
- data/test/unit/extensions/active_record/base_test.rb +10 -0
- data/test/unit/extensions/hash_test.rb +17 -0
- data/test/unit/extensions/integer_test.rb +10 -0
- data/test/unit/helpers/application_helper_test.rb +29 -0
- data/test/unit/helpers/menu_helper_test.rb +305 -0
- data/test/unit/helpers/page_helper_test.rb +57 -0
- data/test/unit/lib/content_block_test.rb +170 -0
- data/test/unit/models/attachment_test.rb +94 -0
- data/test/unit/models/category_test.rb +40 -0
- data/test/unit/models/category_type_test.rb +8 -0
- data/test/unit/models/connector_test.rb +92 -0
- data/test/unit/models/content_type_test.rb +23 -0
- data/test/unit/models/email_page_portlet_test.rb +14 -0
- data/test/unit/models/file_block_test.rb +177 -0
- data/test/unit/models/group_test.rb +7 -0
- data/test/unit/models/html_block_test.rb +104 -0
- data/test/unit/models/link_test.rb +8 -0
- data/test/unit/models/page_partial_test.rb +29 -0
- data/test/unit/models/page_route_test.rb +29 -0
- data/test/unit/models/page_template_test.rb +35 -0
- data/test/unit/models/page_test.rb +679 -0
- data/test/unit/models/permission_test.rb +10 -0
- data/test/unit/models/portlet_test.rb +11 -0
- data/test/unit/models/section_node_test.rb +92 -0
- data/test/unit/models/sections_test.rb +121 -0
- data/test/unit/models/site_test.rb +50 -0
- data/test/unit/models/task_test.rb +126 -0
- data/test/unit/models/user_test.rb +130 -0
- metadata +965 -0
@@ -0,0 +1,179 @@
|
|
1
|
+
module Cms
|
2
|
+
module Behaviors
|
3
|
+
module Attaching
|
4
|
+
SANITIZATION_REGEXES = [ [/\s/, '_'], [/[&+()]/, '-'], [/[=?!'"{}\[\]#<>%]/, ''] ]
|
5
|
+
|
6
|
+
def self.included(model_class)
|
7
|
+
model_class.extend(MacroMethods)
|
8
|
+
end
|
9
|
+
module MacroMethods
|
10
|
+
def belongs_to_attachment?
|
11
|
+
!!@belongs_to_attachment
|
12
|
+
end
|
13
|
+
def belongs_to_attachment(options={})
|
14
|
+
@belongs_to_attachment = true
|
15
|
+
include InstanceMethods
|
16
|
+
before_validation :process_attachment
|
17
|
+
before_save :update_attachment_if_changed
|
18
|
+
after_save :clear_attachment_ivars
|
19
|
+
belongs_to :attachment
|
20
|
+
|
21
|
+
validates_each :attachment_file do |record, attr, value|
|
22
|
+
if record.attachment && !record.attachment.valid?
|
23
|
+
record.attachment.errors.each do |err_field, err_value|
|
24
|
+
if err_field.to_sym == :file_path
|
25
|
+
record.errors.add(:attachment_file_path, err_value)
|
26
|
+
else
|
27
|
+
record.errors.add(:attachment_file, err_value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
module InstanceMethods
|
35
|
+
|
36
|
+
def attachment_file
|
37
|
+
@attachment_file ||= attachment ? attachment.temp_file : nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def attachment_file=(file)
|
41
|
+
if @attachment_file != file
|
42
|
+
dirty!
|
43
|
+
@attachment_file = file
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def attachment_file_name
|
48
|
+
@attachment_file_name ||= attachment ? attachment.file_name : nil
|
49
|
+
end
|
50
|
+
|
51
|
+
def attachment_file_path
|
52
|
+
@attachment_file_path ||= attachment ? attachment.file_path : nil
|
53
|
+
end
|
54
|
+
|
55
|
+
def attachment_file_path=(file_path)
|
56
|
+
fp = sanitize_file_path(file_path)
|
57
|
+
if @attachment_file_path != fp
|
58
|
+
dirty!
|
59
|
+
@attachment_file_path = fp
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def attachment_section_id
|
64
|
+
@attachment_section_id ||= attachment ? attachment.section_id : nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def attachment_section_id=(section_id)
|
68
|
+
if @attachment_section_id != section_id
|
69
|
+
dirty!
|
70
|
+
@attachment_section_id = section_id
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def attachment_section
|
75
|
+
@attachment_section ||= attachment ? attachment.section : nil
|
76
|
+
end
|
77
|
+
|
78
|
+
def attachment_section=(section)
|
79
|
+
if @attachment_section != section
|
80
|
+
dirty!
|
81
|
+
@attachment_section_id = section ? section.id : nil
|
82
|
+
@attachment_section = section
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def process_attachment
|
87
|
+
if attachment.nil? && attachment_file.blank?
|
88
|
+
unless attachment_file_path.blank?
|
89
|
+
errors.add(:attachment_file, "You must upload a file")
|
90
|
+
return false
|
91
|
+
end
|
92
|
+
unless attachment_section_id.blank?
|
93
|
+
errors.add(:attachment_file, "You must upload a file")
|
94
|
+
return false
|
95
|
+
end
|
96
|
+
else
|
97
|
+
build_attachment if attachment.nil?
|
98
|
+
attachment.temp_file = attachment_file
|
99
|
+
set_attachment_file_path
|
100
|
+
if attachment.file_path.blank?
|
101
|
+
errors.add(:attachment_file_path, "File Name is required for attachment")
|
102
|
+
return false
|
103
|
+
end
|
104
|
+
set_attachment_section
|
105
|
+
if attachment.section_id.blank?
|
106
|
+
errors.add(:attachment_file, "Section is required for attachment")
|
107
|
+
return false
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def clear_attachment_ivars
|
113
|
+
@attachment_file = nil
|
114
|
+
@attachment_file_path = nil
|
115
|
+
@attachment_section_id = nil
|
116
|
+
@attachment_section = nil
|
117
|
+
end
|
118
|
+
|
119
|
+
# Override this method if you would like to override the way the section is set
|
120
|
+
def set_attachment_section
|
121
|
+
if new_record? && !attachment_file.blank?
|
122
|
+
attachment.section = Section.root.first
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Override this method if you would like to override the way file_path is set
|
127
|
+
def set_attachment_file_path
|
128
|
+
if new_record? && !attachment_file.blank?
|
129
|
+
attachment.file_path = "/attachments/#{File.basename(attachment_file.original_filename).to_s.downcase}"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def sanitize_file_path(file_path)
|
134
|
+
SANITIZATION_REGEXES.inject(file_path.to_s) do |s, (regex, replace)|
|
135
|
+
s.gsub(regex, replace)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def update_attachment_if_changed
|
140
|
+
if attachment
|
141
|
+
attachment.archived = archived if self.class.archivable?
|
142
|
+
attachment.published = self.class.publishable? ? !!(publish_on_save) : true
|
143
|
+
if new_record? || attachment.changed? || attachment.temp_file
|
144
|
+
attachment.save
|
145
|
+
end
|
146
|
+
self.attachment_version = attachment.version
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
#Size in kilobytes
|
151
|
+
def file_size
|
152
|
+
attachment ? "%0.2f" % (attachment.file_size / 1024.0) : "?"
|
153
|
+
end
|
154
|
+
|
155
|
+
def after_as_of_version
|
156
|
+
if attachment_id && attachment_version
|
157
|
+
self.attachment = Attachment.find(attachment_id).as_of_version(attachment_version)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def attachment_link
|
162
|
+
if attachment
|
163
|
+
live? ? attachment_file_path : "/cms/attachments/#{attachment_id}?version=#{attachment_version}"
|
164
|
+
else
|
165
|
+
nil
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Forces this record to be changed, even if nothing has changed
|
170
|
+
# This is necessary if just the section.id has changed, for example
|
171
|
+
def dirty!
|
172
|
+
# Seems like a hack, is there a better way?
|
173
|
+
self.updated_at = Time.now
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Cms
|
2
|
+
module Behaviors
|
3
|
+
module Categorizing
|
4
|
+
def self.included(model_class)
|
5
|
+
model_class.extend(MacroMethods)
|
6
|
+
end
|
7
|
+
module MacroMethods
|
8
|
+
def belongs_to_category?
|
9
|
+
!!@belongs_to_category
|
10
|
+
end
|
11
|
+
def belongs_to_category
|
12
|
+
@belongs_to_category = true
|
13
|
+
extend ClassMethods
|
14
|
+
include InstanceMethods
|
15
|
+
|
16
|
+
belongs_to :category
|
17
|
+
|
18
|
+
named_scope :in_category, lambda{|cat| {:conditions => ["category_id = ?", cat.id]}}
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
module ClassMethods
|
23
|
+
end
|
24
|
+
module InstanceMethods
|
25
|
+
def category_name
|
26
|
+
category && category.name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Cms
|
2
|
+
module Behaviors
|
3
|
+
module Connecting
|
4
|
+
def self.included(model_class)
|
5
|
+
model_class.extend(MacroMethods)
|
6
|
+
end
|
7
|
+
module MacroMethods
|
8
|
+
def connectable?
|
9
|
+
!!@is_connectable
|
10
|
+
end
|
11
|
+
def is_connectable(options={})
|
12
|
+
@is_connectable = true
|
13
|
+
extend ClassMethods
|
14
|
+
include InstanceMethods
|
15
|
+
|
16
|
+
attr_accessor :connect_to_page_id
|
17
|
+
attr_accessor :connect_to_container
|
18
|
+
attr_accessor :connected_page
|
19
|
+
|
20
|
+
has_many :connectors, :as => :connectable
|
21
|
+
|
22
|
+
after_create :connect_to_page
|
23
|
+
after_save :update_connected_pages
|
24
|
+
end
|
25
|
+
end
|
26
|
+
module ClassMethods
|
27
|
+
def content_block_type
|
28
|
+
to_s.underscore
|
29
|
+
end
|
30
|
+
def display_name
|
31
|
+
to_s.titleize
|
32
|
+
end
|
33
|
+
def display_name_plural
|
34
|
+
display_name.pluralize
|
35
|
+
end
|
36
|
+
end
|
37
|
+
module InstanceMethods
|
38
|
+
|
39
|
+
def connected_pages
|
40
|
+
Page.connected_to(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
def connected_page_count
|
44
|
+
Page.connected_to(self).count
|
45
|
+
end
|
46
|
+
|
47
|
+
def content_block_type
|
48
|
+
self.class.content_block_type
|
49
|
+
end
|
50
|
+
|
51
|
+
def display_name
|
52
|
+
self.class.display_name
|
53
|
+
end
|
54
|
+
|
55
|
+
def display_name_plural
|
56
|
+
self.class.display_name_plural
|
57
|
+
end
|
58
|
+
|
59
|
+
def connect_to_page
|
60
|
+
unless connect_to_page_id.blank? || connect_to_container.blank?
|
61
|
+
#Note that we are setting connected_page so that page can look at that
|
62
|
+
#to determine if the page should be published
|
63
|
+
self.connected_page = Page.find(connect_to_page_id)
|
64
|
+
connected_page.create_connector(self, connect_to_container)
|
65
|
+
end
|
66
|
+
true
|
67
|
+
end
|
68
|
+
|
69
|
+
def update_connected_pages
|
70
|
+
# If this is versioned, then we need make new versions of all the pages this is connected to
|
71
|
+
#logger.info "updating connected pages -> #{self.inspect}"
|
72
|
+
if self.class.versioned?
|
73
|
+
|
74
|
+
#Get all the pages the previous version of this connectable was connected to
|
75
|
+
Page.connected_to(:connectable => self, :version => (version - 1)).all.each do |p|
|
76
|
+
unless p == published_by_page
|
77
|
+
#This just creates a new version of the page
|
78
|
+
action = deleted? ? "Deleted" : "Edited"
|
79
|
+
p.update_attributes(:publish_on_save => (published? && p.published?), :version_comment => "#{self.class.name} ##{id} was #{action}")
|
80
|
+
|
81
|
+
#The previous step will copy over a connector pointing to the previous version of this connectable
|
82
|
+
#We need to change that to point at the new version of this connectable
|
83
|
+
p.connectors.for_page_version(p.version).for_connectable(self).each do |con|
|
84
|
+
con.update_attribute(:connectable_version, version)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,362 @@
|
|
1
|
+
module Cms
|
2
|
+
module Behaviors
|
3
|
+
module DynamicAttributes
|
4
|
+
def self.included(model_class)
|
5
|
+
model_class.extend(MacroMethods)
|
6
|
+
end
|
7
|
+
module MacroMethods
|
8
|
+
def has_dynamic_attributes?
|
9
|
+
!!@has_dynamic_attributes
|
10
|
+
end
|
11
|
+
# Will make the current class have dynamic attributes.
|
12
|
+
#
|
13
|
+
# class User < ActiveRecord::Base
|
14
|
+
# has_dynamic_attributes
|
15
|
+
# end
|
16
|
+
# eric = User.find_by_login 'eric'
|
17
|
+
# puts "My AOL instant message name is: #{eric.aim}"
|
18
|
+
# eric.phone = '555-123-4567'
|
19
|
+
# eric.save
|
20
|
+
#
|
21
|
+
# The above example should work even though "aim" and "phone" are not
|
22
|
+
# attributes on the User model.
|
23
|
+
#
|
24
|
+
# The following options are available on for has_dynamic_attributes to modify
|
25
|
+
# the behavior. Reasonable defaults are provided:
|
26
|
+
#
|
27
|
+
# class_name::
|
28
|
+
# The class for the related model. This defaults to the
|
29
|
+
# model name prepended to "Attribute". So for a "User" model the class
|
30
|
+
# name would be "UserAttribute". The class can actually exist (in that
|
31
|
+
# case the model file will be loaded through Rails dependency system) or
|
32
|
+
# if it does not exist a basic model will be dynamically defined for you.
|
33
|
+
# This allows you to implement custom methods on the related class by
|
34
|
+
# simply defining the class manually.
|
35
|
+
# table_name::
|
36
|
+
# The table for the related model. This defaults to the
|
37
|
+
# attribute model's table name.
|
38
|
+
# relationship_name::
|
39
|
+
# This is the name of the actual has_many
|
40
|
+
# relationship. Most of the type this relationship will only be used
|
41
|
+
# indirectly but it is there if the user wants more raw access. This
|
42
|
+
# defaults to the class name underscored then pluralized finally turned
|
43
|
+
# into a symbol.
|
44
|
+
# foreign_key::
|
45
|
+
# The key in the attribute table to relate back to the
|
46
|
+
# model. This defaults to the model name underscored prepended to "_id"
|
47
|
+
# name_field::
|
48
|
+
# The field which stores the name of the attribute in the related object
|
49
|
+
# value_field::
|
50
|
+
# The field that stores the value in the related object
|
51
|
+
# fields::
|
52
|
+
# A list of fields that are valid dynamic attributes. By default
|
53
|
+
# this is "nil" which means that all field are valid. Use this option if
|
54
|
+
# you want some fields to go to one dynamic attribute model while other
|
55
|
+
# fields will go to another. As an alternative you can override the
|
56
|
+
# #dynamic_attributes method which will return a list of all valid dynamic
|
57
|
+
# attributes. This is useful if you want to read the list of attributes
|
58
|
+
# from another source to keep your code DRY. This method is given a
|
59
|
+
# single argument which is the class for the related model. The following
|
60
|
+
# provide an example:
|
61
|
+
#
|
62
|
+
# class User < ActiveRecord::Base
|
63
|
+
# has_dynamic_attributes :class_name => 'UserContactInfo'
|
64
|
+
# has_dynamic_attributes :class_name => 'Preferences'
|
65
|
+
#
|
66
|
+
# def dynamic_attributes(model)
|
67
|
+
# case model
|
68
|
+
# when UserContactInfo
|
69
|
+
# %w(email phone aim yahoo msn)
|
70
|
+
# when Preference
|
71
|
+
# %w(project_search project_order user_search user_order)
|
72
|
+
# else Array.new
|
73
|
+
# end
|
74
|
+
# end
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# eric = User.find_by_login 'eric'
|
78
|
+
# eric.email = 'eric@example.com' # Will save to UserContactInfo model
|
79
|
+
# eric.project_order = 'name' # Will save to Preference
|
80
|
+
# eric.save # Carries out save so now values are in database
|
81
|
+
#
|
82
|
+
# Note the else clause in our case statement. Since an empty array is
|
83
|
+
# returned for all other models (perhaps added later) then we can be
|
84
|
+
# certain that only the above dynamic attributes are allowed.
|
85
|
+
#
|
86
|
+
# If both a :fields option and #dynamic_attributes method is defined the
|
87
|
+
# :fields option take precidence. This allows you to easily define the
|
88
|
+
# field list inline for one model while implementing #dynamic_attributes
|
89
|
+
# for another model and not having #dynamic_attributes need to determine
|
90
|
+
# what model it is answering for. In both cases the list of dynamic
|
91
|
+
# attributes can be a list of string or symbols
|
92
|
+
#
|
93
|
+
# A final alternative to :fields and #dynamic_attributes is the
|
94
|
+
# #is_dynamic_attribute? method. This method is given two arguments. The
|
95
|
+
# first is the attribute being retrieved/saved the second is the Model we
|
96
|
+
# are testing for. If you override this method then the #dynamic_attributes
|
97
|
+
# method or the :fields option will have no affect. Use of this method
|
98
|
+
# is ideal when you want to retrict the attributes but do so in a
|
99
|
+
# algorithmic way. The following is an example:
|
100
|
+
# class User < ActiveRecord::Base
|
101
|
+
# has_dynamic_attributes :class_name => 'UserContactInfo'
|
102
|
+
# has_dynamic_attributes :class_name => 'Preferences'
|
103
|
+
#
|
104
|
+
# def is_dynamic_attribute?(attr, model)
|
105
|
+
# case attr.to_s
|
106
|
+
# when /^contact_/ then true
|
107
|
+
# when /^preference_/ then true
|
108
|
+
# else
|
109
|
+
# false
|
110
|
+
# end
|
111
|
+
# end
|
112
|
+
# end
|
113
|
+
#
|
114
|
+
# eric = User.find_by_login 'eric'
|
115
|
+
# eric.contact_phone = '555-123-4567'
|
116
|
+
# eric.contact_email = 'eric@example.com'
|
117
|
+
# eric.preference_project_order = 'name'
|
118
|
+
# eric.some_attribute = 'blah' # If some_attribute is not defined on
|
119
|
+
# # the model then method not found is thrown
|
120
|
+
def has_dynamic_attributes(options={})
|
121
|
+
@has_dynamic_attributes = true
|
122
|
+
include InstanceMethods
|
123
|
+
|
124
|
+
# Provide default options
|
125
|
+
options[:class_name] ||= self.class_name + 'Attribute'
|
126
|
+
options[:table_name] ||= options[:class_name].tableize
|
127
|
+
options[:relationship_name] ||= options[:class_name].tableize.to_sym
|
128
|
+
options[:foreign_key] ||= self.class_name.foreign_key
|
129
|
+
options[:base_foreign_key] ||= self.name.underscore.foreign_key
|
130
|
+
options[:name_field] ||= 'name'
|
131
|
+
options[:value_field] ||= 'value'
|
132
|
+
options[:fields].collect! {|f| f.to_s} unless options[:fields].nil?
|
133
|
+
|
134
|
+
# Init option storage if necessary
|
135
|
+
cattr_accessor :dynamic_options
|
136
|
+
self.dynamic_options ||= Hash.new
|
137
|
+
|
138
|
+
# Return if already processed.
|
139
|
+
return if self.dynamic_options.keys.include? options[:class_name]
|
140
|
+
|
141
|
+
# Attempt to load related class. If not create it
|
142
|
+
begin
|
143
|
+
options[:class_name].constantize
|
144
|
+
rescue
|
145
|
+
Object.const_set(options[:class_name],
|
146
|
+
Class.new(ActiveRecord::Base)).class_eval do
|
147
|
+
def self.reloadable? #:nodoc:
|
148
|
+
false
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# Store options
|
154
|
+
self.dynamic_options[options[:class_name]] = options
|
155
|
+
|
156
|
+
# Modify attribute class
|
157
|
+
attribute_class = options[:class_name].constantize
|
158
|
+
base_class = self.name.underscore.to_sym
|
159
|
+
attribute_class.class_eval do
|
160
|
+
belongs_to base_class, :foreign_key => options[:base_foreign_key]
|
161
|
+
alias_method :base, base_class # For generic access
|
162
|
+
end
|
163
|
+
|
164
|
+
# Modify main class
|
165
|
+
class_eval do
|
166
|
+
has_many options[:relationship_name],
|
167
|
+
:class_name => options[:class_name],
|
168
|
+
:table_name => options[:table_name],
|
169
|
+
:foreign_key => options[:foreign_key],
|
170
|
+
:dependent => :destroy
|
171
|
+
|
172
|
+
# The following is only setup once
|
173
|
+
unless private_method_defined? :method_missing_without_dynamic_attributes
|
174
|
+
|
175
|
+
# Carry out delayed actions before save
|
176
|
+
after_validation_on_update :save_modified_dynamic_attributes
|
177
|
+
|
178
|
+
# Make attributes seem real
|
179
|
+
alias_method :method_missing_without_dynamic_attributes, :method_missing
|
180
|
+
alias_method :method_missing, :method_missing_with_dynamic_attributes
|
181
|
+
|
182
|
+
private
|
183
|
+
|
184
|
+
alias_method :read_attribute_without_dynamic_attributes, :read_attribute
|
185
|
+
alias_method :read_attribute, :read_attribute_with_dynamic_attributes
|
186
|
+
alias_method :write_attribute_without_dynamic_attributes, :write_attribute
|
187
|
+
alias_method :write_attribute, :write_attribute_with_dynamic_attributes
|
188
|
+
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
module InstanceMethods
|
194
|
+
# Will determine if the given attribute is a dynamic attribute on the
|
195
|
+
# given model. Override this in your class to provide custom logic if
|
196
|
+
# the #dynamic_attributes method or the :fields option are not flexible
|
197
|
+
# enough. If you override this method :fields and #dynamic_attributes will
|
198
|
+
# not apply at all unless you implement them yourself.
|
199
|
+
def is_dynamic_attribute?(attr, model)
|
200
|
+
attr = attr.to_s
|
201
|
+
return dynamic_options[model.name][:fields].include?(attr) unless
|
202
|
+
dynamic_options[model.name][:fields].nil?
|
203
|
+
return dynamic_attributes(model).collect {|f| f.to_s}.include?(attr) unless
|
204
|
+
dynamic_attributes(model).nil?
|
205
|
+
true
|
206
|
+
end
|
207
|
+
|
208
|
+
# Return a list of valid dynamic attributes for the given model. Return
|
209
|
+
# nil if any field is allowed. If you want to say no field is allowed
|
210
|
+
# then return an empty array. If you just have a static list the :fields
|
211
|
+
# option is most likely easier.
|
212
|
+
def dynamic_attributes(model); nil end
|
213
|
+
|
214
|
+
private
|
215
|
+
|
216
|
+
# Called after validation on update so that dynamic attributes behave
|
217
|
+
# like normal attributes in the fact that the database is not touched
|
218
|
+
# until save is called.
|
219
|
+
def save_modified_dynamic_attributes
|
220
|
+
return if @save_dynamic_attr.nil?
|
221
|
+
@save_dynamic_attr.each do |s|
|
222
|
+
model, attr_name = s
|
223
|
+
related_attr = dynamic_related_attr model, attr_name
|
224
|
+
unless related_attr.nil?
|
225
|
+
if related_attr.value.nil?
|
226
|
+
dynamic_related(model).delete related_attr
|
227
|
+
else
|
228
|
+
related_attr.save
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
@save_dynamic_attr = []
|
233
|
+
end
|
234
|
+
|
235
|
+
# Overrides ActiveRecord::Base#read_attribute
|
236
|
+
def read_attribute_with_dynamic_attributes(attr_name)
|
237
|
+
attr_name = attr_name.to_s
|
238
|
+
exec_if_related attr_name do |model|
|
239
|
+
return nil if !@remove_dynamic_attr.nil? && @remove_dynamic_attr.any? do |r|
|
240
|
+
r[0] == model && r[1] == attr_name
|
241
|
+
end
|
242
|
+
value_field = dynamic_options[model.name][:value_field]
|
243
|
+
related_attr = dynamic_related_attr model, attr_name
|
244
|
+
return nil if related_attr.nil?
|
245
|
+
return related_attr.send(value_field)
|
246
|
+
end
|
247
|
+
read_attribute_without_dynamic_attributes(attr_name)
|
248
|
+
end
|
249
|
+
|
250
|
+
# Overrides ActiveRecord::Base#write_attribute
|
251
|
+
def write_attribute_with_dynamic_attributes(attr_name, value)
|
252
|
+
attr_name = attr_name.to_s
|
253
|
+
exec_if_related attr_name do |model|
|
254
|
+
value_field = dynamic_options[model.name][:value_field]
|
255
|
+
@save_dynamic_attr ||= []
|
256
|
+
@save_dynamic_attr << [model, attr_name]
|
257
|
+
related_attr = dynamic_related_attr(model, attr_name)
|
258
|
+
if related_attr.nil?
|
259
|
+
# Used to check for nil? but this caused validation
|
260
|
+
# problems that are harder to solve. blank? is probably
|
261
|
+
# not correct but it works well for now.
|
262
|
+
unless value.blank?
|
263
|
+
name_field = dynamic_options[model.name][:name_field]
|
264
|
+
foreign_key = dynamic_options[model.name][:foreign_key]
|
265
|
+
dynamic_related(model).build name_field => attr_name,
|
266
|
+
value_field => value, foreign_key => self.id
|
267
|
+
end
|
268
|
+
return value
|
269
|
+
else
|
270
|
+
value_field = (value_field.to_s + '=').to_sym
|
271
|
+
return related_attr.send(value_field, value)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
write_attribute_without_dynamic_attributes(attr_name, value)
|
275
|
+
end
|
276
|
+
|
277
|
+
# Implements dynamic-attributes as if real getter/setter methods
|
278
|
+
# were defined.
|
279
|
+
def method_missing_with_dynamic_attributes(method_id, *args, &block)
|
280
|
+
begin
|
281
|
+
method_missing_without_dynamic_attributes method_id, *args, &block
|
282
|
+
rescue NoMethodError => e
|
283
|
+
attr_name = method_id.to_s.sub(/\=$/, '')
|
284
|
+
exec_if_related attr_name do |model|
|
285
|
+
if method_id.to_s =~ /\=$/
|
286
|
+
return write_attribute_with_dynamic_attributes(attr_name, args[0])
|
287
|
+
else
|
288
|
+
return read_attribute_with_dynamic_attributes(attr_name)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
raise e
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
# Retrieve the related dynamic attribute object
|
296
|
+
def dynamic_related_attr(model, attr)
|
297
|
+
name_field = dynamic_options[model.name][:name_field]
|
298
|
+
dynamic_related(model).to_a.find {|r| r.send(name_field) == attr}
|
299
|
+
end
|
300
|
+
|
301
|
+
# Retrieve the collection of related dynamic attributes
|
302
|
+
def dynamic_related(model)
|
303
|
+
relationship = dynamic_options[model.name][:relationship_name]
|
304
|
+
send relationship
|
305
|
+
end
|
306
|
+
|
307
|
+
# Yield only if attr_name is a dynamic_attribute
|
308
|
+
def exec_if_related(attr_name)
|
309
|
+
return false if self.class.column_names.include? attr_name
|
310
|
+
each_dynamic_relation do |model|
|
311
|
+
if is_dynamic_attribute?(attr_name, model)
|
312
|
+
yield model
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
# Yields for each dynamic relation.
|
318
|
+
def each_dynamic_relation
|
319
|
+
dynamic_options.keys.each {|kls| yield kls.constantize}
|
320
|
+
end
|
321
|
+
|
322
|
+
# Returns the options for the dynamic attributes
|
323
|
+
def dynamic_options
|
324
|
+
nonversioned_class(self.class).dynamic_options
|
325
|
+
end
|
326
|
+
|
327
|
+
# Will return the parent model if kls is a versioned class
|
328
|
+
def nonversioned_class(kls)
|
329
|
+
if kls.name =~ /\:\:Version$/
|
330
|
+
base_class = kls.name
|
331
|
+
base_class.sub!(/\:\:Version$/, '')
|
332
|
+
return base_class.constantize
|
333
|
+
end
|
334
|
+
kls
|
335
|
+
end
|
336
|
+
|
337
|
+
# This overrides the attributes= defined in ActiveRecord::Base
|
338
|
+
# The only difference is that this doesn't check to see if the
|
339
|
+
# model responds_to the method before sending it
|
340
|
+
# This is needed for Rails 2.2
|
341
|
+
def attributes=(new_attributes, guard_protected_attributes = true)
|
342
|
+
return if new_attributes.nil?
|
343
|
+
attributes = new_attributes.dup
|
344
|
+
attributes.stringify_keys!
|
345
|
+
|
346
|
+
multi_parameter_attributes = []
|
347
|
+
attributes = remove_attributes_protected_from_mass_assignment(attributes) if guard_protected_attributes
|
348
|
+
|
349
|
+
attributes.each do |k, v|
|
350
|
+
if k.include?("(")
|
351
|
+
multi_parameter_attributes << [ k, v ]
|
352
|
+
else
|
353
|
+
send(:"#{k}=", v)
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
assign_multiparameter_attributes(multi_parameter_attributes)
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Cms
|
2
|
+
module Behaviors
|
3
|
+
module FlushCacheOnChange
|
4
|
+
def self.included(model_class)
|
5
|
+
model_class.extend(MacroMethods)
|
6
|
+
model_class.class_eval do
|
7
|
+
def flush_cache_on_change?
|
8
|
+
false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
module MacroMethods
|
13
|
+
def flush_cache_on_change?
|
14
|
+
!!@flush_cache_on_change
|
15
|
+
end
|
16
|
+
def flush_cache_on_change(options={})
|
17
|
+
include InstanceMethods
|
18
|
+
@flush_cache_on_change = true
|
19
|
+
|
20
|
+
after_save :flush_cache
|
21
|
+
after_destroy :flush_cache
|
22
|
+
end
|
23
|
+
end
|
24
|
+
module InstanceMethods
|
25
|
+
def flush_cache
|
26
|
+
if Cms.caching_enabled?
|
27
|
+
Cms.flush_cache
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|