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
@@ -5,22 +5,65 @@
5
5
  module Cms
6
6
  module RenderingHelper
7
7
 
8
+ def page_content_iframe(path)
9
+ content_tag "iframe", "" , src: path, id: 'page_content', frameborder: 0, width: '100%', height: '80%'
10
+ #<iframe id="page_content" src="<%= url_for engine_aware_path(@block, :inline) %>" frameborder="0" width="100%" height="80%"></iframe>
11
+
12
+ end
13
+ # Renders the content for the given field from the current content block.
14
+ # Designed to be used in Block Templates instead of direct output of fields.
15
+ # Example:
16
+ # <pre><%= show :content %></pre>
17
+ # Instead of:
18
+ # <pre><%= @content_block.content.html_safe %></pre>
19
+ #
20
+ # Why bother?: This abstracts the actual variable name (makes future upgrades more robust),
21
+ # as well as let us mark up the content with html_safe,
22
+ # plus conditionally make fields editable.
23
+ #
24
+ # @param [Symbol] method
25
+ # @param [Hash] options
26
+ def show(method, options={})
27
+ if (!is_current_user_able_to_edit_this_content?(@content_block)) # Need to check the current user can edit the page attached to this block too
28
+ value = @content_block.send(method)
29
+ value.respond_to?(:html_safe) ? value.html_safe : value
30
+ else
31
+ content_tag 'div',
32
+ id: random_unique_identifier(),
33
+ class: 'content-block',
34
+ contenteditable: true,
35
+ data: {
36
+ content_name: @content_block.content_name,
37
+ id: @content_block.id,
38
+ attribute: method,
39
+ page_id: @page.id
40
+
41
+ } do
42
+ content = @content_block.send(method)
43
+ content.to_s.html_safe
44
+ end
45
+ end
46
+
47
+ end
48
+
8
49
  # Renders a table of attachments for a given content block.
9
50
  # This is intended as a basic view of the content, and probably won't be suitable for blocks that need to be added directly to pages.
10
51
  #
11
52
  def attachment_viewer(content)
12
- render :partial => 'cms/attachments/attachment_table', :locals => { :block => content, :can_delete => false }
53
+ render :partial => 'cms/attachments/attachment_table', :locals => {:block => content, :can_delete => false}
13
54
  end
14
55
 
15
- # Determines if a user is currently editing this page
16
- def is_editing_page?(page)
17
- logged_in? && @mode == "edit" && current_user.able_to_edit?(page)
56
+ # Determines if the current user can edit and is currently editing this content.
57
+ def is_current_user_able_to_edit_this_content?(content)
58
+ content && logged_in? && edit_mode? && current_user.able_to_edit?(content)
18
59
  end
19
-
60
+
61
+ # @deprecated
62
+ alias :is_editing_page? :is_current_user_able_to_edit_this_content?
63
+
20
64
  def render_connector_and_connectable(connector, connectable)
21
- logger.debug "Rendering #{connectable} "
22
- if is_editing_page?(connector.page)
23
- render(:partial => 'cms/pages/edit_connector', :locals => { :connector => connector, :connectable => connectable})
65
+ if is_current_user_able_to_edit_this_content?(connector.page)
66
+ render(:partial => 'cms/pages/edit_content', :locals => {:connector => connector, :connectable => connectable})
24
67
  else
25
68
  render_connectable(connectable)
26
69
  end
@@ -29,19 +72,24 @@ module Cms
29
72
  def render_connectable(content_block)
30
73
  if content_block
31
74
  if content_block.class.renderable?
32
- logger.debug "Rendering connectable #{content_block.class} ##{content_block.id} #{"v#{content_block.version}" if content_block.respond_to?(:version)}"
75
+ Rails.logger.debug "Rendering connectable #{content_block.class} ##{content_block.id} #{"v#{content_block.version}" if content_block.respond_to?(:version)}"
33
76
  content_block.perform_render(controller)
34
77
  else
35
- logger.warn "Connectable #{content_block.class} ##{content_block.id} is not renderable"
78
+ Rails.logger.warn "Connectable #{content_block.class} ##{content_block.id} is not renderable"
36
79
  end
