browsercms-artirix 4.0.0.rc1.art4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +5 -0
- data/COPYRIGHT.txt +27 -0
- data/GPL.txt +674 -0
- data/LICENSE.txt +165 -0
- data/README.markdown +45 -0
- data/app/assets/fonts/icomoon.dev.svg +61 -0
- data/app/assets/fonts/icomoon.eot +0 -0
- data/app/assets/fonts/icomoon.svg +61 -0
- data/app/assets/fonts/icomoon.ttf +0 -0
- data/app/assets/fonts/icomoon.woff +0 -0
- data/app/assets/images/ckeditor/plugins/delete_content/icons/deletecontent.png +0 -0
- data/app/assets/images/ckeditor/plugins/edit_content/icons/editcontent.png +0 -0
- data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentdown.png +0 -0
- data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentup.png +0 -0
- data/app/assets/images/cms/administration/user_browser_bg.gif +0 -0
- data/app/assets/images/cms/arrow-down.png +0 -0
- data/app/assets/images/cms/arrow-up.png +0 -0
- data/app/assets/images/cms/bg.png +0 -0
- data/app/assets/images/cms/bl_curve.png +0 -0
- data/app/assets/images/cms/bottom_cap.png +0 -0
- data/app/assets/images/cms/bottom_cap_content.png +0 -0
- data/app/assets/images/cms/browse.gif +0 -0
- data/app/assets/images/cms/browser_media_logo.png +0 -0
- data/app/assets/images/cms/browsercms_logo.png +0 -0
- data/app/assets/images/cms/buttons/button.png +0 -0
- data/app/assets/images/cms/buttons/button_bg.png +0 -0
- data/app/assets/images/cms/buttons/button_cap.png +0 -0
- data/app/assets/images/cms/buttons/button_cap_h.png +0 -0
- data/app/assets/images/cms/buttons/button_cap_off.gif +0 -0
- data/app/assets/images/cms/buttons/button_cap_off_middle.gif +0 -0
- data/app/assets/images/cms/buttons/button_h.png +0 -0
- data/app/assets/images/cms/buttons/button_left_bg.png +0 -0
- data/app/assets/images/cms/buttons/button_off.png +0 -0
- data/app/assets/images/cms/buttons/button_off_middle.png +0 -0
- data/app/assets/images/cms/buttons/delete_x.png +0 -0
- data/app/assets/images/cms/buttons/delete_x_disabled.png +0 -0
- data/app/assets/images/cms/buttons/delete_x_h.png +0 -0
- data/app/assets/images/cms/buttons/sm_button.gif +0 -0
- data/app/assets/images/cms/buttons/sm_button_2.gif +0 -0
- data/app/assets/images/cms/buttons/sm_button_2_h.gif +0 -0
- data/app/assets/images/cms/buttons/sm_button_h.gif +0 -0
- data/app/assets/images/cms/cogs.png +0 -0
- data/app/assets/images/cms/containers/add.gif +0 -0
- data/app/assets/images/cms/containers/alpha.png +0 -0
- data/app/assets/images/cms/containers/beta.png +0 -0
- data/app/assets/images/cms/containers/delete.gif +0 -0
- data/app/assets/images/cms/containers/down.gif +0 -0
- data/app/assets/images/cms/containers/edit.gif +0 -0
- data/app/assets/images/cms/containers/up.gif +0 -0
- data/app/assets/images/cms/containers/view.gif +0 -0
- data/app/assets/images/cms/content_bg.gif +0 -0
- data/app/assets/images/cms/dashboard/bottom_cap.png +0 -0
- data/app/assets/images/cms/dashboard/bottom_cap_content.png +0 -0
- data/app/assets/images/cms/dashboard/header_bg.gif +0 -0
- data/app/assets/images/cms/dashboard/header_left_bg.gif +0 -0
- data/app/assets/images/cms/dashboard/home.png +0 -0
- data/app/assets/images/cms/dashboard/table_header_bg.gif +0 -0
- data/app/assets/images/cms/dashboard/top_cap.png +0 -0
- data/app/assets/images/cms/dashed.gif +0 -0
- data/app/assets/images/cms/datepicker/clear.gif +0 -0
- data/app/assets/images/cms/datepicker/close.gif +0 -0
- data/app/assets/images/cms/dk_button_l.gif +0 -0
- data/app/assets/images/cms/dk_button_r.gif +0 -0
- data/app/assets/images/cms/dot.png +0 -0
- data/app/assets/images/cms/draft_status.gif +0 -0
- data/app/assets/images/cms/file-uploading.gif +0 -0
- data/app/assets/images/cms/gray_long_bg.gif +0 -0
- data/app/assets/images/cms/home.png +0 -0
- data/app/assets/images/cms/icons/actions/add.png +0 -0
- data/app/assets/images/cms/icons/actions/config.png +0 -0
- data/app/assets/images/cms/icons/actions/connect.png +0 -0
- data/app/assets/images/cms/icons/actions/delete.png +0 -0
- data/app/assets/images/cms/icons/actions/down.png +0 -0
- data/app/assets/images/cms/icons/actions/edit.png +0 -0
- data/app/assets/images/cms/icons/actions/folder.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_add.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_delete.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_edit.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_move.png +0 -0
- data/app/assets/images/cms/icons/actions/folder_open.png +0 -0
- data/app/assets/images/cms/icons/actions/history.png +0 -0
- data/app/assets/images/cms/icons/actions/home.png +0 -0
- data/app/assets/images/cms/icons/actions/left.png +0 -0
- data/app/assets/images/cms/icons/actions/link.png +0 -0
- data/app/assets/images/cms/icons/actions/page.png +0 -0
- data/app/assets/images/cms/icons/actions/page_add.png +0 -0
- data/app/assets/images/cms/icons/actions/page_edit.png +0 -0
- data/app/assets/images/cms/icons/actions/page_move.png +0 -0
- data/app/assets/images/cms/icons/actions/redo.png +0 -0
- data/app/assets/images/cms/icons/actions/refresh.png +0 -0
- data/app/assets/images/cms/icons/actions/right.png +0 -0
- data/app/assets/images/cms/icons/actions/root_folder.png +0 -0
- data/app/assets/images/cms/icons/actions/root_link.png +0 -0
- data/app/assets/images/cms/icons/actions/root_page.png +0 -0
- data/app/assets/images/cms/icons/actions/undo.png +0 -0
- data/app/assets/images/cms/icons/actions/up.png +0 -0
- data/app/assets/images/cms/icons/actions/view.png +0 -0
- data/app/assets/images/cms/icons/file_types/doc.png +0 -0
- data/app/assets/images/cms/icons/file_types/file.png +0 -0
- data/app/assets/images/cms/icons/file_types/gif.png +0 -0
- data/app/assets/images/cms/icons/file_types/htm.png +0 -0
- data/app/assets/images/cms/icons/file_types/pdf.png +0 -0
- data/app/assets/images/cms/icons/file_types/ppt.png +0 -0
- data/app/assets/images/cms/icons/file_types/swf.png +0 -0
- data/app/assets/images/cms/icons/file_types/txt.png +0 -0
- data/app/assets/images/cms/icons/file_types/xls.png +0 -0
- data/app/assets/images/cms/icons/file_types/xml.png +0 -0
- data/app/assets/images/cms/icons/file_types/zip.png +0 -0
- data/app/assets/images/cms/icons/status/archived.gif +0 -0
- data/app/assets/images/cms/icons/status/draft.gif +0 -0
- data/app/assets/images/cms/icons/status/hidden.gif +0 -0
- data/app/assets/images/cms/icons/status/locked.gif +0 -0
- data/app/assets/images/cms/icons/status/published.gif +0 -0
- data/app/assets/images/cms/icons/status/unlocked.gif +0 -0
- data/app/assets/images/cms/icons/user.png +0 -0
- data/app/assets/images/cms/login_bg.jpg +0 -0
- data/app/assets/images/cms/login_bottom.jpg +0 -0
- data/app/assets/images/cms/login_top.gif +0 -0
- data/app/assets/images/cms/logo.png +0 -0
- data/app/assets/images/cms/lt_button_bg.gif +0 -0
- data/app/assets/images/cms/lt_button_l.gif +0 -0
- data/app/assets/images/cms/lt_button_r.gif +0 -0
- data/app/assets/images/cms/menu/block_cap_h.gif +0 -0
- data/app/assets/images/cms/menu/bottom_cap.png +0 -0
- data/app/assets/images/cms/menu/bottom_cap_menu.png +0 -0
- data/app/assets/images/cms/menu/bottom_cap_menu_first.png +0 -0
- data/app/assets/images/cms/menu/menu_header_first_bg.gif +0 -0
- data/app/assets/images/cms/menu/selected_block_cap.gif +0 -0
- data/app/assets/images/cms/menu/top_cap.png +0 -0
- data/app/assets/images/cms/menu/top_cap_menu_header.png +0 -0
- data/app/assets/images/cms/menu.png +0 -0
- data/app/assets/images/cms/menu_h.gif +0 -0
- data/app/assets/images/cms/menu_header.png +0 -0
- data/app/assets/images/cms/menu_open.png +0 -0
- data/app/assets/images/cms/menu_open_bg.gif +0 -0
- data/app/assets/images/cms/nav/on_bg.gif +0 -0
- data/app/assets/images/cms/nav.png +0 -0
- data/app/assets/images/cms/nav_admin.gif +0 -0
- data/app/assets/images/cms/nav_admin_h.gif +0 -0
- data/app/assets/images/cms/nav_admin_on.gif +0 -0
- data/app/assets/images/cms/nav_cap.png +0 -0
- data/app/assets/images/cms/nav_cap_h.gif +0 -0
- data/app/assets/images/cms/nav_content_library.gif +0 -0
- data/app/assets/images/cms/nav_content_library_h.gif +0 -0
- data/app/assets/images/cms/nav_content_library_on.gif +0 -0
- data/app/assets/images/cms/nav_dash.gif +0 -0
- data/app/assets/images/cms/nav_dash_h.gif +0 -0
- data/app/assets/images/cms/nav_dash_on.gif +0 -0
- data/app/assets/images/cms/nav_h.gif +0 -0
- data/app/assets/images/cms/nav_sitemap.gif +0 -0
- data/app/assets/images/cms/nav_sitemap_h.gif +0 -0
- data/app/assets/images/cms/nav_sitemap_on.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_inset_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/page_toolbar_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_draft_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_draft_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_published_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/status_published_l.gif +0 -0
- data/app/assets/images/cms/page_toolbar/visual_editor_bg.gif +0 -0
- data/app/assets/images/cms/page_toolbar/visual_editor_end.gif +0 -0
- data/app/assets/images/cms/page_toolbar/visual_editor_r.gif +0 -0
- data/app/assets/images/cms/page_toolbar/visual_editor_state_bg.gif +0 -0
- data/app/assets/images/cms/pages/add_connectable.gif +0 -0
- data/app/assets/images/cms/pages/connect_connectable.gif +0 -0
- data/app/assets/images/cms/pages/container_border.gif +0 -0
- data/app/assets/images/cms/pages/container_border_l.gif +0 -0
- data/app/assets/images/cms/pages/container_border_r.gif +0 -0
- data/app/assets/images/cms/pages/delete_connectable.gif +0 -0
- data/app/assets/images/cms/pages/down_connectable.gif +0 -0
- data/app/assets/images/cms/pages/down_connectable_disabled.gif +0 -0
- data/app/assets/images/cms/pages/edit_connectable.gif +0 -0
- data/app/assets/images/cms/pages/edit_connectable_2.gif +0 -0
- data/app/assets/images/cms/pages/show_connectable.gif +0 -0
- data/app/assets/images/cms/pages/up_connectable.gif +0 -0
- data/app/assets/images/cms/pages/up_connectable_disabled.gif +0 -0
- data/app/assets/images/cms/pagination/first.gif +0 -0
- data/app/assets/images/cms/pagination/first_h.gif +0 -0
- data/app/assets/images/cms/pagination/input.gif +0 -0
- data/app/assets/images/cms/pagination/last.gif +0 -0
- data/app/assets/images/cms/pagination/last_h.gif +0 -0
- data/app/assets/images/cms/pagination/next.gif +0 -0
- data/app/assets/images/cms/pagination/next_h.gif +0 -0
- data/app/assets/images/cms/pagination/previous.gif +0 -0
- data/app/assets/images/cms/pagination/previous_h.gif +0 -0
- data/app/assets/images/cms/pencil.png +0 -0
- data/app/assets/images/cms/plus.png +0 -0
- data/app/assets/images/cms/published_status.gif +0 -0
- data/app/assets/images/cms/search.png +0 -0
- data/app/assets/images/cms/search_submit.gif +0 -0
- data/app/assets/images/cms/search_submit_h.gif +0 -0
- data/app/assets/images/cms/searchbox_gradient.gif +0 -0
- data/app/assets/images/cms/select_bg.gif +0 -0
- data/app/assets/images/cms/select_bg_2.gif +0 -0
- data/app/assets/images/cms/sitemap/bottom_cap.png +0 -0
- data/app/assets/images/cms/sitemap/buffer_caps.png +0 -0
- data/app/assets/images/cms/sitemap/contract.png +0 -0
- data/app/assets/images/cms/sitemap/corners.gif +0 -0
- data/app/assets/images/cms/sitemap/corners_hover.gif +0 -0
- data/app/assets/images/cms/sitemap/divider.gif +0 -0
- data/app/assets/images/cms/sitemap/expand.png +0 -0
- data/app/assets/images/cms/sitemap/gradient.gif +0 -0
- data/app/assets/images/cms/sitemap/gray_contract.png +0 -0
- data/app/assets/images/cms/sitemap/gray_expand.png +0 -0
- data/app/assets/images/cms/sitemap/no_contents.png +0 -0
- data/app/assets/images/cms/sitemap/site_root_cap.png +0 -0
- data/app/assets/images/cms/sitemap/tooltip.gif +0 -0
- data/app/assets/images/cms/sitemap/top_cap_content.png +0 -0
- data/app/assets/images/cms/solid.gif +0 -0
- data/app/assets/images/cms/table/bl.gif +0 -0
- data/app/assets/images/cms/table/br.gif +0 -0
- data/app/assets/images/cms/table/divider.gif +0 -0
- data/app/assets/images/cms/table/td_cap_first_h.gif +0 -0
- data/app/assets/images/cms/table/td_cap_first_s.gif +0 -0
- data/app/assets/images/cms/table/td_cap_last_h.gif +0 -0
- data/app/assets/images/cms/table/td_cap_last_s.gif +0 -0
- data/app/assets/images/cms/table/td_last_bg.gif +0 -0
- data/app/assets/images/cms/table/th_bg.gif +0 -0
- data/app/assets/images/cms/table/th_divider.gif +0 -0
- data/app/assets/images/cms/table/th_last_bg.gif +0 -0
- data/app/assets/images/cms/table/tl.gif +0 -0
- data/app/assets/images/cms/table/tr.gif +0 -0
- data/app/assets/images/cms/table/tr_bg.gif +0 -0
- data/app/assets/images/cms/toolbar_bg.png +0 -0
- data/app/assets/images/cms/top_cap.png +0 -0
- data/app/assets/images/cms/top_cap_content.png +0 -0
- data/app/assets/images/cms/top_cap_menu_header.png +0 -0
- data/app/assets/images/cms/user.png +0 -0
- data/app/assets/images/cms/user_search_submit.gif +0 -0
- data/app/assets/images/cms/usercontrols_bg.png +0 -0
- data/app/assets/images/cms/usercontrols_bg_cap.png +0 -0
- data/app/assets/javascripts/bcms/ckeditor.js +8 -0
- data/app/assets/javascripts/bcms/ckeditor_inline.js +23 -0
- data/app/assets/javascripts/bcms/ckeditor_load.js +54 -0
- data/app/assets/javascripts/bcms/ckeditor_standard_config.js +10 -0
- data/app/assets/javascripts/ckeditor/plugins/delete_content/plugin.js +36 -0
- data/app/assets/javascripts/ckeditor/plugins/edit_content/plugin.js +24 -0
- data/app/assets/javascripts/ckeditor/plugins/move_content/plugin.js +25 -0
- data/app/assets/javascripts/cms/ajax.js +60 -0
- data/app/assets/javascripts/cms/application.js +18 -0
- data/app/assets/javascripts/cms/attachment_manager.js +88 -0
- data/app/assets/javascripts/cms/content_library.js +121 -0
- data/app/assets/javascripts/cms/content_types.js +13 -0
- data/app/assets/javascripts/cms/core_library.js.erb +210 -0
- data/app/assets/javascripts/cms/form_builder.js +250 -0
- data/app/assets/javascripts/cms/namespace.js +2 -0
- data/app/assets/javascripts/cms/new_content_button.js +27 -0
- data/app/assets/javascripts/cms/page_editor.js +189 -0
- data/app/assets/javascripts/cms/page_toolbar.js +13 -0
- data/app/assets/javascripts/cms/site.js +2 -0
- data/app/assets/javascripts/cms/sitemap.js +219 -0
- data/app/assets/javascripts/cms/toolbar.js +21 -0
- data/app/assets/javascripts/cms/user.js +40 -0
- data/app/assets/javascripts/jquery.exists.js +5 -0
- data/app/assets/javascripts/jquery.taglist.js +157 -0
- data/app/assets/stylesheets/cms/_assets.scss +60 -0
- data/app/assets/stylesheets/cms/_base.scss +42 -0
- data/app/assets/stylesheets/cms/_cms-buttons.scss +73 -0
- data/app/assets/stylesheets/cms/_cms-forms.scss +70 -0
- data/app/assets/stylesheets/cms/_colors.scss +20 -0
- data/app/assets/stylesheets/cms/_dashboard.scss +25 -0
- data/app/assets/stylesheets/cms/_glyph.scss +60 -0
- data/app/assets/stylesheets/cms/_main-area.scss +62 -0
- data/app/assets/stylesheets/cms/_nav.scss +197 -0
- data/app/assets/stylesheets/cms/_sidebar.scss +64 -0
- data/app/assets/stylesheets/cms/_sitemap.scss +209 -0
- data/app/assets/stylesheets/cms/_submenu.scss +48 -0
- data/app/assets/stylesheets/cms/application.scss +49 -0
- data/app/assets/stylesheets/cms/core.scss +96 -0
- data/app/assets/stylesheets/cms/default-forms.scss +3 -0
- data/app/assets/stylesheets/cms/includes/_animation.scss +2 -0
- data/app/assets/stylesheets/cms/includes/_rem.scss +120 -0
- data/app/assets/stylesheets/cms/includes/animation/_animate.scss +31 -0
- data/app/assets/stylesheets/cms/includes/animation/_core.scss +127 -0
- data/app/assets/stylesheets/cms/includes/animation/_shared.scss +22 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_attention-seekers.scss +152 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_bouncing.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_classes.scss +21 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_fading.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_flippers.scss +87 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_lightspeed.scss +24 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_rotating.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_specials.scss +42 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-entrances.scss +68 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-exits.scss +60 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-entrances.scss +86 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-exits.scss +86 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-entrances.scss +58 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-exits.scss +58 -0
- data/app/assets/stylesheets/cms/page_content_editing.scss +4 -0
- data/app/assets/stylesheets/cms/page_editor.scss +4 -0
- data/app/assets/stylesheets/cms/style.scss +138 -0
- data/app/assets/stylesheets/cms/styles/_alerts.scss +150 -0
- data/app/assets/stylesheets/cms/styles/_base-grid.scss +299 -0
- data/app/assets/stylesheets/cms/styles/_buttons.scss +247 -0
- data/app/assets/stylesheets/cms/styles/_dropdown.scss +155 -0
- data/app/assets/stylesheets/cms/styles/_forms.scss +728 -0
- data/app/assets/stylesheets/cms/styles/_glyph.scss +86 -0
- data/app/assets/stylesheets/cms/styles/_images.scss +86 -0
- data/app/assets/stylesheets/cms/styles/_lists.scss +115 -0
- data/app/assets/stylesheets/cms/styles/_modal.scss +174 -0
- data/app/assets/stylesheets/cms/styles/_progress.scss +43 -0
- data/app/assets/stylesheets/cms/styles/_tables.scss +141 -0
- data/app/assets/stylesheets/cms/styles/_text.scss +134 -0
- data/app/controllers/cms/application_controller.rb +11 -0
- data/app/controllers/cms/attachments_controller.rb +48 -0
- data/app/controllers/cms/base_controller.rb +22 -0
- data/app/controllers/cms/cache_controller.rb +23 -0
- data/app/controllers/cms/categories_controller.rb +7 -0
- data/app/controllers/cms/category_types_controller.rb +12 -0
- data/app/controllers/cms/connectors_controller.rb +70 -0
- data/app/controllers/cms/content_block_controller.rb +361 -0
- data/app/controllers/cms/content_controller.rb +173 -0
- data/app/controllers/cms/content_types_controller.rb +14 -0
- data/app/controllers/cms/dashboard_controller.rb +13 -0
- data/app/controllers/cms/dynamic_views_controller.rb +81 -0
- data/app/controllers/cms/email_messages_controller.rb +21 -0
- data/app/controllers/cms/file_blocks_controller.rb +4 -0
- data/app/controllers/cms/form_entries_controller.rb +140 -0
- data/app/controllers/cms/form_fields_controller.rb +74 -0
- data/app/controllers/cms/forms_controller.rb +35 -0
- data/app/controllers/cms/groups_controller.rb +25 -0
- data/app/controllers/cms/home_controller.rb +10 -0
- data/app/controllers/cms/html_blocks_controller.rb +4 -0
- data/app/controllers/cms/image_blocks_controller.rb +4 -0
- data/app/controllers/cms/inline_content_controller.rb +50 -0
- data/app/controllers/cms/links_controller.rb +81 -0
- data/app/controllers/cms/page_components_controller.rb +20 -0
- data/app/controllers/cms/page_route_conditions_controller.rb +4 -0
- data/app/controllers/cms/page_route_options_controller.rb +58 -0
- data/app/controllers/cms/page_route_requirements_controller.rb +4 -0
- data/app/controllers/cms/page_routes_controller.rb +51 -0
- data/app/controllers/cms/pages_controller.rb +151 -0
- data/app/controllers/cms/passwords_controller.rb +22 -0
- data/app/controllers/cms/portlet_controller.rb +21 -0
- data/app/controllers/cms/portlets_controller.rb +35 -0
- data/app/controllers/cms/redirects_controller.rb +25 -0
- data/app/controllers/cms/resource_controller.rb +125 -0
- data/app/controllers/cms/routes_controller.rb +22 -0
- data/app/controllers/cms/section_nodes_controller.rb +24 -0
- data/app/controllers/cms/sections_controller.rb +100 -0
- data/app/controllers/cms/sessions_controller.rb +15 -0
- data/app/controllers/cms/sites/passwords_controller.rb +32 -0
- data/app/controllers/cms/sites/sessions_controller.rb +20 -0
- data/app/controllers/cms/tags_controller.rb +16 -0
- data/app/controllers/cms/tasks_controller.rb +56 -0
- data/app/controllers/cms/toolbar_controller.rb +18 -0
- data/app/controllers/cms/user_controller.rb +8 -0
- data/app/controllers/cms/users_controller.rb +125 -0
- data/app/controllers/tests/pretend_controller.rb +32 -0
- data/app/helpers/cms/application_helper.rb +258 -0
- data/app/helpers/cms/content_block_helper.rb +55 -0
- data/app/helpers/cms/content_types_helper.rb +4 -0
- data/app/helpers/cms/form_tag_helper.rb +36 -0
- data/app/helpers/cms/menu_helper.rb +167 -0
- data/app/helpers/cms/mobile_helper.rb +29 -0
- data/app/helpers/cms/nav_menu_helper.rb +23 -0
- data/app/helpers/cms/page_helper.rb +169 -0
- data/app/helpers/cms/path_helper.rb +113 -0
- data/app/helpers/cms/rendering_helper.rb +112 -0
- data/app/helpers/cms/section_nodes_helper.rb +112 -0
- data/app/helpers/cms/sites/authentication_helper.rb +25 -0
- data/app/helpers/cms/sites/devise_shim_helper.rb +31 -0
- data/app/helpers/cms/template_support.rb +18 -0
- data/app/helpers/cms/ui_elements_helper.rb +168 -0
- data/app/helpers/forgot_password_portlet_helper.rb +9 -0
- data/app/helpers/login_portlet_helper.rb +10 -0
- data/app/inputs/attachments_input.rb +14 -0
- data/app/inputs/cms_text_area_input.rb +10 -0
- data/app/inputs/date_picker_input.rb +8 -0
- data/app/inputs/file_picker_input.rb +75 -0
- data/app/inputs/name_input.rb +42 -0
- data/app/inputs/path_input.rb +18 -0
- data/app/inputs/tag_list_input.rb +3 -0
- data/app/inputs/template_editor_input.rb +24 -0
- data/app/inputs/text_editor_input.rb +19 -0
- data/app/models/cms/abstract_file_block.rb +50 -0
- data/app/models/cms/attachment.rb +267 -0
- data/app/models/cms/category.rb +56 -0
- data/app/models/cms/category_type.rb +43 -0
- data/app/models/cms/connector.rb +99 -0
- data/app/models/cms/content.rb +31 -0
- data/app/models/cms/content_type.rb +191 -0
- data/app/models/cms/dynamic_view.rb +81 -0
- data/app/models/cms/email_message.rb +63 -0
- data/app/models/cms/email_message_mailer.rb +12 -0
- data/app/models/cms/external_user.rb +60 -0
- data/app/models/cms/file_block.rb +19 -0
- data/app/models/cms/form.rb +47 -0
- data/app/models/cms/form_entry.rb +75 -0
- data/app/models/cms/form_field.rb +78 -0
- data/app/models/cms/group.rb +62 -0
- data/app/models/cms/group_permission.rb +12 -0
- data/app/models/cms/group_section.rb +9 -0
- data/app/models/cms/group_type.rb +16 -0
- data/app/models/cms/group_type_permission.rb +8 -0
- data/app/models/cms/guest_user.rb +57 -0
- data/app/models/cms/html_block.rb +38 -0
- data/app/models/cms/image_block.rb +23 -0
- data/app/models/cms/link.rb +20 -0
- data/app/models/cms/page.rb +437 -0
- data/app/models/cms/page_component.rb +43 -0
- data/app/models/cms/page_partial.rb +40 -0
- data/app/models/cms/page_route.rb +140 -0
- data/app/models/cms/page_route_condition.rb +5 -0
- data/app/models/cms/page_route_option.rb +7 -0
- data/app/models/cms/page_route_requirement.rb +5 -0
- data/app/models/cms/page_template.rb +45 -0
- data/app/models/cms/permission.rb +17 -0
- data/app/models/cms/persistent_user.rb +223 -0
- data/app/models/cms/portlet.rb +237 -0
- data/app/models/cms/redirect.rb +12 -0
- data/app/models/cms/search_filter.rb +18 -0
- data/app/models/cms/section.rb +224 -0
- data/app/models/cms/section_node.rb +144 -0
- data/app/models/cms/site.rb +45 -0
- data/app/models/cms/tag.rb +69 -0
- data/app/models/cms/tagging.rb +14 -0
- data/app/models/cms/task.rb +75 -0
- data/app/models/cms/templates.rb +31 -0
- data/app/models/cms/user.rb +43 -0
- data/app/models/cms/user_group_membership.rb +9 -0
- data/app/models/cms/view_context.rb +81 -0
- data/app/portlets/deprecated_placeholder.rb +12 -0
- data/app/portlets/dynamic_portlet.rb +7 -0
- data/app/portlets/email_page_portlet.rb +32 -0
- data/app/portlets/forgot_password_portlet.rb +15 -0
- data/app/portlets/helpers/cms/list_portlet_helper.rb +5 -0
- data/app/portlets/list_portlet.rb +40 -0
- data/app/portlets/login_portlet.rb +13 -0
- data/app/portlets/tag_cloud_portlet.rb +15 -0
- data/app/presenters/cms/user_presenter.rb +47 -0
- data/app/views/cms/application/_add_content_modal.html.erb +3 -0
- data/app/views/cms/application/_buttons.html.erb +7 -0
- data/app/views/cms/application/_exception.html.erb +6 -0
- data/app/views/cms/application/_form_errors.html.erb +7 -0
- data/app/views/cms/application/_form_with_buttons.html.erb +10 -0
- data/app/views/cms/application/_main_content.html.erb +3 -0
- data/app/views/cms/application/_main_with_sidebar.html.erb +8 -0
- data/app/views/cms/application/_mobile_toolbar.html.erb +16 -0
- data/app/views/cms/application/_page_title.html.erb +5 -0
- data/app/views/cms/application/_pagination.html.erb +26 -0
- data/app/views/cms/application/_row.html.erb +1 -0
- data/app/views/cms/application/_save_buttons.html.erb +7 -0
- data/app/views/cms/application/_sidebar_layout.html.erb +3 -0
- data/app/views/cms/application/_version.html.erb +23 -0
- data/app/views/cms/application/_version_conflict_diff.html.erb +11 -0
- data/app/views/cms/application/_version_conflict_error.html.erb +6 -0
- data/app/views/cms/attachments/_attachment.html.erb +16 -0
- data/app/views/cms/attachments/_attachment_manager.html.erb +39 -0
- data/app/views/cms/attachments/_attachment_table.html.erb +22 -0
- data/app/views/cms/attachments/_attachment_wrapper.html.erb +4 -0
- data/app/views/cms/attachments/_no_attachments_defined.html.erb +1 -0
- data/app/views/cms/cache/show.html.erb +7 -0
- data/app/views/cms/categories/_form.html.erb +27 -0
- data/app/views/cms/category_types/_form.html.erb +1 -0
- data/app/views/cms/connectors/new.html.erb +38 -0
- data/app/views/cms/content/editing_frame.html.erb +1 -0
- data/app/views/cms/content/no_page.html.erb +19 -0
- data/app/views/cms/content/show.html.erb +21 -0
- data/app/views/cms/content_block/_block_form.html.erb +15 -0
- data/app/views/cms/content_block/_buttonbar.html.erb +29 -0
- data/app/views/cms/content_block/_buttons.html.erb +13 -0
- data/app/views/cms/content_block/_hidden_fields.html.erb +13 -0
- data/app/views/cms/content_block/_sidebar.html.erb +36 -0
- data/app/views/cms/content_block/edit.html.erb +3 -0
- data/app/views/cms/content_block/index.html.erb +87 -0
- data/app/views/cms/content_block/new.html.erb +3 -0
- data/app/views/cms/content_block/render_block_in_main_container.html.erb +10 -0
- data/app/views/cms/content_block/show.html.erb +1 -0
- data/app/views/cms/content_block/show_in_isolation.html.erb +15 -0
- data/app/views/cms/content_block/versions.html.erb +24 -0
- data/app/views/cms/content_types/_order_field.html.erb +5 -0
- data/app/views/cms/content_types/index.html.erb +3 -0
- data/app/views/cms/dashboard/_page_drafts.html.erb +39 -0
- data/app/views/cms/dashboard/_tasks.html.erb +41 -0
- data/app/views/cms/dashboard/index.html.erb +13 -0
- data/app/views/cms/dynamic_views/_form.html.erb +9 -0
- data/app/views/cms/dynamic_views/edit.html.erb +2 -0
- data/app/views/cms/dynamic_views/index.html.erb +33 -0
- data/app/views/cms/dynamic_views/new.html.erb +2 -0
- data/app/views/cms/email_messages/index.html.erb +36 -0
- data/app/views/cms/email_messages/show.html.erb +50 -0
- data/app/views/cms/file_blocks/_form.html.erb +3 -0
- data/app/views/cms/file_blocks/_section_selector.html.erb +13 -0
- data/app/views/cms/file_blocks/render.html.erb +5 -0
- data/app/views/cms/forgot_password_mailer/reset_password.text.html.erb +3 -0
- data/app/views/cms/forgot_password_mailer/reset_password.text.plain.erb +3 -0
- data/app/views/cms/form_entries/_buttons.html.erb +2 -0
- data/app/views/cms/form_entries/_form.html.erb +7 -0
- data/app/views/cms/form_entries/_internal_form.html.erb +9 -0
- data/app/views/cms/form_entries/edit.html.erb +5 -0
- data/app/views/cms/form_entries/error.html.erb +3 -0
- data/app/views/cms/form_entries/index.html.erb +5 -0
- data/app/views/cms/form_entries/new.html.erb +5 -0
- data/app/views/cms/form_entries/show.html.erb +13 -0
- data/app/views/cms/form_entries/submit.html.erb +1 -0
- data/app/views/cms/form_fields/_form.html.erb +8 -0
- data/app/views/cms/form_fields/_select.html.erb +3 -0
- data/app/views/cms/form_fields/_text_area.html.erb +3 -0
- data/app/views/cms/form_fields/_text_field.html.erb +3 -0
- data/app/views/cms/form_fields/edit.html.erb +0 -0
- data/app/views/cms/form_fields/new.html.erb +26 -0
- data/app/views/cms/form_fields/preview.html.erb +16 -0
- data/app/views/cms/forms/_form.html.erb +67 -0
- data/app/views/cms/forms/render.html.erb +15 -0
- data/app/views/cms/forms/show.html.erb +6 -0
- data/app/views/cms/groups/_form.html.erb +38 -0
- data/app/views/cms/groups/_permissions.html.erb +14 -0
- data/app/views/cms/groups/_sections.html.erb +12 -0
- data/app/views/cms/groups/edit.html.erb +2 -0
- data/app/views/cms/groups/index.html.erb +36 -0
- data/app/views/cms/groups/new.html.erb +2 -0
- data/app/views/cms/html_blocks/_form.html.erb +3 -0
- data/app/views/cms/html_blocks/render.html.erb +1 -0
- data/app/views/cms/image_blocks/_form.html.erb +3 -0
- data/app/views/cms/image_blocks/render.html.erb +4 -0
- data/app/views/cms/links/_form.html.erb +8 -0
- data/app/views/cms/links/edit.html.erb +4 -0
- data/app/views/cms/links/new.html.erb +5 -0
- data/app/views/cms/menus/_menu.html.erb +9 -0
- data/app/views/cms/menus/_menu_item.html.erb +11 -0
- data/app/views/cms/page_components/_content.html.erb +18 -0
- data/app/views/cms/page_components/new.html.erb +12 -0
- data/app/views/cms/page_routes/_form.html.erb +12 -0
- data/app/views/cms/page_routes/edit.html.erb +2 -0
- data/app/views/cms/page_routes/index.html.erb +33 -0
- data/app/views/cms/page_routes/new.html.erb +2 -0
- data/app/views/cms/pages/_edit_content.html.erb +28 -0
- data/app/views/cms/pages/_form.html.erb +21 -0
- data/app/views/cms/pages/_main_form.html.erb +23 -0
- data/app/views/cms/pages/_simple_container.html.erb +8 -0
- data/app/views/cms/pages/edit.html.erb +2 -0
- data/app/views/cms/pages/new.html.erb +19 -0
- data/app/views/cms/pages/versions.html.erb +22 -0
- data/app/views/cms/passwords/new.html.erb +16 -0
- data/app/views/cms/redirects/_form.html.erb +7 -0
- data/app/views/cms/redirects/edit.html.erb +2 -0
- data/app/views/cms/redirects/index.html.erb +25 -0
- data/app/views/cms/redirects/new.html.erb +2 -0
- data/app/views/cms/routes/index.html.erb +35 -0
- data/app/views/cms/section_nodes/_children.html.erb +5 -0
- data/app/views/cms/section_nodes/_row_buttons.html.erb +11 -0
- data/app/views/cms/section_nodes/_section_node.html.erb +24 -0
- data/app/views/cms/section_nodes/_sitemap_buttons.html.erb +47 -0
- data/app/views/cms/section_nodes/_status.html.erb +5 -0
- data/app/views/cms/section_nodes/show.html.erb +9 -0
- data/app/views/cms/sections/_buttons.html.erb +6 -0
- data/app/views/cms/sections/_form.html.erb +30 -0
- data/app/views/cms/sections/edit.html.erb +4 -0
- data/app/views/cms/sections/new.html.erb +5 -0
- data/app/views/cms/sessions/new.html.erb +16 -0
- data/app/views/cms/shared/access_denied.html.erb +2 -0
- data/app/views/cms/shared/error.html.erb +40 -0
- data/app/views/cms/shared/error.xml.erb +8 -0
- data/app/views/cms/sites/_flash.html.erb +8 -0
- data/app/views/cms/sites/passwords/new.html.erb +2 -0
- data/app/views/cms/sites/sessions/new.html.erb +2 -0
- data/app/views/cms/tags/_form.html.erb +1 -0
- data/app/views/cms/tags/render.html.erb +52 -0
- data/app/views/cms/tasks/new.html.erb +22 -0
- data/app/views/cms/toolbar/_new_pages_menu.html.erb +10 -0
- data/app/views/cms/users/_form.html.erb +9 -0
- data/app/views/cms/users/_password.html.erb +2 -0
- data/app/views/cms/users/_user_fields.html.erb +7 -0
- data/app/views/cms/users/change_password.html.erb +12 -0
- data/app/views/cms/users/edit.html.erb +2 -0
- data/app/views/cms/users/index.html.erb +65 -0
- data/app/views/cms/users/new.html.erb +2 -0
- data/app/views/devise/confirmations/new.html.erb +16 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +19 -0
- data/app/views/devise/passwords/new.html.erb +15 -0
- data/app/views/devise/registrations/edit.html.erb +28 -0
- data/app/views/devise/registrations/new.html.erb +18 -0
- data/app/views/devise/shared/_links.erb +25 -0
- data/app/views/devise/unlocks/new.html.erb +16 -0
- data/app/views/layouts/cms/_content_types.html.erb +13 -0
- data/app/views/layouts/cms/_footer.erb +4 -0
- data/app/views/layouts/cms/_head.html.erb +8 -0
- data/app/views/layouts/cms/_main_menu.html.erb +78 -0
- data/app/views/layouts/cms/application.html.erb +23 -0
- data/app/views/layouts/cms/content_page.html.erb +5 -0
- data/app/views/layouts/cms/page_editor.html.erb +90 -0
- data/app/views/portlets/deprecated_placeholders/_form.html.erb +1 -0
- data/app/views/portlets/deprecated_placeholders/render.html.erb +8 -0
- data/app/views/portlets/dynamic/_form.html.erb +3 -0
- data/app/views/portlets/email_page/_form.html.erb +5 -0
- data/app/views/portlets/email_page/render.html.erb +17 -0
- data/app/views/portlets/forgot_password/_form.html.erb +5 -0
- data/app/views/portlets/forgot_password/render.html.erb +2 -0
- data/app/views/portlets/list/_form.html.erb +33 -0
- data/app/views/portlets/list/_list.html.erb +6 -0
- data/app/views/portlets/list/_table.html.erb +13 -0
- data/app/views/portlets/list/render.html.erb +1 -0
- data/app/views/portlets/login/_form.html.erb +4 -0
- data/app/views/portlets/login/render.html.erb +10 -0
- data/app/views/portlets/portlets/_form.html.erb +20 -0
- data/app/views/portlets/tag_cloud/_form.html.erb +4 -0
- data/app/views/portlets/tag_cloud/render.html.erb +5 -0
- data/app/views/tests/pretend/open_with_layout.html.erb +5 -0
- data/bin/bcms +321 -0
- data/bin/browsercms +4 -0
- data/bin/rake +16 -0
- data/config/routes.rb +135 -0
- data/db/browsercms.seeds.rb +63 -0
- data/db/migrate/20080815014337_browsercms300.rb +287 -0
- data/db/migrate/20130327184912_browsercms400.rb +120 -0
- data/db/migrate/20150715173336_create_default_users.rb +12 -0
- data/db/seeds.rb +1 -0
- data/doc/README_FOR_APP +6 -0
- data/doc/design/blue_button.psd +0 -0
- data/doc/design/gray_box.psd +0 -0
- data/doc/design/main_nav.psd +0 -0
- data/doc/features/design_integration.md +45 -0
- data/doc/features/external_user.md +7 -0
- data/doc/features/form_builder.md +40 -0
- data/doc/features/simple_form_refactor.md +60 -0
- data/doc/performance_tuning_notes.md +12 -0
- data/doc/release_notes.md +837 -0
- data/doc/test_procedure.txt +141 -0
- data/lib/acts_as_list.rb +257 -0
- data/lib/browsercms-artirix.rb +1 -0
- data/lib/browsercms.rb +73 -0
- data/lib/cms/acts/cms_user.rb +131 -0
- data/lib/cms/acts/content_block.rb +61 -0
- data/lib/cms/acts/content_page.rb +90 -0
- data/lib/cms/acts.rb +7 -0
- data/lib/cms/admin_tab.rb +15 -0
- data/lib/cms/attachments/attachment_serving.rb +59 -0
- data/lib/cms/attachments/configuration.rb +88 -0
- data/lib/cms/authentication/controller.rb +120 -0
- data/lib/cms/authentication/test_password_strategy.rb +28 -0
- data/lib/cms/authentication.rb +4 -0
- data/lib/cms/authoring.rb +9 -0
- data/lib/cms/behaviors/archiving.rb +43 -0
- data/lib/cms/behaviors/attaching.rb +363 -0
- data/lib/cms/behaviors/categorizing.rb +31 -0
- data/lib/cms/behaviors/connecting.rb +141 -0
- data/lib/cms/behaviors/dynamic_attributes.rb +384 -0
- data/lib/cms/behaviors/flush_cache_on_change.rb +31 -0
- data/lib/cms/behaviors/hiding.rb +46 -0
- data/lib/cms/behaviors/namespacing.rb +15 -0
- data/lib/cms/behaviors/naming.rb +16 -0
- data/lib/cms/behaviors/publishing.rb +205 -0
- data/lib/cms/behaviors/rendering.rb +195 -0
- data/lib/cms/behaviors/searching.rb +45 -0
- data/lib/cms/behaviors/soft_deleting.rb +103 -0
- data/lib/cms/behaviors/taggable.rb +66 -0
- data/lib/cms/behaviors/userstamping.rb +42 -0
- data/lib/cms/behaviors/versioning.rb +360 -0
- data/lib/cms/behaviors.rb +34 -0
- data/lib/cms/caching.rb +62 -0
- data/lib/cms/commands/actions.rb +107 -0
- data/lib/cms/commands/to_version400.rb +10 -0
- data/lib/cms/concerns/can_be_addressable.rb +326 -0
- data/lib/cms/concerns/has_content_type.rb +46 -0
- data/lib/cms/concerns/ignores_publishing.rb +9 -0
- data/lib/cms/concerns.rb +7 -0
- data/lib/cms/configuration/configurable_template.rb +24 -0
- data/lib/cms/configuration/devise.rb +256 -0
- data/lib/cms/configuration.rb +79 -0
- data/lib/cms/configure_simple_form.rb +142 -0
- data/lib/cms/configure_simple_form_bootstrap.rb +58 -0
- data/lib/cms/content_filter.rb +18 -0
- data/lib/cms/content_page.rb +77 -0
- data/lib/cms/content_rendering_support.rb +114 -0
- data/lib/cms/controllers/admin_controller.rb +78 -0
- data/lib/cms/data_loader.rb +54 -0
- data/lib/cms/date_picker.rb +23 -0
- data/lib/cms/default_accessible.rb +13 -0
- data/lib/cms/domain_support.rb +38 -0
- data/lib/cms/engine.rb +135 -0
- data/lib/cms/engine_helper.rb +103 -0
- data/lib/cms/error_handling.rb +84 -0
- data/lib/cms/error_pages.rb +8 -0
- data/lib/cms/extensions/action_view/base.rb +13 -0
- data/lib/cms/extensions/active_model/name.rb +13 -0
- data/lib/cms/extensions/active_record/base.rb +37 -0
- data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +94 -0
- data/lib/cms/extensions/active_record/errors.rb +12 -0
- data/lib/cms/extensions/active_support/cache/file_store.rb +9 -0
- data/lib/cms/extensions/hash.rb +11 -0
- data/lib/cms/extensions/integer.rb +16 -0
- data/lib/cms/extensions/nil.rb +19 -0
- data/lib/cms/extensions/string.rb +24 -0
- data/lib/cms/extensions.rb +5 -0
- data/lib/cms/form_builder/content_block_form_builder.rb +45 -0
- data/lib/cms/form_builder/default_input.rb +13 -0
- data/lib/cms/form_builder/deprecated_inputs.rb +40 -0
- data/lib/cms/form_builder/workflow_buttons.rb +38 -0
- data/lib/cms/installation_actions.rb +8 -0
- data/lib/cms/mobile_aware.rb +67 -0
- data/lib/cms/module.rb +36 -0
- data/lib/cms/module_installation.rb +31 -0
- data/lib/cms/polymorphic_single_table_inheritance.rb +19 -0
- data/lib/cms/publish_workflow.rb +26 -0
- data/lib/cms/responders/content_responder.rb +14 -0
- data/lib/cms/route_extensions.rb +157 -0
- data/lib/cms/users_service.rb +208 -0
- data/lib/cms/version.rb +11 -0
- data/lib/command_line.rb +39 -0
- data/lib/generators/browser_cms/demo_site/USAGE +3 -0
- data/lib/generators/browser_cms/demo_site/templates/demo.seeds.rb +249 -0
- data/lib/generators/browser_cms/demo_site/templates/demo_site.rake +14 -0
- data/lib/generators/browser_cms/demo_site/templates/logo.jpg +0 -0
- data/lib/generators/browser_cms/demo_site/templates/splash.jpg +0 -0
- data/lib/generators/browser_cms/demo_site/templates/style.css +257 -0
- data/lib/generators/browser_cms.rb +12 -0
- data/lib/generators/cms/content_block/USAGE +22 -0
- data/lib/generators/cms/content_block/content_block_generator.rb +103 -0
- data/lib/generators/cms/content_block/templates/_form.html.erb +27 -0
- data/lib/generators/cms/content_block/templates/application_controller.rb.erb +4 -0
- data/lib/generators/cms/content_block/templates/render.html.erb +23 -0
- data/lib/generators/cms/install/USAGE +8 -0
- data/lib/generators/cms/install/install_generator.rb +16 -0
- data/lib/generators/cms/portlet/USAGE +26 -0
- data/lib/generators/cms/portlet/portlet_generator.rb +38 -0
- data/lib/generators/cms/portlet/templates/_form.html.erb +5 -0
- data/lib/generators/cms/portlet/templates/portlet.rb +12 -0
- data/lib/generators/cms/portlet/templates/portlet_helper.rb +5 -0
- data/lib/generators/cms/portlet/templates/render.html.erb +1 -0
- data/lib/generators/cms/portlet/templates/unit_test.erb +9 -0
- data/lib/generators/cms/project/USAGE +1 -0
- data/lib/generators/cms/project/templates/COPYRIGHT.txt +23 -0
- data/lib/generators/cms/project/templates/GPL.txt +674 -0
- data/lib/generators/cms/project/templates/LICENSE.txt +165 -0
- data/lib/generators/cms/project/templates/USAGE +3 -0
- data/lib/generators/cms/project/templates/devise.rb.erb +7 -0
- data/lib/generators/cms/project/templates/gitignore.erb +11 -0
- data/lib/generators/cms/project/templates/install_generator.erb +21 -0
- data/lib/generators/cms/project/templates/module_tasks.rake +10 -0
- data/lib/generators/cms/template/USAGE +10 -0
- data/lib/generators/cms/template/template_generator.rb +29 -0
- data/lib/generators/cms/template/templates/template.erb +2 -0
- data/lib/sequence.rb +6 -0
- data/lib/tasks/cms.rake +23 -0
- data/lib/templates/active_record/model/model.rb +17 -0
- data/vendor/assets/javascripts/jquery.cookie.js +91 -0
- data/vendor/assets/javascripts/jquery.selectbox.js +209 -0
- metadata +1048 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
class ContentType
|
|
3
|
+
|
|
4
|
+
attr_accessor :name
|
|
5
|
+
|
|
6
|
+
def initialize(options)
|
|
7
|
+
self.name = options[:name]
|
|
8
|
+
@path_builder = EngineAwarePathBuilder.new(model_class)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
attr_accessor :path_builder
|
|
12
|
+
delegate :main_app_model?, :engine_name, :engine_class, to: :path_builder
|
|
13
|
+
|
|
14
|
+
DEFAULT_CONTENT_TYPE_NAME = 'Cms::HtmlBlock'
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
def named(name)
|
|
18
|
+
[Cms::ContentType.new(name: name)]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def connectable
|
|
22
|
+
available.select { |content_type| content_type.connectable? }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Return all content types, grouped by module.
|
|
26
|
+
#
|
|
27
|
+
# @return [Hash<Symbol, Cms::ContentType]
|
|
28
|
+
def available_by_module
|
|
29
|
+
modules = {}
|
|
30
|
+
available.each do |content_type|
|
|
31
|
+
|
|
32
|
+
modules[content_type.module_name] = [] unless modules[content_type.module_name]
|
|
33
|
+
modules[content_type.module_name] << content_type
|
|
34
|
+
end
|
|
35
|
+
modules
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns a list of all ContentTypes in the system. Content Types can opt out of this list by specifying:
|
|
39
|
+
#
|
|
40
|
+
# class MyWidget < ActiveRecord::Base
|
|
41
|
+
# acts_as_content content_module: false
|
|
42
|
+
# end
|
|
43
|
+
#
|
|
44
|
+
# Ignores the database to just look at classes, then returns a 'new' ContentType to match.
|
|
45
|
+
#
|
|
46
|
+
# @return [Array<Cms::ContentType] An alphabetical list of content types.
|
|
47
|
+
def available
|
|
48
|
+
subclasses = ObjectSpace.each_object(::Class).select do |klass|
|
|
49
|
+
klass < Cms::Concerns::HasContentType::InstanceMethods
|
|
50
|
+
end
|
|
51
|
+
subclasses << Cms::Portlet
|
|
52
|
+
subclasses.uniq! { |k| k.name } # filter duplicate classes
|
|
53
|
+
subclasses.map do |klass|
|
|
54
|
+
unless klass < Cms::Portlet
|
|
55
|
+
Cms::ContentType.new(name: klass.name)
|
|
56
|
+
end
|
|
57
|
+
end.compact.sort { |a, b| a.name <=> b.name }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def list
|
|
61
|
+
available
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Returns all content types besides the default.
|
|
65
|
+
#
|
|
66
|
+
# @return [Array<Cms::ContentType]
|
|
67
|
+
def other_connectables()
|
|
68
|
+
available.select { |content_type| content_type.name != DEFAULT_CONTENT_TYPE_NAME }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Returns the default content type that is most frequently added to pages.
|
|
72
|
+
def default()
|
|
73
|
+
Cms::ContentType.new(name: DEFAULT_CONTENT_TYPE_NAME)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Returns only user generated Content Blocks
|
|
77
|
+
def user_generated_connectables()
|
|
78
|
+
available.select { |content_type| !content_type.name.starts_with?("Cms::") }
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Return content types that can be accessed as pages.
|
|
82
|
+
def addressable()
|
|
83
|
+
available.select { |content_type| content_type.model_class.addressable? }
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# Given a 'key' like 'html_blocks' or 'portlet'. Looks first for a class in the Cms:: namespace, then again without it.
|
|
89
|
+
# Raises exception if nothing was found.
|
|
90
|
+
def self.find_by_key(key)
|
|
91
|
+
class_name = key.tableize.classify
|
|
92
|
+
klass = nil
|
|
93
|
+
prefix = "Cms::"
|
|
94
|
+
if !class_name.starts_with? prefix
|
|
95
|
+
klass = "Cms::#{class_name}".safe_constantize
|
|
96
|
+
end
|
|
97
|
+
unless klass
|
|
98
|
+
klass = class_name.safe_constantize
|
|
99
|
+
end
|
|
100
|
+
unless klass
|
|
101
|
+
if class_name.starts_with?(prefix)
|
|
102
|
+
klass = class_name[prefix.length, class_name.length].safe_constantize
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
unless klass
|
|
106
|
+
raise "Couldn't find ContentType for '#{key}'. Checked for classes Cms::#{class_name} and #{class_name}."
|
|
107
|
+
end
|
|
108
|
+
klass.content_type
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Returns a list of column names and values for this content type which are allowed be orderable.
|
|
112
|
+
def orderable_attributes
|
|
113
|
+
attribute_names = model_class.new.attribute_names
|
|
114
|
+
attribute_names -= ["id", "version", "lock_version", "created_by_id", "updated_by_id"]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# @deprecated
|
|
118
|
+
def save!
|
|
119
|
+
ActiveSupport::Deprecation.warn "Cms::ContentType#save! should no longer be called. Content Types do not need to be registered in the database."
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def self.create!
|
|
123
|
+
ActiveSupport::Deprecation.warn "Cms::ContentType.create! should no longer be called. Content Types do not need to be registered in the database."
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Return the name of the module this content type should be grouped in. In most cases, content blocks will be
|
|
127
|
+
# configured to specify this.
|
|
128
|
+
# @return [Symbol]
|
|
129
|
+
def module_name
|
|
130
|
+
model_class.content_module
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Returns the partial used to render the form fields for a given block.
|
|
134
|
+
def form
|
|
135
|
+
model_class.respond_to?(:form) ? model_class.form : "#{name.underscore.pluralize}/form"
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def display_name
|
|
139
|
+
model_class.respond_to?(:display_name) ? model_class.display_name : Cms::Behaviors::Connecting.default_naming_for(model_class)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def display_name_plural
|
|
143
|
+
model_class.respond_to?(:display_name_plural) ? model_class.display_name_plural : display_name.pluralize
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def model_class
|
|
147
|
+
name.constantize
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Determines if the content can be connected to other pages.
|
|
151
|
+
def connectable?
|
|
152
|
+
model_class.connectable?
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Cms::HtmlBlock -> html_block
|
|
156
|
+
# ThingBlock -> thing_block
|
|
157
|
+
def param_key
|
|
158
|
+
model_class.model_name.param_key
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Allows models to show additional columns when being shown in a list.
|
|
162
|
+
def columns_for_index
|
|
163
|
+
if model_class.respond_to?(:columns_for_index)
|
|
164
|
+
model_class.columns_for_index.map do |column|
|
|
165
|
+
column.respond_to?(:humanize) ? {:label => column.humanize, :method => column} : column
|
|
166
|
+
end
|
|
167
|
+
else
|
|
168
|
+
[{:label => "Name", :method => :name, :order => "name"},
|
|
169
|
+
{:label => "Updated On", :method => :updated_on_string, :order => "updated_at"}]
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Used in ERB for pathing
|
|
174
|
+
def content_block_type
|
|
175
|
+
n = name.starts_with?("Cms::") ? name.demodulize : name
|
|
176
|
+
n.pluralize.underscore
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# This is used for situations where you want different to use a type for the list page
|
|
180
|
+
# This is true for portlets, where you don't want to list all portlets of a given type,
|
|
181
|
+
# You want to list all portlets
|
|
182
|
+
def content_block_type_for_list
|
|
183
|
+
if model_class.respond_to?(:content_block_type_for_list)
|
|
184
|
+
model_class.content_block_type_for_list
|
|
185
|
+
else
|
|
186
|
+
content_block_type
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
end
|
|
191
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
class DynamicView < ActiveRecord::Base
|
|
3
|
+
store_templates
|
|
4
|
+
|
|
5
|
+
extend DefaultAccessible
|
|
6
|
+
|
|
7
|
+
def self.with_file_name(file_name)
|
|
8
|
+
conditions = {:name => nil, :format => nil, :handler => nil}
|
|
9
|
+
if file_name && (parts = file_name.split(".")).size == 3
|
|
10
|
+
conditions[:name] = parts[0]
|
|
11
|
+
conditions[:format] = parts[1]
|
|
12
|
+
conditions[:handler] = parts[2]
|
|
13
|
+
end
|
|
14
|
+
where(conditions)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.inherited(subclass)
|
|
18
|
+
super if defined? super
|
|
19
|
+
ensure
|
|
20
|
+
subclass.class_eval do
|
|
21
|
+
flush_cache_on_change
|
|
22
|
+
is_publishable
|
|
23
|
+
uses_soft_delete
|
|
24
|
+
is_userstamped
|
|
25
|
+
is_versioned
|
|
26
|
+
|
|
27
|
+
before_validation :set_publish_on_save
|
|
28
|
+
before_validation :set_defaults, :set_path
|
|
29
|
+
|
|
30
|
+
validates_presence_of :name, :format, :handler, :path, :locale
|
|
31
|
+
validates_uniqueness_of :name, :scope => [:format, :handler],
|
|
32
|
+
:message => "Must have a unique combination of name, format and handler",
|
|
33
|
+
conditions: -> { where(deleted: false) }
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns the title of this class
|
|
39
|
+
def self.title
|
|
40
|
+
self.name.demodulize.titleize
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.new_with_defaults(options={})
|
|
44
|
+
new({:format => "html", :handler => "erb", :body => default_body, :locale => I18n.locale}.merge(options))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.find_by_file_name(file_name)
|
|
48
|
+
with_file_name(file_name).first
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.base_path
|
|
52
|
+
File.join(Rails.root, "tmp", "views")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def file_name
|
|
56
|
+
"#{name}.#{format}.#{handler}"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def display_name
|
|
60
|
+
self.class.display_name(file_name)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.default_body
|
|
64
|
+
""
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def set_publish_on_save
|
|
68
|
+
self.publish_on_save = true
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def set_path
|
|
72
|
+
self.path = self.class.relative_path + '/' + name
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def set_defaults
|
|
76
|
+
self.locale = I18n.locale.to_s unless locale
|
|
77
|
+
self.partial = partial?
|
|
78
|
+
true
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
class EmailMessage < ActiveRecord::Base
|
|
3
|
+
|
|
4
|
+
extend DefaultAccessible
|
|
5
|
+
extend Cms::DomainSupport
|
|
6
|
+
|
|
7
|
+
scope :undelivered, -> { where("delivered_at is null") }
|
|
8
|
+
validates_presence_of :recipients
|
|
9
|
+
after_create :deliver_now
|
|
10
|
+
|
|
11
|
+
def delivered?
|
|
12
|
+
!!delivered_at
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.deliver!
|
|
16
|
+
# Send all messages, 100 at a time
|
|
17
|
+
undelivered.all(:limit => 100).each do |m|
|
|
18
|
+
m.deliver!
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Returns a clean (non-www prefixed) domain name
|
|
23
|
+
def self.normalize_domain(domain)
|
|
24
|
+
normalized = domain =~ /^www/ ? domain.sub(/^www\./, "") : domain
|
|
25
|
+
# Strip the port
|
|
26
|
+
URI.parse("http://#{normalized}").host
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Converts a relative path to a path in the CMS. Used for creating a links to internal pages in the body of emails.
|
|
30
|
+
#
|
|
31
|
+
# @param [String] path A relative path (i.e. /cms/your-page)
|
|
32
|
+
# @return [String] (i.e http://cms.example.com/cms/your-page)
|
|
33
|
+
def self.absolute_cms_url(path)
|
|
34
|
+
host = normalize_domain(Rails.configuration.cms.site_domain)
|
|
35
|
+
"http://#{cms_domain_prefix}.#{host}#{path}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns a default address that mail will be sent from. (i.e. mailbot@example.com)
|
|
39
|
+
def self.mailbot_address
|
|
40
|
+
address = Rails.configuration.cms.mailbot
|
|
41
|
+
if address == :default
|
|
42
|
+
host = normalize_domain(Rails.configuration.cms.site_domain)
|
|
43
|
+
"mailbot@#{host}"
|
|
44
|
+
else
|
|
45
|
+
address
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
#TODO: Take this out when we have an email queue processor
|
|
51
|
+
def deliver_now
|
|
52
|
+
deliver!
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def deliver!
|
|
56
|
+
return false if delivered?
|
|
57
|
+
self.sender = self.class.mailbot_address if self.sender.blank?
|
|
58
|
+
Cms::EmailMessageMailer.email_message(self).deliver
|
|
59
|
+
update_attributes(:delivered_at => Time.now)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
class EmailMessageMailer < ActionMailer::Base
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def email_message(message)
|
|
6
|
+
email = {:to=>message.recipients, :from=>message.sender, :subject => message.subject, :body =>message.body}
|
|
7
|
+
email[:content_type] = message.content_type if message.content_type
|
|
8
|
+
mail email
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
|
|
3
|
+
# Represents a user that has been authenticated from an external data source. Typical use case might be:
|
|
4
|
+
#
|
|
5
|
+
# ```
|
|
6
|
+
# # Assumes there is an external Crm tool that we look up username/passwords from.
|
|
7
|
+
# if(SouthparkCrm::Client.authenticate(params[:login], params[:password]))
|
|
8
|
+
# user = Cms::ExternalUser.authenticate('stan.marsh', 'southpark-crm')
|
|
9
|
+
# user.authorize('cms-admin')
|
|
10
|
+
# end
|
|
11
|
+
# ```
|
|
12
|
+
class ExternalUser < Cms::PersistentUser
|
|
13
|
+
|
|
14
|
+
# Allows extra data to be cached from external sources without needing to alter table columns of the :cms_users table.
|
|
15
|
+
# This could be anything from security group information to shoe size.
|
|
16
|
+
store :external_data, coder: JSON
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
|
|
20
|
+
# Returns an authenticated external user. If this is the first time this account has been logged in, this will create
|
|
21
|
+
# a new User row as a side effect. Otherwise, it returns the existing user account.
|
|
22
|
+
#
|
|
23
|
+
# @param [String] login
|
|
24
|
+
# @param [String] source Used for documentation purposes to determine where User accounts were granted permission from.
|
|
25
|
+
# @param [Hash] info (Optional) Additional user attributes to assign to user. Can be core user fields (:first_name) or :external_data.
|
|
26
|
+
# @return [Cms::ExternalUser] An ExternalUser record which has been persisted in the database.
|
|
27
|
+
def authenticate(login, source, info={})
|
|
28
|
+
info = work_around_rails_4_serialization_bug(info)
|
|
29
|
+
criteria = {login: login, source: source}
|
|
30
|
+
existing = Cms::ExternalUser.where(criteria).first
|
|
31
|
+
if existing
|
|
32
|
+
existing.update(info)
|
|
33
|
+
return existing
|
|
34
|
+
end
|
|
35
|
+
criteria.merge!(info)
|
|
36
|
+
new_user = Cms::ExternalUser.create!(criteria)
|
|
37
|
+
new_user.groups << Cms::Group.guest if Cms::Group.guest
|
|
38
|
+
new_user
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Rails 4.0.2 bug: If some value (even {}) for external_data is not specified, then a serialization error occurs.
|
|
42
|
+
def work_around_rails_4_serialization_bug(info)
|
|
43
|
+
{external_data: {}}.merge(info)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Determines if this User can have their password changed.
|
|
48
|
+
def password_changeable?
|
|
49
|
+
false
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Authorize this particular user to be part of one or more groups.
|
|
53
|
+
# This will overwrite any previous group membership. Typically this would be called after authenticating a user.
|
|
54
|
+
# @param [Array<String>] group_codes One or more group codes
|
|
55
|
+
def authorize(*group_codes)
|
|
56
|
+
new_groups = group_codes.collect { |code| Cms::Group.with_code(code).first }
|
|
57
|
+
self.groups = new_groups
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
class FileBlock < Cms::AbstractFileBlock
|
|
3
|
+
|
|
4
|
+
acts_as_content_block :taggable => true
|
|
5
|
+
content_module :core
|
|
6
|
+
|
|
7
|
+
has_attachment :file
|
|
8
|
+
validates_attachment_presence :file, :message => "You must upload a file"
|
|
9
|
+
|
|
10
|
+
def self.display_name
|
|
11
|
+
"File"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Override default behavior to handle STI class when looking up other versions of attachments.
|
|
15
|
+
def attachable_type
|
|
16
|
+
Cms::Attachment::FILE_BLOCKS
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -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,75 @@
|
|
|
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
|
+
def search(term)
|
|
27
|
+
where("data_columns like ?", "%#{term}%")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Create an Entry for a specific Form. It will have validation and accessors based on the fields of the form.
|
|
31
|
+
#
|
|
32
|
+
# @param [Cms::Form] form
|
|
33
|
+
def for(form)
|
|
34
|
+
entry = FormEntry.ish(form: form) {
|
|
35
|
+
form.field_names.each do |field_name|
|
|
36
|
+
if form.required?(field_name)
|
|
37
|
+
validates field_name, presence: true
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
}
|
|
41
|
+
entry
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Create an instance of a FormEntry with the given methods.
|
|
45
|
+
def ish(*args, &block)
|
|
46
|
+
dup(&block).new(*args)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Creates a faux class with singleton methods. Solves this problem:
|
|
50
|
+
# https://github.com/rails/rails/issues/5449
|
|
51
|
+
def dup(&block)
|
|
52
|
+
super.tap do |dup|
|
|
53
|
+
def dup.name()
|
|
54
|
+
FormEntry.name
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
dup.class_eval(&block) if block
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
# Add a single field accessor to the current instance of the object. (I.e. not shared with others)
|
|
64
|
+
def add_store_accessor(field_name)
|
|
65
|
+
singleton_class.class_eval { store_accessor :data_columns, field_name }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def add_field_accessors
|
|
69
|
+
return unless form
|
|
70
|
+
form.field_names.each do |field_name|
|
|
71
|
+
add_store_accessor(field_name)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
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
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#
|
|
2
|
+
# A group represents a collection of permissions. Each User can be assigned to one or more groups, and the sum of
|
|
3
|
+
# their permissions from all groups combined represents what they can do.
|
|
4
|
+
#
|
|
5
|
+
class Cms::Group < ActiveRecord::Base
|
|
6
|
+
GUEST_CODE = "guest"
|
|
7
|
+
|
|
8
|
+
has_many :user_group_memberships, :class_name => 'Cms::UserGroupMembership'
|
|
9
|
+
has_many :users, :through => :user_group_memberships, :class_name => 'Cms::PersistentUser'
|
|
10
|
+
|
|
11
|
+
has_many :group_permissions, :class_name => 'Cms::GroupPermission'
|
|
12
|
+
has_many :permissions, :through => :group_permissions, :class_name => 'Cms::Permission'
|
|
13
|
+
|
|
14
|
+
has_many :group_sections, :class_name => 'Cms::GroupSection'
|
|
15
|
+
has_many :sections, :through => :group_sections, :class_name => 'Cms::Section'
|
|
16
|
+
|
|
17
|
+
belongs_to :group_type, :class_name => 'Cms::GroupType'
|
|
18
|
+
|
|
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
|
+
|
|
26
|
+
|
|
27
|
+
validates_presence_of :name
|
|
28
|
+
|
|
29
|
+
class << self
|
|
30
|
+
def named(n)
|
|
31
|
+
where name: n
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def with_code(c)
|
|
35
|
+
where code: c
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
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) }
|
|
41
|
+
|
|
42
|
+
def guest?
|
|
43
|
+
group_type && group_type.guest?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def cms_access?
|
|
47
|
+
group_type && group_type.cms_access?
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Finds the guest group, which is a special group that represents public non-logged in users.
|
|
51
|
+
def self.guest
|
|
52
|
+
with_code(GUEST_CODE).first
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def has_permission?(permission)
|
|
57
|
+
permissions.any? do |p|
|
|
58
|
+
return true if permission.to_sym == p.name.to_sym
|
|
59
|
+
end
|
|
60
|
+
false
|
|
61
|
+
end
|
|
62
|
+
end
|