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.
Files changed (523) hide show
  1. checksums.yaml +7 -0
  2. data/COPYRIGHT.txt +2 -1
  3. data/README.markdown +3 -3
  4. data/app/assets/fonts/icomoon.dev.svg +61 -0
  5. data/app/assets/fonts/icomoon.eot +0 -0
  6. data/app/assets/fonts/icomoon.svg +61 -0
  7. data/app/assets/fonts/icomoon.ttf +0 -0
  8. data/app/assets/fonts/icomoon.woff +0 -0
  9. data/app/assets/images/ckeditor/plugins/delete_content/icons/deletecontent.png +0 -0
  10. data/app/assets/images/ckeditor/plugins/edit_content/icons/editcontent.png +0 -0
  11. data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentdown.png +0 -0
  12. data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentup.png +0 -0
  13. data/app/assets/images/cms/arrow-down.png +0 -0
  14. data/app/assets/images/cms/arrow-up.png +0 -0
  15. data/app/assets/images/cms/cogs.png +0 -0
  16. data/app/assets/images/cms/dashboard/home.png +0 -0
  17. data/app/assets/images/cms/home.png +0 -0
  18. data/app/assets/images/cms/logo.png +0 -0
  19. data/app/assets/images/cms/pencil.png +0 -0
  20. data/app/assets/images/cms/plus.png +0 -0
  21. data/app/assets/images/cms/user.png +0 -0
  22. data/app/assets/javascripts/bcms/ckeditor_inline.js +23 -0
  23. data/app/assets/javascripts/bcms/ckeditor_standard_config.js +1 -1
  24. data/app/assets/javascripts/ckeditor/plugins/delete_content/plugin.js +36 -0
  25. data/app/assets/javascripts/ckeditor/plugins/edit_content/plugin.js +24 -0
  26. data/app/assets/javascripts/ckeditor/plugins/move_content/plugin.js +25 -0
  27. data/app/assets/javascripts/cms/ajax.js +60 -0
  28. data/app/assets/javascripts/cms/application.js +6 -1
  29. data/app/assets/javascripts/cms/attachment_manager.js.erb +3 -10
  30. data/app/assets/javascripts/cms/content_library.js +31 -12
  31. data/app/assets/javascripts/cms/core_library.js.erb +68 -36
  32. data/app/assets/javascripts/cms/form_builder.js +250 -0
  33. data/app/assets/javascripts/cms/namespace.js +2 -0
  34. data/app/assets/javascripts/cms/new_content_button.js +27 -0
  35. data/app/assets/javascripts/cms/page_editor.js +188 -0
  36. data/app/assets/javascripts/cms/page_toolbar.js +13 -0
  37. data/app/assets/javascripts/cms/site.js +2 -0
  38. data/app/assets/javascripts/cms/sitemap.js +219 -0
  39. data/app/assets/javascripts/cms/toolbar.js +17 -1
  40. data/app/assets/javascripts/cms/user.js +40 -0
  41. data/app/assets/javascripts/jquery.exists.js +5 -0
  42. data/app/assets/javascripts/jquery.taglist.js +37 -23
  43. data/app/assets/stylesheets/cms/_assets.css.scss +55 -0
  44. data/app/assets/stylesheets/cms/_base.css.scss +42 -0
  45. data/app/assets/stylesheets/cms/_cms-buttons.css.scss +73 -0
  46. data/app/assets/stylesheets/cms/_cms-forms.css.scss +70 -0
  47. data/app/assets/stylesheets/cms/_colors.css.scss +20 -0
  48. data/app/assets/stylesheets/cms/_dashboard.css.scss +25 -0
  49. data/app/assets/stylesheets/cms/_glyph.css.scss +60 -0
  50. data/app/assets/stylesheets/cms/_main-area.css.scss +62 -0
  51. data/app/assets/stylesheets/cms/_nav.css.scss +197 -0
  52. data/app/assets/stylesheets/cms/_sidebar.css.scss +64 -0
  53. data/app/assets/stylesheets/cms/_sitemap.css.scss +196 -0
  54. data/app/assets/stylesheets/cms/_submenu.css.scss +48 -0
  55. data/app/assets/stylesheets/cms/application.css.scss +49 -0
  56. data/app/assets/stylesheets/cms/core.css.scss +96 -0
  57. data/app/assets/stylesheets/cms/default-forms.css.scss +3 -0
  58. data/app/assets/stylesheets/cms/includes/_animation.css.scss +2 -0
  59. data/app/assets/stylesheets/cms/includes/_rem.css.scss +120 -0
  60. data/app/assets/stylesheets/cms/includes/animation/_animate.css.scss +31 -0
  61. data/app/assets/stylesheets/cms/includes/animation/_core.css.scss +127 -0
  62. data/app/assets/stylesheets/cms/includes/animation/_shared.css.scss +22 -0
  63. data/app/assets/stylesheets/cms/includes/animation/animate/_attention-seekers.css.scss +152 -0
  64. data/app/assets/stylesheets/cms/includes/animation/animate/_bouncing.css.scss +3 -0
  65. data/app/assets/stylesheets/cms/includes/animation/animate/_classes.css.scss +21 -0
  66. data/app/assets/stylesheets/cms/includes/animation/animate/_fading.css.scss +3 -0
  67. data/app/assets/stylesheets/cms/includes/animation/animate/_flippers.css.scss +87 -0
  68. data/app/assets/stylesheets/cms/includes/animation/animate/_lightspeed.css.scss +24 -0
  69. data/app/assets/stylesheets/cms/includes/animation/animate/_rotating.css.scss +3 -0
  70. data/app/assets/stylesheets/cms/includes/animation/animate/_specials.css.scss +42 -0
  71. data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-entrances.css.scss +68 -0
  72. data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-exits.css.scss +60 -0
  73. data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-entrances.css.scss +86 -0
  74. data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-exits.css.scss +86 -0
  75. data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-entrances.css.scss +58 -0
  76. data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-exits.css.scss +58 -0
  77. data/app/assets/stylesheets/cms/page_content_editing.css.scss +4 -0
  78. data/app/assets/stylesheets/cms/page_editor.css.scss +4 -0
  79. data/app/assets/stylesheets/cms/style.css.scss +138 -0
  80. data/app/assets/stylesheets/cms/styles/_alerts.css.scss +150 -0
  81. data/app/assets/stylesheets/cms/styles/_base-grid.css.scss +299 -0
  82. data/app/assets/stylesheets/cms/styles/_buttons.css.scss +247 -0
  83. data/app/assets/stylesheets/cms/styles/_dropdown.css.scss +155 -0
  84. data/app/assets/stylesheets/cms/styles/_forms.css.scss +728 -0
  85. data/app/assets/stylesheets/cms/styles/_glyph.css.scss +86 -0
  86. data/app/assets/stylesheets/cms/styles/_images.css.scss +75 -0
  87. data/app/assets/stylesheets/cms/styles/_lists.css.scss +115 -0
  88. data/app/assets/stylesheets/cms/styles/_modal.css.scss +174 -0
  89. data/app/assets/stylesheets/cms/styles/_progress.css.scss +43 -0
  90. data/app/assets/stylesheets/cms/styles/_tables.css.scss +141 -0
  91. data/app/assets/stylesheets/cms/styles/_text.css.scss +134 -0
  92. data/app/controllers/cms/application_controller.rb +3 -68
  93. data/app/controllers/cms/attachments_controller.rb +5 -5
  94. data/app/controllers/cms/base_controller.rb +20 -13
  95. data/app/controllers/cms/cache_controller.rb +16 -17
  96. data/app/controllers/cms/category_types_controller.rb +6 -1
  97. data/app/controllers/cms/connectors_controller.rb +12 -7
  98. data/app/controllers/cms/content_block_controller.rb +128 -71
  99. data/app/controllers/cms/content_controller.rb +54 -56
  100. data/app/controllers/cms/dashboard_controller.rb +5 -6
  101. data/app/controllers/cms/dynamic_views_controller.rb +12 -9
  102. data/app/controllers/cms/email_messages_controller.rb +18 -13
  103. data/app/controllers/cms/form_entries_controller.rb +119 -0
  104. data/app/controllers/cms/form_fields_controller.rb +74 -0
  105. data/app/controllers/cms/forms_controller.rb +35 -0
  106. data/app/controllers/cms/groups_controller.rb +13 -16
  107. data/app/controllers/cms/html_blocks_controller.rb +2 -2
  108. data/app/controllers/cms/inline_content_controller.rb +48 -0
  109. data/app/controllers/cms/links_controller.rb +58 -46
  110. data/app/controllers/cms/page_components_controller.rb +20 -0
  111. data/app/controllers/cms/page_routes_controller.rb +44 -40
  112. data/app/controllers/cms/pages_controller.rb +111 -97
  113. data/app/controllers/cms/passwords_controller.rb +17 -0
  114. data/app/controllers/cms/portlet_controller.rb +0 -1
  115. data/app/controllers/cms/portlets_controller.rb +20 -27
  116. data/app/controllers/cms/redirects_controller.rb +13 -9
  117. data/app/controllers/cms/resource_controller.rb +15 -4
  118. data/app/controllers/cms/routes_controller.rb +2 -4
  119. data/app/controllers/cms/section_nodes_controller.rb +6 -37
  120. data/app/controllers/cms/sections_controller.rb +13 -8
  121. data/app/controllers/cms/sessions_controller.rb +8 -66
  122. data/app/controllers/cms/sites/passwords_controller.rb +27 -0
  123. data/app/controllers/cms/sites/sessions_controller.rb +20 -0
  124. data/app/controllers/cms/tags_controller.rb +12 -12
  125. data/app/controllers/cms/tasks_controller.rb +45 -46
  126. data/app/controllers/cms/user_controller.rb +8 -0
  127. data/app/controllers/cms/users_controller.rb +91 -68
  128. data/app/helpers/cms/application_helper.rb +58 -52
  129. data/app/helpers/cms/content_block_helper.rb +8 -7
  130. data/app/helpers/cms/form_tag_helper.rb +21 -25
  131. data/app/helpers/cms/menu_helper.rb +1 -3
  132. data/app/helpers/cms/mobile_helper.rb +12 -2
  133. data/app/helpers/cms/nav_menu_helper.rb +23 -0
  134. data/app/helpers/cms/page_helper.rb +72 -30
  135. data/app/helpers/cms/path_helper.rb +46 -70
  136. data/app/helpers/cms/rendering_helper.rb +68 -12
  137. data/app/helpers/cms/section_nodes_helper.rb +92 -31
  138. data/app/helpers/cms/sites/authentication_helper.rb +25 -0
  139. data/app/helpers/cms/sites/devise_shim_helper.rb +31 -0
  140. data/app/helpers/cms/template_support.rb +1 -7
  141. data/app/helpers/cms/ui_elements_helper.rb +147 -6
  142. data/app/helpers/forgot_password_portlet_helper.rb +9 -0
  143. data/app/helpers/login_portlet_helper.rb +10 -0
  144. data/app/inputs/attachments_input.rb +14 -0
  145. data/app/inputs/cms_text_area_input.rb +10 -0
  146. data/app/inputs/cms_text_field_input.rb +29 -0
  147. data/app/inputs/date_picker_input.rb +8 -0
  148. data/app/inputs/file_picker_input.rb +75 -0
  149. data/app/inputs/path_input.rb +18 -0
  150. data/app/inputs/tag_list_input.rb +3 -0
  151. data/app/inputs/template_editor_input.rb +24 -0
  152. data/app/inputs/text_editor_input.rb +19 -0
  153. data/app/models/cms/abstract_file_block.rb +10 -6
  154. data/app/models/cms/attachment.rb +20 -27
  155. data/app/models/cms/category.rb +17 -7
  156. data/app/models/cms/category_type.rb +8 -4
  157. data/app/models/cms/connector.rb +32 -20
  158. data/app/models/cms/content.rb +31 -0
  159. data/app/models/cms/content_type.rb +114 -62
  160. data/app/models/cms/dynamic_view.rb +19 -45
  161. data/app/models/cms/email_message.rb +32 -2
  162. data/app/models/cms/external_user.rb +60 -0
  163. data/app/models/cms/file_block.rb +1 -0
  164. data/app/models/cms/form.rb +47 -0
  165. data/app/models/cms/form_entry.rb +71 -0
  166. data/app/models/cms/form_field.rb +78 -0
  167. data/app/models/cms/group.rb +19 -9
  168. data/app/models/cms/group_permission.rb +1 -1
  169. data/app/models/cms/group_section.rb +1 -1
  170. data/app/models/cms/group_type.rb +5 -5
  171. data/app/models/cms/group_type_permission.rb +1 -1
  172. data/app/models/cms/html_block.rb +14 -19
  173. data/app/models/cms/image_block.rb +1 -0
  174. data/app/models/cms/link.rb +8 -6
  175. data/app/models/cms/page.rb +156 -59
  176. data/app/models/cms/page_component.rb +43 -0
  177. data/app/models/cms/page_partial.rb +16 -8
  178. data/app/models/cms/page_route.rb +1 -1
  179. data/app/models/cms/page_route_condition.rb +1 -1
  180. data/app/models/cms/page_route_option.rb +1 -1
  181. data/app/models/cms/page_route_requirement.rb +1 -1
  182. data/app/models/cms/page_template.rb +14 -9
  183. data/app/models/cms/permission.rb +4 -2
  184. data/app/models/cms/persistent_user.rb +208 -0
  185. data/app/models/cms/portlet.rb +56 -9
  186. data/app/models/cms/redirect.rb +1 -1
  187. data/app/models/cms/search_filter.rb +18 -0
  188. data/app/models/cms/section.rb +39 -28
  189. data/app/models/cms/section_node.rb +32 -5
  190. data/app/models/cms/site.rb +3 -3
  191. data/app/models/cms/tag.rb +14 -12
  192. data/app/models/cms/tagging.rb +2 -2
  193. data/app/models/cms/task.rb +14 -21
  194. data/app/models/cms/templates.rb +1 -2
  195. data/app/models/cms/user.rb +21 -160
  196. data/app/models/cms/user_group_membership.rb +2 -2
  197. data/app/portlets/deprecated_placeholder.rb +12 -0
  198. data/app/portlets/dynamic_portlet.rb +1 -1
  199. data/app/portlets/email_page_portlet.rb +10 -3
  200. data/app/portlets/forgot_password_portlet.rb +9 -28
  201. data/app/portlets/login_portlet.rb +8 -5
  202. data/app/portlets/tag_cloud_portlet.rb +3 -1
  203. data/app/presenters/cms/user_presenter.rb +24 -0
  204. data/app/views/cms/application/_add_content_modal.html.erb +3 -0
  205. data/app/views/cms/application/_buttons.html.erb +7 -0
  206. data/app/views/cms/{shared → application}/_exception.html.erb +0 -0
  207. data/app/views/cms/application/_form_errors.html.erb +7 -0
  208. data/app/views/cms/application/_form_with_buttons.html.erb +10 -0
  209. data/app/views/cms/application/_main_content.html.erb +3 -0
  210. data/app/views/cms/application/_main_with_sidebar.html.erb +8 -0
  211. data/app/views/cms/application/_mobile_toolbar.html.erb +16 -0
  212. data/app/views/cms/application/_page_title.html.erb +5 -0
  213. data/app/views/cms/application/_pagination.html.erb +26 -0
  214. data/app/views/cms/application/_row.html.erb +1 -0
  215. data/app/views/cms/application/_save_buttons.html.erb +7 -0
  216. data/app/views/cms/application/_sidebar_layout.html.erb +3 -0
  217. data/app/views/cms/application/_version.html.erb +23 -0
  218. data/app/views/cms/{shared → application}/_version_conflict_diff.html.erb +0 -0
  219. data/app/views/cms/{shared → application}/_version_conflict_error.html.erb +0 -0
  220. data/app/views/cms/attachments/_attachment_manager.html.erb +22 -0
  221. data/app/views/cms/attachments/_no_attachments_defined.html.erb +1 -0
  222. data/app/views/cms/cache/show.html.erb +5 -10
  223. data/app/views/cms/categories/_form.html.erb +15 -24
  224. data/app/views/cms/category_types/_form.html.erb +1 -1
  225. data/app/views/cms/connectors/new.html.erb +33 -64
  226. data/app/views/cms/content/editing_frame.html.erb +1 -0
  227. data/app/views/cms/content/no_page.html.erb +9 -27
  228. data/app/views/cms/content/show.html.erb +14 -15
  229. data/app/views/cms/content_block/_block_form.html.erb +15 -0
  230. data/app/views/cms/content_block/_buttonbar.html.erb +29 -0
  231. data/app/views/cms/content_block/_buttons.html.erb +13 -0
  232. data/app/views/cms/content_block/_hidden_fields.html.erb +13 -0
  233. data/app/views/cms/content_block/_sidebar.html.erb +35 -0
  234. data/app/views/cms/content_block/edit.html.erb +3 -0
  235. data/app/views/cms/content_block/index.html.erb +87 -0
  236. data/app/views/cms/content_block/new.html.erb +3 -0
  237. data/app/views/cms/content_block/render_block_in_main_container.html.erb +10 -0
  238. data/app/views/cms/content_block/show.html.erb +1 -0
  239. data/app/views/cms/content_block/show_in_isolation.html.erb +15 -0
  240. data/app/views/cms/content_block/versions.html.erb +24 -0
  241. data/app/views/cms/dashboard/_page_drafts.html.erb +12 -22
  242. data/app/views/cms/dashboard/_tasks.html.erb +32 -45
  243. data/app/views/cms/dashboard/index.html.erb +11 -13
  244. data/app/views/cms/dynamic_views/_form.html.erb +8 -10
  245. data/app/views/cms/dynamic_views/edit.html.erb +2 -3
  246. data/app/views/cms/dynamic_views/index.html.erb +22 -44
  247. data/app/views/cms/dynamic_views/new.html.erb +2 -3
  248. data/app/views/cms/email_messages/index.html.erb +31 -34
  249. data/app/views/cms/email_messages/show.html.erb +45 -52
  250. data/app/views/cms/file_blocks/_form.html.erb +2 -4
  251. data/app/views/cms/form_entries/_buttons.html.erb +2 -0
  252. data/app/views/cms/form_entries/_form.html.erb +7 -0
  253. data/app/views/cms/form_entries/_internal_form.html.erb +9 -0
  254. data/app/views/cms/form_entries/edit.html.erb +5 -0
  255. data/app/views/cms/form_entries/error.html.erb +3 -0
  256. data/app/views/cms/form_entries/index.html.erb +4 -0
  257. data/app/views/cms/form_entries/new.html.erb +5 -0
  258. data/app/views/cms/form_entries/show.html.erb +13 -0
  259. data/app/views/cms/form_entries/submit.html.erb +1 -0
  260. data/app/views/cms/form_fields/_form.html.erb +8 -0
  261. data/app/views/cms/form_fields/_select.html.erb +3 -0
  262. data/app/views/cms/form_fields/_text_area.html.erb +3 -0
  263. data/app/views/cms/form_fields/_text_field.html.erb +3 -0
  264. data/app/views/cms/form_fields/edit.html.erb +0 -0
  265. data/app/views/cms/form_fields/new.html.erb +26 -0
  266. data/app/views/cms/form_fields/preview.html.erb +16 -0
  267. data/app/views/cms/forms/_form.html.erb +66 -0
  268. data/app/views/cms/forms/render.html.erb +15 -0
  269. data/app/views/cms/forms/show.html.erb +6 -0
  270. data/app/views/cms/groups/_form.html.erb +32 -38
  271. data/app/views/cms/groups/_permissions.html.erb +11 -34
  272. data/app/views/cms/groups/_sections.html.erb +11 -17
  273. data/app/views/cms/groups/edit.html.erb +1 -3
  274. data/app/views/cms/groups/index.html.erb +10 -32
  275. data/app/views/cms/groups/new.html.erb +2 -4
  276. data/app/views/cms/html_blocks/_form.html.erb +2 -2
  277. data/app/views/cms/html_blocks/render.html.erb +1 -1
  278. data/app/views/cms/image_blocks/_form.html.erb +3 -3
  279. data/app/views/cms/links/_form.html.erb +6 -11
  280. data/app/views/cms/links/edit.html.erb +3 -12
  281. data/app/views/cms/links/new.html.erb +4 -13
  282. data/app/views/cms/page_components/_content.html.erb +18 -0
  283. data/app/views/cms/page_components/new.html.erb +12 -0
  284. data/app/views/cms/page_routes/_form.html.erb +11 -10
  285. data/app/views/cms/page_routes/edit.html.erb +2 -3
  286. data/app/views/cms/page_routes/index.html.erb +25 -48
  287. data/app/views/cms/page_routes/new.html.erb +2 -3
  288. data/app/views/cms/pages/_edit_content.html.erb +28 -0
  289. data/app/views/cms/pages/_form.html.erb +20 -37
  290. data/app/views/cms/pages/_main_form.html.erb +23 -0
  291. data/app/views/cms/pages/_simple_container.html.erb +8 -0
  292. data/app/views/cms/pages/edit.html.erb +2 -23
  293. data/app/views/cms/pages/new.html.erb +2 -16
  294. data/app/views/cms/pages/versions.html.erb +18 -87
  295. data/app/views/cms/redirects/_form.html.erb +6 -14
  296. data/app/views/cms/redirects/edit.html.erb +2 -3
  297. data/app/views/cms/redirects/index.html.erb +24 -50
  298. data/app/views/cms/redirects/new.html.erb +2 -3
  299. data/app/views/cms/routes/index.html.erb +15 -20
  300. data/app/views/cms/section_nodes/_children.html.erb +3 -0
  301. data/app/views/cms/section_nodes/_row_buttons.html.erb +11 -0
  302. data/app/views/cms/section_nodes/_section_node.html.erb +24 -10
  303. data/app/views/cms/section_nodes/_sitemap_buttons.html.erb +47 -0
  304. data/app/views/cms/section_nodes/_status.html.erb +5 -0
  305. data/app/views/cms/section_nodes/show.html.erb +9 -0
  306. data/app/views/cms/sections/_buttons.html.erb +6 -0
  307. data/app/views/cms/sections/_form.html.erb +22 -49
  308. data/app/views/cms/sections/edit.html.erb +3 -8
  309. data/app/views/cms/sections/new.html.erb +4 -20
  310. data/app/views/cms/sessions/new.html.erb +16 -31
  311. data/app/views/cms/shared/access_denied.html.erb +1 -2
  312. data/app/views/cms/shared/error.html.erb +5 -5
  313. data/app/views/cms/sites/_flash.html.erb +8 -0
  314. data/app/views/cms/sites/passwords/new.html.erb +2 -0
  315. data/app/views/cms/sites/sessions/new.html.erb +2 -0
  316. data/app/views/cms/tags/_form.html.erb +1 -1
  317. data/app/views/cms/tags/render.html.erb +0 -1
  318. data/app/views/cms/tasks/new.html.erb +18 -32
  319. data/app/views/cms/toolbar/_new_pages_menu.html.erb +10 -0
  320. data/app/views/cms/users/_form.html.erb +8 -11
  321. data/app/views/cms/users/_password.html.erb +2 -8
  322. data/app/views/cms/users/_user_fields.html.erb +7 -20
  323. data/app/views/cms/users/change_password.html.erb +12 -21
  324. data/app/views/cms/users/edit.html.erb +1 -15
  325. data/app/views/cms/users/index.html.erb +61 -58
  326. data/app/views/cms/users/new.html.erb +1 -12
  327. data/app/views/devise/confirmations/new.html.erb +16 -0
  328. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  329. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  330. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  331. data/app/views/devise/passwords/edit.html.erb +19 -0
  332. data/app/views/devise/passwords/new.html.erb +15 -0
  333. data/app/views/devise/registrations/edit.html.erb +28 -0
  334. data/app/views/devise/registrations/new.html.erb +18 -0
  335. data/app/views/devise/shared/_links.erb +25 -0
  336. data/app/views/devise/unlocks/new.html.erb +16 -0
  337. data/app/views/layouts/cms/_content_types.html.erb +13 -0
  338. data/app/views/layouts/cms/_footer.erb +2 -2
  339. data/app/views/layouts/cms/_head.html.erb +8 -18
  340. data/app/views/layouts/cms/_main_menu.html.erb +78 -0
  341. data/app/views/layouts/cms/application.html.erb +19 -24
  342. data/app/views/layouts/cms/content_page.html.erb +5 -0
  343. data/app/views/layouts/cms/page_editor.html.erb +90 -0
  344. data/app/views/portlets/deprecated_placeholders/_form.html.erb +1 -0
  345. data/app/views/portlets/deprecated_placeholders/render.html.erb +8 -0
  346. data/app/views/portlets/dynamic/_form.html.erb +3 -3
  347. data/app/views/portlets/email_page/_form.html.erb +5 -6
  348. data/app/views/portlets/forgot_password/_form.html.erb +2 -3
  349. data/app/views/portlets/forgot_password/render.html.erb +2 -14
  350. data/app/views/portlets/login/_form.html.erb +4 -6
  351. data/app/views/portlets/login/render.html.erb +8 -27
  352. data/app/views/portlets/portlets/_form.html.erb +7 -6
  353. data/app/views/portlets/tag_cloud/_form.html.erb +4 -4
  354. data/app/views/tests/pretend/open_with_layout.html.erb +1 -1
  355. data/bin/bcms +13 -16
  356. data/config/routes.rb +58 -29
  357. data/db/browsercms.seeds.rb +0 -6
  358. data/db/migrate/{20080815014337_browsercms_3_0_0.rb → 20080815014337_browsercms300.rb} +94 -73
  359. data/db/migrate/20130327184912_browsercms400.rb +90 -0
  360. data/db/migrate/20131206214021_devise_create_users.rb +47 -0
  361. data/db/migrate/20131211223908_kill_reset_password.rb +5 -0
  362. data/db/migrate/20131218222005_create_cms_external_users.rb +10 -0
  363. data/doc/features/design_integration.md +45 -0
  364. data/doc/features/external_user.md +7 -0
  365. data/doc/features/form_builder.md +40 -0
  366. data/doc/features/simple_form_refactor.md +60 -0
  367. data/doc/release_notes.md +224 -10
  368. data/lib/acts_as_list.rb +72 -71
  369. data/lib/browsercms.rb +41 -1
  370. data/lib/cms/acts/content_block.rb +12 -2
  371. data/lib/cms/acts/content_page.rb +3 -4
  372. data/lib/cms/admin_tab.rb +15 -0
  373. data/lib/cms/attachments/configuration.rb +1 -1
  374. data/lib/cms/authentication/controller.rb +83 -177
  375. data/lib/cms/authentication/test_password_strategy.rb +19 -0
  376. data/lib/cms/behaviors.rb +1 -0
  377. data/lib/cms/behaviors/archiving.rb +2 -2
  378. data/lib/cms/behaviors/attaching.rb +21 -45
  379. data/lib/cms/behaviors/connecting.rb +14 -4
  380. data/lib/cms/behaviors/dynamic_attributes.rb +3 -3
  381. data/lib/cms/behaviors/hiding.rb +2 -2
  382. data/lib/cms/behaviors/namespacing.rb +6 -36
  383. data/lib/cms/behaviors/publishing.rb +92 -45
  384. data/lib/cms/behaviors/rendering.rb +15 -7
  385. data/lib/cms/behaviors/searching.rb +5 -4
  386. data/lib/cms/behaviors/soft_deleting.rb +13 -16
  387. data/lib/cms/behaviors/taggable.rb +17 -10
  388. data/lib/cms/behaviors/versioning.rb +12 -16
  389. data/lib/cms/commands/to_version400.rb +10 -0
  390. data/lib/cms/concerns.rb +7 -0
  391. data/lib/cms/concerns/can_be_addressable.rb +326 -0
  392. data/lib/cms/concerns/has_content_type.rb +46 -0
  393. data/lib/cms/concerns/ignores_publishing.rb +9 -0
  394. data/lib/cms/configuration.rb +14 -4
  395. data/lib/cms/configuration/configurable_template.rb +24 -0
  396. data/lib/cms/configuration/devise.rb +256 -0
  397. data/lib/cms/configure_simple_form.rb +142 -0
  398. data/lib/cms/configure_simple_form_bootstrap.rb +49 -0
  399. data/lib/cms/content_filter.rb +18 -0
  400. data/lib/cms/content_page.rb +77 -0
  401. data/lib/cms/content_rendering_support.rb +25 -16
  402. data/lib/cms/controllers/admin_controller.rb +78 -0
  403. data/lib/cms/data_loader.rb +30 -11
  404. data/lib/cms/default_accessible.rb +6 -6
  405. data/lib/cms/domain_support.rb +0 -4
  406. data/lib/cms/engine.rb +52 -20
  407. data/lib/cms/engine_helper.rb +41 -51
  408. data/{app/controllers → lib}/cms/error_handling.rb +11 -5
  409. data/lib/cms/extensions.rb +2 -1
  410. data/lib/cms/extensions/active_model/name.rb +13 -0
  411. data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +49 -89
  412. data/lib/cms/extensions/hash.rb +0 -12
  413. data/lib/cms/form_builder/content_block_form_builder.rb +45 -0
  414. data/lib/cms/form_builder/default_input.rb +13 -0
  415. data/lib/cms/form_builder/deprecated_inputs.rb +40 -0
  416. data/lib/cms/form_builder/workflow_buttons.rb +38 -0
  417. data/lib/cms/module.rb +1 -7
  418. data/lib/cms/polymorphic_single_table_inheritance.rb +19 -0
  419. data/lib/cms/publish_workflow.rb +26 -0
  420. data/lib/cms/responders/content_responder.rb +14 -0
  421. data/lib/cms/route_extensions.rb +112 -20
  422. data/lib/cms/version.rb +1 -1
  423. data/lib/generators/browser_cms/demo_site/templates/demo.seeds.rb +0 -2
  424. data/lib/generators/cms/content_block/content_block_generator.rb +19 -46
  425. data/lib/generators/cms/content_block/templates/_form.html.erb +22 -28
  426. data/lib/generators/cms/project/templates/devise.rb.erb +7 -0
  427. metadata +383 -150
  428. data/app/assets/javascripts/cms/sitemap.js.erb +0 -464
  429. data/app/assets/stylesheets/browsercms/application.css +0 -7
  430. data/app/assets/stylesheets/cms/administration.css.erb +0 -91
  431. data/app/assets/stylesheets/cms/application.css.erb +0 -171
  432. data/app/assets/stylesheets/cms/attachment_manager.css.scss +0 -28
  433. data/app/assets/stylesheets/cms/block.css +0 -26
  434. data/app/assets/stylesheets/cms/buttons.css.erb +0 -120
  435. data/app/assets/stylesheets/cms/content_library.css.erb +0 -139
  436. data/app/assets/stylesheets/cms/content_types.css +0 -4
  437. data/app/assets/stylesheets/cms/dashboard.css.erb +0 -118
  438. data/app/assets/stylesheets/cms/data_table.css.erb.erb +0 -156
  439. data/app/assets/stylesheets/cms/date_picker.css.erb +0 -82
  440. data/app/assets/stylesheets/cms/form_layout.css.erb +0 -282
  441. data/app/assets/stylesheets/cms/login.css.erb +0 -78
  442. data/app/assets/stylesheets/cms/menu.css.erb +0 -116
  443. data/app/assets/stylesheets/cms/nav.css.erb +0 -99
  444. data/app/assets/stylesheets/cms/page_toolbar.css.erb +0 -135
  445. data/app/assets/stylesheets/cms/reset.css +0 -46
  446. data/app/assets/stylesheets/cms/selectbox.css.erb +0 -56
  447. data/app/assets/stylesheets/cms/sitemap.css.erb +0 -390
  448. data/app/assets/stylesheets/cms/taglist.css +0 -18
  449. data/app/controllers/application_controller.rb +0 -14
  450. data/app/controllers/cms/content_types_controller.rb +0 -9
  451. data/app/helpers/application_helper.rb +0 -5
  452. data/app/helpers/cms/form_builder.rb +0 -241
  453. data/app/models/cms/content_type_group.rb +0 -15
  454. data/app/models/cms/forgot_password_mailer.rb +0 -14
  455. data/app/portlets/reset_password_portlet.rb +0 -28
  456. data/app/views/cms/blocks/_hidden_fields.html.erb +0 -10
  457. data/app/views/cms/blocks/_toolbar.html.erb +0 -9
  458. data/app/views/cms/blocks/_toolbar_for_collection.html.erb +0 -23
  459. data/app/views/cms/blocks/_toolbar_for_member.html.erb +0 -36
  460. data/app/views/cms/blocks/edit.html.erb +0 -28
  461. data/app/views/cms/blocks/index.html.erb +0 -86
  462. data/app/views/cms/blocks/new.html.erb +0 -19
  463. data/app/views/cms/blocks/show.html.erb +0 -43
  464. data/app/views/cms/blocks/usages.html.erb +0 -44
  465. data/app/views/cms/blocks/versions.html.erb +0 -90
  466. data/app/views/cms/content_types/index.html.erb +0 -14
  467. data/app/views/cms/form_builder/_cms_attachment_manager.html.erb +0 -27
  468. data/app/views/cms/form_builder/_cms_check_box.html.erb +0 -7
  469. data/app/views/cms/form_builder/_cms_date_picker.html.erb +0 -12
  470. data/app/views/cms/form_builder/_cms_datetime_select.html.erb +0 -12
  471. data/app/views/cms/form_builder/_cms_drop_down.html.erb +0 -12
  472. data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +0 -9
  473. data/app/views/cms/form_builder/_cms_file_field.html.erb +0 -28
  474. data/app/views/cms/form_builder/_cms_instructions.html.erb +0 -4
  475. data/app/views/cms/form_builder/_cms_tag_list.html.erb +0 -15
  476. data/app/views/cms/form_builder/_cms_template_editor.html.erb +0 -9
  477. data/app/views/cms/form_builder/_cms_text_area.html.erb +0 -10
  478. data/app/views/cms/form_builder/_cms_text_editor.html.erb +0 -19
  479. data/app/views/cms/form_builder/_cms_text_field.html.erb +0 -12
  480. data/app/views/cms/links/destroy.js.rjs +0 -2
  481. data/app/views/cms/page_routes/show.html.erb +0 -10
  482. data/app/views/cms/pages/_edit_connector.html.erb +0 -19
  483. data/app/views/cms/pages/_edit_container.html.erb +0 -11
  484. data/app/views/cms/section_nodes/_link.html.erb +0 -14
  485. data/app/views/cms/section_nodes/_node.html.erb +0 -44
  486. data/app/views/cms/section_nodes/_page.html.erb +0 -20
  487. data/app/views/cms/section_nodes/_section.html.erb +0 -28
  488. data/app/views/cms/section_nodes/index.html.erb +0 -43
  489. data/app/views/cms/sections/_page.html.erb +0 -4
  490. data/app/views/cms/sections/_section.html.erb +0 -8
  491. data/app/views/cms/sections/destroy.js.rjs +0 -2
  492. data/app/views/cms/sections/index.html.erb +0 -23
  493. data/app/views/cms/shared/_admin_sidebar.html.erb +0 -36
  494. data/app/views/cms/shared/_pagination.html.erb +0 -31
  495. data/app/views/cms/toolbar/_mobile_toggle.html.erb +0 -33
  496. data/app/views/cms/toolbar/index.html.erb +0 -1
  497. data/app/views/cms/users/_groups.html.erb +0 -12
  498. data/app/views/cms/users/_toolbar.html.erb +0 -24
  499. data/app/views/cms/users/show.html.erb +0 -50
  500. data/app/views/layouts/_cms_toolbar.html.erb +0 -54
  501. data/app/views/layouts/_page_toolbar.html.erb +0 -119
  502. data/app/views/layouts/cms/administration.html.erb +0 -51
  503. data/app/views/layouts/cms/content_library.html.erb +0 -96
  504. data/app/views/layouts/cms/dashboard.html.erb +0 -16
  505. data/app/views/layouts/cms/login.html.erb +0 -31
  506. data/app/views/layouts/cms/section_nodes.html.erb +0 -20
  507. data/app/views/layouts/cms/toolbar.html.erb +0 -23
  508. data/app/views/portlets/reset_password/_form.html.erb +0 -3
  509. data/app/views/portlets/reset_password/render.html.erb +0 -22
  510. data/bin/bcms-upgrade +0 -332
  511. data/db/migrate/20091109175123_browsercms_3_0_5.rb +0 -9
  512. data/db/migrate/20100117144038_browsercms314.rb +0 -20
  513. data/db/migrate/20100117144039_browsercms315.rb +0 -95
  514. data/db/migrate/20100705083859_browsercms_3_3_0.rb +0 -56
  515. data/db/migrate/20111130221145_browsercms340.rb +0 -56
  516. data/db/migrate/20120329144406_browsercms350.rb +0 -32
  517. data/db/migrate/20120717182827_browsercms353.rb +0 -19
  518. data/db/migrate/20120813180110_browsercms354.rb +0 -9
  519. data/lib/cms/addressable.rb +0 -93
  520. data/lib/cms/authentication/model.rb +0 -116
  521. data/lib/cms/behaviors/pagination.rb +0 -212
  522. data/lib/cms/upgrades/v3_4_0.rb +0 -31
  523. data/lib/cms/upgrades/v3_5_0.rb +0 -227
