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
@@ -0,0 +1,19 @@
1
+ module Cms
2
+ module Authentication
3
+ # For testing external authentication.
4
+ class TestPasswordStrategy < Devise::Strategies::Authenticatable
5
+ EXPECTED_LOGIN = EXPECTED_PASSWORD = 'test'
6
+ def authenticate!
7
+ if(authentication_hash[:login] == password && password == EXPECTED_PASSWORD)
8
+ user = Cms::ExternalUser.authenticate(authentication_hash[:login], 'Test Password', {first_name: "Test", last_name: "User"})
9
+ user.authorize('cms-admin', 'content-editor')
10
+ success!(user)
11
+ else
12
+ pass
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ Warden::Strategies.add(:test_password, Cms::Authentication::TestPasswordStrategy)
@@ -31,3 +31,4 @@ Dir["#{File.dirname(__FILE__)}/behaviors/*.rb"].each do |b|
31
31
  require File.join("cms", "behaviors", File.basename(b, ".rb"))
32
32
  ActiveRecord::Base.send(:include, "Cms::Behaviors::#{File.basename(b, ".rb").camelize}".constantize)
33
33
  end
34
+
@@ -12,8 +12,8 @@ module Cms
12
12
  @is_archivable = true
13
13
  include InstanceMethods
14
14
 
15
- scope :archived, :conditions => {:archived => true}
16
- scope :not_archived, :conditions => {:archived => false}
15
+ scope :archived, ->{where(:archived => true)}
16
+ scope :not_archived, ->{where(:archived => false)}
17
17
  end
18
18
  end
19
19
  module InstanceMethods
@@ -3,56 +3,24 @@ module Cms
3
3
  module Behaviors
4
4
  # Allows one or more files to be attached to content blocks.
5
5
  #
6
- # class Book
6
+ # class Book < ActiveRecord::Base
7
7
  # acts_as_content_block
8
- # uses_paperclip
8
+ # has_attachment :cover
9
9
  # end
10
10
  #
11
- # It would probably be nice to do something like:
12
- #
13
- # class Book
14
- # acts_as_content_block :uses_paperclip => true
15
- # end
16
11
  #
17
- # has_attached_asset and has_many_attached_assets are very similar.
18
- # They both define a couple of methods in the content block:
12
+ # To add a set of multiple attachments:
19
13
  #
20
14
  # class Book
21
- # uses_paperclip
15
+ # acts_as_content_block
22
16
  #
23
- # has_attached_asset :cover
24
- # has_many_attached_assets :drafts
17
+ # has_attachment :cover
18
+ # has_many_attachments :drafts
25
19
  # end
26
20
  #
27
- # book = Book.new
28
- # book.cover = nil #is basically calling: book.assets.named(:cover).first
29
- # book.drafts = [] #is calling book.assets.named(:drafts)
30
- #
31
- # Book#cover and Book#drafts both return Asset objects as opposed to what
32
- # happens with stand alone Paperclip:
33
- #
34
- # class Book
35
- # has_attached_file :invoice #straight Paperclip
36
- # end
37
- #
38
- # Book.new.invoice # returns an instance of Paperclip::Attachment
39
- #
40
- # However, Asset instances respond to most of the same methods
41
- # Paperclip::Attachments do (at least the most usefull ones and the ones
42
- # that make sense for this implementation). Please see asset.rb for more on
43
- # this.
44
- #
45
- # At the moment, calling has_attached_asset does not enforce that only
46
- # one asset is created, it only defines a method that returns the first one
47
- # ActiveRecord finds. It would be possible to do if that makes sense.
48
- #
49
- # In terms of validations, I'm aiming to expose the same 3 class methods
50
- # Paperclip exposes, apart from those needed by BCMS itself (like enforcing
51
- # unique attachment paths) but this is not ready yet:
52
- #
53
- # validates_asset_size
54
- # validates_asset_presence
55
- # validates_asset_content_type
21
+ # Adds the following methods to Book:
22
+ # - Book#cover @return [Cms::Attachment]
23
+ # - Book#drafts @return [Array<Cms::Attachment>]
56
24
  #
57
25
  module Attaching
58
26
 
@@ -83,7 +51,6 @@ module Cms
83
51
  :allow_destroy => true,
84
52
  # New attachments must have an uploaded file
85
53
  :reject_if => lambda { |a| a[:data].blank? && a[:id].blank? }
