browsercms 3.5.7 → 4.0.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,47 @@
|
|
1
|
+
module Cms
|
2
|
+
class Form < ActiveRecord::Base
|
3
|
+
acts_as_content_block
|
4
|
+
content_module :forms
|
5
|
+
is_addressable path: '/forms', template: 'default'
|
6
|
+
|
7
|
+
has_many :fields, -> {order(:position)}, class_name: 'Cms::FormField'
|
8
|
+
has_many :entries, class_name: 'Cms::FormEntry'
|
9
|
+
|
10
|
+
validates_format_of :notification_email, :with => /@/, unless: lambda { |form| form.notification_email.blank? }
|
11
|
+
|
12
|
+
# Copy any field related errors into the model :base so they get displayed at the top of the form.
|
13
|
+
after_validation do
|
14
|
+
unless errors[:fields].empty?
|
15
|
+
fields.each do |field|
|
16
|
+
field.errors.each do |attribute, error|
|
17
|
+
errors[:base] << field.errors.full_message(attribute, error)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def field(name)
|
25
|
+
fields.select {|f| f.name == name}.first
|
26
|
+
end
|
27
|
+
|
28
|
+
def required?(name)
|
29
|
+
field = field(name)
|
30
|
+
field ? field.required? : false
|
31
|
+
end
|
32
|
+
|
33
|
+
def field_names
|
34
|
+
fields.collect { |f| f.name }
|
35
|
+
end
|
36
|
+
|
37
|
+
def show_text?
|
38
|
+
confirmation_behavior.to_sym == :show_text
|
39
|
+
end
|
40
|
+
|
41
|
+
# Provides a sample Entry for the form.
|
42
|
+
# This allows us to use SimpleForm to layout out elements but ignore the input when the form submits.
|
43
|
+
def new_entry
|
44
|
+
Cms::Entry.new(form: self)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Cms
|
2
|
+
class FormEntry < ActiveRecord::Base
|
3
|
+
|
4
|
+
store :data_columns
|
5
|
+
belongs_to :form, class_name: 'Cms::Form'
|
6
|
+
|
7
|
+
after_initialize :add_field_accessors
|
8
|
+
|
9
|
+
def permitted_params
|
10
|
+
form.field_names
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns a copy of the persisted object. This is required so that existing records fetched from the db can
|
14
|
+
# have validation during update operations.
|
15
|
+
#
|
16
|
+
# @return [Cms::FormEntry] A copy of this record with validations enabled on it.
|
17
|
+
def enable_validations
|
18
|
+
entry = FormEntry.for(form)
|
19
|
+
entry.attributes = self.attributes
|
20
|
+
entry.instance_variable_set(:@new_record, false)
|
21
|
+
entry
|
22
|
+
end
|
23
|
+
|
24
|
+
class << self
|
25
|
+
|
26
|
+
# Create an Entry for a specific Form. It will have validation and accessors based on the fields of the form.
|
27
|
+
#
|
28
|
+
# @param [Cms::Form] form
|
29
|
+
def for(form)
|
30
|
+
entry = FormEntry.ish(form: form) {
|
31
|
+
form.field_names.each do |field_name|
|
32
|
+
if form.required?(field_name)
|
33
|
+
validates field_name, presence: true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
}
|
37
|
+
entry
|
38
|
+
end
|
39
|
+
|
40
|
+
# Create an instance of a FormEntry with the given methods.
|
41
|
+
def ish(*args, &block)
|
42
|
+
dup(&block).new(*args)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Creates a faux class with singleton methods. Solves this problem:
|
46
|
+
# https://github.com/rails/rails/issues/5449
|
47
|
+
def dup(&block)
|
48
|
+
super.tap do |dup|
|
49
|
+
def dup.name()
|
50
|
+
FormEntry.name
|
51
|
+
end
|
52
|
+
|
53
|
+
dup.class_eval(&block) if block
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
private
|
58
|
+
|
59
|
+
# Add a single field accessor to the current instance of the object. (I.e. not shared with others)
|
60
|
+
def add_store_accessor(field_name)
|
61
|
+
singleton_class.class_eval { store_accessor :data_columns, field_name }
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_field_accessors
|
65
|
+
return unless form
|
66
|
+
form.field_names.each do |field_name|
|
67
|
+
add_store_accessor(field_name)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Cms
|
2
|
+
class FormField < ActiveRecord::Base
|
3
|
+
extend DefaultAccessible
|
4
|
+
|
5
|
+
belongs_to :form
|
6
|
+
acts_as_list scope: :form
|
7
|
+
|
8
|
+
attr_accessor :edit_path, :delete_path
|
9
|
+
|
10
|
+
# Name is assigned when the Field is created, and should not be changed afterwords.
|
11
|
+
# Otherwise existing entries will not display their data correctly.
|
12
|
+
#
|
13
|
+
# FormField#name is used for input fields. I.e. <%= f.input field.name %>
|
14
|
+
before_validation(on: :create) do
|
15
|
+
self.name = label.parameterize.underscore.to_sym if label
|
16
|
+
end
|
17
|
+
|
18
|
+
validates :name, :uniqueness => {:scope => :form_id, message: "can only be used once per form."}
|
19
|
+
|
20
|
+
def as_json(options={})
|
21
|
+
super(:methods => [:edit_path, :delete_path])
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# Return the form widget that should be used to render this field.
|
26
|
+
#
|
27
|
+
# @return [Symbol] A SimpleForm input mapping (i.e. :string, :text)
|
28
|
+
def as
|
29
|
+
case field_type
|
30
|
+
when "text_field"
|
31
|
+
:string
|
32
|
+
when "text_area"
|
33
|
+
:text
|
34
|
+
else
|
35
|
+
field_type.to_sym
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Return options to be passed to a SimpleForm input.
|
40
|
+
# @return [Hash]
|
41
|
+
# @param [Hash] config
|
42
|
+
# @option config [Boolean] :disabled If the field should be disabled.
|
43
|
+
# @option config [FormEntry] :entry
|
44
|
+
def options(config={})
|
45
|
+
opts = {label: label}
|
46
|
+
if field_type != "text_field"
|
47
|
+
opts[:as] = self.as
|
48
|
+
end
|
49
|
+
if config[:disabled]
|
50
|
+
opts[:disabled] = true
|
51
|
+
opts[:readonly] = 'readonly'
|
52
|
+
end
|
53
|
+
opts[:required] = !!required
|
54
|
+
opts[:hint] = instructions if instructions
|
55
|
+
unless choices.blank?
|
56
|
+
opts[:collection] = parse_choices
|
57
|
+
opts[:prompt] = !self.required?
|
58
|
+
end
|
59
|
+
unless config[:entry] && config[:entry].send(name)
|
60
|
+
opts[:input_html] = {value: default_value}
|
61
|
+
end
|
62
|
+
opts
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
# Don't allow name to be set via UI.
|
67
|
+
def self.permitted_params
|
68
|
+
super - [:name]
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
# Choices is a single text area where choices are divided by endlines.
|
74
|
+
def parse_choices
|
75
|
+
choices.split( /\r?\n/ )
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/app/models/cms/group.rb
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
# their permissions from all groups combined represents what they can do.
|
4
4
|
#
|
5
5
|
class Cms::Group < ActiveRecord::Base
|
6
|
-
|
6
|
+
GUEST_CODE = "guest"
|
7
7
|
|
8
8
|
has_many :user_group_memberships, :class_name => 'Cms::UserGroupMembership'
|
9
|
-
has_many :users, :through => :user_group_memberships, :class_name => 'Cms::
|
9
|
+
has_many :users, :through => :user_group_memberships, :class_name => 'Cms::PersistentUser'
|
10
10
|
|
11
11
|
has_many :group_permissions, :class_name => 'Cms::GroupPermission'
|
12
12
|
has_many :permissions, :through => :group_permissions, :class_name => 'Cms::Permission'
|
@@ -16,18 +16,28 @@ class Cms::Group < ActiveRecord::Base
|
|
16
16
|
|
17
17
|
belongs_to :group_type, :class_name => 'Cms::GroupType'
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
extend Cms::DefaultAccessible
|
20
|
+
|
21
|
+
# @override Add extra params
|
22
|
+
def self.permitted_params
|
23
|
+
super + [:group_type_id] +[section_ids: [], permission_ids: []]
|
24
|
+
end
|
25
|
+
|
22
26
|
|
23
27
|
validates_presence_of :name
|
24
28
|
|
25
|
-
|
26
|
-
|
29
|
+
class << self
|
30
|
+
def named(n)
|
31
|
+
where name: n
|
32
|
+
end
|
27
33
|
|
34
|
+
def with_code(c)
|
35
|
+
where code: c
|
36
|
+
end
|
37
|
+
end
|
28
38
|
|
29
|
-
scope :public,
|
30
|
-
scope :cms_access,
|
39
|
+
scope :public, -> { where(["#{Cms::GroupType.table_name}.cms_access = ?", false]).includes(:group_type).references(:group_type) }
|
40
|
+
scope :cms_access, -> { where(["#{Cms::GroupType.table_name}.cms_access = ?", true]).includes(:group_type).references(:group_type) }
|
31
41
|
|
32
42
|
def guest?
|
33
43
|
group_type && group_type.guest?
|
@@ -1,16 +1,16 @@
|
|
1
1
|
module Cms
|
2
2
|
class GroupType < ActiveRecord::Base
|
3
|
-
|
3
|
+
#attr_accessible :name, :guest, :cms_access
|
4
4
|
|
5
5
|
has_many :groups, :class_name => 'Cms::Group'
|
6
6
|
has_many :group_type_permissions, :class_name => 'Cms::GroupTypePermission'
|
7
7
|
has_many :permissions, :through => :group_type_permissions, :class_name => 'Cms::Permission'
|
8
8
|
|
9
|
-
scope :guest,
|
10
|
-
scope :non_guest,
|
9
|
+
scope :guest, -> {where( ["#{GroupType.table_name}.guest = ?", true])}
|
10
|
+
scope :non_guest, -> {where( ["#{GroupType.table_name}.guest = ?", false])}
|
11
11
|
|
12
|
-
scope :cms_access,
|
13
|
-
scope :non_cms_access,
|
12
|
+
scope :cms_access, -> {where( ["#{GroupType.table_name}.cms_access = ?", true])}
|
13
|
+
scope :non_cms_access, -> {where( ["#{GroupType.table_name}.cms_access = ?", false])}
|
14
14
|
|
15
15
|
end
|
16
16
|
end
|
@@ -2,34 +2,29 @@ module Cms
|
|
2
2
|
class HtmlBlock < ActiveRecord::Base
|
3
3
|
|
4
4
|
acts_as_content_block :taggable => true
|
5
|
+
content_module :core
|
5
6
|
|
6
7
|
# This shouldn't be necessary but it is for browsercms.seeds.rb'
|
7
|
-
|
8
|
+
#attr_accessible :name, :content
|
8
9
|
|
9
10
|
validates_presence_of :name
|
10
11
|
|
12
|
+
def self.eager_matching(term)
|
13
|
+
"%#{term}%"
|
14
|
+
end
|
11
15
|
# Override of search scope from searching behavior to deal with include_body
|
12
|
-
|
16
|
+
def self.search(search_params)
|
13
17
|
term = search_params.is_a?(Hash) ? search_params[:term] : search_params
|
14
18
|
include_body = search_params.is_a?(Hash) ? search_params[:include_body] : false
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
conditions = ["lower(#{table_name}.#{c}) like lower(?)"]
|
22
|
-
else
|
23
|
-
conditions.first << "or lower(#{table_name}.#{c}) like (?)"
|
24
|
-
end
|
25
|
-
conditions << "%#{term}%"
|
26
|
-
end
|
27
|
-
conditions[0] = "(#{conditions[0]})"
|
19
|
+
|
20
|
+
|
21
|
+
conditions = ["name like lower(?)", eager_matching(term)]
|
22
|
+
if include_body
|
23
|
+
conditions[0] << "OR content like lower(?)"
|
24
|
+
conditions << eager_matching(term)
|
28
25
|
end
|
29
|
-
|
30
|
-
|
31
|
-
scope
|
32
|
-
}
|
26
|
+
where(conditions)
|
27
|
+
end
|
33
28
|
|
34
29
|
def self.display_name
|
35
30
|
"Text"
|
data/app/models/cms/link.rb
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
class Cms::Link < ActiveRecord::Base
|
2
|
-
acts_as_content_block :
|
2
|
+
acts_as_content_block connectable: false, content_module: false
|
3
3
|
|
4
|
-
scope :named, lambda{|name| {:conditions => ["#{table_name}.name = ?", name]}}
|
5
|
-
|
6
|
-
has_one :section_node, :as => :node, :dependent => :destroy, :inverse_of => :node, :class_name => 'Cms::SectionNode'
|
4
|
+
scope :named, lambda { |name| {:conditions => ["#{table_name}.name = ?", name]} }
|
7
5
|
|
8
6
|
validates_presence_of :name
|
9
7
|
|
10
|
-
|
11
|
-
include Cms::Addressable::DeprecatedPageAccessors
|
8
|
+
is_addressable
|
9
|
+
include Cms::Concerns::Addressable::DeprecatedPageAccessors
|
12
10
|
|
13
11
|
#needed by menu_helper
|
14
12
|
def path
|
15
13
|
url
|
16
14
|
end
|
17
15
|
|
16
|
+
# @override
|
17
|
+
def self.permitted_params
|
18
|
+
super + [:publish_on_save]
|
19
|
+
end
|
18
20
|
end
|
data/app/models/cms/page.rb
CHANGED
@@ -12,45 +12,55 @@ class Cms::Page < ActiveRecord::Base
|
|
12
12
|
is_userstamped
|
13
13
|
is_versioned
|
14
14
|
|
15
|
-
has_many :connectors,
|
15
|
+
has_many :connectors, -> { order("#{Cms::Connector.table_name}.container, #{Cms::Connector.table_name}.position") }, :class_name => 'Cms::Connector'
|
16
16
|
has_many :page_routes, :class_name => 'Cms::PageRoute'
|
17
17
|
has_many :tasks
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
19
|
+
extend Cms::DefaultAccessible
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def named(name)
|
23
|
+
where(["#{table_name}.name = ?", name])
|
24
|
+
end
|
25
|
+
|
26
|
+
def with_path(path)
|
27
|
+
where(["#{table_name}.path = ?", path])
|
28
|
+
end
|
29
|
+
|
30
|
+
# This scope will accept a connectable object or a Hash. The Hash is expect to have
|
31
|
+
# a value for the key :connectable, which is the connectable object, and possibly
|
32
|
+
# a value for the key :version. The Hash contains a versioned connectable object,
|
33
|
+
# it will use the value in :version if present, otherwise it will use the version
|
34
|
+
# of the object. In either case of a connectable object or a Hash, if the object
|
35
|
+
# is not versioned, no version will be used
|
36
|
+
def connected_to(b)
|
37
|
+
if b.is_a?(Hash)
|
38
|
+
obj = b[:connectable]
|
39
|
+
if obj.class.versioned?
|
40
|
+
ver = b[:version] ? b[:version] : obj.version
|
41
|
+
else
|
42
|
+
ver = nil
|
43
|
+
end
|
36
44
|
else
|
37
|
-
|
45
|
+
obj = b
|
46
|
+
ver = obj.class.versioned? ? obj.version : nil
|
38
47
|
end
|
39
|
-
else
|
40
|
-
obj = b
|
41
|
-
ver = obj.class.versioned? ? obj.version : nil
|
42
|
-
end
|
43
48
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
if ver
|
50
|
+
query = where(["#{Cms::Connector.table_name}.connectable_id = ? and #{Cms::Connector.table_name}.connectable_type = ? and #{Cms::Connector.table_name}.connectable_version = ?", obj.id, obj.class.base_class.name, ver])
|
51
|
+
else
|
52
|
+
query = where(["#{Cms::Connector.table_name}.connectable_id = ? and #{Cms::Connector.table_name}.connectable_type = ?", obj.id, obj.class.base_class.name])
|
53
|
+
end
|
54
|
+
query.includes(:connectors).references(:connectors)
|
55
|
+
|
50
56
|
end
|
51
|
-
}
|
52
57
|
|
53
|
-
|
58
|
+
# @override
|
59
|
+
def permitted_params
|
60
|
+
super + [:visibility, :publish_on_save]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
# currently_connected_to tightens the scope of connected_to by restricting to the
|
54
64
|
# results to matches on current versions of pages only. This renders obj versions
|
55
65
|
# useless, as the older objects will very likely have older versions of pages and
|
56
66
|
# thus return no results.
|
@@ -59,19 +69,14 @@ class Cms::Page < ActiveRecord::Base
|
|
59
69
|
|
60
70
|
ver = obj.class.versioned? ? obj.version : nil
|
61
71
|
if ver
|
62
|
-
{
|
63
|
-
:conditions => ["#{connectors_table}.connectable_id = ? and #{connectors_table}.connectable_type = ? and #{connectors_table}.connectable_version = ? and #{connectors_table}.page_version = #{Cms::Page.table_name}.version", obj.id, obj.class.base_class.name, ver]}
|
72
|
+
where(["#{connectors_table}.connectable_id = ? and #{connectors_table}.connectable_type = ? and #{connectors_table}.connectable_version = ? and #{connectors_table}.page_version = #{Cms::Page.table_name}.version", obj.id, obj.class.base_class.name, ver]).includes(:connectors).references(:connectors)
|
64
73
|
else
|
65
|
-
{
|
66
|
-
:conditions => ["#{connectors_table}.connectable_id = ? and #{connectors_table}.connectable_type = ? and #{connectors_table}.page_version = #{Cms::Page.table_name}.version", obj.id, obj.class.base_class.name]}
|
74
|
+
where(["#{connectors_table}.connectable_id = ? and #{connectors_table}.connectable_type = ? and #{connectors_table}.page_version = #{Cms::Page.table_name}.version", obj.id, obj.class.base_class.name]).includes(:connectors).references(:connectors)
|
67
75
|
end
|
68
76
|
}
|
69
77
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
include Cms::Addressable
|
74
|
-
include Cms::Addressable::DeprecatedPageAccessors
|
78
|
+
is_addressable(no_dynamic_path: true)
|
79
|
+
include Cms::Concerns::Addressable::DeprecatedPageAccessors
|
75
80
|
|
76
81
|
|
77
82
|
before_validation :append_leading_slash_to_path, :remove_trailing_slash_from_path
|
@@ -80,9 +85,62 @@ class Cms::Page < ActiveRecord::Base
|
|
80
85
|
validates_presence_of :name, :path
|
81
86
|
|
82
87
|
# Paths must be unique among undeleted records
|
83
|
-
validates_uniqueness_of :path, :scope
|
88
|
+
validates_uniqueness_of :path, :scope => :deleted
|
84
89
|
validate :path_not_reserved
|
85
90
|
|
91
|
+
# Find the latest draft of a given page.
|
92
|
+
#
|
93
|
+
# @param [Integer | String] id_or_path The id or path of the page
|
94
|
+
# @return [Cms::Page::Version] The version of the page as of the current Draft.
|
95
|
+
# @raises [Cms::Errors::ContentNotFound] if no record could be found.
|
96
|
+
def self.find_draft(id_or_path)
|
97
|
+
if id_or_path.is_a? String
|
98
|
+
current = self.with_path(id_or_path).first
|
99
|
+
else
|
100
|
+
current = self.find(id_or_path)
|
101
|
+
end
|
102
|
+
if current
|
103
|
+
current.as_of_draft_version
|
104
|
+
else
|
105
|
+
raise Cms::Errors::DraftNotFound
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Finds the live version of a Page.
|
110
|
+
# @param [String] path The relative path to the page
|
111
|
+
# @return [Cms::Page] The page if found
|
112
|
+
# @rais [Cms::Errors::ContentNotFound] If no published page was found with the given path.
|
113
|
+
def self.find_live(path)
|
114
|
+
result = find_live_by_path(path)
|
115
|
+
unless result
|
116
|
+
raise Cms::Errors::ContentNotFound
|
117
|
+
end
|
118
|
+
result
|
119
|
+
end
|
120
|
+
|
121
|
+
# Find live version of a page.
|
122
|
+
# @return [Cms::Page] Or nil if not found.
|
123
|
+
def self.find_live_by_path(path)
|
124
|
+
published.not_archived.where(path: path).first
|
125
|
+
end
|
126
|
+
|
127
|
+
# Returns all content for the current page, excluding any deleted ones.
|
128
|
+
# @return [Array<ContentBlock>]
|
129
|
+
def contents
|
130
|
+
current_connectors.map(&:connectable_with_deleted)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Return a list of all connectors for the current version of the page.
|
134
|
+
# @param [Symbol] container The name of the container to match (Optional - Return all)
|
135
|
+
def current_connectors(container=nil)
|
136
|
+
@current_connectors ||= self.connectors.for_page_version(self.version)
|
137
|
+
if (container)
|
138
|
+
@current_connectors.select { |c| c.container.to_sym == container }
|
139
|
+
else
|
140
|
+
@current_connectors
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
86
144
|
# Implements Versioning Callback.
|
87
145
|
def after_build_new_version(new_version)
|
88
146
|
copy_connectors(
|
@@ -96,7 +154,7 @@ class Cms::Page < ActiveRecord::Base
|
|
96
154
|
# Publish all
|
97
155
|
def after_publish
|
98
156
|
self.reload # Get's the correct version number loaded
|
99
|
-
self.connectors.for_page_version(self.version).
|
157
|
+
self.connectors.for_page_version(self.version).order("position").to_a.each do |c|
|
100
158
|
if c.connectable_type.constantize.publishable? && con = c.connectable
|
101
159
|
con.publish
|
102
160
|
end
|
@@ -108,7 +166,7 @@ class Cms::Page < ActiveRecord::Base
|
|
108
166
|
def copy_connectors(options={})
|
109
167
|
logger.debug { "Copying connectors from Page #{id} v#{options[:from_version_number]} to v#{options[:to_version_number]}." }
|
110
168
|
|
111
|
-
c_found = connectors.for_page_version(options[:from_version_number]).
|
169
|
+
c_found = connectors.for_page_version(options[:from_version_number]).order("#{Cms::Connector.table_name}.container, #{Cms::Connector.table_name}.position").to_a
|
112
170
|
logger.debug { "Found connectors #{c_found}" }
|
113
171
|
c_found.each do |c|
|
114
172
|
|
@@ -134,11 +192,11 @@ class Cms::Page < ActiveRecord::Base
|
|
134
192
|
logger.debug "When copying block #{connectable.inspect} version is '#{version}'"
|
135
193
|
|
136
194
|
new_connector = connectors.create(
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
195
|
+
:page_version => options[:to_version_number],
|
196
|
+
:connectable => connectable,
|
197
|
+
:connectable_version => version,
|
198
|
+
:container => c.container,
|
199
|
+
:position => c.position
|
142
200
|
)
|
143
201
|
logger.debug { "Built new connector #{new_connector}." }
|
144
202
|
end
|
@@ -147,18 +205,21 @@ class Cms::Page < ActiveRecord::Base
|
|
147
205
|
end
|
148
206
|
|
149
207
|
# Adds a Content block to this page.
|
208
|
+
#
|
150
209
|
# @param [ContentBlock] connectable The content block to be added
|
151
210
|
# @param [Symbol] container The container to add it in (default :main)
|
152
211
|
def add_content(connectable, container=:main)
|
153
212
|
transaction do
|
154
213
|
raise "Connectable is nil" unless connectable
|
155
214
|
raise "Container is required" if container.blank?
|
215
|
+
#should_publish = published? &&
|
216
|
+
# connectable.connected_page &&
|
217
|
+
# (connectable.class.publishable? ? connectable.published? : true)
|
218
|
+
should_publish = false
|
156
219
|
update_attributes(
|
157
220
|
:version_comment => "#{connectable} was added to the '#{container}' container",
|
158
|
-
:publish_on_save =>
|
159
|
-
|
160
|
-
connectable.connected_page &&
|
161
|
-
(connectable.class.publishable? ? connectable.published? : true)))
|
221
|
+
:publish_on_save => should_publish
|
222
|
+
)
|
162
223
|
connectors.create(
|
163
224
|
:page_version => draft.version,
|
164
225
|
:connectable => connectable,
|
@@ -167,14 +228,16 @@ class Cms::Page < ActiveRecord::Base
|
|
167
228
|
end
|
168
229
|
end
|
169
230
|
|
231
|
+
# @deprecated
|
170
232
|
alias_method :create_connector, :add_content
|
171
233
|
|
234
|
+
# Moves a specific connector up or down within its container for a page.
|
172
235
|
def move_connector(connector, direction)
|
173
236
|
transaction do
|
174
237
|
raise "Connector is nil" unless connector
|
175
238
|
raise "Direction is nil" unless direction
|
176
239
|
orientation = direction[/_/] ? "#{direction.sub('_', ' the ')} of" : "#{direction} within"
|
177
|
-
update_attributes(:version_comment => "#{connector.connectable} was moved #{orientation} the '#{connector.container}' container")
|
240
|
+
update_attributes(:version_comment => "#{connector.connectable} was moved #{orientation} the '#{connector.container}' container", :publish_on_save => false)
|
178
241
|
connectors.for_page_version(draft.version).like(connector).first.send("move_#{direction}")
|
179
242
|
end
|
180
243
|
end
|
@@ -188,7 +251,7 @@ class Cms::Page < ActiveRecord::Base
|
|
188
251
|
def remove_connector(connector)
|
189
252
|
transaction do
|
190
253
|
raise "Connector is nil" unless connector
|
191
|
-
update_attributes(:
|
254
|
+
update_attributes(version_comment: "#{connector.connectable} was removed from the '#{connector.container}' container", publish_on_save: false)
|
192
255
|
|
193
256
|
#The logic of this is to go ahead and let the container get copied forward, then delete the new connector
|
194
257
|
if new_connector = connectors.for_page_version(draft.version).like(connector).first
|
@@ -201,7 +264,7 @@ class Cms::Page < ActiveRecord::Base
|
|
201
264
|
|
202
265
|
# Pages that get deleted should be 'disconnected' from any blocks they were associated with.
|
203
266
|
def delete_connectors
|
204
|
-
connectors.for_page_version(version).
|
267
|
+
connectors.for_page_version(version).to_a.each { |c| c.destroy }
|
205
268
|
end
|
206
269
|
|
207
270
|
#This is done to let copy_connectors know which version to pull from
|
@@ -216,6 +279,14 @@ class Cms::Page < ActiveRecord::Base
|
|
216
279
|
"NA"
|
217
280
|
end
|
218
281
|
|
282
|
+
# Whether or not this page is considered the 'landing' page for its parent section. These 'Overview' pages
|
283
|
+
# will have the same path as their parent.
|
284
|
+
#
|
285
|
+
# @return [Boolean]
|
286
|
+
def landing_page?
|
287
|
+
parent.path == path
|
288
|
+
end
|
289
|
+
|
219
290
|
def public?
|
220
291
|
section ? section.public? : false
|
221
292
|
end
|
@@ -298,15 +369,16 @@ class Cms::Page < ActiveRecord::Base
|
|
298
369
|
connectors.for_page_version(version).in_container(container.to_s).count
|
299
370
|
end
|
300
371
|
|
301
|
-
def self.find_live_by_path(path)
|
302
|
-
published.not_archived.first(:conditions => {:path => path})
|
303
|
-
end
|
304
|
-
|
305
372
|
def name_with_section_path
|
306
373
|
a = ancestors
|
307
374
|
(a[1..a.size].map { |a| a.name } + [name]).join(" / ")
|
308
375
|
end
|
309
376
|
|
377
|
+
# @return [Boolean] true if this page is the home page of the site.
|
378
|
+
def home?
|
379
|
+
path == "/"
|
380
|
+
end
|
381
|
+
|
310
382
|
# This will return the "top level section" for this page, which is the section directly
|
311
383
|
# below the root (a.k.a My Site) that this page is in. If this page is in root,
|
312
384
|
# then this will return root.
|
@@ -331,4 +403,29 @@ class Cms::Page < ActiveRecord::Base
|
|
331
403
|
assigned_to == user
|
332
404
|
end
|
333
405
|
|
406
|
+
# Return a collection of the available visibility statuses this model will accept via #visibility=
|
407
|
+
def visibilities
|
408
|
+
[['Public', :public], ['Archived', :archived], ['Hidden' , :hidden]]
|
409
|
+
end
|
410
|
+
|
411
|
+
def visibility
|
412
|
+
if archived?
|
413
|
+
:archived
|
414
|
+
elsif hidden?
|
415
|
+
:hidden
|
416
|
+
else
|
417
|
+
:public
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
def visibility=(new_state)
|
422
|
+
self.archived = false
|
423
|
+
self.hidden = false
|
424
|
+
if new_state.to_sym == :archived
|
425
|
+
self.archived = true
|
426
|
+
elsif new_state.to_sym == :hidden
|
427
|
+
self.hidden = true
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
334
431
|
end
|