browsercms 3.5.7 → 4.0.0.alpha
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/COPYRIGHT.txt +2 -1
- data/README.markdown +3 -3
- 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/arrow-down.png +0 -0
- data/app/assets/images/cms/arrow-up.png +0 -0
- data/app/assets/images/cms/cogs.png +0 -0
- data/app/assets/images/cms/dashboard/home.png +0 -0
- data/app/assets/images/cms/home.png +0 -0
- data/app/assets/images/cms/logo.png +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/user.png +0 -0
- data/app/assets/javascripts/bcms/ckeditor_inline.js +23 -0
- data/app/assets/javascripts/bcms/ckeditor_standard_config.js +1 -1
- 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 +6 -1
- data/app/assets/javascripts/cms/attachment_manager.js.erb +3 -10
- data/app/assets/javascripts/cms/content_library.js +31 -12
- data/app/assets/javascripts/cms/core_library.js.erb +68 -36
- 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 +188 -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 +17 -1
- 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 +37 -23
- data/app/assets/stylesheets/cms/_assets.css.scss +55 -0
- data/app/assets/stylesheets/cms/_base.css.scss +42 -0
- data/app/assets/stylesheets/cms/_cms-buttons.css.scss +73 -0
- data/app/assets/stylesheets/cms/_cms-forms.css.scss +70 -0
- data/app/assets/stylesheets/cms/_colors.css.scss +20 -0
- data/app/assets/stylesheets/cms/_dashboard.css.scss +25 -0
- data/app/assets/stylesheets/cms/_glyph.css.scss +60 -0
- data/app/assets/stylesheets/cms/_main-area.css.scss +62 -0
- data/app/assets/stylesheets/cms/_nav.css.scss +197 -0
- data/app/assets/stylesheets/cms/_sidebar.css.scss +64 -0
- data/app/assets/stylesheets/cms/_sitemap.css.scss +196 -0
- data/app/assets/stylesheets/cms/_submenu.css.scss +48 -0
- data/app/assets/stylesheets/cms/application.css.scss +49 -0
- data/app/assets/stylesheets/cms/core.css.scss +96 -0
- data/app/assets/stylesheets/cms/default-forms.css.scss +3 -0
- data/app/assets/stylesheets/cms/includes/_animation.css.scss +2 -0
- data/app/assets/stylesheets/cms/includes/_rem.css.scss +120 -0
- data/app/assets/stylesheets/cms/includes/animation/_animate.css.scss +31 -0
- data/app/assets/stylesheets/cms/includes/animation/_core.css.scss +127 -0
- data/app/assets/stylesheets/cms/includes/animation/_shared.css.scss +22 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_attention-seekers.css.scss +152 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_bouncing.css.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_classes.css.scss +21 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_fading.css.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_flippers.css.scss +87 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_lightspeed.css.scss +24 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_rotating.css.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_specials.css.scss +42 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-entrances.css.scss +68 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-exits.css.scss +60 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-entrances.css.scss +86 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-exits.css.scss +86 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-entrances.css.scss +58 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-exits.css.scss +58 -0
- data/app/assets/stylesheets/cms/page_content_editing.css.scss +4 -0
- data/app/assets/stylesheets/cms/page_editor.css.scss +4 -0
- data/app/assets/stylesheets/cms/style.css.scss +138 -0
- data/app/assets/stylesheets/cms/styles/_alerts.css.scss +150 -0
- data/app/assets/stylesheets/cms/styles/_base-grid.css.scss +299 -0
- data/app/assets/stylesheets/cms/styles/_buttons.css.scss +247 -0
- data/app/assets/stylesheets/cms/styles/_dropdown.css.scss +155 -0
- data/app/assets/stylesheets/cms/styles/_forms.css.scss +728 -0
- data/app/assets/stylesheets/cms/styles/_glyph.css.scss +86 -0
- data/app/assets/stylesheets/cms/styles/_images.css.scss +75 -0
- data/app/assets/stylesheets/cms/styles/_lists.css.scss +115 -0
- data/app/assets/stylesheets/cms/styles/_modal.css.scss +174 -0
- data/app/assets/stylesheets/cms/styles/_progress.css.scss +43 -0
- data/app/assets/stylesheets/cms/styles/_tables.css.scss +141 -0
- data/app/assets/stylesheets/cms/styles/_text.css.scss +134 -0
- data/app/controllers/cms/application_controller.rb +3 -68
- data/app/controllers/cms/attachments_controller.rb +5 -5
- data/app/controllers/cms/base_controller.rb +20 -13
- data/app/controllers/cms/cache_controller.rb +16 -17
- data/app/controllers/cms/category_types_controller.rb +6 -1
- data/app/controllers/cms/connectors_controller.rb +12 -7
- data/app/controllers/cms/content_block_controller.rb +128 -71
- data/app/controllers/cms/content_controller.rb +54 -56
- data/app/controllers/cms/dashboard_controller.rb +5 -6
- data/app/controllers/cms/dynamic_views_controller.rb +12 -9
- data/app/controllers/cms/email_messages_controller.rb +18 -13
- data/app/controllers/cms/form_entries_controller.rb +119 -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 +13 -16
- data/app/controllers/cms/html_blocks_controller.rb +2 -2
- data/app/controllers/cms/inline_content_controller.rb +48 -0
- data/app/controllers/cms/links_controller.rb +58 -46
- data/app/controllers/cms/page_components_controller.rb +20 -0
- data/app/controllers/cms/page_routes_controller.rb +44 -40
- data/app/controllers/cms/pages_controller.rb +111 -97
- data/app/controllers/cms/passwords_controller.rb +17 -0
- data/app/controllers/cms/portlet_controller.rb +0 -1
- data/app/controllers/cms/portlets_controller.rb +20 -27
- data/app/controllers/cms/redirects_controller.rb +13 -9
- data/app/controllers/cms/resource_controller.rb +15 -4
- data/app/controllers/cms/routes_controller.rb +2 -4
- data/app/controllers/cms/section_nodes_controller.rb +6 -37
- data/app/controllers/cms/sections_controller.rb +13 -8
- data/app/controllers/cms/sessions_controller.rb +8 -66
- data/app/controllers/cms/sites/passwords_controller.rb +27 -0
- data/app/controllers/cms/sites/sessions_controller.rb +20 -0
- data/app/controllers/cms/tags_controller.rb +12 -12
- data/app/controllers/cms/tasks_controller.rb +45 -46
- data/app/controllers/cms/user_controller.rb +8 -0
- data/app/controllers/cms/users_controller.rb +91 -68
- data/app/helpers/cms/application_helper.rb +58 -52
- data/app/helpers/cms/content_block_helper.rb +8 -7
- data/app/helpers/cms/form_tag_helper.rb +21 -25
- data/app/helpers/cms/menu_helper.rb +1 -3
- data/app/helpers/cms/mobile_helper.rb +12 -2
- data/app/helpers/cms/nav_menu_helper.rb +23 -0
- data/app/helpers/cms/page_helper.rb +72 -30
- data/app/helpers/cms/path_helper.rb +46 -70
- data/app/helpers/cms/rendering_helper.rb +68 -12
- data/app/helpers/cms/section_nodes_helper.rb +92 -31
- 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 +1 -7
- data/app/helpers/cms/ui_elements_helper.rb +147 -6
- 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/cms_text_field_input.rb +29 -0
- data/app/inputs/date_picker_input.rb +8 -0
- data/app/inputs/file_picker_input.rb +75 -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 +10 -6
- data/app/models/cms/attachment.rb +20 -27
- data/app/models/cms/category.rb +17 -7
- data/app/models/cms/category_type.rb +8 -4
- data/app/models/cms/connector.rb +32 -20
- data/app/models/cms/content.rb +31 -0
- data/app/models/cms/content_type.rb +114 -62
- data/app/models/cms/dynamic_view.rb +19 -45
- data/app/models/cms/email_message.rb +32 -2
- data/app/models/cms/external_user.rb +60 -0
- data/app/models/cms/file_block.rb +1 -0
- data/app/models/cms/form.rb +47 -0
- data/app/models/cms/form_entry.rb +71 -0
- data/app/models/cms/form_field.rb +78 -0
- data/app/models/cms/group.rb +19 -9
- data/app/models/cms/group_permission.rb +1 -1
- data/app/models/cms/group_section.rb +1 -1
- data/app/models/cms/group_type.rb +5 -5
- data/app/models/cms/group_type_permission.rb +1 -1
- data/app/models/cms/html_block.rb +14 -19
- data/app/models/cms/image_block.rb +1 -0
- data/app/models/cms/link.rb +8 -6
- data/app/models/cms/page.rb +156 -59
- data/app/models/cms/page_component.rb +43 -0
- data/app/models/cms/page_partial.rb +16 -8
- data/app/models/cms/page_route.rb +1 -1
- data/app/models/cms/page_route_condition.rb +1 -1
- data/app/models/cms/page_route_option.rb +1 -1
- data/app/models/cms/page_route_requirement.rb +1 -1
- data/app/models/cms/page_template.rb +14 -9
- data/app/models/cms/permission.rb +4 -2
- data/app/models/cms/persistent_user.rb +208 -0
- data/app/models/cms/portlet.rb +56 -9
- data/app/models/cms/redirect.rb +1 -1
- data/app/models/cms/search_filter.rb +18 -0
- data/app/models/cms/section.rb +39 -28
- data/app/models/cms/section_node.rb +32 -5
- data/app/models/cms/site.rb +3 -3
- data/app/models/cms/tag.rb +14 -12
- data/app/models/cms/tagging.rb +2 -2
- data/app/models/cms/task.rb +14 -21
- data/app/models/cms/templates.rb +1 -2
- data/app/models/cms/user.rb +21 -160
- data/app/models/cms/user_group_membership.rb +2 -2
- data/app/portlets/deprecated_placeholder.rb +12 -0
- data/app/portlets/dynamic_portlet.rb +1 -1
- data/app/portlets/email_page_portlet.rb +10 -3
- data/app/portlets/forgot_password_portlet.rb +9 -28
- data/app/portlets/login_portlet.rb +8 -5
- data/app/portlets/tag_cloud_portlet.rb +3 -1
- data/app/presenters/cms/user_presenter.rb +24 -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/{shared → application}/_exception.html.erb +0 -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/{shared → application}/_version_conflict_diff.html.erb +0 -0
- data/app/views/cms/{shared → application}/_version_conflict_error.html.erb +0 -0
- data/app/views/cms/attachments/_attachment_manager.html.erb +22 -0
- data/app/views/cms/attachments/_no_attachments_defined.html.erb +1 -0
- data/app/views/cms/cache/show.html.erb +5 -10
- data/app/views/cms/categories/_form.html.erb +15 -24
- data/app/views/cms/category_types/_form.html.erb +1 -1
- data/app/views/cms/connectors/new.html.erb +33 -64
- data/app/views/cms/content/editing_frame.html.erb +1 -0
- data/app/views/cms/content/no_page.html.erb +9 -27
- data/app/views/cms/content/show.html.erb +14 -15
- 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 +35 -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/dashboard/_page_drafts.html.erb +12 -22
- data/app/views/cms/dashboard/_tasks.html.erb +32 -45
- data/app/views/cms/dashboard/index.html.erb +11 -13
- data/app/views/cms/dynamic_views/_form.html.erb +8 -10
- data/app/views/cms/dynamic_views/edit.html.erb +2 -3
- data/app/views/cms/dynamic_views/index.html.erb +22 -44
- data/app/views/cms/dynamic_views/new.html.erb +2 -3
- data/app/views/cms/email_messages/index.html.erb +31 -34
- data/app/views/cms/email_messages/show.html.erb +45 -52
- data/app/views/cms/file_blocks/_form.html.erb +2 -4
- 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 +4 -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 +66 -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 +32 -38
- data/app/views/cms/groups/_permissions.html.erb +11 -34
- data/app/views/cms/groups/_sections.html.erb +11 -17
- data/app/views/cms/groups/edit.html.erb +1 -3
- data/app/views/cms/groups/index.html.erb +10 -32
- data/app/views/cms/groups/new.html.erb +2 -4
- data/app/views/cms/html_blocks/_form.html.erb +2 -2
- data/app/views/cms/html_blocks/render.html.erb +1 -1
- data/app/views/cms/image_blocks/_form.html.erb +3 -3
- data/app/views/cms/links/_form.html.erb +6 -11
- data/app/views/cms/links/edit.html.erb +3 -12
- data/app/views/cms/links/new.html.erb +4 -13
- 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 +11 -10
- data/app/views/cms/page_routes/edit.html.erb +2 -3
- data/app/views/cms/page_routes/index.html.erb +25 -48
- data/app/views/cms/page_routes/new.html.erb +2 -3
- data/app/views/cms/pages/_edit_content.html.erb +28 -0
- data/app/views/cms/pages/_form.html.erb +20 -37
- 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 -23
- data/app/views/cms/pages/new.html.erb +2 -16
- data/app/views/cms/pages/versions.html.erb +18 -87
- data/app/views/cms/redirects/_form.html.erb +6 -14
- data/app/views/cms/redirects/edit.html.erb +2 -3
- data/app/views/cms/redirects/index.html.erb +24 -50
- data/app/views/cms/redirects/new.html.erb +2 -3
- data/app/views/cms/routes/index.html.erb +15 -20
- data/app/views/cms/section_nodes/_children.html.erb +3 -0
- data/app/views/cms/section_nodes/_row_buttons.html.erb +11 -0
- data/app/views/cms/section_nodes/_section_node.html.erb +24 -10
- 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 +22 -49
- data/app/views/cms/sections/edit.html.erb +3 -8
- data/app/views/cms/sections/new.html.erb +4 -20
- data/app/views/cms/sessions/new.html.erb +16 -31
- data/app/views/cms/shared/access_denied.html.erb +1 -2
- data/app/views/cms/shared/error.html.erb +5 -5
- 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 -1
- data/app/views/cms/tags/render.html.erb +0 -1
- data/app/views/cms/tasks/new.html.erb +18 -32
- data/app/views/cms/toolbar/_new_pages_menu.html.erb +10 -0
- data/app/views/cms/users/_form.html.erb +8 -11
- data/app/views/cms/users/_password.html.erb +2 -8
- data/app/views/cms/users/_user_fields.html.erb +7 -20
- data/app/views/cms/users/change_password.html.erb +12 -21
- data/app/views/cms/users/edit.html.erb +1 -15
- data/app/views/cms/users/index.html.erb +61 -58
- data/app/views/cms/users/new.html.erb +1 -12
- 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 +2 -2
- data/app/views/layouts/cms/_head.html.erb +8 -18
- data/app/views/layouts/cms/_main_menu.html.erb +78 -0
- data/app/views/layouts/cms/application.html.erb +19 -24
- 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 -3
- data/app/views/portlets/email_page/_form.html.erb +5 -6
- data/app/views/portlets/forgot_password/_form.html.erb +2 -3
- data/app/views/portlets/forgot_password/render.html.erb +2 -14
- data/app/views/portlets/login/_form.html.erb +4 -6
- data/app/views/portlets/login/render.html.erb +8 -27
- data/app/views/portlets/portlets/_form.html.erb +7 -6
- data/app/views/portlets/tag_cloud/_form.html.erb +4 -4
- data/app/views/tests/pretend/open_with_layout.html.erb +1 -1
- data/bin/bcms +13 -16
- data/config/routes.rb +58 -29
- data/db/browsercms.seeds.rb +0 -6
- data/db/migrate/{20080815014337_browsercms_3_0_0.rb → 20080815014337_browsercms300.rb} +94 -73
- data/db/migrate/20130327184912_browsercms400.rb +90 -0
- data/db/migrate/20131206214021_devise_create_users.rb +47 -0
- data/db/migrate/20131211223908_kill_reset_password.rb +5 -0
- data/db/migrate/20131218222005_create_cms_external_users.rb +10 -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/release_notes.md +224 -10
- data/lib/acts_as_list.rb +72 -71
- data/lib/browsercms.rb +41 -1
- data/lib/cms/acts/content_block.rb +12 -2
- data/lib/cms/acts/content_page.rb +3 -4
- data/lib/cms/admin_tab.rb +15 -0
- data/lib/cms/attachments/configuration.rb +1 -1
- data/lib/cms/authentication/controller.rb +83 -177
- data/lib/cms/authentication/test_password_strategy.rb +19 -0
- data/lib/cms/behaviors.rb +1 -0
- data/lib/cms/behaviors/archiving.rb +2 -2
- data/lib/cms/behaviors/attaching.rb +21 -45
- data/lib/cms/behaviors/connecting.rb +14 -4
- data/lib/cms/behaviors/dynamic_attributes.rb +3 -3
- data/lib/cms/behaviors/hiding.rb +2 -2
- data/lib/cms/behaviors/namespacing.rb +6 -36
- data/lib/cms/behaviors/publishing.rb +92 -45
- data/lib/cms/behaviors/rendering.rb +15 -7
- data/lib/cms/behaviors/searching.rb +5 -4
- data/lib/cms/behaviors/soft_deleting.rb +13 -16
- data/lib/cms/behaviors/taggable.rb +17 -10
- data/lib/cms/behaviors/versioning.rb +12 -16
- data/lib/cms/commands/to_version400.rb +10 -0
- data/lib/cms/concerns.rb +7 -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/configuration.rb +14 -4
- data/lib/cms/configuration/configurable_template.rb +24 -0
- data/lib/cms/configuration/devise.rb +256 -0
- data/lib/cms/configure_simple_form.rb +142 -0
- data/lib/cms/configure_simple_form_bootstrap.rb +49 -0
- data/lib/cms/content_filter.rb +18 -0
- data/lib/cms/content_page.rb +77 -0
- data/lib/cms/content_rendering_support.rb +25 -16
- data/lib/cms/controllers/admin_controller.rb +78 -0
- data/lib/cms/data_loader.rb +30 -11
- data/lib/cms/default_accessible.rb +6 -6
- data/lib/cms/domain_support.rb +0 -4
- data/lib/cms/engine.rb +52 -20
- data/lib/cms/engine_helper.rb +41 -51
- data/{app/controllers → lib}/cms/error_handling.rb +11 -5
- data/lib/cms/extensions.rb +2 -1
- data/lib/cms/extensions/active_model/name.rb +13 -0
- data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +49 -89
- data/lib/cms/extensions/hash.rb +0 -12
- 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/module.rb +1 -7
- 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 +112 -20
- data/lib/cms/version.rb +1 -1
- data/lib/generators/browser_cms/demo_site/templates/demo.seeds.rb +0 -2
- data/lib/generators/cms/content_block/content_block_generator.rb +19 -46
- data/lib/generators/cms/content_block/templates/_form.html.erb +22 -28
- data/lib/generators/cms/project/templates/devise.rb.erb +7 -0
- metadata +383 -150
- data/app/assets/javascripts/cms/sitemap.js.erb +0 -464
- data/app/assets/stylesheets/browsercms/application.css +0 -7
- data/app/assets/stylesheets/cms/administration.css.erb +0 -91
- data/app/assets/stylesheets/cms/application.css.erb +0 -171
- data/app/assets/stylesheets/cms/attachment_manager.css.scss +0 -28
- data/app/assets/stylesheets/cms/block.css +0 -26
- data/app/assets/stylesheets/cms/buttons.css.erb +0 -120
- data/app/assets/stylesheets/cms/content_library.css.erb +0 -139
- data/app/assets/stylesheets/cms/content_types.css +0 -4
- data/app/assets/stylesheets/cms/dashboard.css.erb +0 -118
- data/app/assets/stylesheets/cms/data_table.css.erb.erb +0 -156
- data/app/assets/stylesheets/cms/date_picker.css.erb +0 -82
- data/app/assets/stylesheets/cms/form_layout.css.erb +0 -282
- data/app/assets/stylesheets/cms/login.css.erb +0 -78
- data/app/assets/stylesheets/cms/menu.css.erb +0 -116
- data/app/assets/stylesheets/cms/nav.css.erb +0 -99
- data/app/assets/stylesheets/cms/page_toolbar.css.erb +0 -135
- data/app/assets/stylesheets/cms/reset.css +0 -46
- data/app/assets/stylesheets/cms/selectbox.css.erb +0 -56
- data/app/assets/stylesheets/cms/sitemap.css.erb +0 -390
- data/app/assets/stylesheets/cms/taglist.css +0 -18
- data/app/controllers/application_controller.rb +0 -14
- data/app/controllers/cms/content_types_controller.rb +0 -9
- data/app/helpers/application_helper.rb +0 -5
- data/app/helpers/cms/form_builder.rb +0 -241
- data/app/models/cms/content_type_group.rb +0 -15
- data/app/models/cms/forgot_password_mailer.rb +0 -14
- data/app/portlets/reset_password_portlet.rb +0 -28
- data/app/views/cms/blocks/_hidden_fields.html.erb +0 -10
- data/app/views/cms/blocks/_toolbar.html.erb +0 -9
- data/app/views/cms/blocks/_toolbar_for_collection.html.erb +0 -23
- data/app/views/cms/blocks/_toolbar_for_member.html.erb +0 -36
- data/app/views/cms/blocks/edit.html.erb +0 -28
- data/app/views/cms/blocks/index.html.erb +0 -86
- data/app/views/cms/blocks/new.html.erb +0 -19
- data/app/views/cms/blocks/show.html.erb +0 -43
- data/app/views/cms/blocks/usages.html.erb +0 -44
- data/app/views/cms/blocks/versions.html.erb +0 -90
- data/app/views/cms/content_types/index.html.erb +0 -14
- data/app/views/cms/form_builder/_cms_attachment_manager.html.erb +0 -27
- data/app/views/cms/form_builder/_cms_check_box.html.erb +0 -7
- data/app/views/cms/form_builder/_cms_date_picker.html.erb +0 -12
- data/app/views/cms/form_builder/_cms_datetime_select.html.erb +0 -12
- data/app/views/cms/form_builder/_cms_drop_down.html.erb +0 -12
- data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +0 -9
- data/app/views/cms/form_builder/_cms_file_field.html.erb +0 -28
- data/app/views/cms/form_builder/_cms_instructions.html.erb +0 -4
- data/app/views/cms/form_builder/_cms_tag_list.html.erb +0 -15
- data/app/views/cms/form_builder/_cms_template_editor.html.erb +0 -9
- data/app/views/cms/form_builder/_cms_text_area.html.erb +0 -10
- data/app/views/cms/form_builder/_cms_text_editor.html.erb +0 -19
- data/app/views/cms/form_builder/_cms_text_field.html.erb +0 -12
- data/app/views/cms/links/destroy.js.rjs +0 -2
- data/app/views/cms/page_routes/show.html.erb +0 -10
- data/app/views/cms/pages/_edit_connector.html.erb +0 -19
- data/app/views/cms/pages/_edit_container.html.erb +0 -11
- data/app/views/cms/section_nodes/_link.html.erb +0 -14
- data/app/views/cms/section_nodes/_node.html.erb +0 -44
- data/app/views/cms/section_nodes/_page.html.erb +0 -20
- data/app/views/cms/section_nodes/_section.html.erb +0 -28
- data/app/views/cms/section_nodes/index.html.erb +0 -43
- data/app/views/cms/sections/_page.html.erb +0 -4
- data/app/views/cms/sections/_section.html.erb +0 -8
- data/app/views/cms/sections/destroy.js.rjs +0 -2
- data/app/views/cms/sections/index.html.erb +0 -23
- data/app/views/cms/shared/_admin_sidebar.html.erb +0 -36
- data/app/views/cms/shared/_pagination.html.erb +0 -31
- data/app/views/cms/toolbar/_mobile_toggle.html.erb +0 -33
- data/app/views/cms/toolbar/index.html.erb +0 -1
- data/app/views/cms/users/_groups.html.erb +0 -12
- data/app/views/cms/users/_toolbar.html.erb +0 -24
- data/app/views/cms/users/show.html.erb +0 -50
- data/app/views/layouts/_cms_toolbar.html.erb +0 -54
- data/app/views/layouts/_page_toolbar.html.erb +0 -119
- data/app/views/layouts/cms/administration.html.erb +0 -51
- data/app/views/layouts/cms/content_library.html.erb +0 -96
- data/app/views/layouts/cms/dashboard.html.erb +0 -16
- data/app/views/layouts/cms/login.html.erb +0 -31
- data/app/views/layouts/cms/section_nodes.html.erb +0 -20
- data/app/views/layouts/cms/toolbar.html.erb +0 -23
- data/app/views/portlets/reset_password/_form.html.erb +0 -3
- data/app/views/portlets/reset_password/render.html.erb +0 -22
- data/bin/bcms-upgrade +0 -332
- data/db/migrate/20091109175123_browsercms_3_0_5.rb +0 -9
- data/db/migrate/20100117144038_browsercms314.rb +0 -20
- data/db/migrate/20100117144039_browsercms315.rb +0 -95
- data/db/migrate/20100705083859_browsercms_3_3_0.rb +0 -56
- data/db/migrate/20111130221145_browsercms340.rb +0 -56
- data/db/migrate/20120329144406_browsercms350.rb +0 -32
- data/db/migrate/20120717182827_browsercms353.rb +0 -19
- data/db/migrate/20120813180110_browsercms354.rb +0 -9
- data/lib/cms/addressable.rb +0 -93
- data/lib/cms/authentication/model.rb +0 -116
- data/lib/cms/behaviors/pagination.rb +0 -212
- data/lib/cms/upgrades/v3_4_0.rb +0 -31
- data/lib/cms/upgrades/v3_5_0.rb +0 -227
|
@@ -37,7 +37,6 @@ module Cms
|
|
|
37
37
|
@instance_variable_name_for_view = options[:instance_variable_name_for_view]
|
|
38
38
|
|
|
39
39
|
extend ClassMethods
|
|
40
|
-
extend EngineHelper
|
|
41
40
|
include InstanceMethods
|
|
42
41
|
|
|
43
42
|
# I'm not pleased with the need to include all of the these rails helpers onto every 'renderable' content item
|
|
@@ -82,11 +81,7 @@ module Cms
|
|
|
82
81
|
# of the renderable, so if you have an Article that is renderable,
|
|
83
82
|
# the template will be "articles/render"
|
|
84
83
|
def template_path
|
|
85
|
-
|
|
86
|
-
if main_app_model?
|
|
87
|
-
path = "cms/#{path}"
|
|
88
|
-
end
|
|
89
|
-
path
|
|
84
|
+
"#{name.underscore.pluralize}/render"
|
|
90
85
|
end
|
|
91
86
|
|
|
92
87
|
# Instance variables that will not be copied from the renderable to the view
|
|
@@ -96,6 +91,19 @@ module Cms
|
|
|
96
91
|
|
|
97
92
|
end
|
|
98
93
|
module InstanceMethods
|
|
94
|
+
|
|
95
|
+
# Returns the Mercury editor type for a given attribute
|
|
96
|
+
# @param [Symbol] method (i.e. :name, :content, etc)
|
|
97
|
+
# @return [Hash]
|
|
98
|
+
def editor_info(method)
|
|
99
|
+
column = self.class.columns_hash[method.to_s]
|
|
100
|
+
if column.type == :text
|
|
101
|
+
{:element => 'div', :region => 'full'}
|
|
102
|
+
else
|
|
103
|
+
{:element => 'span', :region => 'simple'}
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
99
107
|
def prepare_to_render(controller)
|
|
100
108
|
# Give this renderable a reference to the controller
|
|
101
109
|
@controller = controller
|
|
@@ -123,7 +131,7 @@ module Cms
|
|
|
123
131
|
|
|
124
132
|
if self.respond_to?(:deleted) && self.deleted
|
|
125
133
|
logger.error "Attempting to render deleted object: #{self.inspect}"
|
|
126
|
-
msg = (
|
|
134
|
+
msg = (edit_mode? ? %Q[<div class="error">This #{self.class.name} has been deleted. Please remove this container from the page</div>] : '')
|
|
127
135
|
return msg
|
|
128
136
|
end
|
|
129
137
|
|
|
@@ -26,11 +26,12 @@ module Cms
|
|
|
26
26
|
end
|
|
27
27
|
conditions << "%#{term}%"
|
|
28
28
|
end
|
|
29
|
-
conditions[0] = "(#{conditions[0]})"
|
|
29
|
+
#conditions[0] = "(#{conditions[0]})"
|
|
30
30
|
end
|
|
31
|
-
|
|
32
|
-
scope
|
|
33
|
-
scope
|
|
31
|
+
where(conditions)
|
|
32
|
+
#scope = {}
|
|
33
|
+
#scope[:conditions] = conditions if conditions
|
|
34
|
+
#scope
|
|
34
35
|
}
|
|
35
36
|
end
|
|
36
37
|
end
|
|
@@ -17,18 +17,18 @@ module Cms
|
|
|
17
17
|
def uses_soft_delete(options={})
|
|
18
18
|
@uses_soft_delete = true
|
|
19
19
|
|
|
20
|
-
scope :not_deleted,
|
|
20
|
+
scope :not_deleted, -> {where (["#{table_name}.deleted = ?", false])}
|
|
21
21
|
class << self
|
|
22
22
|
alias_method :delete_all!, :delete_all
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
extend ClassMethods
|
|
26
26
|
include InstanceMethods
|
|
27
|
-
|
|
27
|
+
#attr_accessible :deleted
|
|
28
28
|
|
|
29
29
|
# By default, all queries for blocks should filter out deleted rows.
|
|
30
30
|
begin
|
|
31
|
-
default_scope where(:deleted => false)
|
|
31
|
+
default_scope {where(:deleted => false)}
|
|
32
32
|
# This may fail during gem loading, if no DB or the table does not exist. Log it and move on.
|
|
33
33
|
rescue StandardError => e
|
|
34
34
|
handle_missing_table_error_during_startup("Can't set a default_scope for soft_deleting", e)
|
|
@@ -43,13 +43,10 @@ module Cms
|
|
|
43
43
|
# See http://github.com/fernandoluizao/acts_as_active for an implementation of this
|
|
44
44
|
module ClassMethods
|
|
45
45
|
|
|
46
|
-
# Returns
|
|
47
|
-
#
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# @param args Same params as ActiveRecord.find
|
|
51
|
-
def find_with_deleted(* args)
|
|
52
|
-
self.with_exclusive_scope { find(* args) }
|
|
46
|
+
# Returns a content block even if it is marked as deleted.
|
|
47
|
+
# @param [Hash] options Hash suitable to be passed to '#where'
|
|
48
|
+
def find_with_deleted(options)
|
|
49
|
+
self.unscoped.where(options).first
|
|
53
50
|
end
|
|
54
51
|
|
|
55
52
|
# Returns a count of all records of this type, including those marked as deleted.
|
|
@@ -58,20 +55,20 @@ module Cms
|
|
|
58
55
|
#
|
|
59
56
|
# @param args Same params as ActiveRecord.count
|
|
60
57
|
def count_with_deleted(* args)
|
|
61
|
-
self.
|
|
58
|
+
self.unscoped.count(* args)
|
|
62
59
|
end
|
|
63
60
|
|
|
64
61
|
def delete_all(conditions=nil)
|
|
65
|
-
update_all(["deleted = ?", true]
|
|
62
|
+
where(conditions).update_all(["deleted = ?", true])
|
|
66
63
|
end
|
|
67
64
|
|
|
68
65
|
def exists?(id_or_conditions)
|
|
69
|
-
if id_or_conditions.is_a?(Hash) || id_or_conditions.is_a?(Array)
|
|
70
|
-
|
|
66
|
+
query = if id_or_conditions.is_a?(Hash) || id_or_conditions.is_a?(Array)
|
|
67
|
+
where id_or_conditions
|
|
71
68
|
else
|
|
72
|
-
|
|
69
|
+
where(:id => id_or_conditions)
|
|
73
70
|
end
|
|
74
|
-
count
|
|
71
|
+
query.count > 0
|
|
75
72
|
end
|
|
76
73
|
end
|
|
77
74
|
module InstanceMethods
|
|
@@ -4,31 +4,36 @@ module Cms
|
|
|
4
4
|
def self.included(model_class)
|
|
5
5
|
model_class.extend(MacroMethods)
|
|
6
6
|
end
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
module MacroMethods
|
|
8
9
|
def taggable?
|
|
9
10
|
!!@is_taggable
|
|
10
11
|
end
|
|
12
|
+
|
|
11
13
|
def is_taggable(options={})
|
|
12
14
|
@is_taggable = true
|
|
13
15
|
@tag_separator = options[:separator] || " "
|
|
14
|
-
|
|
16
|
+
|
|
15
17
|
has_many :taggings, :as => :taggable, :class_name => 'Cms::Tagging'
|
|
16
|
-
has_many :tags,
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
has_many :tags, -> { order("#{Cms::Tag.table_name}.name") }, :class_name => 'Cms::Tag', :through => :taggings
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
after_save :save_tags
|
|
19
22
|
|
|
20
|
-
after_save :save_tags
|
|
21
|
-
|
|
22
23
|
extend ClassMethods
|
|
23
24
|
include InstanceMethods
|
|
24
25
|
|
|
25
|
-
attr_accessible :tag_list
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
module ClassMethods
|
|
29
|
+
def tagged_with(t)
|
|
30
|
+
where(["#{Cms::Tag.table_name}.name = ?", t]).includes(:taggings => :tag).references(:tags)
|
|
31
|
+
end
|
|
32
|
+
|
|
29
33
|
def tag_cloud
|
|
30
34
|
Cms::Tagging.cloud(base_class.name)
|
|
31
35
|
end
|
|
36
|
+
|
|
32
37
|
def tag_separator
|
|
33
38
|
@tag_separator
|
|
34
39
|
end
|
|
@@ -37,12 +42,14 @@ module Cms
|
|
|
37
42
|
def tag_list
|
|
38
43
|
@tag_list ||= tags.reload.map(&:name).join(self.class.tag_separator)
|
|
39
44
|
end
|
|
45
|
+
|
|
40
46
|
def tag_list=(tag_names)
|
|
41
47
|
changed_attributes["tag_list"] = tag_list unless @tag_list == tag_names
|
|
42
48
|
@tag_list = tag_names
|
|
43
49
|
end
|
|
50
|
+
|
|
44
51
|
def save_tags
|
|
45
|
-
tag_list_tags = tag_list.to_s.split(self.class.tag_separator).map{|t| Cms::Tag.
|
|
52
|
+
tag_list_tags = tag_list.to_s.split(self.class.tag_separator).map { |t| Cms::Tag.find_or_create_by(name: t.strip) }
|
|
46
53
|
taggings.each do |tg|
|
|
47
54
|
if tag_list_tags.include?(tg.tag)
|
|
48
55
|
tag_list_tags.delete(tg.tag)
|
|
@@ -50,7 +57,7 @@ module Cms
|
|
|
50
57
|
tg.destroy
|
|
51
58
|
end
|
|
52
59
|
end
|
|
53
|
-
tag_list_tags.each{|t| taggings.create(:tag => t, :taggable => self) }
|
|
60
|
+
tag_list_tags.each { |t| taggings.create(:tag => t, :taggable => self) }
|
|
54
61
|
self.tag_list = nil
|
|
55
62
|
end
|
|
56
63
|
end
|
|
@@ -5,7 +5,7 @@ module Cms
|
|
|
5
5
|
# Skip sanitizing attributes from mass assignment. This should be used sparingly, since it bypasses security.
|
|
6
6
|
# Ideally used for dynamically created classes (like ::Version or ::Attribute) where the attributes are not known at
|
|
7
7
|
# design time.
|
|
8
|
-
def sanitize(attributes, authorizer)
|
|
8
|
+
def sanitize(klass, attributes, authorizer)
|
|
9
9
|
attributes
|
|
10
10
|
end
|
|
11
11
|
end
|
|
@@ -86,7 +86,6 @@ module Cms
|
|
|
86
86
|
before_validation :initialize_version
|
|
87
87
|
before_save :build_new_version
|
|
88
88
|
attr_accessor :skip_callbacks
|
|
89
|
-
attr_accessible :version_comment
|
|
90
89
|
|
|
91
90
|
#Define the version class
|
|
92
91
|
#puts "is_version called for #{self}"
|
|
@@ -96,7 +95,7 @@ module Cms
|
|
|
96
95
|
end
|
|
97
96
|
|
|
98
97
|
include VersionRecord
|
|
99
|
-
self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
|
|
98
|
+
#self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
|
|
100
99
|
|
|
101
100
|
def versioned_class
|
|
102
101
|
self.class.versioned_class
|
|
@@ -155,7 +154,7 @@ module Cms
|
|
|
155
154
|
#Rails 3 could use update_column here instead
|
|
156
155
|
if respond_to? :latest_version
|
|
157
156
|
sql = "UPDATE #{self.class.table_name} SET latest_version = #{draft.version} where id = #{self.id}"
|
|
158
|
-
connection.execute sql
|
|
157
|
+
self.class.connection.execute sql
|
|
159
158
|
self.latest_version = draft.version # So we don't need to #reload this object. Probably marks it as dirty though, which could have weird side effects.
|
|
160
159
|
end
|
|
161
160
|
end
|
|
@@ -193,16 +192,6 @@ module Cms
|
|
|
193
192
|
end
|
|
194
193
|
end
|
|
195
194
|
|
|
196
|
-
def publish_if_needed
|
|
197
|
-
#logger.debug { "#{self.class}#publish_if_needed. publish? = '#{!!@publish_on_save}'" }
|
|
198
|
-
|
|
199
|
-
if @publish_on_save
|
|
200
|
-
publish
|
|
201
|
-
@publish_on_save = nil
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
|
|
206
195
|
#
|
|
207
196
|
#ActiveRecord 3.0.0 call chain
|
|
208
197
|
# ActiveRecord 3 now uses basic inheritence rather than alias_method_chain. The order in which ActiveRecord::Base
|
|
@@ -264,11 +253,17 @@ module Cms
|
|
|
264
253
|
save(:validate => perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
|
|
265
254
|
end
|
|
266
255
|
|
|
256
|
+
# Returns the most recently created Version for this class. Drafts are the most recent change from
|
|
257
|
+
# the _versions table for a given content item.
|
|
258
|
+
# i.e. For Cms::Page, this would return Cms::Page::Version
|
|
259
|
+
#
|
|
260
|
+
# @return [<Class>::Version] The version for this class that represents the draft.
|
|
267
261
|
def draft
|
|
268
|
-
versions.
|
|
262
|
+
versions.order("version desc").first
|
|
269
263
|
end
|
|
270
264
|
|
|
271
265
|
def draft_version?
|
|
266
|
+
return true unless draft
|
|
272
267
|
version == draft.version
|
|
273
268
|
end
|
|
274
269
|
|
|
@@ -285,7 +280,7 @@ module Cms
|
|
|
285
280
|
end
|
|
286
281
|
|
|
287
282
|
def find_version(number)
|
|
288
|
-
versions.
|
|
283
|
+
versions.where(:version => number).first
|
|
289
284
|
end
|
|
290
285
|
|
|
291
286
|
def as_of_draft_version
|
|
@@ -324,6 +319,7 @@ module Cms
|
|
|
324
319
|
|
|
325
320
|
self.after_revert(revert_to_version) if self.respond_to?(:after_revert)
|
|
326
321
|
self.version_comment = "Reverted to version #{version}"
|
|
322
|
+
self.publish_on_save = false
|
|
327
323
|
self
|
|
328
324
|
end
|
|
329
325
|
|
data/lib/cms/concerns.rb
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Each concern should be automatically added to each ActiveRecord class using extend.
|
|
2
|
+
module Cms::Concerns; end
|
|
3
|
+
|
|
4
|
+
Dir["#{File.dirname(__FILE__)}/concerns/*.rb"].each do |b|
|
|
5
|
+
require File.join("cms", "concerns", File.basename(b, ".rb"))
|
|
6
|
+
ActiveRecord::Base.extend "Cms::Concerns::#{File.basename(b, ".rb").camelize}".constantize
|
|
7
|
+
end
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
module Concerns
|
|
3
|
+
module CanBeAddressable
|
|
4
|
+
|
|
5
|
+
# Adds Addressable behavior to a model. This allows models to be inserted into the sitemap, having parent
|
|
6
|
+
# sections. By default, this method is available to all ActiveRecord::Base classes.
|
|
7
|
+
#
|
|
8
|
+
# @params [Hash] options
|
|
9
|
+
# @option options [String] :path The base path where instances will be placed.
|
|
10
|
+
# @option options [String] :no_dynamic_path Set as true if the Record has a :path attribute managed as a column in the db. (Default: false)
|
|
11
|
+
# @option options [Symbol] :destroy_if Name of a custom method used to determine when this object should be destroyed. Rather than dependant: destroy to determine if the section node should be destroyed when this object is.
|
|
12
|
+
def is_addressable(options={})
|
|
13
|
+
has_one_options = {as: :node, inverse_of: :node, class_name: 'Cms::SectionNode', validate: true}
|
|
14
|
+
unless options[:destroy_if]
|
|
15
|
+
has_one_options[:dependent] = :destroy
|
|
16
|
+
else
|
|
17
|
+
before_destroy options[:destroy_if]
|
|
18
|
+
after_destroy :destroy_node
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
has_one :section_node, has_one_options
|
|
22
|
+
# For reasons that aren't clear, just using :autosave doesn't work.
|
|
23
|
+
after_save do
|
|
24
|
+
if section_node && section_node.changed?
|
|
25
|
+
section_node.save
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
after_validation do
|
|
30
|
+
# Copy errors from association for slug
|
|
31
|
+
if section_node && !section_node.valid?
|
|
32
|
+
section_node.errors[:slug].each do |message|
|
|
33
|
+
errors.add(:slug, message)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
include Cms::Concerns::Addressable
|
|
39
|
+
extend Cms::Concerns::Addressable::ClassMethods
|
|
40
|
+
include Cms::Concerns::Addressable::NodeAccessors
|
|
41
|
+
include Cms::Concerns::Addressable::MarkAsDirty
|
|
42
|
+
extend Cms::Configuration::ConfigurableTemplate
|
|
43
|
+
|
|
44
|
+
if options[:path]
|
|
45
|
+
@path = options[:path]
|
|
46
|
+
include GenericSitemapBehavior
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
@template = options[:template]
|
|
50
|
+
|
|
51
|
+
unless options[:no_dynamic_path]
|
|
52
|
+
include Addressable::DynamicPath
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [Boolean] Until is_addressable is called, this will always be false.
|
|
57
|
+
def addressable?
|
|
58
|
+
false
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @return [Boolean] Some addressable content types don't require a slug.
|
|
62
|
+
def requires_slug?
|
|
63
|
+
false
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Implements behavior for displaying content blocks that should appear in the sitemap.
|
|
68
|
+
#
|
|
69
|
+
module GenericSitemapBehavior
|
|
70
|
+
def self.included(klass)
|
|
71
|
+
klass.before_validation :assign_parent_if_needed
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def partial_for
|
|
75
|
+
"addressable_content_block"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def hidden?
|
|
79
|
+
false
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def assign_parent_if_needed
|
|
83
|
+
unless parent || parent_id
|
|
84
|
+
new_parent = Cms::Section.with_path(self.class.path).first
|
|
85
|
+
|
|
86
|
+
unless new_parent
|
|
87
|
+
logger.warn "Creating default section for #{self.try(:display_name)} in #{self.class.path}."
|
|
88
|
+
section_attributes = {:name => self.class.name.demodulize.pluralize,
|
|
89
|
+
:path => self.class.path,
|
|
90
|
+
:hidden => true,
|
|
91
|
+
allow_groups: :all}
|
|
92
|
+
section_parent = Cms::Section.root.first
|
|
93
|
+
if section_parent
|
|
94
|
+
section_attributes[:parent] = section_parent
|
|
95
|
+
end
|
|
96
|
+
new_parent = Cms::Section.create!(section_attributes)
|
|
97
|
+
end
|
|
98
|
+
self.parent_id = new_parent.id
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
module Addressable
|
|
104
|
+
|
|
105
|
+
module ClassMethods
|
|
106
|
+
|
|
107
|
+
def requires_slug?
|
|
108
|
+
!@path.nil?
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# The base path where new records will be added.
|
|
112
|
+
# @return [String]
|
|
113
|
+
def path
|
|
114
|
+
@path
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# @return [Boolean] Once is_addressable is called, this will always be true.
|
|
118
|
+
def addressable?
|
|
119
|
+
true
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def calculate_path(slug)
|
|
123
|
+
"#{self.path}/#{slug}"
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Used in UI forms to show what the complete URL will look like with a slug added to it.
|
|
127
|
+
def base_path
|
|
128
|
+
"#{self.path}/"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Find an addressable object with the given content type.
|
|
132
|
+
#
|
|
133
|
+
# @param [String] slug
|
|
134
|
+
# @return [Addressable] The content block with that slug (if it exists). Nil otherwise
|
|
135
|
+
def with_slug(slug)
|
|
136
|
+
section_node = SectionNode.where(slug: slug).where(node_type: self.name).first
|
|
137
|
+
section_node ? section_node.node : nil
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Returns the layout (Page Template) that should be used to render instances of this content.
|
|
141
|
+
# Can be specified as is_addressable template: 'subpage'
|
|
142
|
+
# @return [String] template/default unless template was set.
|
|
143
|
+
def layout
|
|
144
|
+
normalize_layout(self, @template)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
module DynamicPath
|
|
149
|
+
|
|
150
|
+
# @return [String] The relative path to this content
|
|
151
|
+
def path
|
|
152
|
+
self.class.calculate_path(slug)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def slug
|
|
156
|
+
if section_node
|
|
157
|
+
section_node.slug
|
|
158
|
+
else
|
|
159
|
+
nil
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def slug=(slug)
|
|
164
|
+
if section_node
|
|
165
|
+
section_node.slug = slug
|
|
166
|
+
else
|
|
167
|
+
@slug = slug # Store temporarily until there is a section_node created.
|
|
168
|
+
end
|
|
169
|
+
dirty!
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Resources are accessible to guests if their parent section is. Variables are passed in for performance reasons
|
|
174
|
+
# since this gets called 'MANY' times on the sitemap.
|
|
175
|
+
#
|
|
176
|
+
# @param [Array<Section>] public_sections
|
|
177
|
+
# @param [Section] parent
|
|
178
|
+
def accessible_to_guests?(public_sections, parent)
|
|
179
|
+
public_sections.include?(parent)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Returns all classes which need a custom route to show themselves.
|
|
183
|
+
def self.classes_that_require_custom_routes
|
|
184
|
+
descendants.select { |klass| klass.path != nil }
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# List of all classes that can be in the sitemap.
|
|
188
|
+
#
|
|
189
|
+
# @return [Array<Class>] Returns all classes which inherit from Cms::Concerns::Addressable
|
|
190
|
+
def self.descendants
|
|
191
|
+
ObjectSpace.each_object(::Class).select { |klass| klass < Cms::Concerns::Addressable }
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# Allows for manual destruction of node
|
|
195
|
+
def destroy_node
|
|
196
|
+
node.destroy
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# Whether or not this content is the 'landing' page for its section.
|
|
200
|
+
#
|
|
201
|
+
# @return [Boolean] false always, since a content block won't ever be the landing page for the section
|
|
202
|
+
def landing_page?
|
|
203
|
+
false
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# Returns the value that will appear in the <title> element of the page when this content is rendered.
|
|
207
|
+
# Subclasses can override this.
|
|
208
|
+
#
|
|
209
|
+
# @return [String]
|
|
210
|
+
# @example Override the page title
|
|
211
|
+
# class MyWidget < ActiveRecord::Base
|
|
212
|
+
# def page_title
|
|
213
|
+
# "My Widget | #{name}"
|
|
214
|
+
# end
|
|
215
|
+
# end
|
|
216
|
+
def page_title
|
|
217
|
+
name
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Returns a list of all Addressable objects that are ancestors to this record.
|
|
221
|
+
# @param [Hash] options
|
|
222
|
+
# @option [Symbol] :include_self If this object should be included in the Array
|
|
223
|
+
# @return [Array<Addressable>] Or [] if no ancestors and/or has no parent.
|
|
224
|
+
#
|
|
225
|
+
def ancestors(options={})
|
|
226
|
+
return [] unless node
|
|
227
|
+
ancestor_nodes = node.ancestors
|
|
228
|
+
ancestors = ancestor_nodes.collect { |node| node.node }
|
|
229
|
+
ancestors << self if options[:include_self]
|
|
230
|
+
ancestors
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def parent
|
|
234
|
+
@parent if @parent
|
|
235
|
+
node ? node.section : nil
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def cache_parent(section)
|
|
239
|
+
@parent = section
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def parent_id
|
|
243
|
+
parent.try(:id)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def parent_id=(id)
|
|
247
|
+
self.parent = Cms::Section.find(id)
|
|
248
|
+
# Handles slug being set before there is a parent
|
|
249
|
+
if @slug
|
|
250
|
+
self.slug = @slug
|
|
251
|
+
@slug = nil
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def parent=(sec)
|
|
256
|
+
if node
|
|
257
|
+
node.move_to_end(sec)
|
|
258
|
+
else
|
|
259
|
+
build_section_node(:node_id => self.id, :section => sec)
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Computes the name of the partial used to render this object in the sitemap.
|
|
264
|
+
def partial_for
|
|
265
|
+
self.class.name.demodulize.underscore
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# alias :node, :section_node
|
|
269
|
+
module NodeAccessors
|
|
270
|
+
def node
|
|
271
|
+
section_node
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def node=(n)
|
|
275
|
+
self.section_node = n
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
# These exist for backwards compatibility to avoid having to change tests.
|
|
280
|
+
# I want to get rid of these in favor of parent and parent_id
|
|
281
|
+
module DeprecatedPageAccessors
|
|
282
|
+
|
|
283
|
+
def self.included(model_class)
|
|
284
|
+
#model_class.attr_accessible :section_id, :section
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def build_node(opts)
|
|
289
|
+
build_section_node(opts)
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def section_id
|
|
293
|
+
section ? section.id : nil
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def section_id=(sec_id)
|
|
297
|
+
self.section = Section.find(sec_id)
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def section
|
|
301
|
+
parent
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def section=(sec)
|
|
305
|
+
self.parent = sec
|
|
306
|
+
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# Allows records to be marked as being changed, which can be called to trigger updates when
|
|
311
|
+
# associated objects may have been changed.
|
|
312
|
+
module MarkAsDirty
|
|
313
|
+
# Forces this record to be changed, even if nothing has changed
|
|
314
|
+
# This is necessary if just the section.id has changed, for example
|
|
315
|
+
# test if this is necessary now that the attributes are in the
|
|
316
|
+
# model itself.
|
|
317
|
+
def dirty!
|
|
318
|
+
# Seems like a hack, is there a better way?
|
|
319
|
+
self.updated_at = Time.now
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
end
|
|
326
|
+
end
|