@@ -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 = { :column => "position", :scope => "1 = 1" }
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.find(:first, :conditions =>
160
- "#{scope_condition} AND #{position_column} < #{send(position_column).to_s}", :order => "#{position_column} DESC"
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.find(:first, :conditions =>
168
- "#{scope_condition} AND #{position_column} > #{send(position_column).to_s}", :order => "#{position_column} ASC"
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
- def add_to_list_top
179
- increment_positions_on_all_items
180
- end
179
+ def add_to_list_top
180
+ increment_positions_on_all_items
181
+ end
181
182
 
182
- def add_to_list_bottom
183
- self[position_column] = bottom_position_in_list.to_i + 1
184
- end
183
+ def add_to_list_bottom
184
+ self[position_column] = bottom_position_in_list.to_i + 1
185
+ end
185
186
 
186
- # Overwrite this method to define the scope of the list changes
187
- def scope_condition() "1" end
187
+ # Overwrite this method to define the scope of the list changes
188
+ def scope_condition()
189
+ "1"
190
+ end
188
191
 
189
- # Returns the bottom position number in the list.
190
- # bottom_position_in_list # => 2
191
- def bottom_position_in_list(except = nil)
192
- item = bottom_item(except)
193
- item ? item.send(position_column) : 0
194
- end
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
- # Returns the bottom item
197
- def bottom_item(except = nil)
198
- conditions = scope_condition
199
- conditions = "#{conditions} AND #{self.class.primary_key} != #{except.id}" if except
200
- acts_as_list_class.find(:first, :conditions => conditions, :order => "#{position_column} DESC")
201
- end
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
- # Forces item to assume the bottom position in the list.
204
- def assume_bottom_position
205
- update_attribute(position_column, bottom_position_in_list(self).to_i + 1)
206
- end
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
- # Forces item to assume the top position in the list.
209
- def assume_top_position
210
- update_attribute(position_column, 1)
211
- end
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
- # This has the effect of moving all the higher items up one.
214
- def decrement_positions_on_higher_items(position)
215
- acts_as_list_class.update_all(
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
- end
220
+ )
221
+ end
219
222
 
220
- # This has the effect of moving all the lower items up one.
221
- def decrement_positions_on_lower_items
222
- return unless in_list?
223
- acts_as_list_class.update_all(
224
- "#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} > #{send(position_column).to_i}"
225
- )
226
- end
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
- # This has the effect of moving all the higher items down one.
229
- def increment_positions_on_higher_items
230
- return unless in_list?
231
- acts_as_list_class.update_all(
232
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} < #{send(position_column).to_i}"
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
- # This has the effect of moving all the lower items down one.
237
- def increment_positions_on_lower_items(position)
238
- acts_as_list_class.update_all(
239
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} >= #{position}"
240
- )
241
- end
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
- # Increments position (<tt>position_column</tt>) of all items in the list.
244
- def increment_positions_on_all_items
245
- acts_as_list_class.update_all(
246
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition}"
247
- )
248
- end
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
- def insert_at_position(position)
251
- remove_from_list
252
- increment_positions_on_lower_items(position)
253
- self.update_attribute(position_column, position)
254
- end
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
@@ -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
- include Cms::DefaultAccessible
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
- protected
29
- # Returns true or false if the user is logged in.
30
- # Preloads Cms::User.current with the user model if they're logged in.
31
- def logged_in?
32
- !current_user.nil? && !current_user.guest?
33
- end
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
- # Store the given user id in the session.
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
- # Check if the user is authorized
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
- # Override this method in your controllers if you want to restrict access
55
- # to only a few actions or if you want to check if the user
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
- # # only allow nonbobs
61
- # def authorized?
62
- # current_user.login != "bob"
63
- # end
64
- #
65
- def authorized?(action=nil, resource=nil, *args)
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
- # This is ususally what you want; resetting the session willy-nilly wreaks
158
- # havoc with forgery protection, and is only strictly necessary on login.
159
- # However, **all session state variables should be unset here**.
160
- def logout_keeping_session!
161
- # Kill server-side auth cookie
162
- Cms::User.current.forget_me if Cms::User.current.is_a? User
163
- Cms::User.current = false # not logged in, and don't do it for me
164
- kill_remember_cookie! # Kill client-side auth cookie
165
- session[:user_id] = nil # keeps the session but kill our variable
166
- # explicitly kill any other session variables you set
167
- end
168
-
169
- # The session should only be reset at the tail end of a form POST --
170
- # otherwise the request forgery protection fails. It's only really necessary
171
- # when you cross quarantine (logged-out to logged-in).
172
- def logout_killing_session!
173
- logout_keeping_session!
174
- reset_session
175
- end
176
-
177
- #
178
- # Remember_me Tokens
179
- #
180
- # Cookies shouldn't be allowed to persist past their freshness date,
181
- # and they should be changed at each login
182
-
183
- # Cookies shouldn't be allowed to persist past their freshness date,
184
- # and they should be changed at each login
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