browsercms-artirix 4.0.0.rc1.art4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +5 -0
- data/COPYRIGHT.txt +27 -0
- data/GPL.txt +674 -0
- data/LICENSE.txt +165 -0
- data/README.markdown +45 -0
- data/app/assets/fonts/icomoon.dev.svg +61 -0
- data/app/assets/fonts/icomoon.eot +0 -0
- data/app/assets/fonts/icomoon.svg +61 -0
- data/app/assets/fonts/icomoon.ttf +0 -0
- data/app/assets/fonts/icomoon.woff +0 -0
- data/app/assets/images/ckeditor/plugins/delete_content/icons/deletecontent.png +0 -0
- data/app/assets/images/ckeditor/plugins/edit_content/icons/editcontent.png +0 -0
- data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentdown.png +0 -0
- data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentup.png +0 -0
- data/app/assets/images/cms/administration/user_browser_bg.gif +0 -0
- data/app/assets/images/cms/arrow-down.png +0 -0
- data/app/assets/images/cms/arrow-up.png +0 -0
- data/app/assets/images/cms/bg.png +0 -0
- data/app/assets/images/cms/bl_curve.png +0 -0
- data/app/assets/images/cms/bottom_cap.png +0 -0
- data/app/assets/images/cms/bottom_cap_content.png +0 -0
- data/app/assets/images/cms/browse.gif +0 -0
- data/app/assets/images/cms/browser_media_logo.png +0 -0
- data/app/assets/images/cms/browsercms_logo.png +0 -0
- data/app/assets/images/cms/buttons/button.png +0 -0
- data/app/assets/images/cms/buttons/button_bg.png +0 -0
- data/app/assets/images/cms/buttons/button_cap.png +0 -0
- data/app/assets/images/cms/buttons/button_cap_h.png +0 -0
- data/app/assets/images/cms/buttons/button_cap_off.gif +0 -0
- data/app/assets/images/cms/buttons/button_cap_off_middle.gif +0 -0
- data/app/assets/images/cms/buttons/button_h.png +0 -0
- data/app/assets/images/cms/buttons/button_left_bg.png +0 -0
- data/app/assets/images/cms/buttons/button_off.png +0 -0
- data/app/assets/images/cms/buttons/button_off_middle.png +0 -0
- data/app/assets/images/cms/buttons/delete_x.png +0 -0
- data/app/assets/images/cms/buttons/delete_x_disabled.png +0 -0
- data/app/assets/images/cms/buttons/delete_x_h.png +0 -0
- data/app/assets/images/cms/buttons/sm_button.gif +0 -0
- data/app/assets/images/cms/buttons/sm_button_2.gif +0 -0
- data/app/assets/images/cms/buttons/sm_button_2_h.gif +0 -0
- data/app/assets/images/cms/buttons/sm_button_h.gif +0 -0
- data/app/assets/images/cms/cogs.png +0 -0
- data/app/assets/images/cms/containers/add.gif +0 -0
- data/app/assets/images/cms/containers/alpha.png +0 -0
- data/app/assets/images/cms/containers/beta.png +0 -0
- data/app/assets/images/cms/containers/delete.gif +0 -0
- data/app/assets/images/cms/containers/down.gif +0 -0
- data/app/assets/images/cms/containers/edit.gif +0 -0
- data/app/assets/images/cms/containers/up.gif +0 -0
- data/app/assets/images/cms/containers/view.gif +0 -0
- data/app/assets/images/cms/content_bg.gif +0 -0
- data/app/assets/images/cms/dashboard/bottom_cap.png +0 -0
- data/app/assets/images/cms/dashboard/bottom_cap_content.png +0 -0
- data/app/assets/images/cms/dashboard/header_bg.gif +0 -0
- data/app/assets/images/cms/dashboard/header_left_bg.gif +0 -0
- data/app/assets/images/cms/dashboard/home.png +0 -0
- data/app/assets/images/cms/dashboard/table_header_bg.gif +0 -0
- data/app/assets/images/cms/dashboard/top_cap.png +0 -0
- data/app/assets/images/cms/dashed.gif +0 -0
- data/app/assets/images/cms/datepicker/clear.gif +0 -0
- data/app/assets/images/cms/datepicker/close.gif +0 -0
- data/app/assets/images/cms/dk_button_l.gif +0 -0
- data/app/assets/images/cms/dk_button_r.gif +0 -0
- data/app/assets/images/cms/dot.png +0 -0
- data/app/assets/images/cms/draft_status.gif +0 -0
- data/app/assets/images/cms/file-uploading.gif +0 -0
- data/app/assets/images/cms/gray_long_bg.gif +0 -0
- data/app/assets/images/cms/home.png +0 -0
- data/app/assets/images/cms/icons/actions/add.png +0 -0
- data/app/assets/images/cms/icons/actions/config.png +0 -0
- data/app/assets/images/cms/icons/actions/connect.png +0 -0
- data/app/assets/images/cms/icons/actions/delete.png +0 -0
- data/app/assets/images/cms/icons/actions/down.png +0 -0
- data/app/assets/images/cms/icons/actions/edit.png +0 -0
- data/app/assets/images/cms/icons/actions/folder.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_add.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_delete.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_edit.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_move.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_open.png +0 -0
- data/app/assets/images/cms/icons/actions/history.png +0 -0
- data/app/assets/images/cms/icons/actions/home.png +0 -0
- data/app/assets/images/cms/icons/actions/left.png +0 -0
- data/app/assets/images/cms/icons/actions/link.png +0 -0
- data/app/assets/images/cms/icons/actions/page.png +0 -0
- data/app/assets/images/cms/icons/actions/page_add.png +0 -0
- data/app/assets/images/cms/icons/actions/page_edit.png +0 -0
- data/app/assets/images/cms/icons/actions/page_move.png +0 -0
- data/app/assets/images/cms/icons/actions/redo.png +0 -0
- data/app/assets/images/cms/icons/actions/refresh.png +0 -0
- data/app/assets/images/cms/icons/actions/right.png +0 -0
- data/app/assets/images/cms/icons/actions/root_folder.png +0 -0
- data/app/assets/images/cms/icons/actions/root_link.png +0 -0
- data/app/assets/images/cms/icons/actions/root_page.png +0 -0
- data/app/assets/images/cms/icons/actions/undo.png +0 -0
- data/app/assets/images/cms/icons/actions/up.png +0 -0
- data/app/assets/images/cms/icons/actions/view.png +0 -0
- data/app/assets/images/cms/icons/file_types/doc.png +0 -0
- data/app/assets/images/cms/icons/file_types/file.png +0 -0
- data/app/assets/images/cms/icons/file_types/gif.png +0 -0
- data/app/assets/images/cms/icons/file_types/htm.png +0 -0
- data/app/assets/images/cms/icons/file_types/pdf.png +0 -0
- data/app/assets/images/cms/icons/file_types/ppt.png +0 -0
- data/app/assets/images/cms/icons/file_types/swf.png +0 -0
- data/app/assets/images/cms/icons/file_types/txt.png +0 -0
- data/app/assets/images/cms/icons/file_types/xls.png +0 -0
- data/app/assets/images/cms/icons/file_types/xml.png +0 -0
- data/app/assets/images/cms/icons/file_types/zip.png +0 -0
- data/app/assets/images/cms/icons/status/archived.gif +0 -0
- data/app/assets/images/cms/icons/status/draft.gif +0 -0
- data/app/assets/images/cms/icons/status/hidden.gif +0 -0
- data/app/assets/images/cms/icons/status/locked.gif +0 -0
- data/app/assets/images/cms/icons/status/published.gif +0 -0
- data/app/assets/images/cms/icons/status/unlocked.gif +0 -0
- data/app/assets/images/cms/icons/user.png +0 -0
- data/app/assets/images/cms/login_bg.jpg +0 -0
- data/app/assets/images/cms/login_bottom.jpg +0 -0
- data/app/assets/images/cms/login_top.gif +0 -0
- data/app/assets/images/cms/logo.png +0 -0
- data/app/assets/images/cms/lt_button_bg.gif +0 -0
- data/app/assets/images/cms/lt_button_l.gif +0 -0
- data/app/assets/images/cms/lt_button_r.gif +0 -0
- data/app/assets/images/cms/menu/block_cap_h.gif +0 -0
- data/app/assets/images/cms/menu/bottom_cap.png +0 -0
- data/app/assets/images/cms/menu/bottom_cap_menu.png +0 -0
- data/app/assets/images/cms/menu/bottom_cap_menu_first.png +0 -0
- data/app/assets/images/cms/menu/menu_header_first_bg.gif +0 -0
- data/app/assets/images/cms/menu/selected_block_cap.gif +0 -0
- data/app/assets/images/cms/menu/top_cap.png +0 -0
- data/app/assets/images/cms/menu/top_cap_menu_header.png +0 -0
- data/app/assets/images/cms/menu.png +0 -0
- data/app/assets/images/cms/menu_h.gif +0 -0
- data/app/assets/images/cms/menu_header.png +0 -0
- data/app/assets/images/cms/menu_open.png +0 -0
- data/app/assets/images/cms/menu_open_bg.gif +0 -0
- data/app/assets/images/cms/nav/on_bg.gif +0 -0
- data/app/assets/images/cms/nav.png +0 -0
- data/app/assets/images/cms/nav_admin.gif +0 -0
- data/app/assets/images/cms/nav_admin_h.gif +0 -0
- data/app/assets/images/cms/nav_admin_on.gif +0 -0
- data/app/assets/images/cms/nav_cap.png +0 -0
- data/app/assets/images/cms/nav_cap_h.gif +0 -0
- data/app/assets/images/cms/nav_content_library.gif +0 -0
- data/app/assets/images/cms/nav_content_library_h.gif +0 -0
- data/app/assets/images/cms/nav_content_library_on.gif +0 -0
- data/app/assets/images/cms/nav_dash.gif +0 -0
- data/app/assets/images/cms/nav_dash_h.gif +0 -0
- data/app/assets/images/cms/nav_dash_on.gif +0 -0
- data/app/assets/images/cms/nav_h.gif +0 -0
- data/app/assets/images/cms/nav_sitemap.gif +0 -0
- data/app/assets/images/cms/nav_sitemap_h.gif +0 -0
- data/app/assets/images/cms/nav_sitemap_on.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_draft_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_draft_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_published_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_published_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/visual_editor_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/visual_editor_end.gif +0 -0
- data/app/assets/images/cms/page_toolbar/visual_editor_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/visual_editor_state_bg.gif +0 -0
- data/app/assets/images/cms/pages/add_connectable.gif +0 -0
- data/app/assets/images/cms/pages/connect_connectable.gif +0 -0
- data/app/assets/images/cms/pages/container_border.gif +0 -0
- data/app/assets/images/cms/pages/container_border_l.gif +0 -0
- data/app/assets/images/cms/pages/container_border_r.gif +0 -0
- data/app/assets/images/cms/pages/delete_connectable.gif +0 -0
- data/app/assets/images/cms/pages/down_connectable.gif +0 -0
- data/app/assets/images/cms/pages/down_connectable_disabled.gif +0 -0
- data/app/assets/images/cms/pages/edit_connectable.gif +0 -0
- data/app/assets/images/cms/pages/edit_connectable_2.gif +0 -0
- data/app/assets/images/cms/pages/show_connectable.gif +0 -0
- data/app/assets/images/cms/pages/up_connectable.gif +0 -0
- data/app/assets/images/cms/pages/up_connectable_disabled.gif +0 -0
- data/app/assets/images/cms/pagination/first.gif +0 -0
- data/app/assets/images/cms/pagination/first_h.gif +0 -0
- data/app/assets/images/cms/pagination/input.gif +0 -0
- data/app/assets/images/cms/pagination/last.gif +0 -0
- data/app/assets/images/cms/pagination/last_h.gif +0 -0
- data/app/assets/images/cms/pagination/next.gif +0 -0
- data/app/assets/images/cms/pagination/next_h.gif +0 -0
- data/app/assets/images/cms/pagination/previous.gif +0 -0
- data/app/assets/images/cms/pagination/previous_h.gif +0 -0
- data/app/assets/images/cms/pencil.png +0 -0
- data/app/assets/images/cms/plus.png +0 -0
- data/app/assets/images/cms/published_status.gif +0 -0
- data/app/assets/images/cms/search.png +0 -0
- data/app/assets/images/cms/search_submit.gif +0 -0
- data/app/assets/images/cms/search_submit_h.gif +0 -0
- data/app/assets/images/cms/searchbox_gradient.gif +0 -0
- data/app/assets/images/cms/select_bg.gif +0 -0
- data/app/assets/images/cms/select_bg_2.gif +0 -0
- data/app/assets/images/cms/sitemap/bottom_cap.png +0 -0
- data/app/assets/images/cms/sitemap/buffer_caps.png +0 -0
- data/app/assets/images/cms/sitemap/contract.png +0 -0
- data/app/assets/images/cms/sitemap/corners.gif +0 -0
- data/app/assets/images/cms/sitemap/corners_hover.gif +0 -0
- data/app/assets/images/cms/sitemap/divider.gif +0 -0
- data/app/assets/images/cms/sitemap/expand.png +0 -0
- data/app/assets/images/cms/sitemap/gradient.gif +0 -0
- data/app/assets/images/cms/sitemap/gray_contract.png +0 -0
- data/app/assets/images/cms/sitemap/gray_expand.png +0 -0
- data/app/assets/images/cms/sitemap/no_contents.png +0 -0
- data/app/assets/images/cms/sitemap/site_root_cap.png +0 -0
- data/app/assets/images/cms/sitemap/tooltip.gif +0 -0
- data/app/assets/images/cms/sitemap/top_cap_content.png +0 -0
- data/app/assets/images/cms/solid.gif +0 -0
- data/app/assets/images/cms/table/bl.gif +0 -0
- data/app/assets/images/cms/table/br.gif +0 -0
- data/app/assets/images/cms/table/divider.gif +0 -0
- data/app/assets/images/cms/table/td_cap_first_h.gif +0 -0
- data/app/assets/images/cms/table/td_cap_first_s.gif +0 -0
- data/app/assets/images/cms/table/td_cap_last_h.gif +0 -0
- data/app/assets/images/cms/table/td_cap_last_s.gif +0 -0
- data/app/assets/images/cms/table/td_last_bg.gif +0 -0
- data/app/assets/images/cms/table/th_bg.gif +0 -0
- data/app/assets/images/cms/table/th_divider.gif +0 -0
- data/app/assets/images/cms/table/th_last_bg.gif +0 -0
- data/app/assets/images/cms/table/tl.gif +0 -0
- data/app/assets/images/cms/table/tr.gif +0 -0
- data/app/assets/images/cms/table/tr_bg.gif +0 -0
- data/app/assets/images/cms/toolbar_bg.png +0 -0
- data/app/assets/images/cms/top_cap.png +0 -0
- data/app/assets/images/cms/top_cap_content.png +0 -0
- data/app/assets/images/cms/top_cap_menu_header.png +0 -0
- data/app/assets/images/cms/user.png +0 -0
- data/app/assets/images/cms/user_search_submit.gif +0 -0
- data/app/assets/images/cms/usercontrols_bg.png +0 -0
- data/app/assets/images/cms/usercontrols_bg_cap.png +0 -0
- data/app/assets/javascripts/bcms/ckeditor.js +8 -0
- data/app/assets/javascripts/bcms/ckeditor_inline.js +23 -0
- data/app/assets/javascripts/bcms/ckeditor_load.js +54 -0
- data/app/assets/javascripts/bcms/ckeditor_standard_config.js +10 -0
- data/app/assets/javascripts/ckeditor/plugins/delete_content/plugin.js +36 -0
- data/app/assets/javascripts/ckeditor/plugins/edit_content/plugin.js +24 -0
- data/app/assets/javascripts/ckeditor/plugins/move_content/plugin.js +25 -0
- data/app/assets/javascripts/cms/ajax.js +60 -0
- data/app/assets/javascripts/cms/application.js +18 -0
- data/app/assets/javascripts/cms/attachment_manager.js +88 -0
- data/app/assets/javascripts/cms/content_library.js +121 -0
- data/app/assets/javascripts/cms/content_types.js +13 -0
- data/app/assets/javascripts/cms/core_library.js.erb +210 -0
- data/app/assets/javascripts/cms/form_builder.js +250 -0
- data/app/assets/javascripts/cms/namespace.js +2 -0
- data/app/assets/javascripts/cms/new_content_button.js +27 -0
- data/app/assets/javascripts/cms/page_editor.js +189 -0
- data/app/assets/javascripts/cms/page_toolbar.js +13 -0
- data/app/assets/javascripts/cms/site.js +2 -0
- data/app/assets/javascripts/cms/sitemap.js +219 -0
- data/app/assets/javascripts/cms/toolbar.js +21 -0
- data/app/assets/javascripts/cms/user.js +40 -0
- data/app/assets/javascripts/jquery.exists.js +5 -0
- data/app/assets/javascripts/jquery.taglist.js +157 -0
- data/app/assets/stylesheets/cms/_assets.scss +60 -0
- data/app/assets/stylesheets/cms/_base.scss +42 -0
- data/app/assets/stylesheets/cms/_cms-buttons.scss +73 -0
- data/app/assets/stylesheets/cms/_cms-forms.scss +70 -0
- data/app/assets/stylesheets/cms/_colors.scss +20 -0
- data/app/assets/stylesheets/cms/_dashboard.scss +25 -0
- data/app/assets/stylesheets/cms/_glyph.scss +60 -0
- data/app/assets/stylesheets/cms/_main-area.scss +62 -0
- data/app/assets/stylesheets/cms/_nav.scss +197 -0
- data/app/assets/stylesheets/cms/_sidebar.scss +64 -0
- data/app/assets/stylesheets/cms/_sitemap.scss +209 -0
- data/app/assets/stylesheets/cms/_submenu.scss +48 -0
- data/app/assets/stylesheets/cms/application.scss +49 -0
- data/app/assets/stylesheets/cms/core.scss +96 -0
- data/app/assets/stylesheets/cms/default-forms.scss +3 -0
- data/app/assets/stylesheets/cms/includes/_animation.scss +2 -0
- data/app/assets/stylesheets/cms/includes/_rem.scss +120 -0
- data/app/assets/stylesheets/cms/includes/animation/_animate.scss +31 -0
- data/app/assets/stylesheets/cms/includes/animation/_core.scss +127 -0
- data/app/assets/stylesheets/cms/includes/animation/_shared.scss +22 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_attention-seekers.scss +152 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_bouncing.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_classes.scss +21 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_fading.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_flippers.scss +87 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_lightspeed.scss +24 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_rotating.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_specials.scss +42 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-entrances.scss +68 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-exits.scss +60 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-entrances.scss +86 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-exits.scss +86 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-entrances.scss +58 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-exits.scss +58 -0
- data/app/assets/stylesheets/cms/page_content_editing.scss +4 -0
- data/app/assets/stylesheets/cms/page_editor.scss +4 -0
- data/app/assets/stylesheets/cms/style.scss +138 -0
- data/app/assets/stylesheets/cms/styles/_alerts.scss +150 -0
- data/app/assets/stylesheets/cms/styles/_base-grid.scss +299 -0
- data/app/assets/stylesheets/cms/styles/_buttons.scss +247 -0
- data/app/assets/stylesheets/cms/styles/_dropdown.scss +155 -0
- data/app/assets/stylesheets/cms/styles/_forms.scss +728 -0
- data/app/assets/stylesheets/cms/styles/_glyph.scss +86 -0
- data/app/assets/stylesheets/cms/styles/_images.scss +86 -0
- data/app/assets/stylesheets/cms/styles/_lists.scss +115 -0
- data/app/assets/stylesheets/cms/styles/_modal.scss +174 -0
- data/app/assets/stylesheets/cms/styles/_progress.scss +43 -0
- data/app/assets/stylesheets/cms/styles/_tables.scss +141 -0
- data/app/assets/stylesheets/cms/styles/_text.scss +134 -0
- data/app/controllers/cms/application_controller.rb +11 -0
- data/app/controllers/cms/attachments_controller.rb +48 -0
- data/app/controllers/cms/base_controller.rb +22 -0
- data/app/controllers/cms/cache_controller.rb +23 -0
- data/app/controllers/cms/categories_controller.rb +7 -0
- data/app/controllers/cms/category_types_controller.rb +12 -0
- data/app/controllers/cms/connectors_controller.rb +70 -0
- data/app/controllers/cms/content_block_controller.rb +361 -0
- data/app/controllers/cms/content_controller.rb +173 -0
- data/app/controllers/cms/content_types_controller.rb +14 -0
- data/app/controllers/cms/dashboard_controller.rb +13 -0
- data/app/controllers/cms/dynamic_views_controller.rb +81 -0
- data/app/controllers/cms/email_messages_controller.rb +21 -0
- data/app/controllers/cms/file_blocks_controller.rb +4 -0
- data/app/controllers/cms/form_entries_controller.rb +140 -0
- data/app/controllers/cms/form_fields_controller.rb +74 -0
- data/app/controllers/cms/forms_controller.rb +35 -0
- data/app/controllers/cms/groups_controller.rb +25 -0
- data/app/controllers/cms/home_controller.rb +10 -0
- data/app/controllers/cms/html_blocks_controller.rb +4 -0
- data/app/controllers/cms/image_blocks_controller.rb +4 -0
- data/app/controllers/cms/inline_content_controller.rb +50 -0
- data/app/controllers/cms/links_controller.rb +81 -0
- data/app/controllers/cms/page_components_controller.rb +20 -0
- data/app/controllers/cms/page_route_conditions_controller.rb +4 -0
- data/app/controllers/cms/page_route_options_controller.rb +58 -0
- data/app/controllers/cms/page_route_requirements_controller.rb +4 -0
- data/app/controllers/cms/page_routes_controller.rb +51 -0
- data/app/controllers/cms/pages_controller.rb +151 -0
- data/app/controllers/cms/passwords_controller.rb +22 -0
- data/app/controllers/cms/portlet_controller.rb +21 -0
- data/app/controllers/cms/portlets_controller.rb +35 -0
- data/app/controllers/cms/redirects_controller.rb +25 -0
- data/app/controllers/cms/resource_controller.rb +125 -0
- data/app/controllers/cms/routes_controller.rb +22 -0
- data/app/controllers/cms/section_nodes_controller.rb +24 -0
- data/app/controllers/cms/sections_controller.rb +100 -0
- data/app/controllers/cms/sessions_controller.rb +15 -0
- data/app/controllers/cms/sites/passwords_controller.rb +32 -0
- data/app/controllers/cms/sites/sessions_controller.rb +20 -0
- data/app/controllers/cms/tags_controller.rb +16 -0
- data/app/controllers/cms/tasks_controller.rb +56 -0
- data/app/controllers/cms/toolbar_controller.rb +18 -0
- data/app/controllers/cms/user_controller.rb +8 -0
- data/app/controllers/cms/users_controller.rb +125 -0
- data/app/controllers/tests/pretend_controller.rb +32 -0
- data/app/helpers/cms/application_helper.rb +258 -0
- data/app/helpers/cms/content_block_helper.rb +55 -0
- data/app/helpers/cms/content_types_helper.rb +4 -0
- data/app/helpers/cms/form_tag_helper.rb +36 -0
- data/app/helpers/cms/menu_helper.rb +167 -0
- data/app/helpers/cms/mobile_helper.rb +29 -0
- data/app/helpers/cms/nav_menu_helper.rb +23 -0
- data/app/helpers/cms/page_helper.rb +169 -0
- data/app/helpers/cms/path_helper.rb +113 -0
- data/app/helpers/cms/rendering_helper.rb +112 -0
- data/app/helpers/cms/section_nodes_helper.rb +112 -0
- data/app/helpers/cms/sites/authentication_helper.rb +25 -0
- data/app/helpers/cms/sites/devise_shim_helper.rb +31 -0
- data/app/helpers/cms/template_support.rb +18 -0
- data/app/helpers/cms/ui_elements_helper.rb +168 -0
- data/app/helpers/forgot_password_portlet_helper.rb +9 -0
- data/app/helpers/login_portlet_helper.rb +10 -0
- data/app/inputs/attachments_input.rb +14 -0
- data/app/inputs/cms_text_area_input.rb +10 -0
- data/app/inputs/date_picker_input.rb +8 -0
- data/app/inputs/file_picker_input.rb +75 -0
- data/app/inputs/name_input.rb +42 -0
- data/app/inputs/path_input.rb +18 -0
- data/app/inputs/tag_list_input.rb +3 -0
- data/app/inputs/template_editor_input.rb +24 -0
- data/app/inputs/text_editor_input.rb +19 -0
- data/app/models/cms/abstract_file_block.rb +50 -0
- data/app/models/cms/attachment.rb +267 -0
- data/app/models/cms/category.rb +56 -0
- data/app/models/cms/category_type.rb +43 -0
- data/app/models/cms/connector.rb +99 -0
- data/app/models/cms/content.rb +31 -0
- data/app/models/cms/content_type.rb +191 -0
- data/app/models/cms/dynamic_view.rb +81 -0
- data/app/models/cms/email_message.rb +63 -0
- data/app/models/cms/email_message_mailer.rb +12 -0
- data/app/models/cms/external_user.rb +60 -0
- data/app/models/cms/file_block.rb +19 -0
- data/app/models/cms/form.rb +47 -0
- data/app/models/cms/form_entry.rb +75 -0
- data/app/models/cms/form_field.rb +78 -0
- data/app/models/cms/group.rb +62 -0
- data/app/models/cms/group_permission.rb +12 -0
- data/app/models/cms/group_section.rb +9 -0
- data/app/models/cms/group_type.rb +16 -0
- data/app/models/cms/group_type_permission.rb +8 -0
- data/app/models/cms/guest_user.rb +57 -0
- data/app/models/cms/html_block.rb +38 -0
- data/app/models/cms/image_block.rb +23 -0
- data/app/models/cms/link.rb +20 -0
- data/app/models/cms/page.rb +437 -0
- data/app/models/cms/page_component.rb +43 -0
- data/app/models/cms/page_partial.rb +40 -0
- data/app/models/cms/page_route.rb +140 -0
- data/app/models/cms/page_route_condition.rb +5 -0
- data/app/models/cms/page_route_option.rb +7 -0
- data/app/models/cms/page_route_requirement.rb +5 -0
- data/app/models/cms/page_template.rb +45 -0
- data/app/models/cms/permission.rb +17 -0
- data/app/models/cms/persistent_user.rb +223 -0
- data/app/models/cms/portlet.rb +237 -0
- data/app/models/cms/redirect.rb +12 -0
- data/app/models/cms/search_filter.rb +18 -0
- data/app/models/cms/section.rb +224 -0
- data/app/models/cms/section_node.rb +144 -0
- data/app/models/cms/site.rb +45 -0
- data/app/models/cms/tag.rb +69 -0
- data/app/models/cms/tagging.rb +14 -0
- data/app/models/cms/task.rb +75 -0
- data/app/models/cms/templates.rb +31 -0
- data/app/models/cms/user.rb +43 -0
- data/app/models/cms/user_group_membership.rb +9 -0
- data/app/models/cms/view_context.rb +81 -0
- data/app/portlets/deprecated_placeholder.rb +12 -0
- data/app/portlets/dynamic_portlet.rb +7 -0
- data/app/portlets/email_page_portlet.rb +32 -0
- data/app/portlets/forgot_password_portlet.rb +15 -0
- data/app/portlets/helpers/cms/list_portlet_helper.rb +5 -0
- data/app/portlets/list_portlet.rb +40 -0
- data/app/portlets/login_portlet.rb +13 -0
- data/app/portlets/tag_cloud_portlet.rb +15 -0
- data/app/presenters/cms/user_presenter.rb +47 -0
- data/app/views/cms/application/_add_content_modal.html.erb +3 -0
- data/app/views/cms/application/_buttons.html.erb +7 -0
- data/app/views/cms/application/_exception.html.erb +6 -0
- data/app/views/cms/application/_form_errors.html.erb +7 -0
- data/app/views/cms/application/_form_with_buttons.html.erb +10 -0
- data/app/views/cms/application/_main_content.html.erb +3 -0
- data/app/views/cms/application/_main_with_sidebar.html.erb +8 -0
- data/app/views/cms/application/_mobile_toolbar.html.erb +16 -0
- data/app/views/cms/application/_page_title.html.erb +5 -0
- data/app/views/cms/application/_pagination.html.erb +26 -0
- data/app/views/cms/application/_row.html.erb +1 -0
- data/app/views/cms/application/_save_buttons.html.erb +7 -0
- data/app/views/cms/application/_sidebar_layout.html.erb +3 -0
- data/app/views/cms/application/_version.html.erb +23 -0
- data/app/views/cms/application/_version_conflict_diff.html.erb +11 -0
- data/app/views/cms/application/_version_conflict_error.html.erb +6 -0
- data/app/views/cms/attachments/_attachment.html.erb +16 -0
- data/app/views/cms/attachments/_attachment_manager.html.erb +39 -0
- data/app/views/cms/attachments/_attachment_table.html.erb +22 -0
- data/app/views/cms/attachments/_attachment_wrapper.html.erb +4 -0
- data/app/views/cms/attachments/_no_attachments_defined.html.erb +1 -0
- data/app/views/cms/cache/show.html.erb +7 -0
- data/app/views/cms/categories/_form.html.erb +27 -0
- data/app/views/cms/category_types/_form.html.erb +1 -0
- data/app/views/cms/connectors/new.html.erb +38 -0
- data/app/views/cms/content/editing_frame.html.erb +1 -0
- data/app/views/cms/content/no_page.html.erb +19 -0
- data/app/views/cms/content/show.html.erb +21 -0
- data/app/views/cms/content_block/_block_form.html.erb +15 -0
- data/app/views/cms/content_block/_buttonbar.html.erb +29 -0
- data/app/views/cms/content_block/_buttons.html.erb +13 -0
- data/app/views/cms/content_block/_hidden_fields.html.erb +13 -0
- data/app/views/cms/content_block/_sidebar.html.erb +36 -0
- data/app/views/cms/content_block/edit.html.erb +3 -0
- data/app/views/cms/content_block/index.html.erb +87 -0
- data/app/views/cms/content_block/new.html.erb +3 -0
- data/app/views/cms/content_block/render_block_in_main_container.html.erb +10 -0
- data/app/views/cms/content_block/show.html.erb +1 -0
- data/app/views/cms/content_block/show_in_isolation.html.erb +15 -0
- data/app/views/cms/content_block/versions.html.erb +24 -0
- data/app/views/cms/content_types/_order_field.html.erb +5 -0
- data/app/views/cms/content_types/index.html.erb +3 -0
- data/app/views/cms/dashboard/_page_drafts.html.erb +39 -0
- data/app/views/cms/dashboard/_tasks.html.erb +41 -0
- data/app/views/cms/dashboard/index.html.erb +13 -0
- data/app/views/cms/dynamic_views/_form.html.erb +9 -0
- data/app/views/cms/dynamic_views/edit.html.erb +2 -0
- data/app/views/cms/dynamic_views/index.html.erb +33 -0
- data/app/views/cms/dynamic_views/new.html.erb +2 -0
- data/app/views/cms/email_messages/index.html.erb +36 -0
- data/app/views/cms/email_messages/show.html.erb +50 -0
- data/app/views/cms/file_blocks/_form.html.erb +3 -0
- data/app/views/cms/file_blocks/_section_selector.html.erb +13 -0
- data/app/views/cms/file_blocks/render.html.erb +5 -0
- data/app/views/cms/forgot_password_mailer/reset_password.text.html.erb +3 -0
- data/app/views/cms/forgot_password_mailer/reset_password.text.plain.erb +3 -0
- data/app/views/cms/form_entries/_buttons.html.erb +2 -0
- data/app/views/cms/form_entries/_form.html.erb +7 -0
- data/app/views/cms/form_entries/_internal_form.html.erb +9 -0
- data/app/views/cms/form_entries/edit.html.erb +5 -0
- data/app/views/cms/form_entries/error.html.erb +3 -0
- data/app/views/cms/form_entries/index.html.erb +5 -0
- data/app/views/cms/form_entries/new.html.erb +5 -0
- data/app/views/cms/form_entries/show.html.erb +13 -0
- data/app/views/cms/form_entries/submit.html.erb +1 -0
- data/app/views/cms/form_fields/_form.html.erb +8 -0
- data/app/views/cms/form_fields/_select.html.erb +3 -0
- data/app/views/cms/form_fields/_text_area.html.erb +3 -0
- data/app/views/cms/form_fields/_text_field.html.erb +3 -0
- data/app/views/cms/form_fields/edit.html.erb +0 -0
- data/app/views/cms/form_fields/new.html.erb +26 -0
- data/app/views/cms/form_fields/preview.html.erb +16 -0
- data/app/views/cms/forms/_form.html.erb +67 -0
- data/app/views/cms/forms/render.html.erb +15 -0
- data/app/views/cms/forms/show.html.erb +6 -0
- data/app/views/cms/groups/_form.html.erb +38 -0
- data/app/views/cms/groups/_permissions.html.erb +14 -0
- data/app/views/cms/groups/_sections.html.erb +12 -0
- data/app/views/cms/groups/edit.html.erb +2 -0
- data/app/views/cms/groups/index.html.erb +36 -0
- data/app/views/cms/groups/new.html.erb +2 -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 +3 -0
- data/app/views/cms/image_blocks/render.html.erb +4 -0
- data/app/views/cms/links/_form.html.erb +8 -0
- data/app/views/cms/links/edit.html.erb +4 -0
- data/app/views/cms/links/new.html.erb +5 -0
- data/app/views/cms/menus/_menu.html.erb +9 -0
- data/app/views/cms/menus/_menu_item.html.erb +11 -0
- data/app/views/cms/page_components/_content.html.erb +18 -0
- data/app/views/cms/page_components/new.html.erb +12 -0
- data/app/views/cms/page_routes/_form.html.erb +12 -0
- data/app/views/cms/page_routes/edit.html.erb +2 -0
- data/app/views/cms/page_routes/index.html.erb +33 -0
- data/app/views/cms/page_routes/new.html.erb +2 -0
- data/app/views/cms/pages/_edit_content.html.erb +28 -0
- data/app/views/cms/pages/_form.html.erb +21 -0
- data/app/views/cms/pages/_main_form.html.erb +23 -0
- data/app/views/cms/pages/_simple_container.html.erb +8 -0
- data/app/views/cms/pages/edit.html.erb +2 -0
- data/app/views/cms/pages/new.html.erb +19 -0
- data/app/views/cms/pages/versions.html.erb +22 -0
- data/app/views/cms/passwords/new.html.erb +16 -0
- data/app/views/cms/redirects/_form.html.erb +7 -0
- data/app/views/cms/redirects/edit.html.erb +2 -0
- data/app/views/cms/redirects/index.html.erb +25 -0
- data/app/views/cms/redirects/new.html.erb +2 -0
- data/app/views/cms/routes/index.html.erb +35 -0
- data/app/views/cms/section_nodes/_children.html.erb +5 -0
- data/app/views/cms/section_nodes/_row_buttons.html.erb +11 -0
- data/app/views/cms/section_nodes/_section_node.html.erb +24 -0
- data/app/views/cms/section_nodes/_sitemap_buttons.html.erb +47 -0
- data/app/views/cms/section_nodes/_status.html.erb +5 -0
- data/app/views/cms/section_nodes/show.html.erb +9 -0
- data/app/views/cms/sections/_buttons.html.erb +6 -0
- data/app/views/cms/sections/_form.html.erb +30 -0
- data/app/views/cms/sections/edit.html.erb +4 -0
- data/app/views/cms/sections/new.html.erb +5 -0
- data/app/views/cms/sessions/new.html.erb +16 -0
- data/app/views/cms/shared/access_denied.html.erb +2 -0
- data/app/views/cms/shared/error.html.erb +40 -0
- data/app/views/cms/shared/error.xml.erb +8 -0
- data/app/views/cms/sites/_flash.html.erb +8 -0
- data/app/views/cms/sites/passwords/new.html.erb +2 -0
- data/app/views/cms/sites/sessions/new.html.erb +2 -0
- data/app/views/cms/tags/_form.html.erb +1 -0
- data/app/views/cms/tags/render.html.erb +52 -0
- data/app/views/cms/tasks/new.html.erb +22 -0
- data/app/views/cms/toolbar/_new_pages_menu.html.erb +10 -0
- data/app/views/cms/users/_form.html.erb +9 -0
- data/app/views/cms/users/_password.html.erb +2 -0
- data/app/views/cms/users/_user_fields.html.erb +7 -0
- data/app/views/cms/users/change_password.html.erb +12 -0
- data/app/views/cms/users/edit.html.erb +2 -0
- data/app/views/cms/users/index.html.erb +65 -0
- data/app/views/cms/users/new.html.erb +2 -0
- data/app/views/devise/confirmations/new.html.erb +16 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +19 -0
- data/app/views/devise/passwords/new.html.erb +15 -0
- data/app/views/devise/registrations/edit.html.erb +28 -0
- data/app/views/devise/registrations/new.html.erb +18 -0
- data/app/views/devise/shared/_links.erb +25 -0
- data/app/views/devise/unlocks/new.html.erb +16 -0
- data/app/views/layouts/cms/_content_types.html.erb +13 -0
- data/app/views/layouts/cms/_footer.erb +4 -0
- data/app/views/layouts/cms/_head.html.erb +8 -0
- data/app/views/layouts/cms/_main_menu.html.erb +78 -0
- data/app/views/layouts/cms/application.html.erb +23 -0
- data/app/views/layouts/cms/content_page.html.erb +5 -0
- data/app/views/layouts/cms/page_editor.html.erb +90 -0
- data/app/views/portlets/deprecated_placeholders/_form.html.erb +1 -0
- data/app/views/portlets/deprecated_placeholders/render.html.erb +8 -0
- data/app/views/portlets/dynamic/_form.html.erb +3 -0
- data/app/views/portlets/email_page/_form.html.erb +5 -0
- data/app/views/portlets/email_page/render.html.erb +17 -0
- data/app/views/portlets/forgot_password/_form.html.erb +5 -0
- data/app/views/portlets/forgot_password/render.html.erb +2 -0
- data/app/views/portlets/list/_form.html.erb +33 -0
- data/app/views/portlets/list/_list.html.erb +6 -0
- data/app/views/portlets/list/_table.html.erb +13 -0
- data/app/views/portlets/list/render.html.erb +1 -0
- data/app/views/portlets/login/_form.html.erb +4 -0
- data/app/views/portlets/login/render.html.erb +10 -0
- data/app/views/portlets/portlets/_form.html.erb +20 -0
- data/app/views/portlets/tag_cloud/_form.html.erb +4 -0
- data/app/views/portlets/tag_cloud/render.html.erb +5 -0
- data/app/views/tests/pretend/open_with_layout.html.erb +5 -0
- data/bin/bcms +321 -0
- data/bin/browsercms +4 -0
- data/bin/rake +16 -0
- data/config/routes.rb +135 -0
- data/db/browsercms.seeds.rb +63 -0
- data/db/migrate/20080815014337_browsercms300.rb +287 -0
- data/db/migrate/20130327184912_browsercms400.rb +120 -0
- data/db/migrate/20150715173336_create_default_users.rb +12 -0
- data/db/seeds.rb +1 -0
- data/doc/README_FOR_APP +6 -0
- data/doc/design/blue_button.psd +0 -0
- data/doc/design/gray_box.psd +0 -0
- data/doc/design/main_nav.psd +0 -0
- data/doc/features/design_integration.md +45 -0
- data/doc/features/external_user.md +7 -0
- data/doc/features/form_builder.md +40 -0
- data/doc/features/simple_form_refactor.md +60 -0
- data/doc/performance_tuning_notes.md +12 -0
- data/doc/release_notes.md +837 -0
- data/doc/test_procedure.txt +141 -0
- data/lib/acts_as_list.rb +257 -0
- data/lib/browsercms-artirix.rb +1 -0
- data/lib/browsercms.rb +73 -0
- data/lib/cms/acts/cms_user.rb +131 -0
- data/lib/cms/acts/content_block.rb +61 -0
- data/lib/cms/acts/content_page.rb +90 -0
- data/lib/cms/acts.rb +7 -0
- data/lib/cms/admin_tab.rb +15 -0
- data/lib/cms/attachments/attachment_serving.rb +59 -0
- data/lib/cms/attachments/configuration.rb +88 -0
- data/lib/cms/authentication/controller.rb +120 -0
- data/lib/cms/authentication/test_password_strategy.rb +28 -0
- data/lib/cms/authentication.rb +4 -0
- data/lib/cms/authoring.rb +9 -0
- data/lib/cms/behaviors/archiving.rb +43 -0
- data/lib/cms/behaviors/attaching.rb +363 -0
- data/lib/cms/behaviors/categorizing.rb +31 -0
- data/lib/cms/behaviors/connecting.rb +141 -0
- data/lib/cms/behaviors/dynamic_attributes.rb +384 -0
- data/lib/cms/behaviors/flush_cache_on_change.rb +31 -0
- data/lib/cms/behaviors/hiding.rb +46 -0
- data/lib/cms/behaviors/namespacing.rb +15 -0
- data/lib/cms/behaviors/naming.rb +16 -0
- data/lib/cms/behaviors/publishing.rb +205 -0
- data/lib/cms/behaviors/rendering.rb +195 -0
- data/lib/cms/behaviors/searching.rb +45 -0
- data/lib/cms/behaviors/soft_deleting.rb +103 -0
- data/lib/cms/behaviors/taggable.rb +66 -0
- data/lib/cms/behaviors/userstamping.rb +42 -0
- data/lib/cms/behaviors/versioning.rb +360 -0
- data/lib/cms/behaviors.rb +34 -0
- data/lib/cms/caching.rb +62 -0
- data/lib/cms/commands/actions.rb +107 -0
- data/lib/cms/commands/to_version400.rb +10 -0
- data/lib/cms/concerns/can_be_addressable.rb +326 -0
- data/lib/cms/concerns/has_content_type.rb +46 -0
- data/lib/cms/concerns/ignores_publishing.rb +9 -0
- data/lib/cms/concerns.rb +7 -0
- data/lib/cms/configuration/configurable_template.rb +24 -0
- data/lib/cms/configuration/devise.rb +256 -0
- data/lib/cms/configuration.rb +79 -0
- data/lib/cms/configure_simple_form.rb +142 -0
- data/lib/cms/configure_simple_form_bootstrap.rb +58 -0
- data/lib/cms/content_filter.rb +18 -0
- data/lib/cms/content_page.rb +77 -0
- data/lib/cms/content_rendering_support.rb +114 -0
- data/lib/cms/controllers/admin_controller.rb +78 -0
- data/lib/cms/data_loader.rb +54 -0
- data/lib/cms/date_picker.rb +23 -0
- data/lib/cms/default_accessible.rb +13 -0
- data/lib/cms/domain_support.rb +38 -0
- data/lib/cms/engine.rb +135 -0
- data/lib/cms/engine_helper.rb +103 -0
- data/lib/cms/error_handling.rb +84 -0
- data/lib/cms/error_pages.rb +8 -0
- data/lib/cms/extensions/action_view/base.rb +13 -0
- data/lib/cms/extensions/active_model/name.rb +13 -0
- data/lib/cms/extensions/active_record/base.rb +37 -0
- data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +94 -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 +11 -0
- data/lib/cms/extensions/integer.rb +16 -0
- data/lib/cms/extensions/nil.rb +19 -0
- data/lib/cms/extensions/string.rb +24 -0
- data/lib/cms/extensions.rb +5 -0
- data/lib/cms/form_builder/content_block_form_builder.rb +45 -0
- data/lib/cms/form_builder/default_input.rb +13 -0
- data/lib/cms/form_builder/deprecated_inputs.rb +40 -0
- data/lib/cms/form_builder/workflow_buttons.rb +38 -0
- data/lib/cms/installation_actions.rb +8 -0
- data/lib/cms/mobile_aware.rb +67 -0
- data/lib/cms/module.rb +36 -0
- data/lib/cms/module_installation.rb +31 -0
- data/lib/cms/polymorphic_single_table_inheritance.rb +19 -0
- data/lib/cms/publish_workflow.rb +26 -0
- data/lib/cms/responders/content_responder.rb +14 -0
- data/lib/cms/route_extensions.rb +157 -0
- data/lib/cms/users_service.rb +208 -0
- data/lib/cms/version.rb +11 -0
- data/lib/command_line.rb +39 -0
- data/lib/generators/browser_cms/demo_site/USAGE +3 -0
- data/lib/generators/browser_cms/demo_site/templates/demo.seeds.rb +249 -0
- data/lib/generators/browser_cms/demo_site/templates/demo_site.rake +14 -0
- data/lib/generators/browser_cms/demo_site/templates/logo.jpg +0 -0
- data/lib/generators/browser_cms/demo_site/templates/splash.jpg +0 -0
- data/lib/generators/browser_cms/demo_site/templates/style.css +257 -0
- data/lib/generators/browser_cms.rb +12 -0
- data/lib/generators/cms/content_block/USAGE +22 -0
- data/lib/generators/cms/content_block/content_block_generator.rb +103 -0
- data/lib/generators/cms/content_block/templates/_form.html.erb +27 -0
- data/lib/generators/cms/content_block/templates/application_controller.rb.erb +4 -0
- data/lib/generators/cms/content_block/templates/render.html.erb +23 -0
- data/lib/generators/cms/install/USAGE +8 -0
- data/lib/generators/cms/install/install_generator.rb +16 -0
- data/lib/generators/cms/portlet/USAGE +26 -0
- data/lib/generators/cms/portlet/portlet_generator.rb +38 -0
- data/lib/generators/cms/portlet/templates/_form.html.erb +5 -0
- data/lib/generators/cms/portlet/templates/portlet.rb +12 -0
- data/lib/generators/cms/portlet/templates/portlet_helper.rb +5 -0
- data/lib/generators/cms/portlet/templates/render.html.erb +1 -0
- data/lib/generators/cms/portlet/templates/unit_test.erb +9 -0
- data/lib/generators/cms/project/USAGE +1 -0
- data/lib/generators/cms/project/templates/COPYRIGHT.txt +23 -0
- data/lib/generators/cms/project/templates/GPL.txt +674 -0
- data/lib/generators/cms/project/templates/LICENSE.txt +165 -0
- data/lib/generators/cms/project/templates/USAGE +3 -0
- data/lib/generators/cms/project/templates/devise.rb.erb +7 -0
- data/lib/generators/cms/project/templates/gitignore.erb +11 -0
- data/lib/generators/cms/project/templates/install_generator.erb +21 -0
- data/lib/generators/cms/project/templates/module_tasks.rake +10 -0
- data/lib/generators/cms/template/USAGE +10 -0
- data/lib/generators/cms/template/template_generator.rb +29 -0
- data/lib/generators/cms/template/templates/template.erb +2 -0
- data/lib/sequence.rb +6 -0
- data/lib/tasks/cms.rake +23 -0
- data/lib/templates/active_record/model/model.rb +17 -0
- data/vendor/assets/javascripts/jquery.cookie.js +91 -0
- data/vendor/assets/javascripts/jquery.selectbox.js +209 -0
- metadata +1048 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
module Behaviors
|
|
3
|
+
# The DynamicAttributes behavior allows a model to store values for any attributes.
|
|
4
|
+
# A model that uses DynamicAttributes should have corresponding "_attributes" table
|
|
5
|
+
# where it stores the values for the dynamic attributes.
|
|
6
|
+
# This is based on the {Flex Attributes Rails Plugin}[http://rubyforge.org/projects/flex-attributes].
|
|
7
|
+
#
|
|
8
|
+
# class User < ActiveRecord::Base
|
|
9
|
+
# has_dynamic_attributes
|
|
10
|
+
# end
|
|
11
|
+
# eric = User.find_by_login 'eric'
|
|
12
|
+
# puts "My AOL instant message name is: #{eric.aim}"
|
|
13
|
+
# eric.phone = '555-123-4567'
|
|
14
|
+
# eric.save
|
|
15
|
+
#
|
|
16
|
+
# The above example should work even though "aim" and "phone" are not
|
|
17
|
+
# attributes on the User model.
|
|
18
|
+
#
|
|
19
|
+
# The following options are available on for has_dynamic_attributes to modify
|
|
20
|
+
# the behavior. Reasonable defaults are provided:
|
|
21
|
+
#
|
|
22
|
+
# class_name::
|
|
23
|
+
# The class for the related model. This defaults to the
|
|
24
|
+
# model name prepended to "Attribute". So for a "User" model the class
|
|
25
|
+
# name would be "UserAttribute". The class can actually exist (in that
|
|
26
|
+
# case the model file will be loaded through Rails dependency system) or
|
|
27
|
+
# if it does not exist a basic model will be dynamically defined for you.
|
|
28
|
+
# This allows you to implement custom methods on the related class by
|
|
29
|
+
# simply defining the class manually.
|
|
30
|
+
# table_name::
|
|
31
|
+
# The table for the related model. This defaults to the
|
|
32
|
+
# attribute model's table name.
|
|
33
|
+
# relationship_name::
|
|
34
|
+
# This is the name of the actual has_many
|
|
35
|
+
# relationship. Most of the type this relationship will only be used
|
|
36
|
+
# indirectly but it is there if the user wants more raw access. This
|
|
37
|
+
# defaults to the class name underscored then pluralized finally turned
|
|
38
|
+
# into a symbol.
|
|
39
|
+
# foreign_key::
|
|
40
|
+
# The key in the attribute table to relate back to the
|
|
41
|
+
# model. This defaults to the model name underscored prepended to "_id"
|
|
42
|
+
# name_field::
|
|
43
|
+
# The field which stores the name of the attribute in the related object
|
|
44
|
+
# value_field::
|
|
45
|
+
# The field that stores the value in the related object
|
|
46
|
+
# fields::
|
|
47
|
+
# A list of fields that are valid dynamic attributes. By default
|
|
48
|
+
# this is "nil" which means that all field are valid. Use this option if
|
|
49
|
+
# you want some fields to go to one dynamic attribute model while other
|
|
50
|
+
# fields will go to another. As an alternative you can override the
|
|
51
|
+
# #dynamic_attributes method which will return a list of all valid dynamic
|
|
52
|
+
# attributes. This is useful if you want to read the list of attributes
|
|
53
|
+
# from another source to keep your code DRY. This method is given a
|
|
54
|
+
# single argument which is the class for the related model. The following
|
|
55
|
+
# provide an example:
|
|
56
|
+
#
|
|
57
|
+
# class User < ActiveRecord::Base
|
|
58
|
+
# has_dynamic_attributes :class_name => 'UserContactInfo'
|
|
59
|
+
# has_dynamic_attributes :class_name => 'Preferences'
|
|
60
|
+
#
|
|
61
|
+
# def dynamic_attributes(model)
|
|
62
|
+
# case model
|
|
63
|
+
# when UserContactInfo
|
|
64
|
+
# %w(email phone aim yahoo msn)
|
|
65
|
+
# when Preference
|
|
66
|
+
# %w(project_search project_order user_search user_order)
|
|
67
|
+
# else Array.new
|
|
68
|
+
# end
|
|
69
|
+
# end
|
|
70
|
+
# end
|
|
71
|
+
#
|
|
72
|
+
# eric = User.find_by_login 'eric'
|
|
73
|
+
# eric.email = 'eric@example.com' # Will save to UserContactInfo model
|
|
74
|
+
# eric.project_order = 'name' # Will save to Preference
|
|
75
|
+
# eric.save # Carries out save so now values are in database
|
|
76
|
+
#
|
|
77
|
+
# Note the else clause in our case statement. Since an empty array is
|
|
78
|
+
# returned for all other models (perhaps added later) then we can be
|
|
79
|
+
# certain that only the above dynamic attributes are allowed.
|
|
80
|
+
#
|
|
81
|
+
# If both a :fields option and #dynamic_attributes method is defined the
|
|
82
|
+
# :fields option take precidence. This allows you to easily define the
|
|
83
|
+
# field list inline for one model while implementing #dynamic_attributes
|
|
84
|
+
# for another model and not having #dynamic_attributes need to determine
|
|
85
|
+
# what model it is answering for. In both cases the list of dynamic
|
|
86
|
+
# attributes can be a list of string or symbols
|
|
87
|
+
#
|
|
88
|
+
# A final alternative to :fields and #dynamic_attributes is the
|
|
89
|
+
# #is_dynamic_attribute? method. This method is given two arguments. The
|
|
90
|
+
# first is the attribute being retrieved/saved the second is the Model we
|
|
91
|
+
# are testing for. If you override this method then the #dynamic_attributes
|
|
92
|
+
# method or the :fields option will have no affect. Use of this method
|
|
93
|
+
# is ideal when you want to retrict the attributes but do so in a
|
|
94
|
+
# algorithmic way. The following is an example:
|
|
95
|
+
# class User < ActiveRecord::Base
|
|
96
|
+
# has_dynamic_attributes :class_name => 'UserContactInfo'
|
|
97
|
+
# has_dynamic_attributes :class_name => 'Preferences'
|
|
98
|
+
#
|
|
99
|
+
# def is_dynamic_attribute?(attr, model)
|
|
100
|
+
# case attr.to_s
|
|
101
|
+
# when /^contact_/ then true
|
|
102
|
+
# when /^preference_/ then true
|
|
103
|
+
# else
|
|
104
|
+
# false
|
|
105
|
+
# end
|
|
106
|
+
# end
|
|
107
|
+
# end
|
|
108
|
+
#
|
|
109
|
+
# eric = User.find_by_login 'eric'
|
|
110
|
+
# eric.contact_phone = '555-123-4567'
|
|
111
|
+
# eric.contact_email = 'eric@example.com'
|
|
112
|
+
# eric.preference_project_order = 'name'
|
|
113
|
+
# eric.some_attribute = 'blah' # If some_attribute is not defined on
|
|
114
|
+
# # the model then method not found is thrown
|
|
115
|
+
module DynamicAttributes
|
|
116
|
+
def self.included(model_class)
|
|
117
|
+
model_class.extend(MacroMethods)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
module MacroMethods
|
|
121
|
+
def has_dynamic_attributes?
|
|
122
|
+
!!@has_dynamic_attributes
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Will make the current class have dynamic attributes.
|
|
126
|
+
def has_dynamic_attributes(options={})
|
|
127
|
+
@has_dynamic_attributes = true
|
|
128
|
+
include InstanceMethods
|
|
129
|
+
|
|
130
|
+
# Provide default options
|
|
131
|
+
options[:class_name] ||= "#{self.model_name}Attribute"
|
|
132
|
+
options[:table_name] ||= options[:class_name].tableize
|
|
133
|
+
options[:relationship_name] ||= options[:class_name].tableize.to_sym
|
|
134
|
+
options[:foreign_key] ||= self.model_name.foreign_key
|
|
135
|
+
options[:base_foreign_key] ||= self.name.underscore.foreign_key
|
|
136
|
+
options[:name_field] ||= 'name'
|
|
137
|
+
options[:value_field] ||= 'value'
|
|
138
|
+
options[:fields].collect! { |f| f.to_s } unless options[:fields].nil?
|
|
139
|
+
|
|
140
|
+
# Init option storage if necessary
|
|
141
|
+
cattr_accessor :dynamic_options
|
|
142
|
+
self.dynamic_options ||= Hash.new
|
|
143
|
+
|
|
144
|
+
# Return if already processed.
|
|
145
|
+
return if self.dynamic_options.keys.include? options[:class_name]
|
|
146
|
+
|
|
147
|
+
# Attempt to load related class. If not create it
|
|
148
|
+
begin
|
|
149
|
+
options[:class_name].constantize
|
|
150
|
+
rescue
|
|
151
|
+
Object.const_set(options[:class_name], Class.new(ActiveRecord::Base)).class_eval do
|
|
152
|
+
self.table_name = options[:table_name]
|
|
153
|
+
#self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
|
|
154
|
+
|
|
155
|
+
def self.reloadable? #:nodoc:
|
|
156
|
+
false
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Store options
|
|
162
|
+
self.dynamic_options[options[:class_name]] = options
|
|
163
|
+
|
|
164
|
+
# Modify attribute class
|
|
165
|
+
attribute_class = options[:class_name].constantize
|
|
166
|
+
base_class = self.name.underscore.to_sym
|
|
167
|
+
attribute_class.class_eval do
|
|
168
|
+
belongs_to base_class, :foreign_key => options[:base_foreign_key]
|
|
169
|
+
alias_method :base, base_class # For generic access
|
|
170
|
+
#attr_accessible :name, :value, "#{base_class.to_s}_id".to_sym
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Modify main class
|
|
174
|
+
class_eval do
|
|
175
|
+
has_many options[:relationship_name],
|
|
176
|
+
:class_name => options[:class_name],
|
|
177
|
+
:foreign_key => options[:foreign_key],
|
|
178
|
+
:dependent => :destroy
|
|
179
|
+
|
|
180
|
+
# The following is only setup once
|
|
181
|
+
unless private_method_defined? :method_missing_without_dynamic_attributes
|
|
182
|
+
|
|
183
|
+
# Carry out delayed actions before save
|
|
184
|
+
after_validation :save_modified_dynamic_attributes
|
|
185
|
+
|
|
186
|
+
# Make attributes seem real
|
|
187
|
+
alias_method :method_missing_without_dynamic_attributes, :method_missing
|
|
188
|
+
alias_method :method_missing, :method_missing_with_dynamic_attributes
|
|
189
|
+
|
|
190
|
+
private
|
|
191
|
+
|
|
192
|
+
alias_method :read_attribute_without_dynamic_attributes, :read_attribute
|
|
193
|
+
alias_method :read_attribute, :read_attribute_with_dynamic_attributes
|
|
194
|
+
alias_method :write_attribute_without_dynamic_attributes, :write_attribute
|
|
195
|
+
alias_method :write_attribute, :write_attribute_with_dynamic_attributes
|
|
196
|
+
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
module InstanceMethods
|
|
204
|
+
# Will determine if the given attribute is a dynamic attribute on the
|
|
205
|
+
# given model. Override this in your class to provide custom logic if
|
|
206
|
+
# the #dynamic_attributes method or the :fields option are not flexible
|
|
207
|
+
# enough. If you override this method :fields and #dynamic_attributes will
|
|
208
|
+
# not apply at all unless you implement them yourself.
|
|
209
|
+
def is_dynamic_attribute?(attr, model)
|
|
210
|
+
attr = attr.to_s
|
|
211
|
+
return dynamic_options[model.name][:fields].include?(attr) unless dynamic_options[model.name][:fields].nil?
|
|
212
|
+
return dynamic_attributes(model).collect { |f| f.to_s }.include?(attr) unless dynamic_attributes(model).nil?
|
|
213
|
+
true
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# Return a list of valid dynamic attributes for the given model. Return
|
|
217
|
+
# nil if any field is allowed. If you want to say no field is allowed
|
|
218
|
+
# then return an empty array. If you just have a static list the :fields
|
|
219
|
+
# option is most likely easier.
|
|
220
|
+
def dynamic_attributes(model)
|
|
221
|
+
; nil
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
# Overrides the assign_attributes= defined in ActiveRecord::Base(active_record/base.rb)
|
|
226
|
+
#
|
|
227
|
+
# The only difference is that this doesn't check to see if the
|
|
228
|
+
# model responds_to the method before sending it
|
|
229
|
+
#
|
|
230
|
+
# Not happy with this copy/paste duplication, but its merely an update to the previous Rails 2/3 behavior
|
|
231
|
+
# Must remain PUBLIC so other rails methods can call it (like ActiveRecord::Persistence#update_attributes)
|
|
232
|
+
def assign_attributes(new_attributes, options = {})
|
|
233
|
+
return unless new_attributes
|
|
234
|
+
|
|
235
|
+
attributes = new_attributes.stringify_keys
|
|
236
|
+
role = options[:as] || :default
|
|
237
|
+
|
|
238
|
+
multi_parameter_attributes = []
|
|
239
|
+
|
|
240
|
+
# Disabling mass assignment protection for attributes, might be a terrible idea, but dynamic_attributes are really wonky.
|
|
241
|
+
#unless options[:without_protection]
|
|
242
|
+
# attributes = sanitize_for_mass_assignment(attributes, role)
|
|
243
|
+
#end
|
|
244
|
+
|
|
245
|
+
attributes.each do |k, v|
|
|
246
|
+
if k.include?("(")
|
|
247
|
+
multi_parameter_attributes << [k, v]
|
|
248
|
+
else
|
|
249
|
+
# Dynamic Attributes will take ALL setters (unlike ActiveRecord)
|
|
250
|
+
send("#{k}=", v)
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
assign_multiparameter_attributes(multi_parameter_attributes)
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
private
|
|
259
|
+
|
|
260
|
+
# Called after validation on update so that dynamic attributes behave
|
|
261
|
+
# like normal attributes in the fact that the database is not touched
|
|
262
|
+
# until save is called.
|
|
263
|
+
def save_modified_dynamic_attributes
|
|
264
|
+
return if new_record?
|
|
265
|
+
return if @save_dynamic_attr.nil?
|
|
266
|
+
@save_dynamic_attr.each do |s|
|
|
267
|
+
model, attr_name = s
|
|
268
|
+
related_attr = dynamic_related_attr model, attr_name
|
|
269
|
+
unless related_attr.nil?
|
|
270
|
+
if related_attr.value.nil?
|
|
271
|
+
dynamic_related(model).delete related_attr
|
|
272
|
+
else
|
|
273
|
+
related_attr.save
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
@save_dynamic_attr = []
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Overrides ActiveRecord::Base#read_attribute
|
|
281
|
+
def read_attribute_with_dynamic_attributes(attr_name)
|
|
282
|
+
attr_name = attr_name.to_s
|
|
283
|
+
exec_if_related attr_name do |model|
|
|
284
|
+
return nil if !@remove_dynamic_attr.nil? && @remove_dynamic_attr.any? do |r|
|
|
285
|
+
r[0] == model && r[1] == attr_name
|
|
286
|
+
end
|
|
287
|
+
value_field = dynamic_options[model.name][:value_field]
|
|
288
|
+
related_attr = dynamic_related_attr model, attr_name
|
|
289
|
+
return nil if related_attr.nil?
|
|
290
|
+
return related_attr.send(value_field)
|
|
291
|
+
end
|
|
292
|
+
read_attribute_without_dynamic_attributes(attr_name)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# Overrides ActiveRecord::Base#write_attribute
|
|
296
|
+
def write_attribute_with_dynamic_attributes(attr_name, value)
|
|
297
|
+
attr_name = attr_name.to_s
|
|
298
|
+
exec_if_related attr_name do |model|
|
|
299
|
+
value_field = dynamic_options[model.name][:value_field]
|
|
300
|
+
@save_dynamic_attr ||= []
|
|
301
|
+
@save_dynamic_attr << [model, attr_name]
|
|
302
|
+
related_attr = dynamic_related_attr(model, attr_name)
|
|
303
|
+
if related_attr.nil?
|
|
304
|
+
# Used to check for nil? but this caused validation
|
|
305
|
+
# problems that are harder to solve. blank? is probably
|
|
306
|
+
# not correct but it works well for now.
|
|
307
|
+
unless value.blank?
|
|
308
|
+
name_field = dynamic_options[model.name][:name_field]
|
|
309
|
+
foreign_key = dynamic_options[model.name][:foreign_key]
|
|
310
|
+
dynamic_related(model).build name_field => attr_name,
|
|
311
|
+
value_field => value, foreign_key => self.id
|
|
312
|
+
end
|
|
313
|
+
return value
|
|
314
|
+
else
|
|
315
|
+
value_field = (value_field.to_s + '=').to_sym
|
|
316
|
+
return related_attr.send(value_field, value)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
write_attribute_without_dynamic_attributes(attr_name, value)
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# Implements dynamic-attributes as if real getter/setter methods
|
|
323
|
+
# were defined.
|
|
324
|
+
def method_missing_with_dynamic_attributes(method_id, *args, &block)
|
|
325
|
+
begin
|
|
326
|
+
method_missing_without_dynamic_attributes method_id, *args, &block
|
|
327
|
+
rescue NoMethodError => e
|
|
328
|
+
attr_name = method_id.to_s.sub(/\=$/, '')
|
|
329
|
+
exec_if_related attr_name do |model|
|
|
330
|
+
if method_id.to_s =~ /\=$/
|
|
331
|
+
return write_attribute_with_dynamic_attributes(attr_name, args[0])
|
|
332
|
+
else
|
|
333
|
+
return read_attribute_with_dynamic_attributes(attr_name)
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
raise e
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
# Retrieve the related dynamic attribute object
|
|
341
|
+
def dynamic_related_attr(model, attr)
|
|
342
|
+
name_field = dynamic_options[model.name][:name_field]
|
|
343
|
+
dynamic_related(model).to_a.find { |r| r.send(name_field) == attr }
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
# Retrieve the collection of related dynamic attributes
|
|
347
|
+
def dynamic_related(model)
|
|
348
|
+
relationship = dynamic_options[model.name][:relationship_name]
|
|
349
|
+
send relationship
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
# Yield only if attr_name is a dynamic_attribute
|
|
353
|
+
def exec_if_related(attr_name)
|
|
354
|
+
return false if self.class.column_names.include? attr_name
|
|
355
|
+
each_dynamic_relation do |model|
|
|
356
|
+
if is_dynamic_attribute?(attr_name, model)
|
|
357
|
+
yield model
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
# Yields for each dynamic relation.
|
|
363
|
+
def each_dynamic_relation
|
|
364
|
+
dynamic_options.keys.each { |kls| yield kls.constantize }
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
# Returns the options for the dynamic attributes
|
|
368
|
+
def dynamic_options
|
|
369
|
+
nonversioned_class(self.class).dynamic_options
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
# Will return the parent model if kls is a versioned class
|
|
373
|
+
def nonversioned_class(kls)
|
|
374
|
+
if kls.name =~ /\:\:Version$/
|
|
375
|
+
base_class = kls.name
|
|
376
|
+
base_class.sub!(/\:\:Version$/, '')
|
|
377
|
+
return base_class.constantize
|
|
378
|
+
end
|
|
379
|
+
kls
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
Cms::Cache.flush
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
module Behaviors
|
|
3
|
+
module Hiding
|
|
4
|
+
def self.included(model_class)
|
|
5
|
+
model_class.extend(MacroMethods)
|
|
6
|
+
end
|
|
7
|
+
module MacroMethods
|
|
8
|
+
def hideable?
|
|
9
|
+
!!@is_hideable
|
|
10
|
+
end
|
|
11
|
+
def is_hideable(options={})
|
|
12
|
+
@is_hideable = true
|
|
13
|
+
extend ClassMethods
|
|
14
|
+
include InstanceMethods
|
|
15
|
+
|
|
16
|
+
scope :hidden, ->{where(:hidden => true)}
|
|
17
|
+
scope :not_hidden, ->{where(:hidden => false)}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
module ClassMethods
|
|
21
|
+
end
|
|
22
|
+
module InstanceMethods
|
|
23
|
+
def hide
|
|
24
|
+
self.hidden = true
|
|
25
|
+
self.version_comment = "Hidden"
|
|
26
|
+
self.save
|
|
27
|
+
end
|
|
28
|
+
def hide!
|
|
29
|
+
self.hidden = true
|
|
30
|
+
self.version_comment = "Hidden"
|
|
31
|
+
self.save!
|
|
32
|
+
end
|
|
33
|
+
def unhide
|
|
34
|
+
self.hidden = false
|
|
35
|
+
self.version_comment = "Unhidden"
|
|
36
|
+
self.save
|
|
37
|
+
end
|
|
38
|
+
def unhide!
|
|
39
|
+
self.hidden = false
|
|
40
|
+
self.version_comment = "Unhidden"
|
|
41
|
+
self.save!
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
|
|
3
|
+
# @deprecated To be removed in BrowserCMS 4.1 or later.
|
|
4
|
+
def self.table_prefix=(prefix)
|
|
5
|
+
message = "Calling Cms.table_prefix('#{prefix}') is no longer necessary and can be removed from your project. See https://github.com/browsermedia/browsercms/issues/639"
|
|
6
|
+
ActiveSupport::Deprecation.warn(message, caller(1))
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Behaviors
|
|
10
|
+
module Namespacing
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
module Behaviors
|
|
3
|
+
# Assumes the 'extended' class is an instance of ActiveModel
|
|
4
|
+
module Naming
|
|
5
|
+
|
|
6
|
+
# Returns the name of this content block as it will appear in paths.
|
|
7
|
+
#
|
|
8
|
+
# Examples:
|
|
9
|
+
# HtmlBlock -> html_blocks
|
|
10
|
+
# Thing -> things
|
|
11
|
+
def path_name
|
|
12
|
+
model_name.element.pluralize
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
module Behaviors
|
|
3
|
+
|
|
4
|
+
# Allows content to be marked as publishable or not. In practice, this has a direct dependency on
|
|
5
|
+
# Versioning, so it may not make sense to be separated out this way.
|
|
6
|
+
module Publishing
|
|
7
|
+
def self.included(model_class)
|
|
8
|
+
model_class.extend(MacroMethods)
|
|
9
|
+
model_class.class_eval do
|
|
10
|
+
def publishable?
|
|
11
|
+
false
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module MacroMethods
|
|
17
|
+
def publishable?
|
|
18
|
+
!!@is_publishable
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def is_publishable(options={})
|
|
22
|
+
@is_publishable = true
|
|
23
|
+
extend ClassMethods
|
|
24
|
+
include InstanceMethods
|
|
25
|
+
|
|
26
|
+
#attr_accessible :publish_on_save, :as
|
|
27
|
+
after_save :publish_for_non_versioned
|
|
28
|
+
|
|
29
|
+
scope :published, -> { where(:published => true) }
|
|
30
|
+
scope :unpublished, -> {
|
|
31
|
+
if self.versioned?
|
|
32
|
+
q = "#{connection.quote_table_name(version_table_name)}.#{connection.quote_column_name('version')} > " +
|
|
33
|
+
"#{connection.quote_table_name(table_name)}.#{connection.quote_column_name('version')}"
|
|
34
|
+
select("distinct #{connection.quote_table_name(table_name)}.*").where(q).joins(:versions)
|
|
35
|
+
else
|
|
36
|
+
where(:published => false)
|
|
37
|
+
end
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
module ClassMethods
|
|
43
|
+
end
|
|
44
|
+
module InstanceMethods
|
|
45
|
+
|
|
46
|
+
# Can specify whether to save this block as a draft using a terser syntax.
|
|
47
|
+
# These two calls behave identically
|
|
48
|
+
# - Cms::HtmlBlock.create(name: "Shorter", as: :draft)
|
|
49
|
+
# - Cms::HtmlBlock.create(name: "Longer", publish_on_save: false)
|
|
50
|
+
# @param [Symbol] status :draft to not publish on the next save. All other values are ignored.
|
|
51
|
+
def as=(status)
|
|
52
|
+
if status == :draft
|
|
53
|
+
self.publish_on_save = false
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Whether or not this object will be published the next time '.save' is called.
|
|
58
|
+
# @return [Boolean] True unless explicitly set otherwise.
|
|
59
|
+
def publish_on_save
|
|
60
|
+
if @publish_on_save.nil?
|
|
61
|
+
@publish_on_save = true
|
|
62
|
+
end
|
|
63
|
+
@publish_on_save
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Set whether or not this object will be published next time '.save' is called.
|
|
67
|
+
# This status resets to true after calling '.save'
|
|
68
|
+
def publish_on_save=(publish)
|
|
69
|
+
@publish_on_save = publish
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def publishable?
|
|
73
|
+
if self.class.connectable?
|
|
74
|
+
new_record? ? connect_to_page_id.blank? : connected_page_count < 1
|
|
75
|
+
else
|
|
76
|
+
true
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def publish_for_non_versioned
|
|
81
|
+
unless self.class.versioned?
|
|
82
|
+
if @publish_on_save
|
|
83
|
+
publish
|
|
84
|
+
@publish_on_save = nil
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def publish_if_needed
|
|
90
|
+
if publish_on_save
|
|
91
|
+
publish
|
|
92
|
+
else
|
|
93
|
+
self.publish_on_save = true
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Publishes the latest previously saved version of content as published. This will not create a new version,
|
|
98
|
+
# and will not persist changes made to a record.
|
|
99
|
+
#
|
|
100
|
+
# @return [Boolean] true if there was a draft record that was published, false otherwise.
|
|
101
|
+
def publish
|
|
102
|
+
publish!
|
|
103
|
+
rescue Exception => e
|
|
104
|
+
Cms::ErrorHandling::NotifierService.notify e
|
|
105
|
+
logger.warn("Could not publish, #{e.class}: #{e.message}\n#{e.backtrace.join("\n")}")
|
|
106
|
+
false
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Saves a draft copy of this content item. This will create a new record in the _versions table for this item, but
|
|
110
|
+
# will not update the existing published record.
|
|
111
|
+
def save_draft
|
|
112
|
+
self.publish_on_save = false
|
|
113
|
+
save
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Publishes the latest draft version of a block. See .publish for more documentation. Can throw errors if publishing failed for unexpected reasons.
|
|
117
|
+
# Note: Having separate .publish! and .publish methods is probably no longer necessary. In practice, only .publish is probably needed.
|
|
118
|
+
# @return [Boolean] true if the block had a draft that was published, false otherwise.
|
|
119
|
+
def publish!
|
|
120
|
+
did_publish = false
|
|
121
|
+
if new_record?
|
|
122
|
+
ActiveSupport::Deprecation.warn "Calling .publish! on a new record no longer saves the record. Call '.save' to persist and publish the record.", caller
|
|
123
|
+
else
|
|
124
|
+
# Do this for publishing existing blocks.
|
|
125
|
+
transaction do
|
|
126
|
+
if self.class.versioned?
|
|
127
|
+
d = draft
|
|
128
|
+
|
|
129
|
+
# We only need to publish if this isn't already published
|
|
130
|
+
# or the draft version is greater than the live version
|
|
131
|
+
if !self.published? || d.version > self.version
|
|
132
|
+
|
|
133
|
+
d.update_attributes(:published => true)
|
|
134
|
+
|
|
135
|
+
# copy values from the draft to the main record
|
|
136
|
+
quoted_attributes = d.send(:arel_attributes_with_values_for_update, self.class.versioned_columns)
|
|
137
|
+
|
|
138
|
+
#the values from the draft MAY have a relation of the versioned module
|
|
139
|
+
#as opposed to the actual class itself
|
|
140
|
+
#eg Page::Version, and not Page
|
|
141
|
+
#so remap to the actual arel_table´
|
|
142
|
+
#I haven't figured out why this is, but I know it happens when you call save! on Page
|
|
143
|
+
#during seeding of data
|
|
144
|
+
if self.class.arel_table.name != quoted_attributes.keys[0].relation.name
|
|
145
|
+
quoted_attributes = quoted_attributes.inject({}) { |hash, pair| hash[self.class.arel_table[pair[0].name]] = pair[1]; hash }
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Doing the SQL ourselves to avoid callbacks
|
|
149
|
+
self.class.unscoped.where(self.class.arel_table[self.class.primary_key].eq(id)).arel.update(quoted_attributes)
|
|
150
|
+
did_publish = true
|
|
151
|
+
end
|
|
152
|
+
else
|
|
153
|
+
self.class.connection.update(
|
|
154
|
+
"UPDATE #{self.class.quoted_table_name} " +
|
|
155
|
+
"SET published = #{self.class.connection.quote(true, self.class.columns_hash["published"])} " +
|
|
156
|
+
"WHERE #{self.class.connection.quote_column_name(self.class.primary_key)} = #{self.class.quote_value(id)}",
|
|
157
|
+
"#{self.class.name.demodulize} Publish"
|
|
158
|
+
)
|
|
159
|
+
did_publish = true
|
|
160
|
+
end
|
|
161
|
+
after_publish if respond_to?(:after_publish)
|
|
162
|
+
end
|
|
163
|
+
self.published = true
|
|
164
|
+
end
|
|
165
|
+
did_publish
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def status
|
|
169
|
+
return @status if @status
|
|
170
|
+
@status = live? ? :published : :draft
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def status_name
|
|
174
|
+
status.to_s.titleize
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Determines if this resource is in draft mode or not. Opposite of #live?
|
|
178
|
+
#
|
|
179
|
+
# @return [Boolean] true if the latest version of the resource is a draft.
|
|
180
|
+
def draft?
|
|
181
|
+
!live?
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Determines if this resource is in published or not.
|
|
185
|
+
#
|
|
186
|
+
# @return [Boolean] true if the latest version of the resource is published.
|
|
187
|
+
def live?
|
|
188
|
+
if self.class.versioned?
|
|
189
|
+
unless persisted?
|
|
190
|
+
return false
|
|
191
|
+
end
|
|
192
|
+
if respond_to?(:latest_version) && self.latest_version
|
|
193
|
+
version == latest_version && published?
|
|
194
|
+
else
|
|
195
|
+
live_version.version == draft.version && published?
|
|
196
|
+
end
|
|
197
|
+
else
|
|
198
|
+
true
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|