37
80
  else
38
- logger.warn "Connectable is null"
81
+ Rails.logger.warn "Connectable is null"
39
82
  end
40
83
  rescue Exception => e
41
- logger.error "Error occurred while rendering #{content_block.class}##{content_block.id}: #{e.message}\n#{e.backtrace.join("\n")}"
84
+ Rails.logger.error "Error occurred while rendering #{content_block.class}##{content_block.id}: #{e.message}\n#{e.backtrace.join("\n")}"
42
85
  "ERROR: #{e.message}"
43
86
  end
44
87
 
88
+ # Some content doesn't have inline editing, so we need to conditionally show move up/down/remove buttons on the page
89
+ def content_supports_inline_editing?(connector)
90
+ content = connector.connectable
91
+ content.supports_inline_editing?
92
+ end
45
93
  ##
46
94
  # Renders the toolbar for the CMS. All page templates need to include this or they won't be editable.
47
95
  # Typically rendered as an iframe to avoid CSS/JS conflicts.
@@ -51,5 +99,13 @@ module Cms
51
99
  def render_cms_toolbar(tab=:dashboard)
52
100
  render :partial => 'layouts/cms_toolbar', :locals => {:tab => tab}
53
101
  end
102
+
103
+ private
104
+
105
+ # Each block needs a unique id on the page so CKeditor can attach to it. Doesn't matter what it is though.
106
+ # This ensure that if the same block is add twice, it will still work.
107
+ def random_unique_identifier
108
+ SecureRandom.urlsafe_base64
109
+ end
54
110
  end
55
111
  end
@@ -1,51 +1,112 @@
1
1
  module Cms
2
2
  module SectionNodesHelper
3
3
 
4
- def access_status(section_node, public_sections)
5
- access_icon = :unlocked
6
- unless public_sections.include?(section_node)
7
- access_icon = :locked
4
+ def draggable_class?(modifiable_sections, section_node, parent)
5
+ if !section_node.root? && current_user_can_modify(modifiable_sections, section_node, parent)
6
+ 'draggable'
7
+ else
8
+ ''
8
9
  end
9
- access_icon
10
10
  end
11
11
 
12
- def section_icons(section_node, children=[])
13
- folder_style = ""
14
- expander_image = "expand.png"
15
- if top_level_section?(section_node)
16
- folder_style = " large"
17
- expander_image = "gray_expand.png"
12
+ def add_page_path_data(section_node, parent_section_node)
13
+ section = figure_out_target_section(parent_section_node, section_node)
14
+ new_section_page_path(section)
15
+ end
16
+
17
+ def add_link_path_data(section_node, parent_section_node)
18
+ section = figure_out_target_section(parent_section_node, section_node)
19
+ new_section_link_path(section)
20
+ end
21
+
22
+ def add_section_path_data(section_node, parent_section_node)
23
+ section = figure_out_target_section(parent_section_node, section_node)
24
+ new_section_path(section_id: section)
25
+ end
26
+
27
+ # When sitemap initially renders, we only want to show first level.
28
+ def initial_visibility_class(section_node)
29
+ section_node.depth > 1 ? 'hide' : ''
30
+ end
31
+
32
+ # Returns a css class for determine sitemap depth.
33
+ def sitemap_depth_class(section_node)
34
+ one_based_depth = section_node.depth + 1
35
+ "level-#{one_based_depth}"
36
+ end
37
+
38
+ # Generate HTML for 'hidden' icon for hidden content.
39
+ # @param [Object] content
40
+ # @return [String] HTML (HTML safe)
41
+ def hidden_icon_tag(content)
42
+ if content.respond_to?(:hidden?) && content.hidden?
43
+ '<span aria-hidden="true" class="permission-icon icon-eye-blocked"></span>'.html_safe
44
+ else
45
+ ''
18
46
  end
19
- if children.empty?
20
- image_tag("cms/sitemap/no_contents.png", :class => "no_folder_toggle#{folder_style}")
47
+ end
48
+
49
+ def guest_accessible_icon_tag(parent, content)
50
+ unless content.accessible_to_guests?(@public_sections, parent)
51
+ '<span aria-hidden="true" class="permission-icon icon-locked"></span>'.html_safe
21
52
  else
