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
data/lib/acts_as_list.rb
CHANGED
|
@@ -29,7 +29,7 @@ module ActsAsList
|
|
|
29
29
|
# to give it an entire string that is interpolated if you need a tighter scope than just a foreign key.
|
|
30
30
|
# Example: <tt>acts_as_list :scope => 'todo_list_id = #{todo_list_id} AND completed = 0'</tt>
|
|
31
31
|
def acts_as_list(options = {})
|
|
32
|
-
configuration = {
|
|
32
|
+
configuration = {:column => "position", :scope => "1 = 1"}
|
|
33
33
|
configuration.update(options) if options.is_a?(Hash)
|
|
34
34
|
|
|
35
35
|
configuration[:scope] = "#{configuration[:scope]}_id".intern if configuration[:scope].is_a?(Symbol) && configuration[:scope].to_s !~ /_id$/
|
|
@@ -156,17 +156,18 @@ module ActsAsList
|
|
|
156
156
|
# Return the next higher item in the list.
|
|
157
157
|
def higher_item
|
|
158
158
|
return nil unless in_list?
|
|
159
|
-
acts_as_list_class
|
|
160
|
-
"#{scope_condition} AND #{position_column} < #{send(position_column).to_s}"
|
|
161
|
-
|
|
159
|
+
acts_as_list_class
|
|
160
|
+
.where("#{scope_condition} AND #{position_column} < #{send(position_column).to_s}")
|
|
161
|
+
.order("#{position_column} DESC")
|
|
162
|
+
.first
|
|
162
163
|
end
|
|
163
164
|
|
|
164
165
|
# Return the next lower item in the list.
|
|
165
166
|
def lower_item
|
|
166
167
|
return nil unless in_list?
|
|
167
|
-
acts_as_list_class.
|
|
168
|
-
|
|
169
|
-
|
|
168
|
+
acts_as_list_class.where("#{scope_condition} AND #{position_column} > #{send(position_column).to_s}")
|
|
169
|
+
.order("#{position_column} ASC" )
|
|
170
|
+
.first
|
|
170
171
|
end
|
|
171
172
|
|
|
172
173
|
# Test if this record is in a list
|
|
@@ -175,82 +176,82 @@ module ActsAsList
|
|
|
175
176
|
end
|
|
176
177
|
|
|
177
178
|
private
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
179
|
+
def add_to_list_top
|
|
180
|
+
increment_positions_on_all_items
|
|
181
|
+
end
|
|
181
182
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
183
|
+
def add_to_list_bottom
|
|
184
|
+
self[position_column] = bottom_position_in_list.to_i + 1
|
|
185
|
+
end
|
|
185
186
|
|
|
186
|
-
|
|
187
|
-
|
|
187
|
+
# Overwrite this method to define the scope of the list changes
|
|
188
|
+
def scope_condition()
|
|
189
|
+
"1"
|
|
190
|
+
end
|
|
188
191
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
192
|
+
# Returns the bottom position number in the list.
|
|
193
|
+
# bottom_position_in_list # => 2
|
|
194
|
+
def bottom_position_in_list(except = nil)
|
|
195
|
+
item = bottom_item(except)
|
|
196
|
+
item ? item.send(position_column) : 0
|
|
197
|
+
end
|
|
195
198
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
199
|
+
# Returns the bottom item
|
|
200
|
+
def bottom_item(except = nil)
|
|
201
|
+
conditions = scope_condition
|
|
202
|
+
conditions = "#{conditions} AND #{self.class.primary_key} != #{except.id}" if except
|
|
203
|
+
acts_as_list_class.where(conditions).order("#{position_column} DESC").first
|
|
204
|
+
end
|
|
202
205
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
206
|
+
# Forces item to assume the bottom position in the list.
|
|
207
|
+
def assume_bottom_position
|
|
208
|
+
update_attribute(position_column, bottom_position_in_list(self).to_i + 1)
|
|
209
|
+
end
|
|
207
210
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
211
|
+
# Forces item to assume the top position in the list.
|
|
212
|
+
def assume_top_position
|
|
213
|
+
update_attribute(position_column, 1)
|
|
214
|
+
end
|
|
212
215
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
+
# This has the effect of moving all the higher items up one.
|
|
217
|
+
def decrement_positions_on_higher_items(position)
|
|
218
|
+
acts_as_list_class.update_all(
|
|
216
219
|
"#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} <= #{position}"
|
|
217
|
-
|
|
218
|
-
|
|
220
|
+
)
|
|
221
|
+
end
|
|
219
222
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
"#{
|
|
225
|
-
|
|
226
|
-
|
|
223
|
+
# This has the effect of moving all the lower items up one.
|
|
224
|
+
def decrement_positions_on_lower_items
|
|
225
|
+
return unless in_list?
|
|
226
|
+
acts_as_list_class.where(
|
|
227
|
+
"#{scope_condition} AND #{position_column} > #{send(position_column).to_i}"
|
|
228
|
+
).update_all("#{position_column} = (#{position_column} - 1)")
|
|
229
|
+
end
|
|
227
230
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
)
|
|
234
|
-
end
|
|
231
|
+
# This has the effect of moving all the higher items down one.
|
|
232
|
+
def increment_positions_on_higher_items
|
|
233
|
+
return unless in_list?
|
|
234
|
+
acts_as_list_class.where("#{scope_condition} AND #{position_column} < #{send(position_column).to_i}").update_all("#{position_column} = (#{position_column} + 1)")
|
|
235
|
+
end
|
|
235
236
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
"#{position_column} = (#{position_column} + 1)"
|
|
240
|
-
|
|
241
|
-
|
|
237
|
+
# This has the effect of moving all the lower items down one.
|
|
238
|
+
def increment_positions_on_lower_items(position)
|
|
239
|
+
acts_as_list_class.where("#{scope_condition} AND #{position_column} >= #{position}").update_all(
|
|
240
|
+
"#{position_column} = (#{position_column} + 1)"
|
|
241
|
+
)
|
|
242
|
+
end
|
|
242
243
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
"#{position_column} = (#{position_column} + 1)"
|
|
247
|
-
|
|
248
|
-
|
|
244
|
+
# Increments position (<tt>position_column</tt>) of all items in the list.
|
|
245
|
+
def increment_positions_on_all_items
|
|
246
|
+
acts_as_list_class.where("#{scope_condition}").update_all(
|
|
247
|
+
"#{position_column} = (#{position_column} + 1)"
|
|
248
|
+
)
|
|
249
|
+
end
|
|
249
250
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
251
|
+
def insert_at_position(position)
|
|
252
|
+
remove_from_list
|
|
253
|
+
increment_positions_on_lower_items(position)
|
|
254
|
+
self.update_attribute(position_column, position)
|
|
255
|
+
end
|
|
255
256
|
end
|
|
256
257
|
end
|
data/lib/browsercms.rb
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
|
+
# Load all dependencies needed at boot time.
|
|
2
|
+
require 'rails'
|
|
3
|
+
require 'cms/configuration'
|
|
4
|
+
require 'cms/version'
|
|
5
|
+
require 'browsercms'
|
|
6
|
+
|
|
7
|
+
require 'bootstrap-sass'
|
|
8
|
+
require 'compass-rails'
|
|
9
|
+
|
|
10
|
+
# Gem name is different than file name
|
|
11
|
+
# Must be required FIRST, so that our assets paths appear before its do.
|
|
12
|
+
# This allows app/assets/ckeditor/config.js to set CMS specific defaults.
|
|
13
|
+
require 'ckeditor-rails'
|
|
14
|
+
|
|
15
|
+
# Explicitly require this, so that CMS projects do not need to add it to their Gemfile
|
|
16
|
+
# especially while upgrading
|
|
17
|
+
require 'jquery-rails'
|
|
18
|
+
require 'jquery-ui-rails'
|
|
19
|
+
|
|
20
|
+
require 'underscore-rails'
|
|
21
|
+
require 'will_paginate'
|
|
22
|
+
require 'will_paginate/active_record'
|
|
23
|
+
require 'actionpack/page_caching'
|
|
24
|
+
require 'panoramic'
|
|
25
|
+
require 'simple_form'
|
|
26
|
+
require 'devise'
|
|
27
|
+
|
|
1
28
|
require 'cms/engine'
|
|
2
29
|
require 'cms/extensions'
|
|
3
30
|
require 'cms/route_extensions'
|
|
4
31
|
require 'cms/caching'
|
|
5
|
-
require 'cms/addressable'
|
|
6
32
|
require 'cms/error_pages'
|
|
7
33
|
|
|
8
34
|
#Load libraries that are included with CMS
|
|
@@ -11,13 +37,23 @@ ActiveRecord::Base.send(:include, ActsAsList)
|
|
|
11
37
|
|
|
12
38
|
require 'cms/acts'
|
|
13
39
|
require 'cms/authentication'
|
|
40
|
+
require 'cms/content_page'
|
|
41
|
+
require 'cms/configuration/configurable_template'
|
|
14
42
|
require 'cms/domain_support'
|
|
15
43
|
require 'cms/authoring'
|
|
16
44
|
require 'cms/date_picker'
|
|
17
45
|
require 'cms/content_rendering_support'
|
|
18
46
|
require 'cms/mobile_aware'
|
|
19
47
|
require 'cms/attachments/configuration'
|
|
48
|
+
require 'cms/controllers/admin_controller'
|
|
20
49
|
require 'cms/default_accessible'
|
|
50
|
+
require 'cms/admin_tab'
|
|
51
|
+
require 'cms/publish_workflow'
|
|
52
|
+
require 'cms/content_filter'
|
|
53
|
+
require 'cms/polymorphic_single_table_inheritance'
|
|
54
|
+
require 'cms/form_builder/default_input'
|
|
55
|
+
require 'cms/form_builder/content_block_form_builder'
|
|
56
|
+
require 'cms/form_builder/workflow_buttons'
|
|
21
57
|
|
|
22
58
|
# This shouldn't be necessary, except for the need to get into the loadpath for testing.
|
|
23
59
|
require 'command_line'
|
|
@@ -25,6 +61,10 @@ require 'command_line'
|
|
|
25
61
|
#Include CMS Behaviors
|
|
26
62
|
ActiveRecord::Base.send(:include, Cms::Acts::ContentBlock)
|
|
27
63
|
require 'cms/behaviors'
|
|
64
|
+
require 'cms/concerns'
|
|
65
|
+
|
|
28
66
|
|
|
29
67
|
ActiveRecord::Base.send(:include, Cms::Acts::CmsUser)
|
|
68
|
+
require 'cms/responders/content_responder'
|
|
30
69
|
|
|
70
|
+
require "panoramic"
|
|
@@ -15,7 +15,8 @@ module Cms
|
|
|
15
15
|
def acts_as_content_block(options={})
|
|
16
16
|
defaults = {
|
|
17
17
|
# Set default values here.
|
|
18
|
-
:allow_attachments => true
|
|
18
|
+
:allow_attachments => true,
|
|
19
|
+
:content_module => true
|
|
19
20
|
}
|
|
20
21
|
options = defaults.merge(options)
|
|
21
22
|
|
|
@@ -23,7 +24,7 @@ module Cms
|
|
|
23
24
|
raise ArgumentError.new ":belongs_to_attachment option is no longer supported. Please use :has_attachments option"
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
extend Cms::DefaultAccessible
|
|
27
28
|
allow_attachments if options[:allow_attachments]
|
|
28
29
|
is_archivable(options[:archiveable].is_a?(Hash) ? options[:archiveable] : {}) unless options[:archiveable] == false
|
|
29
30
|
is_connectable(options[:connectable].is_a?(Hash) ? options[:connectable] : {}) unless options[:connectable] == false
|
|
@@ -37,7 +38,12 @@ module Cms
|
|
|
37
38
|
is_versioned(options[:versioned].is_a?(Hash) ? options[:versioned] : {}) unless options[:versioned] == false
|
|
38
39
|
|
|
39
40
|
include InstanceMethods
|
|
41
|
+
|
|
42
|
+
unless options[:content_module] == false
|
|
43
|
+
has_content_type
|
|
44
|
+
end
|
|
40
45
|
extend Cms::Behaviors::Naming
|
|
46
|
+
|
|
41
47
|
end
|
|
42
48
|
|
|
43
49
|
module InstanceMethods
|
|
@@ -45,7 +51,11 @@ module Cms
|
|
|
45
51
|
"#{self.class.name.demodulize.titleize} '#{name}'"
|
|
46
52
|
end
|
|
47
53
|
end
|
|
54
|
+
|
|
55
|
+
|
|
48
56
|
end
|
|
57
|
+
|
|
58
|
+
|
|
49
59
|
end
|
|
50
60
|
end
|
|
51
61
|
end
|
|
@@ -39,6 +39,9 @@ module Cms
|
|
|
39
39
|
base.helper Cms::RenderingHelper
|
|
40
40
|
base.helper Cms::MenuHelper
|
|
41
41
|
base.helper Cms::Acts::PageHelper
|
|
42
|
+
base.helper Cms::UiElementsHelper
|
|
43
|
+
base.helper Cms::PathHelper
|
|
44
|
+
base.send :include, Cms::NavMenuHelper
|
|
42
45
|
end
|
|
43
46
|
|
|
44
47
|
# Allows a Controller method to set a page title for an action.
|
|
@@ -56,10 +59,6 @@ module Cms
|
|
|
56
59
|
end
|
|
57
60
|
end
|
|
58
61
|
|
|
59
|
-
def determine_page_layout
|
|
60
|
-
@page.layout
|
|
61
|
-
end
|
|
62
|
-
|
|
63
62
|
module ClassMethods
|
|
64
63
|
|
|
65
64
|
# Requires that some or all of the actions on this controller require the same permissions as a specific section of the website.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
|
|
3
|
+
# Any controller that is considered to be on the 'Admin' tab should include this.
|
|
4
|
+
module AdminTab
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
before_filter :set_menu_section
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def new_button_path
|
|
12
|
+
cms.new_user_path
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -45,7 +45,7 @@ module Cms
|
|
|
45
45
|
|
|
46
46
|
# Set default configurations for Attachments.
|
|
47
47
|
def initialize
|
|
48
|
-
self.url = ":attachment_file_path"
|
|
48
|
+
self.url = Rails.configuration.cms.attachments[:url] || ":attachment_file_path"
|
|
49
49
|
self.path = ":attachments_root/:id_partition/:style/:fingerprint"
|
|
50
50
|
self.styles = {}
|
|
51
51
|
self.processors = [:thumbnail]
|
|
@@ -5,11 +5,6 @@
|
|
|
5
5
|
# class MySuperSecureController < ApplicationController
|
|
6
6
|
# include Cms::Authentication::Controller
|
|
7
7
|
#
|
|
8
|
-
# It is based off Restful_Authentication, and adds in behavior to deal with several concepts specific to BrowserCMS.
|
|
9
|
-
#
|
|
10
|
-
# (Note: 10/8/09 - I was comparing this to a very old version of the generated code from Restful_Authentication,
|
|
11
|
-
# so some of the following items may be 'stock' to that. (Especially #2)
|
|
12
|
-
#
|
|
13
8
|
# 1. Guests - These represents users that are not logged in. What guests can see and do can be modified via the CMS UI. Guests
|
|
14
9
|
# are not considered to be 'logged in'.
|
|
15
10
|
# 2. 'Current' User - The currently logged in user is stored in a thread local, and can be accessed anywhere via 'Cms::User.current'.
|
|
@@ -25,189 +20,100 @@
|
|
|
25
20
|
module Cms
|
|
26
21
|
module Authentication
|
|
27
22
|
module Controller
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
23
|
+
# Inclusion hook to make #current_user and #logged_in?
|
|
24
|
+
# available as ActionView helper methods.
|
|
25
|
+
def self.included(base)
|
|
26
|
+
base.send :helper_method, :current_user, :logged_in? if base.respond_to? :helper_method
|
|
27
|
+
base.extend ClassMethods
|
|
28
|
+
end
|
|
34
29
|
|
|
35
|
-
# Accesses the current user from the session or 'remember me' cookie.
|
|
36
|
-
# If the user is not logged in, this will be set to the guest user, which represents a public
|
|
37
|
-
# user, who will likely have more limited permissions
|
|
38
|
-
def current_user
|
|
39
|
-
# Note: We have disabled basic_http_auth
|
|
40
|
-
@current_user ||= begin
|
|
41
|
-
Cms::User.current = (login_from_session || login_from_cookie || Cms::User.guest)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
30
|
|
|
45
|
-
|
|
46
|
-
def current_user=(new_user)
|
|
47
|
-
session[:user_id] = new_user ? new_user.id : nil
|
|
48
|
-
@current_user = new_user || false
|
|
49
|
-
Cms::User.current = @current_user
|
|
50
|
-
end
|
|
31
|
+
module ClassMethods
|
|
51
32
|
|
|
52
|
-
#
|
|
33
|
+
# Determines if the current user has at least one of the following permissions. Sets up a before_action that
|
|
34
|
+
# enforces permissions.
|
|
53
35
|
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
# has the correct rights.
|
|
36
|
+
# @param [Symbol, Array<Symbol>] perms One or more permissions.
|
|
37
|
+
# @raise [Cms::Errors::AccessDenied] If the current_user doesn't have ANY of the given permissions.
|
|
57
38
|
#
|
|
58
39
|
# Example:
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
logged_in?
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Filter method to enforce a login requirement.
|
|
70
|
-
#
|
|
71
|
-
# To require logins for all actions, use this in your controllers:
|
|
72
|
-
#
|
|
73
|
-
# before_filter :login_required
|
|
74
|
-
#
|
|
75
|
-
# To require logins for specific actions, use this in your controllers:
|
|
76
|
-
#
|
|
77
|
-
# before_filter :login_required, :only => [ :edit, :update ]
|
|
78
|
-
#
|
|
79
|
-
# To skip this in a subclassed controller:
|
|
80
|
-
#
|
|
81
|
-
# skip_before_filter :login_required
|
|
82
|
-
#
|
|
83
|
-
def login_required
|
|
84
|
-
authorized? || access_denied
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Redirect as appropriate when an access request fails.
|
|
88
|
-
#
|
|
89
|
-
# The default action is to redirect to the BrowserCMS admin login screen.
|
|
90
|
-
#
|
|
91
|
-
# Override this method in your controllers if you want to have special
|
|
92
|
-
# behavior in case the user is not authorized
|
|
93
|
-
# to access the requested action. For example, a popup window might
|
|
94
|
-
# simply close itself.
|
|
95
|
-
def access_denied
|
|
96
|
-
respond_to do |format|
|
|
97
|
-
format.html do
|
|
98
|
-
store_location
|
|
99
|
-
redirect_to cms.login_path
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Store the URI of the current request in the session.
|
|
105
|
-
#
|
|
106
|
-
# We can return to this location by calling #redirect_back_or_default.
|
|
107
|
-
def store_location
|
|
108
|
-
session[:return_to] = request.fullpath
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# Redirect to the URI stored by the most recent store_location call or
|
|
112
|
-
# to the passed default. Set an appropriately modified
|
|
113
|
-
# after_filter :store_location, :only => [:index, :new, :show, :edit]
|
|
114
|
-
# for any controller you want to be bounce-backable.
|
|
115
|
-
def redirect_back_or_default(default)
|
|
116
|
-
redirect_to(session[:return_to] || default)
|
|
117
|
-
session[:return_to] = nil
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Inclusion hook to make #current_user and #logged_in?
|
|
121
|
-
# available as ActionView helper methods.
|
|
122
|
-
def self.included(base)
|
|
123
|
-
base.send :helper_method, :current_user, :logged_in?, :authorized? if base.respond_to? :helper_method
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
#
|
|
127
|
-
# Login
|
|
128
|
-
#
|
|
129
|
-
|
|
130
|
-
# Called from #current_user. First attempt to login by the user id stored in the session.
|
|
131
|
-
def login_from_session
|
|
132
|
-
self.current_user = Cms::User.find_by_id(session[:user_id]) if session[:user_id]
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# Called from #current_user. Now, attempt to login by basic authentication information.
|
|
136
|
-
def login_from_basic_auth
|
|
137
|
-
authenticate_with_http_basic do |login, password|
|
|
138
|
-
self.current_user = Cms::User.authenticate(login, password)
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
#
|
|
143
|
-
# Logout
|
|
144
|
-
#
|
|
145
|
-
|
|
146
|
-
# Called from #current_user. Finaly, attempt to login by an expiring token in the cookie.
|
|
147
|
-
# for the paranoid: we _should_ be storing user_token = hash(cookie_token, request IP)
|
|
148
|
-
def login_from_cookie
|
|
149
|
-
user = cookies[:auth_token] && Cms::User.find_by_remember_token(cookies[:auth_token])
|
|
150
|
-
if user && user.remember_token?
|
|
151
|
-
self.current_user = user
|
|
152
|
-
handle_remember_cookie! false # freshen cookie token (keeping date)
|
|
153
|
-
self.current_user
|
|
40
|
+
# class MyCustomController < Cms::ApplicationController
|
|
41
|
+
# check_permissions :publish_content, :except => [:index]
|
|
42
|
+
# end
|
|
43
|
+
def check_permissions(*perms)
|
|
44
|
+
opts = Hash === perms.last ? perms.pop : {}
|
|
45
|
+
before_filter(opts) do |controller|
|
|
46
|
+
raise Cms::Errors::AccessDenied unless controller.send(:current_user).able_to?(*perms)
|
|
154
47
|
end
|
|
155
48
|
end
|
|
49
|
+
end
|
|
156
50
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
def valid_remember_cookie?
|
|
186
|
-
return nil unless Cms::User.current
|
|
187
|
-
(Cms::User.current.remember_token?) &&
|
|
188
|
-
(cookies[:auth_token] == Cms::User.current.remember_token)
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
# Refresh the cookie auth token if it exists, create it otherwise
|
|
192
|
-
def handle_remember_cookie! new_cookie_flag
|
|
193
|
-
return unless Cms::User.current
|
|
194
|
-
case
|
|
195
|
-
when valid_remember_cookie? then Cms::User.current.refresh_token # keeping same expiry date
|
|
196
|
-
when new_cookie_flag then Cms::User.current.remember_me
|
|
197
|
-
else Cms::User.current.forget_me
|
|
51
|
+
protected
|
|
52
|
+
# Returns true or false if the user is logged in.
|
|
53
|
+
# Preloads Cms::User.current with the user model if they're logged in.
|
|
54
|
+
def logged_in?
|
|
55
|
+
!current_user.nil? && !current_user.guest?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns the current user if logged in. If no user is logged in, returns the 'Guest' user which represents a
|
|
59
|
+
# what a visitor can do without being logged in.
|
|
60
|
+
def current_user
|
|
61
|
+
@current_user ||= begin
|
|
62
|
+
Cms::PersistentUser.current = current_cms_user || Cms::User.guest
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Redirect as appropriate when an access request fails.
|
|
67
|
+
#
|
|
68
|
+
# The default action is to redirect to the BrowserCMS admin login screen.
|
|
69
|
+
#
|
|
70
|
+
# Override this method in your controllers if you want to have special
|
|
71
|
+
# behavior in case the user is not authorized
|
|
72
|
+
# to access the requested action. For example, a popup window might
|
|
73
|
+
# simply close itself.
|
|
74
|
+
def access_denied
|
|
75
|
+
respond_to do |format|
|
|
76
|
+
format.html do
|
|
77
|
+
store_location
|
|
78
|
+
redirect_to cms.login_path
|
|
198
79
|
end
|
|
199
|
-
send_remember_cookie!
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def kill_remember_cookie!
|
|
203
|
-
cookies.delete :auth_token
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def send_remember_cookie!
|
|
207
|
-
cookies[:auth_token] = {
|
|
208
|
-
:value => Cms::User.current.remember_token,
|
|
209
|
-
:expires => Cms::User.current.remember_token_expires_at }
|
|
210
80
|
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Store the URI of the current request in the session.
|
|
84
|
+
#
|
|
85
|
+
# We can return to this location by calling #redirect_back_or_default.
|
|
86
|
+
def store_location
|
|
87
|
+
session[:return_to] = request.fullpath
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Redirect to the URI stored by the most recent store_location call or
|
|
91
|
+
# to the passed default. Set an appropriately modified
|
|
92
|
+
# after_filter :store_location, :only => [:index, :new, :show, :edit]
|
|
93
|
+
# for any controller you want to be bounce-backable.
|
|
94
|
+
def redirect_back_or_default(default)
|
|
95
|
+
redirect_to(session[:return_to] || default)
|
|
96
|
+
session[:return_to] = nil
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# This is ususally what you want; resetting the session willy-nilly wreaks
|
|
100
|
+
# havoc with forgery protection, and is only strictly necessary on login.
|
|
101
|
+
# However, **all session state variables should be unset here**.
|
|
102
|
+
def logout_keeping_session!
|
|
103
|
+
# Kill server-side auth cookie
|
|
104
|
+
Cms::PersistentUser.current.forget_me if Cms::User.current.is_a? User
|
|
105
|
+
Cms::PersistentUser.current = false # not logged in, and don't do it for me
|
|
106
|
+
session[:user_id] = nil # keeps the session but kill our variable
|
|
107
|
+
# explicitly kill any other session variables you set
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# The session should only be reset at the tail end of a form POST --
|
|
111
|
+
# otherwise the request forgery protection fails. It's only really necessary
|
|
112
|
+
# when you cross quarantine (logged-out to logged-in).
|
|
113
|
+
def logout_killing_session!
|
|
114
|
+
logout_keeping_session!
|
|
115
|
+
reset_session
|
|
116
|
+
end
|
|
211
117
|
|
|
212
118
|
end
|
|
213
119
|
end
|