86
- attr_accessible :attachments_attributes, :attachment_id_list, :attachments_changed
87
54
 
88
55
  validates_associated :attachments
89
56
  before_validation :initialize_attachments, :check_for_updated_attachments
@@ -140,7 +107,8 @@ module Cms
140
107
  end
141
108
  end
142
109
 
143
- # Define at :set_attachment_path if you would like to override the way file_path is set
110
+ # Define the #set_attachment_path method if you would like to override the way file_path is set.
111
+ # A path input will be rendered for content types having #set_attachment_path.
144
112
  def handle_setting_attachment_path
145
113
  if self.respond_to? :set_attachment_path
146
114
  set_attachment_path
@@ -152,6 +120,14 @@ module Cms
152
120
 
153
121
  module ClassMethods
154
122
 
123
+ # Finds all instances of this Attaching content that exist in a given section.
124
+ # @param [Cms::Section] section
125
+ # @return [ActiveRecord::Relation] A relation that will return Attaching instances.
126
+ def by_section(section)
127
+ where(["#{SectionNode.table_name}.ancestry = ?", section.node.ancestry_path])
128
+ .includes(:attachments => :section_node)
129
+ .references(:section_nodes)
130
+ end
155
131
 
156
132
  # Defines an single attachement with a given name.
157
133
  #
@@ -199,7 +175,7 @@ module Cms
199
175
  found_versions = Cms::Attachment::Version.where(:attachable_id => attachable.id).
200
176
  where(:attachable_type => attachable.attachable_type).
201
177
  where(:attachable_version => version_number).
202
- order(:version).all
178
+ order(:version).load
203
179
  found_attachments = []
204
180
 
205
181
  found_versions.each do |av|
@@ -369,7 +345,7 @@ module Cms
369
345
  end
370
346
 
371
347
  def initialize_attachments
372
- attachments.each { |a| a.attachable_class = self.class.name }
348
+ attachments.each { |a| a.attachable_class = self.attachable_type }
373
349
  end
374
350
 
375
351
 
@@ -18,7 +18,7 @@ module Cms
18
18
  include InstanceMethods
19
19
 
20
20
  attr_accessor :connect_to_page_id, :connect_to_container,:connected_page
21
- attr_accessible :connect_to_page_id, :connect_to_container,:connected_page
21
+ #attr_accessible :connect_to_page_id, :connect_to_container,:connected_page
22
22
 
23
23
  has_many :connectors, :as => :connectable, :class_name => 'Cms::Connector'
24
24
 
@@ -33,7 +33,7 @@ module Cms
33
33
  module ClassMethods
34
34
 
35
35
  def content_block_type
36
- ActiveModel::Naming.singular(self)
36
+ ::ActiveModel::Naming.singular(self)
37
37
  end
38
38
  def display_name
39
39
  Connecting.default_naming_for(self)
@@ -44,6 +44,12 @@ module Cms
44
44
  end
45
45
  module InstanceMethods
46
46
 
47
+ # Returns a machine readable key that identifies the type of content this is.
48
+ # Should match the key passed to ContentType.find_by_key
49
+ def content_name
50
+ self.class.name.demodulize.underscore
51
+ end
52
+
47
53
  def connected_pages
48
54
  return @connected_pages if @connected_pages
49
55
  @connected_pages = Page.connected_to(self)
@@ -75,6 +81,10 @@ module Cms
75
81
  true
76
82
  end
77
83
 
84
+ # By default, all content types will support inline editing. Subclasses can override this.
85
+ def supports_inline_editing?
86
+ true
87
+ end
78
88
  #
79
89
  # After blocks are updated, all pages they are connected to should also be updated,
80
90
  # connecting the page to the new version of the block, as well as putting the pages into
@@ -87,7 +97,7 @@ module Cms
87
97
 
88
98
  #Get all the pages the previous version of this connectable was connected to
89
99
  draft_version = draft.version
90
- connected_pages = Page.connected_to(:connectable => self, :version => (draft_version - 1)).all
100
+ connected_pages = Page.connected_to(:connectable => self, :version => (draft_version - 1)).to_a
91
101
  # puts "Found #{connected_pages}"
92
102
  connected_pages.each do |p|
93
103
  # This is needed in the case of updating page,
@@ -95,7 +105,7 @@ module Cms
95
105
  if p != updated_by_page
96
106
  #This just creates a new version of the page
97
107
  action = deleted? ? "Deleted" : "Edited"