22
- image_tag("cms/sitemap/#{expander_image}", :class => "folder_toggle#{folder_style}")
53
+ ''
23
54
  end
24
55
  end
25
56
 
26
- # Renders the ul for a given node (Page/Section/Link/etc)
27
- # Default look:
28
- # - First level pages/sections use 'big' icons
29
- # - All non-first level items should be hidden.
30
- def sitemap_ul_tag(node)
31
- opts = {
32
- :id => "section_node_#{node.section_node.id}",
33
- :class => "section_node"
34
- }
35
- opts[:class] += " rootlet" if in_first_level?(node)
36
- opts[:style] = "display: none" unless in_first_level?(node)
37
- tag("ul", opts, true)
57
+ # Generate the HTML for a given section node.
58
+ def icon_tag(section_node, children)
59
+ name = if section_node.ancestors.size == 0
60
+ 'earth'
61
+ elsif section_node.home?
62
+ 'house'
63
+ elsif section_node.link?
64
+ 'link'
65
+ elsif section_node.page?
66
+ 'file'
67
+ elsif section_node.section? && children.empty?
68
+ 'folder-open'
69
+ elsif section_node.section?
70
+ 'folder'
71
+ else
72
+ 'list' # All other content types.
73
+ end
74
+ content_tag("span", "", {'aria-hidden' => true, class: "type-icon icon-#{name}"})
38
75
  end
39
76
 
40
- def in_first_level?(node)
41
- node.section_node.depth == 1
77
+ # Marks a section to determine if it can be opened/closed in the sitemap.
78
+ def closable_data(section_node, children)
79
+ if (section_node.root?)
80
+ false
81
+ elsif !children.empty?
82
+ true
83
+ else
84
+ false
85
+ end
42
86
  end
43
87
 
44
- private
88
+ def current_user_can_modify(modifiable_sections, section_node, parent_section_node)
89
+ if section_node.section?
90
+ modifiable_sections.include?(section_node.node)
91
+ else
92
+ modifiable_sections.include?(parent_section_node.node)
93
+ end
94
+ end
45
95
 
46
- def top_level_section?(node)
47
- node.depth <= 2
96
+ # Determines if a row is leaf or folder based on whether there are any subchildren.
97
+ def row_type_tag(section_node)
98
+ section_node.section? ? 'folder' : 'leaf'
48
99
  end
49
100
 
101
+ private
102
+
103
+ # Need to determine if we should be adding content to a node or its parent.
104
+ def figure_out_target_section(parent_section_node, section_node)
105
+ if section_node.section?
106
+ section_node.node
107
+ else
108
+ parent_section_node.node
109
+ end
110
+ end
50
111
  end
51
112
  end
@@ -0,0 +1,25 @@
1
+ module Cms
2
+ module Sites
3
+
4
+ # Override Devise Helpers to point to main_app rather than engine.
5
+ # Used for public site authentication.
6
+ module AuthenticationHelper
7
+
8
+ def new_session_path(resource_name)
9
+ main_app.new_cms_user_session_path
10
+ end
11
+
12
+ def session_path(resource_name)
13
+ main_app.cms_user_session_path
14
+ end
15
+
16
+ def password_path(resource_name)
17
+ main_app.cms_user_password_path
18
+ end
19
+
20
+ def new_password_path(resource_name)
21
+ main_app.forgot_password_path
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module Cms
2
+ module Sites
3
+
4
+ # A shim that can be added to Portlet helpers to provide Devise behavior.
5
+ module DeviseShimHelper
6
+
7
+ # Shim to ensure main_app. is available for this helper.
8
+ def main_app
9
+ Rails.application.class.routes.url_helpers
10
+ end
11
+
12
+ include DeviseHelper
13
+
14
+ # Use public routes (/login) for paths
15
+ include Cms::Sites::AuthenticationHelper
16
+
17
+
18
+ def resource
19
+ :cms_user
20
+ end
21
+
22
+ def resource_name
23
+ :cms_user
24
+ end
25
+
26
+ def devise_mapping
27
+ @devise_mapping ||= Devise.mappings[:cms_user]
28
+ end
29
+ end
30
+ end
31
+ end
@@ -10,13 +10,7 @@ module Cms
10
10
  helper Cms::PageHelper
