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
@@ -37,7 +37,6 @@ module Cms
37
37
  @instance_variable_name_for_view = options[:instance_variable_name_for_view]
38
38
 
39
39
  extend ClassMethods
40
- extend EngineHelper
41
40
  include InstanceMethods
42
41
 
43
42
  # I'm not pleased with the need to include all of the these rails helpers onto every 'renderable' content item
@@ -82,11 +81,7 @@ module Cms
82
81
  # of the renderable, so if you have an Article that is renderable,
83
82
  # the template will be "articles/render"
84
83
  def template_path
85
- path = "#{name.underscore.pluralize}/render"
86
- if main_app_model?
87
- path = "cms/#{path}"
88
- end
89
- path
84
+ "#{name.underscore.pluralize}/render"
90
85
  end
91
86
 
92
87
  # Instance variables that will not be copied from the renderable to the view
@@ -96,6 +91,19 @@ module Cms
96
91
 
97
92
  end
98
93
  module InstanceMethods
94
+
95
+ # Returns the Mercury editor type for a given attribute
96
+ # @param [Symbol] method (i.e. :name, :content, etc)
97
+ # @return [Hash]
98
+ def editor_info(method)
99
+ column = self.class.columns_hash[method.to_s]
100
+ if column.type == :text
101
+ {:element => 'div', :region => 'full'}
102
+ else
103
+ {:element => 'span', :region => 'simple'}
104
+ end
105
+ end
106
+
99
107
  def prepare_to_render(controller)
100
108
  # Give this renderable a reference to the controller
101
109
  @controller = controller
@@ -123,7 +131,7 @@ module Cms
123
131
 
124
132
  if self.respond_to?(:deleted) && self.deleted
125
133
  logger.error "Attempting to render deleted object: #{self.inspect}"