98
- p.update_attributes(:version_comment => "#{self.class.name.demodulize} ##{id} was #{action}")
108
+ p.update_attributes(:version_comment => "#{self.class.name.demodulize} ##{id} was #{action}", :publish_on_save=>false)
99
109
 
100
110
  #The previous step will copy over a connector pointing to the previous version of this connectable
101
111
  #We need to change that to point at the new version of this connectable
@@ -128,7 +128,7 @@ module Cms
128
128
  include InstanceMethods
129
129
 
130
130
  # Provide default options
131
- options[:class_name] ||= self.model_name + 'Attribute'
131
+ options[:class_name] ||= "#{self.model_name}Attribute"
132
132
  options[:table_name] ||= options[:class_name].tableize
133
133
  options[:relationship_name] ||= options[:class_name].tableize.to_sym
134
134
  options[:foreign_key] ||= self.model_name.foreign_key
@@ -150,7 +150,7 @@ module Cms
150
150
  rescue
151
151
  Object.const_set(options[:class_name], Class.new(ActiveRecord::Base)).class_eval do
152
152
  self.table_name = options[:table_name]
153
- self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
153
+ #self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
154
154
 
155
155
  def self.reloadable? #:nodoc:
156
156
  false
@@ -167,7 +167,7 @@ module Cms
167
167
  attribute_class.class_eval do
168
168
  belongs_to base_class, :foreign_key => options[:base_foreign_key]
169
169
  alias_method :base, base_class # For generic access
170
- attr_accessible :name, :value, "#{base_class.to_s}_id".to_sym
170
+ #attr_accessible :name, :value, "#{base_class.to_s}_id".to_sym
171
171
  end
172
172
 
173
173
  # Modify main class
@@ -13,8 +13,8 @@ module Cms
13
13
  extend ClassMethods
14
14
  include InstanceMethods
15
15
 
16
- scope :hidden, :conditions => {:hidden => true}
17
- scope :not_hidden, :conditions => {:hidden => false}
16
+ scope :hidden, ->{where(:hidden => true)}
17
+ scope :not_hidden, ->{where(:hidden => false)}
18
18
  end
19
19
  end
20
20
  module ClassMethods
@@ -1,45 +1,15 @@
1
1
  module Cms
2
2
 
3
- # Provides a global configuration setting to set a table prefix for all CMS tables.
4
- #
5
- # For example, Cms.table_prefix = "cms_" would create tables like:
6
- # cms_html_blocks cms_pages
7
- # rather than
8
- # html_blocks pages
9
- #
3
+ # @deprecated To be removed in BrowserCMS 4.1 or later.
10
4
  def self.table_prefix=(prefix)
11
- @table_prefix = prefix
12
- end
13
-
14
-
15
- # Returns the table name prefix for models in the Cms:: Namespace
16
- # Prefer calling table_name_prefix to this methods
17
- # @return [String] nil if no namespace has been set.
18
- #
19
- def self.table_prefix
20
- @table_prefix
21
- end
22
-
23
- # By setting this, ActiveRecord will automatically prefix all tables in the Cms:: module to start with the value of prefix_
24
- # Defaults to "" if not specified.
25
- def self.table_name_prefix
26
- self.table_prefix ? self.table_prefix : ""
27
- end
28
-
29
- module Namespacing
30
-
31
- def self.prefixed_table_name(unprefixed_name)
32
- "#{Cms.table_prefix}#{unprefixed_name}"
33
- end
34
- def self.prefix(unprefixed_name)
35
- self.prefixed_table_name(unprefixed_name)
36
- end
5
+ message = "Calling Cms.table_prefix('#{prefix}') is no longer necessary and can be removed from your project. See https://github.com/browsermedia/browsercms/issues/639"
6
+ ActiveSupport::Deprecation.warn(message, caller(1))
37
7
  end
38
8
 
39
9
  module Behaviors
40
- # Noop - This will be automatically included on all ActiveRecord classes. I don't want to move this, so
41
- # I'm leaving it as a harmless NOOP for now.
42
10
  module Namespacing
11
+
12
+
43
13
  end
44
14
  end
45
- end
15
+ end
@@ -12,30 +12,28 @@ module Cms
12
12
  end
13
13
  end
14
14
  end
15
+
15
16
  module MacroMethods
16
17
  def publishable?
17
18
  !!@is_publishable
18
19
  end