11
11
  helper Cms::MenuHelper
12
12
  helper Cms::RenderingHelper
13
- helper do
14
- def cms_toolbar
15
- if current_user.able_to?(:administrate, :edit_content, :publish_content)
16
- %Q{<iframe src="#{cms.toolbar_path(:page_toolbar => 0)}" width="100%" height="100px" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" name="cms_toolbar"></iframe>}
17
- end
18
- end
19
- end
13
+
20
14
  end
21
15
  end
22
16
  end
@@ -1,27 +1,168 @@
1
1
  module Cms
2
+
3
+ # Defines functions for creating buttons and links using the CMS styling.
4
+ # I.e. Menus, Save, Publish buttons and links.
2
5
  module UiElementsHelper
3
6
 
7
+ def cancel_button(location, label="Cancel")
8
+ klass = ['btn']
9
+ klass << 'btn-small' if location == :top
10
+ link_to label, :back, class: klass
11
+ end
12
+
13
+ def button_menu(location)
14
+ container_class = location == :top ? 'span6 top-buttons' : 'form-actions clearfix'
15
+ container_element = location == :top ? 'span' : 'div'
16
+ content_tag container_element, class: container_class do
17
+ yield if block_given?
18
+ end
19
+ end
20
+
21
+ def page_title_with_buttons(form, partial_name="buttons")
22
+ render(partial: partial_name, locals: {f: form, location: :top}, layout: 'page_title')
23
+ end
24
+
25
+ def bottom_buttons(form, partial_name="buttons")
26
+ render(partial: partial_name, locals: {f: form, location: :bottom}, layout: 'row')
27
+ end
28
+
29
+ # @deprecated Everything below.
30
+
4
31
  # Renders a Save And Publish button if:
5
32
  # 1. Current User has publish rights
6
33
  # 2. Block is publishable
7
34
  def save_and_publish_button(block, content_type)
8
35
  if current_user.able_to?(:publish_content) && block.publishable?
9
- html = %Q{<button type="submit" name="#{content_type.content_block_type.singularize}[publish_on_save]" value="true" class="submit" tabindex="#{next_tabindex}"><span>Save And Publish</span></button>}
10
- lt_button_wrapper html.html_safe
36
+ html = %Q{<button type="submit" name="#{content_type.content_block_type.singularize}[publish_on_save]" value="true" class="submit btn btn-primary" tabindex="#{next_tabindex}"><span>Save And Publish</span></button>}
37
+ html.html_safe
11
38
  end
12
39
  end
13
40
 
14
41
  # For simple publish buttons
15
42
  def publish_button(type)
16
- html = %Q{<button type="submit" name="#{type}[publish_on_save]" value="true" class="submit"><span>Save And Publish</span></button>'}
17
- lt_button_wrapper html.html_safe
43
+ html = %Q{<button type="submit" name="#{type}[publish_on_save]" value="true" class="submit btn btn-primary"><span>Save And Publish</span></button>'}
44
+ html.html_safe
45
+ end
46
+
47
+ # Renders a Publish button for the menu based on whether:
48
+ # 1. The current user can publish
49
+ # 2. The content item can or needs to be published.
50
+ def publish_menu_button(content_item)
51
+ options = {class: ["btn", "btn-primary", "http_put"], id: "publish_button"}
52
+ path = "#"
53
+ if current_user.able_to?(:publish_content) && !content_item.new_record? && content_item.respond_to?(:live?) && !content_item.live?
54
+ path = engine(@block).polymorphic_path([:publish, @block])
55
+ else
56
+ options[:class] << "disabled"
57
+ end
58
+ link_to "Publish", path, options
59
+ end
60
+
61
+ def edit_content_menu_button(content_item)
62
+ path = "#"
63
+ unless content_item.new_record?
64
+ path = edit_engine_aware_path(content_item)
65
+ end
66
+ link_to "Edit Content", path, class: "btn btn-primary", id: "edit_button"
67
+ end
68
+
69
+ def view_content_menu_button(content_item)
70
+ path = "#"
71
+ unless content_item.new_record?
72
+ path = engine_aware_path(content_item, nil)
73
+ end
74
+ link_to "View Content", path, class: "btn btn-primary", id: "view_button"
75
+ end
76
+
77
+
78
+ # Generic bootstrap based menu button
79
+ # @param [Hash] options
80
+ # @option options [Boolean] :enabled
81
+ # @option options [Array<String>] :class An array of additional classes to apply
82
+ def menu_button(label, path, options={})
83
+ defaults = {
84
+ enabled: true,
85
+ pull: 'left'
86
+ }
87
+ options = defaults.merge!(options)
88
+ options[:class] = %w{btn btn-primary}
89
+ if (options[:pull] == 'left' || options[:pull]== 'right')
90
+ options[:class] << "pull-#{options.delete(:pull)}"
91
+ end
92
+
93
+ options[:class] << 'disabled' unless options[:enabled]
94
+ options.delete(:enabled)
95
+ options[:class] << 'http_put' if options[:method] == :put
96
+ options[:class] << 'http_delete' if options[:method] == :delete
97
+ options[:class] << 'confirm_with_title' if options[:method] == :delete
98
+
99
+ options.delete(:method)
100
+ copy_title(options, options)
101
+ link_to(label, path, options)
18
102
  end
19
103
 
104
+ def versions_menu_button(content_item)
105
+ options = {class: ["btn", "btn-primary"], id: "revisions_button"}
106
+ path = "#"
107
+ if !content_item.new_record? && content_item.class.versioned?
108
+ path = engine(content_item).polymorphic_path([:versions, content_item])
109
+ else
110
+ options[:class] << "disabled"
111
+ end
112
+ link_to "List Versions", path, options
113
+ end
114
+
115
+ # Render a CMS styled 'Delete' button. This button will appear on tool bars, typically set apart visually from other buttons.
116
+ # Has a 'confirm?' popup attached to it as well.
117
+ # Assumes that javascript code to handle the 'confirm' has already been included in the page.
118
+ #
119
+ def delete_menu_button(content_item=nil, opts={class: []})
120
+ classes = ["btn", "http_delete", "confirm_with_title"]
121
+ if current_user.able_to_publish?(content_item)
122
+ classes << 'btn-primary'
123
+ else
124
+ classes << 'disabled'
125
+ end
126
+
127
+ link_to_path = "#"
128
+ options = {:id => 'delete_button', :class => classes}
129
+ options[:class].concat(opts[:class]) if opts[:class]
130
+
131
+ if content_item == nil || content_item.new_record?
132
+ classes << 'disabled'
133
+ else
134
+ options[:title] = "Are you sure you want to delete '#{content_item.name}'?"
135
+ link_to_path = engine_aware_path(content_item, nil)
136
+ end
137
+ if opts[:title]
138
+ options[:title] = opts[:title]
139
+ end
140
+ link_to "Delete", link_to_path, options
141
+ end
20
142
 
21
143
  def select_content_type_tag(type, &block)
22
- options = {:rel => "select-#{type.key}"}
23
- options[:class] = "on" if content_type == type
144
+ options = {:rel => "select-#{type.param_key}"}
145
+ if (defined?(content_type) && content_type == type)
146
+ options[:class] = "on"
147
+ end
24
148
  content_tag_for(:li, type, nil, options, &block)
25
149
  end
150
+
151
+ # Used by Twitter Bootstrap dropdown menus used to divide groups of menu items.
152
+ # @param [Integer] index
153
+ def divider_tag(index = 1)
154
+ content_tag(:li, "&nbsp;", {class: "divider"}) if index != 0
155
+ end
156
+
157
+ def nav_link_to(name, link, options={})
158
+ content_tag(:li, link_to(name, link, options))
159
+ end
160
+
161
+ private
162
+
163
+ def copy_title(from, to)
164
+ to[:title] = from[:title] if (!from[:title].blank? && from[:title].class == String)
165
+ end
166
+
26
167
  end
27
168
  end