126
- msg = (@mode == 'edit' ? %Q[<div class="error">This #{self.class.name} has been deleted. Please remove this container from the page</div>] : '')
134
+ msg = (edit_mode? ? %Q[<div class="error">This #{self.class.name} has been deleted. Please remove this container from the page</div>] : '')
127
135
  return msg
128
136
  end
129
137
 
@@ -26,11 +26,12 @@ module Cms
26
26
  end
27
27
  conditions << "%#{term}%"
28
28
  end
29
- conditions[0] = "(#{conditions[0]})"
29
+ #conditions[0] = "(#{conditions[0]})"
30
30
  end
31
- scope = {}
32
- scope[:conditions] = conditions if conditions
33
- scope
31
+ where(conditions)
32
+ #scope = {}
33
+ #scope[:conditions] = conditions if conditions
34
+ #scope
34
35
  }
35
36
  end
36
37
  end
@@ -17,18 +17,18 @@ module Cms
17
17
  def uses_soft_delete(options={})
18
18
  @uses_soft_delete = true
19
19
 
20
- scope :not_deleted, :conditions => ["#{table_name}.deleted = ?", false]
20
+ scope :not_deleted, -> {where (["#{table_name}.deleted = ?", false])}
21
21
  class << self
22
22
  alias_method :delete_all!, :delete_all
23
23
  end
24
24
 
25
25
  extend ClassMethods
26
26
  include InstanceMethods
27
- attr_accessible :deleted
27
+ #attr_accessible :deleted
28
28
 
29
29
  # By default, all queries for blocks should filter out deleted rows.
30
30
  begin
31
- default_scope where(:deleted => false)
31
+ default_scope {where(:deleted => false)}
32
32
  # This may fail during gem loading, if no DB or the table does not exist. Log it and move on.
33
33
  rescue StandardError => e
34
34
  handle_missing_table_error_during_startup("Can't set a default_scope for soft_deleting", e)
@@ -43,13 +43,10 @@ module Cms
43
43
  # See http://github.com/fernandoluizao/acts_as_active for an implementation of this
44
44
  module ClassMethods
45
45
 
46
- # Returns all records, including those which are marked as deleted.
47
- #
48
- # Basically 'find' exactly how ActiveRecord originally implements it.
49
- #
50
- # @param args Same params as ActiveRecord.find
51
- def find_with_deleted(* args)
52
- self.with_exclusive_scope { find(* args) }
46
+ # Returns a content block even if it is marked as deleted.
47
+ # @param [Hash] options Hash suitable to be passed to '#where'
48
+ def find_with_deleted(options)
49
+ self.unscoped.where(options).first
53
50
  end
54
51
 
55
52
  # Returns a count of all records of this type, including those marked as deleted.
@@ -58,20 +55,20 @@ module Cms
58
55
  #
59
56
  # @param args Same params as ActiveRecord.count
60
57
  def count_with_deleted(* args)
61
- self.with_exclusive_scope { count(* args) }
58
+ self.unscoped.count(* args)
62
59
  end
63
60
 
64
61
  def delete_all(conditions=nil)
65
- update_all(["deleted = ?", true], conditions)
62
+ where(conditions).update_all(["deleted = ?", true])
66
63
  end
67
64
 
68
65
  def exists?(id_or_conditions)
69
- if id_or_conditions.is_a?(Hash) || id_or_conditions.is_a?(Array)
70
- conditions = {:conditions => id_or_conditions}
66
+ query = if id_or_conditions.is_a?(Hash) || id_or_conditions.is_a?(Array)
67
+ where id_or_conditions
71
68
  else
72
- conditions = {:conditions => {:id => id_or_conditions}}
69
+ where(:id => id_or_conditions)
73
70
  end
74
- count(conditions) > 0
71
+ query.count > 0
75
72
  end
76
73
  end
77
74
  module InstanceMethods
@@ -4,31 +4,36 @@ module Cms
4
4
  def self.included(model_class)
5
5
  model_class.extend(MacroMethods)
6
6
  end
7
- module MacroMethods
7
+
8
+ module MacroMethods
8
9
  def taggable?
9
10
  !!@is_taggable
10
11
  end
12
+
11
13
  def is_taggable(options={})
12
14
  @is_taggable = true
13
15
  @tag_separator = options[:separator] || " "
14
-
16
+
15
17
  has_many :taggings, :as => :taggable, :class_name => 'Cms::Tagging'
16
- has_many :tags, :through => :taggings, :order => "#{Cms::Tag.table_name}.name", :class_name => 'Cms::Tag'
17
-
18
- scope :tagged_with, lambda{|t| {:include => {:taggings => :tag}, :conditions => ["#{Cms::Tag.table_name}.name = ?", t]} }
18
+ has_many :tags, -> { order("#{Cms::Tag.table_name}.name") }, :class_name => 'Cms::Tag', :through => :taggings
19
+
20
+
21
+ after_save :save_tags
19
22
 
20
- after_save :save_tags
21
-
22
23
  extend ClassMethods
23
24
  include InstanceMethods
24
25
 
25
- attr_accessible :tag_list
26
26
  end
27
27
  end
28
28
  module ClassMethods
29
+ def tagged_with(t)
30
+ where(["#{Cms::Tag.table_name}.name = ?", t]).includes(:taggings => :tag).references(:tags)
31
+ end
32
+
29
33
  def tag_cloud
30
34
  Cms::Tagging.cloud(base_class.name)
31
35
  end
36
+
32
37
  def tag_separator
33
38
  @tag_separator
34
39
  end
@@ -37,12 +42,14 @@ module Cms
37
42
  def tag_list
38
43
  @tag_list ||= tags.reload.map(&:name).join(self.class.tag_separator)
39
44
  end
45
+
40
46
  def tag_list=(tag_names)
41
47
  changed_attributes["tag_list"] = tag_list unless @tag_list == tag_names
42
48
  @tag_list = tag_names
43
49
  end
50
+
44
51
  def save_tags
45
- tag_list_tags = tag_list.to_s.split(self.class.tag_separator).map{|t| Cms::Tag.find_or_create_by_name(t.strip) }
52
+ tag_list_tags = tag_list.to_s.split(self.class.tag_separator).map { |t| Cms::Tag.find_or_create_by(name: t.strip) }
46
53
  taggings.each do |tg|
47
54
  if tag_list_tags.include?(tg.tag)
48
55
  tag_list_tags.delete(tg.tag)
@@ -50,7 +57,7 @@ module Cms
50
57
  tg.destroy
51
58
  end
52
59
  end
53
- tag_list_tags.each{|t| taggings.create(:tag => t, :taggable => self) }
60
+ tag_list_tags.each { |t| taggings.create(:tag => t, :taggable => self) }
54
61
  self.tag_list = nil
55
62
  end
56
63
  end
@@ -5,7 +5,7 @@ module Cms
5
5
  # Skip sanitizing attributes from mass assignment. This should be used sparingly, since it bypasses security.
6
6
  # Ideally used for dynamically created classes (like ::Version or ::Attribute) where the attributes are not known at
7
7
  # design time.
8
- def sanitize(attributes, authorizer)
8
+ def sanitize(klass, attributes, authorizer)
9
9
  attributes
10
10
  end
11
11
  end
@@ -86,7 +86,6 @@ module Cms
86
86
  before_validation :initialize_version
87
87
  before_save :build_new_version
88
88
  attr_accessor :skip_callbacks
89
- attr_accessible :version_comment
90
89
 
91
90
  #Define the version class
92
91
  #puts "is_version called for #{self}"
@@ -96,7 +95,7 @@ module Cms
96
95
  end
97
96
 
98
97
  include VersionRecord
99
- self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
98
+ #self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
100
99
 
101
100
  def versioned_class
102
101
  self.class.versioned_class
@@ -155,7 +154,7 @@ module Cms
155
154
  #Rails 3 could use update_column here instead
156
155
  if respond_to? :latest_version
157
156
  sql = "UPDATE #{self.class.table_name} SET latest_version = #{draft.version} where id = #{self.id}"
158
- connection.execute sql
157
+ self.class.connection.execute sql
159
158
  self.latest_version = draft.version # So we don't need to #reload this object. Probably marks it as dirty though, which could have weird side effects.
160
159
  end
161
160
  end
@@ -193,16 +192,6 @@ module Cms
193
192
  end
194
193
  end
195
194
 
196
- def publish_if_needed
197
- #logger.debug { "#{self.class}#publish_if_needed. publish? = '#{!!@publish_on_save}'" }
198
-
199
- if @publish_on_save
200
- publish
201
- @publish_on_save = nil
202
- end
203
- end
204
-
205
-
206
195
  #
207
196
  #ActiveRecord 3.0.0 call chain
208
197
  # ActiveRecord 3 now uses basic inheritence rather than alias_method_chain. The order in which ActiveRecord::Base
@@ -264,11 +253,17 @@ module Cms
264
253
  save(:validate => perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
265
254
  end
266
255
 
256
+ # Returns the most recently created Version for this class. Drafts are the most recent change from
257
+ # the _versions table for a given content item.
258
+ # i.e. For Cms::Page, this would return Cms::Page::Version
259
+ #
260
+ # @return [<Class>::Version] The version for this class that represents the draft.
267
261
  def draft
268
- versions.first(:order => "version desc")
262
+ versions.order("version desc").first
269
263
  end
270
264
 
271
265
  def draft_version?
266
+ return true unless draft
272
267
  version == draft.version
273
268
  end
274
269
 
@@ -285,7 +280,7 @@ module Cms
285
280
  end
286
281
 
287
282
  def find_version(number)
288
- versions.first(:conditions => {:version => number})
283
+ versions.where(:version => number).first
289
284
  end
290
285
 
291
286
  def as_of_draft_version
@@ -324,6 +319,7 @@ module Cms
324
319
 
325
320
  self.after_revert(revert_to_version) if self.respond_to?(:after_revert)
326
321
  self.version_comment = "Reverted to version #{version}"
322
+ self.publish_on_save = false
327
323
  self
328
324
  end
329
325
 
@@ -0,0 +1,10 @@
1
+ module Cms
2
+ module Commands
3
+ module ToVersion400
4
+
5
+ def generate_devise_configuration
6
+ template 'devise.rb.erb', 'config/initializers/devise.rb'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ # Each concern should be automatically added to each ActiveRecord class using extend.
2
+ module Cms::Concerns; end
3
+
4
+ Dir["#{File.dirname(__FILE__)}/concerns/*.rb"].each do |b|
5
+ require File.join("cms", "concerns", File.basename(b, ".rb"))
6
+ ActiveRecord::Base.extend "Cms::Concerns::#{File.basename(b, ".rb").camelize}".constantize
7
+ end
@@ -0,0 +1,326 @@
1
+ module Cms
2
+ module Concerns
3
+ module CanBeAddressable
4
+
5
+ # Adds Addressable behavior to a model. This allows models to be inserted into the sitemap, having parent
6
+ # sections. By default, this method is available to all ActiveRecord::Base classes.
7
+ #
8
+ # @params [Hash] options
9
+ # @option options [String] :path The base path where instances will be placed.
10
+ # @option options [String] :no_dynamic_path Set as true if the Record has a :path attribute managed as a column in the db. (Default: false)
11
+ # @option options [Symbol] :destroy_if Name of a custom method used to determine when this object should be destroyed. Rather than dependant: destroy to determine if the section node should be destroyed when this object is.
12
+ def is_addressable(options={})
13
+ has_one_options = {as: :node, inverse_of: :node, class_name: 'Cms::SectionNode', validate: true}
14
+ unless options[:destroy_if]
15
+ has_one_options[:dependent] = :destroy
16
+ else
17
+ before_destroy options[:destroy_if]
18
+ after_destroy :destroy_node
19
+ end
20
+
21
+ has_one :section_node, has_one_options
22
+ # For reasons that aren't clear, just using :autosave doesn't work.
23
+ after_save do
24
+ if section_node && section_node.changed?
25
+ section_node.save
26
+ end
27
+ end
28
+
29
+ after_validation do
30
+ # Copy errors from association for slug
31
+ if section_node && !section_node.valid?
32
+ section_node.errors[:slug].each do |message|
33
+ errors.add(:slug, message)
34
+ end
35
+ end
36
+ end
37
+
38
+ include Cms::Concerns::Addressable
39
+ extend Cms::Concerns::Addressable::ClassMethods
40
+ include Cms::Concerns::Addressable::NodeAccessors
41
+ include Cms::Concerns::Addressable::MarkAsDirty
42
+ extend Cms::Configuration::ConfigurableTemplate
43
+
44
+ if options[:path]
45
+ @path = options[:path]
46
+ include GenericSitemapBehavior
47
+ end
48
+
49
+ @template = options[:template]
50
+
51
+ unless options[:no_dynamic_path]
52
+ include Addressable::DynamicPath
53
+ end
54
+ end
55
+
56
+ # @return [Boolean] Until is_addressable is called, this will always be false.
57
+ def addressable?
58
+ false
59
+ end
60
+
61
+ # @return [Boolean] Some addressable content types don't require a slug.
62
+ def requires_slug?
63
+ false
64
+ end
65
+ end
66
+
67
+ # Implements behavior for displaying content blocks that should appear in the sitemap.
68
+ #
69
+ module GenericSitemapBehavior
70
+ def self.included(klass)
71
+ klass.before_validation :assign_parent_if_needed
72
+ end
73
+
74
+ def partial_for
75
+ "addressable_content_block"
76
+ end
77
+
78
+ def hidden?
79
+ false
80
+ end
81
+
82
+ def assign_parent_if_needed
83
+ unless parent || parent_id
84
+ new_parent = Cms::Section.with_path(self.class.path).first
85
+
86
+ unless new_parent
87
+ logger.warn "Creating default section for #{self.try(:display_name)} in #{self.class.path}."
88
+ section_attributes = {:name => self.class.name.demodulize.pluralize,
89
+ :path => self.class.path,
90
+ :hidden => true,
91
+ allow_groups: :all}
92
+ section_parent = Cms::Section.root.first
93
+ if section_parent
94
+ section_attributes[:parent] = section_parent
95
+ end
96
+ new_parent = Cms::Section.create!(section_attributes)
97
+ end
98
+ self.parent_id = new_parent.id
99
+ end
100
+ end
101
+ end
102
+
103
+ module Addressable
104
+
105
+ module ClassMethods
106
+
107
+ def requires_slug?
108
+ !@path.nil?
109
+ end
110
+
111
+ # The base path where new records will be added.
112
+ # @return [String]
113
+ def path
114
+ @path
115
+ end
116
+
117
+ # @return [Boolean] Once is_addressable is called, this will always be true.
118
+ def addressable?
119
+ true
120
+ end
121
+
122
+ def calculate_path(slug)
123
+ "#{self.path}/#{slug}"
124
+ end
125
+
126
+ # Used in UI forms to show what the complete URL will look like with a slug added to it.
127
+ def base_path
128
+ "#{self.path}/"
129
+ end
130
+
131
+ # Find an addressable object with the given content type.
132
+ #
133
+ # @param [String] slug
134
+ # @return [Addressable] The content block with that slug (if it exists). Nil otherwise
135
+ def with_slug(slug)
136
+ section_node = SectionNode.where(slug: slug).where(node_type: self.name).first
137
+ section_node ? section_node.node : nil
138
+ end
139
+
140
+ # Returns the layout (Page Template) that should be used to render instances of this content.
141
+ # Can be specified as is_addressable template: 'subpage'
142
+ # @return [String] template/default unless template was set.
143
+ def layout
144
+ normalize_layout(self, @template)
145
+ end
146
+ end
147
+
148
+ module DynamicPath
149
+
150
+ # @return [String] The relative path to this content
151
+ def path
152
+ self.class.calculate_path(slug)
153
+ end
154
+
155
+ def slug
156
+ if section_node
157
+ section_node.slug
158
+ else
159
+ nil
160
+ end
161
+ end
162
+
163
+ def slug=(slug)
164
+ if section_node
165
+ section_node.slug = slug
166
+ else
167
+ @slug = slug # Store temporarily until there is a section_node created.
168
+ end
169
+ dirty!
170
+ end
171
+ end
172
+
173
+ # Resources are accessible to guests if their parent section is. Variables are passed in for performance reasons
174
+ # since this gets called 'MANY' times on the sitemap.
175
+ #
176
+ # @param [Array<Section>] public_sections
177
+ # @param [Section] parent
178
+ def accessible_to_guests?(public_sections, parent)
179
+ public_sections.include?(parent)
180
+ end
181
+
182
+ # Returns all classes which need a custom route to show themselves.
183
+ def self.classes_that_require_custom_routes
184
+ descendants.select { |klass| klass.path != nil }
185
+ end
186
+
187
+ # List of all classes that can be in the sitemap.
188
+ #
189
+ # @return [Array<Class>] Returns all classes which inherit from Cms::Concerns::Addressable
190
+ def self.descendants
191
+ ObjectSpace.each_object(::Class).select { |klass| klass < Cms::Concerns::Addressable }
192
+ end
193
+
194
+ # Allows for manual destruction of node
195
+ def destroy_node
196
+ node.destroy
197
+ end
198
+
199
+ # Whether or not this content is the 'landing' page for its section.
200
+ #
201
+ # @return [Boolean] false always, since a content block won't ever be the landing page for the section
202
+ def landing_page?
203
+ false
204
+ end
205
+
206
+ # Returns the value that will appear in the <title> element of the page when this content is rendered.
207
+ # Subclasses can override this.
208
+ #
209
+ # @return [String]
210
+ # @example Override the page title
211
+ # class MyWidget < ActiveRecord::Base
212
+ # def page_title
213
+ # "My Widget | #{name}"
214
+ # end
215
+ # end
216
+ def page_title
217
+ name
218
+ end
219
+
220
+ # Returns a list of all Addressable objects that are ancestors to this record.
221
+ # @param [Hash] options
222
+ # @option [Symbol] :include_self If this object should be included in the Array
223
+ # @return [Array<Addressable>] Or [] if no ancestors and/or has no parent.
224
+ #
225
+ def ancestors(options={})
226
+ return [] unless node
227
+ ancestor_nodes = node.ancestors
228
+ ancestors = ancestor_nodes.collect { |node| node.node }
229
+ ancestors << self if options[:include_self]
230
+ ancestors
231
+ end
232
+
233
+ def parent
234
+ @parent if @parent
235
+ node ? node.section : nil
236
+ end
237
+
238
+ def cache_parent(section)
239
+ @parent = section
240
+ end
241
+
242
+ def parent_id
243
+ parent.try(:id)
244
+ end
245
+
246
+ def parent_id=(id)
247
+ self.parent = Cms::Section.find(id)
248
+ # Handles slug being set before there is a parent
249
+ if @slug
250
+ self.slug = @slug
251
+ @slug = nil
252
+ end
253
+ end
254
+
255
+ def parent=(sec)
256
+ if node
257
+ node.move_to_end(sec)
258
+ else
259
+ build_section_node(:node_id => self.id, :section => sec)
260
+ end
261
+ end
262
+
263
+ # Computes the name of the partial used to render this object in the sitemap.
264
+ def partial_for
265
+ self.class.name.demodulize.underscore
266
+ end
267
+
268
+ # alias :node, :section_node
269
+ module NodeAccessors
270
+ def node
271
+ section_node
272
+ end
273
+
274
+ def node=(n)
275
+ self.section_node = n
276
+ end
277
+ end
278
+
279
+ # These exist for backwards compatibility to avoid having to change tests.
280
+ # I want to get rid of these in favor of parent and parent_id
281
+ module DeprecatedPageAccessors
282
+
283
+ def self.included(model_class)
284
+ #model_class.attr_accessible :section_id, :section
285
+ end
286
+
287
+
288
+ def build_node(opts)
289
+ build_section_node(opts)
290
+ end
291
+
292
+ def section_id
293
+ section ? section.id : nil
294
+ end
295
+
296
+ def section_id=(sec_id)
297
+ self.section = Section.find(sec_id)
298
+ end
299
+
300
+ def section
301
+ parent
302
+ end
303
+
304
+ def section=(sec)
305
+ self.parent = sec
306
+
307
+ end
308
+ end
309
+
310
+ # Allows records to be marked as being changed, which can be called to trigger updates when
311
+ # associated objects may have been changed.
312
+ module MarkAsDirty
313
+ # Forces this record to be changed, even if nothing has changed
314
+ # This is necessary if just the section.id has changed, for example
315
+ # test if this is necessary now that the attributes are in the
316
+ # model itself.
317
+ def dirty!
318
+ # Seems like a hack, is there a better way?
319
+ self.updated_at = Time.now
320
+ end
321
+ end
322
+ end
323
+
324
+
325
+ end
326
+ end