20
+
19
21
  def is_publishable(options={})
20
22
  @is_publishable = true
21
23
  extend ClassMethods
22
24
  include InstanceMethods
23
-
24
- attr_accessor :publish_on_save
25
- attr_accessible :publish_on_save
26
25
 
26
+ #attr_accessible :publish_on_save, :as
27
27
  after_save :publish_for_non_versioned
28
-
29
- scope :published, :conditions => {:published => true}
30
- scope :unpublished, lambda {
31
- if versioned?
32
- { :joins => :versions,
33
- :conditions =>
34
- "#{connection.quote_table_name(version_table_name)}.#{connection.quote_column_name('version')} > " +
35
- "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name('version')}",
36
- :select => "distinct #{connection.quote_table_name(table_name)}.*" }
28
+
29
+ scope :published, -> { where(:published => true) }
30
+ scope :unpublished, -> {
31
+ if self.versioned?
32
+ q = "#{connection.quote_table_name(version_table_name)}.#{connection.quote_column_name('version')} > " +
33
+ "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name('version')}"
34
+ select("distinct #{connection.quote_table_name(table_name)}.*").where(q).joins(:versions)
37
35
  else
38
- { :conditions => { :published => false } }
36
+ where(:published => false)
39
37
  end
40
38
  }
41
39
 
@@ -44,6 +42,33 @@ module Cms
44
42
  module ClassMethods
45
43
  end
46
44
  module InstanceMethods
45
+
46
+ # Can specify whether to save this block as a draft using a terser syntax.
47
+ # These two calls behave identically
48
+ # - Cms::HtmlBlock.create(name: "Shorter", as: :draft)
49
+ # - Cms::HtmlBlock.create(name: "Longer", publish_on_save: false)
50
+ # @param [Symbol] status :draft to not publish on the next save. All other values are ignored.
51
+ def as=(status)
52
+ if status == :draft
53
+ self.publish_on_save = false
54
+ end
55
+ end
56
+
57
+ # Whether or not this object will be published the next time '.save' is called.
58
+ # @return [Boolean] True unless explicitly set otherwise.
59
+ def publish_on_save
60
+ if @publish_on_save.nil?
61
+ @publish_on_save = true
62
+ end
63
+ @publish_on_save
64
+ end
65
+
66
+ # Set whether or not this object will be published next time '.save' is called.
67
+ # This status resets to true after calling '.save'
68
+ def publish_on_save=(publish)
69
+ @publish_on_save = publish
70
+ end
71
+
47
72
  def publishable?
48
73
  if self.class.connectable?
49
74
  new_record? ? connect_to_page_id.blank? : connected_page_count < 1
@@ -51,7 +76,7 @@ module Cms
51
76
  true
52
77
  end
53
78
  end
54
-
79
+
55
80
  def publish_for_non_versioned
56
81
  unless self.class.versioned?
57
82
  if @publish_on_save
@@ -60,34 +85,40 @@ module Cms
60
85
  end
61
86
  end
62
87
  end
63
-
88
+
89
+ def publish_if_needed
90
+ if publish_on_save
91
+ publish
92
+ else
93
+ self.publish_on_save = true
94
+ end
95
+ end
96
+
97
+ # Publishes the latest previously saved version of content as published. This will not create a new version,
98
+ # and will not persist changes made to a record.
99
+ #
100
+ # @return [Boolean] true if there was a draft record that was published, false otherwise.
64
101
  def publish
65
102
  publish!
66
- true
67
103
  rescue Exception => e
68
104
  logger.warn("Could not publish, #{e.class}: #{e.message}\n#{e.backtrace.join("\n")}")
69
105
  false
70
106
  end
71
107
 
72
- # Force the publishing of this block.
73
- #
74
- # Warning: The behavior of calling the following on an existing block:
75
- # block.save_on_publish = true
76
- # block.save!
77
- #
78
- # Is different than calling:
79
- # block.publish!
80
- #
81
- # And it probably shouldn't be. Try to merge the 'else' with the 'Versioning#create_or_update' method to eliminate duplication.
82
- #
83
- # In addition, after_publish is NOT called if you do:
84
- # block.save_on_publish = true
85
- # block.save!
86
- # which will cause problems if blocks are updated via the method (like with the UI)
108
+ # Saves a draft copy of this content item. This will create a new record in the _versions table for this item, but
109
+ # will not update the existing published record.
110
+ def save_draft
111
+ self.publish_on_save = false
112
+ save
113
+ end
114
+
115
+ # Publishes the latest draft version of a block. See .publish for more documentation. Can throw errors if publishing failed for unexpected reasons.
116
+ # Note: Having separate .publish! and .publish methods is probably no longer necessary. In practice, only .publish is probably needed.
117
+ # @return [Boolean] true if the block had a draft that was published, false otherwise.
87
118
  def publish!
119
+ did_publish = false
88
120
  if new_record?
89
- self.publish_on_save = true
90
- save!
121
+ ActiveSupport::Deprecation.warn "Calling .publish! on a new record no longer saves the record. Call '.save' to persist and publish the record.", caller
91
122
  else
92
123
  # Do this for publishing existing blocks.
93
124
  transaction do
@@ -97,11 +128,11 @@ module Cms
97
128
  # We only need to publish if this isn't already published
98
129
  # or the draft version is greater than the live version
99
130
  if !self.published? || d.version > self.version
100
-
131
+
101
132
  d.update_attributes(:published => true)
102
133
 
103
134
  # copy values from the draft to the main record
104
- quoted_attributes = d.send(:arel_attributes_values, false, false, self.class.versioned_columns)
135
+ quoted_attributes = d.send(:arel_attributes_with_values_for_update, self.class.versioned_columns)
105
136
 
106
137
  #the values from the draft MAY have a relation of the versioned module
107
138
  #as opposed to the actual class itself
@@ -110,26 +141,29 @@ module Cms
110
141
  #I haven't figured out why this is, but I know it happens when you call save! on Page
111
142
  #during seeding of data
112
143
  if self.class.arel_table.name != quoted_attributes.keys[0].relation.name
113
- quoted_attributes = quoted_attributes.inject({}){|hash, pair| hash[self.class.arel_table[pair[0].name]] = pair[1]; hash}
144
+ quoted_attributes = quoted_attributes.inject({}) { |hash, pair| hash[self.class.arel_table[pair[0].name]] = pair[1]; hash }
114
145
  end
115
146
 
116
147
  # Doing the SQL ourselves to avoid callbacks
117
148
  self.class.unscoped.where(self.class.arel_table[self.class.primary_key].eq(id)).arel.update(quoted_attributes)
149
+ did_publish = true
118
150
  end
119
151
  else
120
- connection.update(
121
- "UPDATE #{self.class.quoted_table_name} " +
122
- "SET published = #{connection.quote(true, self.class.columns_hash["published"])} " +
123
- "WHERE #{connection.quote_column_name(self.class.primary_key)} = #{quote_value(id)}",
124
- "#{self.class.name.demodulize} Publish"
152
+ self.class.connection.update(
153
+ "UPDATE #{self.class.quoted_table_name} " +
154
+ "SET published = #{self.class.connection.quote(true, self.class.columns_hash["published"])} " +
155
+ "WHERE #{self.class.connection.quote_column_name(self.class.primary_key)} = #{self.class.quote_value(id)}",
156
+ "#{self.class.name.demodulize} Publish"
125
157
  )
158
+ did_publish = true
126
159
  end
127
160
  after_publish if respond_to?(:after_publish)
128
161
  end
129
162
  self.published = true
130
163
  end
131
- end
132
-
164
+ did_publish
165
+ end
166
+
133
167
  def status
134
168
  return @status if @status
135
169
  @status = live? ? :published : :draft
@@ -139,9 +173,22 @@ module Cms
139
173
  status.to_s.titleize
140
174
  end
141
175
 
176
+ # Determines if this resource is in draft mode or not. Opposite of #live?
177
+ #
178
+ # @return [Boolean] true if the latest version of the resource is a draft.
179
+ def draft?
180
+ !live?
181
+ end
182
+
183
+ # Determines if this resource is in published or not.
184
+ #
185
+ # @return [Boolean] true if the latest version of the resource is published.
142
186
  def live?
143
187
  if self.class.versioned?
144
- if (respond_to?(:latest_version) && self.latest_version)
188
+ unless persisted?
189
+ return false
190
+ end
191
+ if respond_to?(:latest_version) && self.latest_version
145
192
  version == latest_version && published?
146
193
  else
147
194
  live_version.version == draft.version && published?
@@ -150,7 +197,7 @@ module Cms
150
197
  true
151
198
  end
152
199
  end
153
-
200
+
154
201
  end
155
202
  end
156
203
  end