browsercms-artirix 4.0.0.rc1.art4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (754) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +5 -0
  3. data/COPYRIGHT.txt +27 -0
  4. data/GPL.txt +674 -0
  5. data/LICENSE.txt +165 -0
  6. data/README.markdown +45 -0
  7. data/app/assets/fonts/icomoon.dev.svg +61 -0
  8. data/app/assets/fonts/icomoon.eot +0 -0
  9. data/app/assets/fonts/icomoon.svg +61 -0
  10. data/app/assets/fonts/icomoon.ttf +0 -0
  11. data/app/assets/fonts/icomoon.woff +0 -0
  12. data/app/assets/images/ckeditor/plugins/delete_content/icons/deletecontent.png +0 -0
  13. data/app/assets/images/ckeditor/plugins/edit_content/icons/editcontent.png +0 -0
  14. data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentdown.png +0 -0
  15. data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentup.png +0 -0
  16. data/app/assets/images/cms/administration/user_browser_bg.gif +0 -0
  17. data/app/assets/images/cms/arrow-down.png +0 -0
  18. data/app/assets/images/cms/arrow-up.png +0 -0
  19. data/app/assets/images/cms/bg.png +0 -0
  20. data/app/assets/images/cms/bl_curve.png +0 -0
  21. data/app/assets/images/cms/bottom_cap.png +0 -0
  22. data/app/assets/images/cms/bottom_cap_content.png +0 -0
  23. data/app/assets/images/cms/browse.gif +0 -0
  24. data/app/assets/images/cms/browser_media_logo.png +0 -0
  25. data/app/assets/images/cms/browsercms_logo.png +0 -0
  26. data/app/assets/images/cms/buttons/button.png +0 -0
  27. data/app/assets/images/cms/buttons/button_bg.png +0 -0
  28. data/app/assets/images/cms/buttons/button_cap.png +0 -0
  29. data/app/assets/images/cms/buttons/button_cap_h.png +0 -0
  30. data/app/assets/images/cms/buttons/button_cap_off.gif +0 -0
  31. data/app/assets/images/cms/buttons/button_cap_off_middle.gif +0 -0
  32. data/app/assets/images/cms/buttons/button_h.png +0 -0
  33. data/app/assets/images/cms/buttons/button_left_bg.png +0 -0
  34. data/app/assets/images/cms/buttons/button_off.png +0 -0
  35. data/app/assets/images/cms/buttons/button_off_middle.png +0 -0
  36. data/app/assets/images/cms/buttons/delete_x.png +0 -0
  37. data/app/assets/images/cms/buttons/delete_x_disabled.png +0 -0
  38. data/app/assets/images/cms/buttons/delete_x_h.png +0 -0
  39. data/app/assets/images/cms/buttons/sm_button.gif +0 -0
  40. data/app/assets/images/cms/buttons/sm_button_2.gif +0 -0
  41. data/app/assets/images/cms/buttons/sm_button_2_h.gif +0 -0
  42. data/app/assets/images/cms/buttons/sm_button_h.gif +0 -0
  43. data/app/assets/images/cms/cogs.png +0 -0
  44. data/app/assets/images/cms/containers/add.gif +0 -0
  45. data/app/assets/images/cms/containers/alpha.png +0 -0
  46. data/app/assets/images/cms/containers/beta.png +0 -0
  47. data/app/assets/images/cms/containers/delete.gif +0 -0
  48. data/app/assets/images/cms/containers/down.gif +0 -0
  49. data/app/assets/images/cms/containers/edit.gif +0 -0
  50. data/app/assets/images/cms/containers/up.gif +0 -0
  51. data/app/assets/images/cms/containers/view.gif +0 -0
  52. data/app/assets/images/cms/content_bg.gif +0 -0
  53. data/app/assets/images/cms/dashboard/bottom_cap.png +0 -0
  54. data/app/assets/images/cms/dashboard/bottom_cap_content.png +0 -0
  55. data/app/assets/images/cms/dashboard/header_bg.gif +0 -0
  56. data/app/assets/images/cms/dashboard/header_left_bg.gif +0 -0
  57. data/app/assets/images/cms/dashboard/home.png +0 -0
  58. data/app/assets/images/cms/dashboard/table_header_bg.gif +0 -0
  59. data/app/assets/images/cms/dashboard/top_cap.png +0 -0
  60. data/app/assets/images/cms/dashed.gif +0 -0
  61. data/app/assets/images/cms/datepicker/clear.gif +0 -0
  62. data/app/assets/images/cms/datepicker/close.gif +0 -0
  63. data/app/assets/images/cms/dk_button_l.gif +0 -0
  64. data/app/assets/images/cms/dk_button_r.gif +0 -0
  65. data/app/assets/images/cms/dot.png +0 -0
  66. data/app/assets/images/cms/draft_status.gif +0 -0
  67. data/app/assets/images/cms/file-uploading.gif +0 -0
  68. data/app/assets/images/cms/gray_long_bg.gif +0 -0
  69. data/app/assets/images/cms/home.png +0 -0
  70. data/app/assets/images/cms/icons/actions/add.png +0 -0
  71. data/app/assets/images/cms/icons/actions/config.png +0 -0
  72. data/app/assets/images/cms/icons/actions/connect.png +0 -0
  73. data/app/assets/images/cms/icons/actions/delete.png +0 -0
  74. data/app/assets/images/cms/icons/actions/down.png +0 -0
  75. data/app/assets/images/cms/icons/actions/edit.png +0 -0
  76. data/app/assets/images/cms/icons/actions/folder.png +0 -0
  77. data/app/assets/images/cms/icons/actions/folder_add.png +0 -0
  78. data/app/assets/images/cms/icons/actions/folder_delete.png +0 -0
  79. data/app/assets/images/cms/icons/actions/folder_edit.png +0 -0
  80. data/app/assets/images/cms/icons/actions/folder_move.png +0 -0
  81. data/app/assets/images/cms/icons/actions/folder_open.png +0 -0
  82. data/app/assets/images/cms/icons/actions/history.png +0 -0
  83. data/app/assets/images/cms/icons/actions/home.png +0 -0
  84. data/app/assets/images/cms/icons/actions/left.png +0 -0
  85. data/app/assets/images/cms/icons/actions/link.png +0 -0
  86. data/app/assets/images/cms/icons/actions/page.png +0 -0
  87. data/app/assets/images/cms/icons/actions/page_add.png +0 -0
  88. data/app/assets/images/cms/icons/actions/page_edit.png +0 -0
  89. data/app/assets/images/cms/icons/actions/page_move.png +0 -0
  90. data/app/assets/images/cms/icons/actions/redo.png +0 -0
  91. data/app/assets/images/cms/icons/actions/refresh.png +0 -0
  92. data/app/assets/images/cms/icons/actions/right.png +0 -0
  93. data/app/assets/images/cms/icons/actions/root_folder.png +0 -0
  94. data/app/assets/images/cms/icons/actions/root_link.png +0 -0
  95. data/app/assets/images/cms/icons/actions/root_page.png +0 -0
  96. data/app/assets/images/cms/icons/actions/undo.png +0 -0
  97. data/app/assets/images/cms/icons/actions/up.png +0 -0
  98. data/app/assets/images/cms/icons/actions/view.png +0 -0
  99. data/app/assets/images/cms/icons/file_types/doc.png +0 -0
  100. data/app/assets/images/cms/icons/file_types/file.png +0 -0
  101. data/app/assets/images/cms/icons/file_types/gif.png +0 -0
  102. data/app/assets/images/cms/icons/file_types/htm.png +0 -0
  103. data/app/assets/images/cms/icons/file_types/pdf.png +0 -0
  104. data/app/assets/images/cms/icons/file_types/ppt.png +0 -0
  105. data/app/assets/images/cms/icons/file_types/swf.png +0 -0
  106. data/app/assets/images/cms/icons/file_types/txt.png +0 -0
  107. data/app/assets/images/cms/icons/file_types/xls.png +0 -0
  108. data/app/assets/images/cms/icons/file_types/xml.png +0 -0
  109. data/app/assets/images/cms/icons/file_types/zip.png +0 -0
  110. data/app/assets/images/cms/icons/status/archived.gif +0 -0
  111. data/app/assets/images/cms/icons/status/draft.gif +0 -0
  112. data/app/assets/images/cms/icons/status/hidden.gif +0 -0
  113. data/app/assets/images/cms/icons/status/locked.gif +0 -0
  114. data/app/assets/images/cms/icons/status/published.gif +0 -0
  115. data/app/assets/images/cms/icons/status/unlocked.gif +0 -0
  116. data/app/assets/images/cms/icons/user.png +0 -0
  117. data/app/assets/images/cms/login_bg.jpg +0 -0
  118. data/app/assets/images/cms/login_bottom.jpg +0 -0
  119. data/app/assets/images/cms/login_top.gif +0 -0
  120. data/app/assets/images/cms/logo.png +0 -0
  121. data/app/assets/images/cms/lt_button_bg.gif +0 -0
  122. data/app/assets/images/cms/lt_button_l.gif +0 -0
  123. data/app/assets/images/cms/lt_button_r.gif +0 -0
  124. data/app/assets/images/cms/menu/block_cap_h.gif +0 -0
  125. data/app/assets/images/cms/menu/bottom_cap.png +0 -0
  126. data/app/assets/images/cms/menu/bottom_cap_menu.png +0 -0
  127. data/app/assets/images/cms/menu/bottom_cap_menu_first.png +0 -0
  128. data/app/assets/images/cms/menu/menu_header_first_bg.gif +0 -0
  129. data/app/assets/images/cms/menu/selected_block_cap.gif +0 -0
  130. data/app/assets/images/cms/menu/top_cap.png +0 -0
  131. data/app/assets/images/cms/menu/top_cap_menu_header.png +0 -0
  132. data/app/assets/images/cms/menu.png +0 -0
  133. data/app/assets/images/cms/menu_h.gif +0 -0
  134. data/app/assets/images/cms/menu_header.png +0 -0
  135. data/app/assets/images/cms/menu_open.png +0 -0
  136. data/app/assets/images/cms/menu_open_bg.gif +0 -0
  137. data/app/assets/images/cms/nav/on_bg.gif +0 -0
  138. data/app/assets/images/cms/nav.png +0 -0
  139. data/app/assets/images/cms/nav_admin.gif +0 -0
  140. data/app/assets/images/cms/nav_admin_h.gif +0 -0
  141. data/app/assets/images/cms/nav_admin_on.gif +0 -0
  142. data/app/assets/images/cms/nav_cap.png +0 -0
  143. data/app/assets/images/cms/nav_cap_h.gif +0 -0
  144. data/app/assets/images/cms/nav_content_library.gif +0 -0
  145. data/app/assets/images/cms/nav_content_library_h.gif +0 -0
  146. data/app/assets/images/cms/nav_content_library_on.gif +0 -0
  147. data/app/assets/images/cms/nav_dash.gif +0 -0
  148. data/app/assets/images/cms/nav_dash_h.gif +0 -0
  149. data/app/assets/images/cms/nav_dash_on.gif +0 -0
  150. data/app/assets/images/cms/nav_h.gif +0 -0
  151. data/app/assets/images/cms/nav_sitemap.gif +0 -0
  152. data/app/assets/images/cms/nav_sitemap_h.gif +0 -0
  153. data/app/assets/images/cms/nav_sitemap_on.gif +0 -0
  154. data/app/assets/images/cms/page_toolbar/page_toolbar_bg.gif +0 -0
  155. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_bg.gif +0 -0
  156. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_bg.gif +0 -0
  157. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_l.gif +0 -0
  158. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_draft_r.gif +0 -0
  159. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_l.gif +0 -0
  160. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_bg.gif +0 -0
  161. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_l.gif +0 -0
  162. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_published_r.gif +0 -0
  163. data/app/assets/images/cms/page_toolbar/page_toolbar_inset_r.gif +0 -0
  164. data/app/assets/images/cms/page_toolbar/page_toolbar_l.gif +0 -0
  165. data/app/assets/images/cms/page_toolbar/page_toolbar_r.gif +0 -0
  166. data/app/assets/images/cms/page_toolbar/status_draft_bg.gif +0 -0
  167. data/app/assets/images/cms/page_toolbar/status_draft_l.gif +0 -0
  168. data/app/assets/images/cms/page_toolbar/status_l.gif +0 -0
  169. data/app/assets/images/cms/page_toolbar/status_published_bg.gif +0 -0
  170. data/app/assets/images/cms/page_toolbar/status_published_l.gif +0 -0
  171. data/app/assets/images/cms/page_toolbar/visual_editor_bg.gif +0 -0
  172. data/app/assets/images/cms/page_toolbar/visual_editor_end.gif +0 -0
  173. data/app/assets/images/cms/page_toolbar/visual_editor_r.gif +0 -0
  174. data/app/assets/images/cms/page_toolbar/visual_editor_state_bg.gif +0 -0
  175. data/app/assets/images/cms/pages/add_connectable.gif +0 -0
  176. data/app/assets/images/cms/pages/connect_connectable.gif +0 -0
  177. data/app/assets/images/cms/pages/container_border.gif +0 -0
  178. data/app/assets/images/cms/pages/container_border_l.gif +0 -0
  179. data/app/assets/images/cms/pages/container_border_r.gif +0 -0
  180. data/app/assets/images/cms/pages/delete_connectable.gif +0 -0
  181. data/app/assets/images/cms/pages/down_connectable.gif +0 -0
  182. data/app/assets/images/cms/pages/down_connectable_disabled.gif +0 -0
  183. data/app/assets/images/cms/pages/edit_connectable.gif +0 -0
  184. data/app/assets/images/cms/pages/edit_connectable_2.gif +0 -0
  185. data/app/assets/images/cms/pages/show_connectable.gif +0 -0
  186. data/app/assets/images/cms/pages/up_connectable.gif +0 -0
  187. data/app/assets/images/cms/pages/up_connectable_disabled.gif +0 -0
  188. data/app/assets/images/cms/pagination/first.gif +0 -0
  189. data/app/assets/images/cms/pagination/first_h.gif +0 -0
  190. data/app/assets/images/cms/pagination/input.gif +0 -0
  191. data/app/assets/images/cms/pagination/last.gif +0 -0
  192. data/app/assets/images/cms/pagination/last_h.gif +0 -0
  193. data/app/assets/images/cms/pagination/next.gif +0 -0
  194. data/app/assets/images/cms/pagination/next_h.gif +0 -0
  195. data/app/assets/images/cms/pagination/previous.gif +0 -0
  196. data/app/assets/images/cms/pagination/previous_h.gif +0 -0
  197. data/app/assets/images/cms/pencil.png +0 -0
  198. data/app/assets/images/cms/plus.png +0 -0
  199. data/app/assets/images/cms/published_status.gif +0 -0
  200. data/app/assets/images/cms/search.png +0 -0
  201. data/app/assets/images/cms/search_submit.gif +0 -0
  202. data/app/assets/images/cms/search_submit_h.gif +0 -0
  203. data/app/assets/images/cms/searchbox_gradient.gif +0 -0
  204. data/app/assets/images/cms/select_bg.gif +0 -0
  205. data/app/assets/images/cms/select_bg_2.gif +0 -0
  206. data/app/assets/images/cms/sitemap/bottom_cap.png +0 -0
  207. data/app/assets/images/cms/sitemap/buffer_caps.png +0 -0
  208. data/app/assets/images/cms/sitemap/contract.png +0 -0
  209. data/app/assets/images/cms/sitemap/corners.gif +0 -0
  210. data/app/assets/images/cms/sitemap/corners_hover.gif +0 -0
  211. data/app/assets/images/cms/sitemap/divider.gif +0 -0
  212. data/app/assets/images/cms/sitemap/expand.png +0 -0
  213. data/app/assets/images/cms/sitemap/gradient.gif +0 -0
  214. data/app/assets/images/cms/sitemap/gray_contract.png +0 -0
  215. data/app/assets/images/cms/sitemap/gray_expand.png +0 -0
  216. data/app/assets/images/cms/sitemap/no_contents.png +0 -0
  217. data/app/assets/images/cms/sitemap/site_root_cap.png +0 -0
  218. data/app/assets/images/cms/sitemap/tooltip.gif +0 -0
  219. data/app/assets/images/cms/sitemap/top_cap_content.png +0 -0
  220. data/app/assets/images/cms/solid.gif +0 -0
  221. data/app/assets/images/cms/table/bl.gif +0 -0
  222. data/app/assets/images/cms/table/br.gif +0 -0
  223. data/app/assets/images/cms/table/divider.gif +0 -0
  224. data/app/assets/images/cms/table/td_cap_first_h.gif +0 -0
  225. data/app/assets/images/cms/table/td_cap_first_s.gif +0 -0
  226. data/app/assets/images/cms/table/td_cap_last_h.gif +0 -0
  227. data/app/assets/images/cms/table/td_cap_last_s.gif +0 -0
  228. data/app/assets/images/cms/table/td_last_bg.gif +0 -0
  229. data/app/assets/images/cms/table/th_bg.gif +0 -0
  230. data/app/assets/images/cms/table/th_divider.gif +0 -0
  231. data/app/assets/images/cms/table/th_last_bg.gif +0 -0
  232. data/app/assets/images/cms/table/tl.gif +0 -0
  233. data/app/assets/images/cms/table/tr.gif +0 -0
  234. data/app/assets/images/cms/table/tr_bg.gif +0 -0
  235. data/app/assets/images/cms/toolbar_bg.png +0 -0
  236. data/app/assets/images/cms/top_cap.png +0 -0
  237. data/app/assets/images/cms/top_cap_content.png +0 -0
  238. data/app/assets/images/cms/top_cap_menu_header.png +0 -0
  239. data/app/assets/images/cms/user.png +0 -0
  240. data/app/assets/images/cms/user_search_submit.gif +0 -0
  241. data/app/assets/images/cms/usercontrols_bg.png +0 -0
  242. data/app/assets/images/cms/usercontrols_bg_cap.png +0 -0
  243. data/app/assets/javascripts/bcms/ckeditor.js +8 -0
  244. data/app/assets/javascripts/bcms/ckeditor_inline.js +23 -0
  245. data/app/assets/javascripts/bcms/ckeditor_load.js +54 -0
  246. data/app/assets/javascripts/bcms/ckeditor_standard_config.js +10 -0
  247. data/app/assets/javascripts/ckeditor/plugins/delete_content/plugin.js +36 -0
  248. data/app/assets/javascripts/ckeditor/plugins/edit_content/plugin.js +24 -0
  249. data/app/assets/javascripts/ckeditor/plugins/move_content/plugin.js +25 -0
  250. data/app/assets/javascripts/cms/ajax.js +60 -0
  251. data/app/assets/javascripts/cms/application.js +18 -0
  252. data/app/assets/javascripts/cms/attachment_manager.js +88 -0
  253. data/app/assets/javascripts/cms/content_library.js +121 -0
  254. data/app/assets/javascripts/cms/content_types.js +13 -0
  255. data/app/assets/javascripts/cms/core_library.js.erb +210 -0
  256. data/app/assets/javascripts/cms/form_builder.js +250 -0
  257. data/app/assets/javascripts/cms/namespace.js +2 -0
  258. data/app/assets/javascripts/cms/new_content_button.js +27 -0
  259. data/app/assets/javascripts/cms/page_editor.js +189 -0
  260. data/app/assets/javascripts/cms/page_toolbar.js +13 -0
  261. data/app/assets/javascripts/cms/site.js +2 -0
  262. data/app/assets/javascripts/cms/sitemap.js +219 -0
  263. data/app/assets/javascripts/cms/toolbar.js +21 -0
  264. data/app/assets/javascripts/cms/user.js +40 -0
  265. data/app/assets/javascripts/jquery.exists.js +5 -0
  266. data/app/assets/javascripts/jquery.taglist.js +157 -0
  267. data/app/assets/stylesheets/cms/_assets.scss +60 -0
  268. data/app/assets/stylesheets/cms/_base.scss +42 -0
  269. data/app/assets/stylesheets/cms/_cms-buttons.scss +73 -0
  270. data/app/assets/stylesheets/cms/_cms-forms.scss +70 -0
  271. data/app/assets/stylesheets/cms/_colors.scss +20 -0
  272. data/app/assets/stylesheets/cms/_dashboard.scss +25 -0
  273. data/app/assets/stylesheets/cms/_glyph.scss +60 -0
  274. data/app/assets/stylesheets/cms/_main-area.scss +62 -0
  275. data/app/assets/stylesheets/cms/_nav.scss +197 -0
  276. data/app/assets/stylesheets/cms/_sidebar.scss +64 -0
  277. data/app/assets/stylesheets/cms/_sitemap.scss +209 -0
  278. data/app/assets/stylesheets/cms/_submenu.scss +48 -0
  279. data/app/assets/stylesheets/cms/application.scss +49 -0
  280. data/app/assets/stylesheets/cms/core.scss +96 -0
  281. data/app/assets/stylesheets/cms/default-forms.scss +3 -0
  282. data/app/assets/stylesheets/cms/includes/_animation.scss +2 -0
  283. data/app/assets/stylesheets/cms/includes/_rem.scss +120 -0
  284. data/app/assets/stylesheets/cms/includes/animation/_animate.scss +31 -0
  285. data/app/assets/stylesheets/cms/includes/animation/_core.scss +127 -0
  286. data/app/assets/stylesheets/cms/includes/animation/_shared.scss +22 -0
  287. data/app/assets/stylesheets/cms/includes/animation/animate/_attention-seekers.scss +152 -0
  288. data/app/assets/stylesheets/cms/includes/animation/animate/_bouncing.scss +3 -0
  289. data/app/assets/stylesheets/cms/includes/animation/animate/_classes.scss +21 -0
  290. data/app/assets/stylesheets/cms/includes/animation/animate/_fading.scss +3 -0
  291. data/app/assets/stylesheets/cms/includes/animation/animate/_flippers.scss +87 -0
  292. data/app/assets/stylesheets/cms/includes/animation/animate/_lightspeed.scss +24 -0
  293. data/app/assets/stylesheets/cms/includes/animation/animate/_rotating.scss +3 -0
  294. data/app/assets/stylesheets/cms/includes/animation/animate/_specials.scss +42 -0
  295. data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-entrances.scss +68 -0
  296. data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-exits.scss +60 -0
  297. data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-entrances.scss +86 -0
  298. data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-exits.scss +86 -0
  299. data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-entrances.scss +58 -0
  300. data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-exits.scss +58 -0
  301. data/app/assets/stylesheets/cms/page_content_editing.scss +4 -0
  302. data/app/assets/stylesheets/cms/page_editor.scss +4 -0
  303. data/app/assets/stylesheets/cms/style.scss +138 -0
  304. data/app/assets/stylesheets/cms/styles/_alerts.scss +150 -0
  305. data/app/assets/stylesheets/cms/styles/_base-grid.scss +299 -0
  306. data/app/assets/stylesheets/cms/styles/_buttons.scss +247 -0
  307. data/app/assets/stylesheets/cms/styles/_dropdown.scss +155 -0
  308. data/app/assets/stylesheets/cms/styles/_forms.scss +728 -0
  309. data/app/assets/stylesheets/cms/styles/_glyph.scss +86 -0
  310. data/app/assets/stylesheets/cms/styles/_images.scss +86 -0
  311. data/app/assets/stylesheets/cms/styles/_lists.scss +115 -0
  312. data/app/assets/stylesheets/cms/styles/_modal.scss +174 -0
  313. data/app/assets/stylesheets/cms/styles/_progress.scss +43 -0
  314. data/app/assets/stylesheets/cms/styles/_tables.scss +141 -0
  315. data/app/assets/stylesheets/cms/styles/_text.scss +134 -0
  316. data/app/controllers/cms/application_controller.rb +11 -0
  317. data/app/controllers/cms/attachments_controller.rb +48 -0
  318. data/app/controllers/cms/base_controller.rb +22 -0
  319. data/app/controllers/cms/cache_controller.rb +23 -0
  320. data/app/controllers/cms/categories_controller.rb +7 -0
  321. data/app/controllers/cms/category_types_controller.rb +12 -0
  322. data/app/controllers/cms/connectors_controller.rb +70 -0
  323. data/app/controllers/cms/content_block_controller.rb +361 -0
  324. data/app/controllers/cms/content_controller.rb +173 -0
  325. data/app/controllers/cms/content_types_controller.rb +14 -0
  326. data/app/controllers/cms/dashboard_controller.rb +13 -0
  327. data/app/controllers/cms/dynamic_views_controller.rb +81 -0
  328. data/app/controllers/cms/email_messages_controller.rb +21 -0
  329. data/app/controllers/cms/file_blocks_controller.rb +4 -0
  330. data/app/controllers/cms/form_entries_controller.rb +140 -0
  331. data/app/controllers/cms/form_fields_controller.rb +74 -0
  332. data/app/controllers/cms/forms_controller.rb +35 -0
  333. data/app/controllers/cms/groups_controller.rb +25 -0
  334. data/app/controllers/cms/home_controller.rb +10 -0
  335. data/app/controllers/cms/html_blocks_controller.rb +4 -0
  336. data/app/controllers/cms/image_blocks_controller.rb +4 -0
  337. data/app/controllers/cms/inline_content_controller.rb +50 -0
  338. data/app/controllers/cms/links_controller.rb +81 -0
  339. data/app/controllers/cms/page_components_controller.rb +20 -0
  340. data/app/controllers/cms/page_route_conditions_controller.rb +4 -0
  341. data/app/controllers/cms/page_route_options_controller.rb +58 -0
  342. data/app/controllers/cms/page_route_requirements_controller.rb +4 -0
  343. data/app/controllers/cms/page_routes_controller.rb +51 -0
  344. data/app/controllers/cms/pages_controller.rb +151 -0
  345. data/app/controllers/cms/passwords_controller.rb +22 -0
  346. data/app/controllers/cms/portlet_controller.rb +21 -0
  347. data/app/controllers/cms/portlets_controller.rb +35 -0
  348. data/app/controllers/cms/redirects_controller.rb +25 -0
  349. data/app/controllers/cms/resource_controller.rb +125 -0
  350. data/app/controllers/cms/routes_controller.rb +22 -0
  351. data/app/controllers/cms/section_nodes_controller.rb +24 -0
  352. data/app/controllers/cms/sections_controller.rb +100 -0
  353. data/app/controllers/cms/sessions_controller.rb +15 -0
  354. data/app/controllers/cms/sites/passwords_controller.rb +32 -0
  355. data/app/controllers/cms/sites/sessions_controller.rb +20 -0
  356. data/app/controllers/cms/tags_controller.rb +16 -0
  357. data/app/controllers/cms/tasks_controller.rb +56 -0
  358. data/app/controllers/cms/toolbar_controller.rb +18 -0
  359. data/app/controllers/cms/user_controller.rb +8 -0
  360. data/app/controllers/cms/users_controller.rb +125 -0
  361. data/app/controllers/tests/pretend_controller.rb +32 -0
  362. data/app/helpers/cms/application_helper.rb +258 -0
  363. data/app/helpers/cms/content_block_helper.rb +55 -0
  364. data/app/helpers/cms/content_types_helper.rb +4 -0
  365. data/app/helpers/cms/form_tag_helper.rb +36 -0
  366. data/app/helpers/cms/menu_helper.rb +167 -0
  367. data/app/helpers/cms/mobile_helper.rb +29 -0
  368. data/app/helpers/cms/nav_menu_helper.rb +23 -0
  369. data/app/helpers/cms/page_helper.rb +169 -0
  370. data/app/helpers/cms/path_helper.rb +113 -0
  371. data/app/helpers/cms/rendering_helper.rb +112 -0
  372. data/app/helpers/cms/section_nodes_helper.rb +112 -0
  373. data/app/helpers/cms/sites/authentication_helper.rb +25 -0
  374. data/app/helpers/cms/sites/devise_shim_helper.rb +31 -0
  375. data/app/helpers/cms/template_support.rb +18 -0
  376. data/app/helpers/cms/ui_elements_helper.rb +168 -0
  377. data/app/helpers/forgot_password_portlet_helper.rb +9 -0
  378. data/app/helpers/login_portlet_helper.rb +10 -0
  379. data/app/inputs/attachments_input.rb +14 -0
  380. data/app/inputs/cms_text_area_input.rb +10 -0
  381. data/app/inputs/date_picker_input.rb +8 -0
  382. data/app/inputs/file_picker_input.rb +75 -0
  383. data/app/inputs/name_input.rb +42 -0
  384. data/app/inputs/path_input.rb +18 -0
  385. data/app/inputs/tag_list_input.rb +3 -0
  386. data/app/inputs/template_editor_input.rb +24 -0
  387. data/app/inputs/text_editor_input.rb +19 -0
  388. data/app/models/cms/abstract_file_block.rb +50 -0
  389. data/app/models/cms/attachment.rb +267 -0
  390. data/app/models/cms/category.rb +56 -0
  391. data/app/models/cms/category_type.rb +43 -0
  392. data/app/models/cms/connector.rb +99 -0
  393. data/app/models/cms/content.rb +31 -0
  394. data/app/models/cms/content_type.rb +191 -0
  395. data/app/models/cms/dynamic_view.rb +81 -0
  396. data/app/models/cms/email_message.rb +63 -0
  397. data/app/models/cms/email_message_mailer.rb +12 -0
  398. data/app/models/cms/external_user.rb +60 -0
  399. data/app/models/cms/file_block.rb +19 -0
  400. data/app/models/cms/form.rb +47 -0
  401. data/app/models/cms/form_entry.rb +75 -0
  402. data/app/models/cms/form_field.rb +78 -0
  403. data/app/models/cms/group.rb +62 -0
  404. data/app/models/cms/group_permission.rb +12 -0
  405. data/app/models/cms/group_section.rb +9 -0
  406. data/app/models/cms/group_type.rb +16 -0
  407. data/app/models/cms/group_type_permission.rb +8 -0
  408. data/app/models/cms/guest_user.rb +57 -0
  409. data/app/models/cms/html_block.rb +38 -0
  410. data/app/models/cms/image_block.rb +23 -0
  411. data/app/models/cms/link.rb +20 -0
  412. data/app/models/cms/page.rb +437 -0
  413. data/app/models/cms/page_component.rb +43 -0
  414. data/app/models/cms/page_partial.rb +40 -0
  415. data/app/models/cms/page_route.rb +140 -0
  416. data/app/models/cms/page_route_condition.rb +5 -0
  417. data/app/models/cms/page_route_option.rb +7 -0
  418. data/app/models/cms/page_route_requirement.rb +5 -0
  419. data/app/models/cms/page_template.rb +45 -0
  420. data/app/models/cms/permission.rb +17 -0
  421. data/app/models/cms/persistent_user.rb +223 -0
  422. data/app/models/cms/portlet.rb +237 -0
  423. data/app/models/cms/redirect.rb +12 -0
  424. data/app/models/cms/search_filter.rb +18 -0
  425. data/app/models/cms/section.rb +224 -0
  426. data/app/models/cms/section_node.rb +144 -0
  427. data/app/models/cms/site.rb +45 -0
  428. data/app/models/cms/tag.rb +69 -0
  429. data/app/models/cms/tagging.rb +14 -0
  430. data/app/models/cms/task.rb +75 -0
  431. data/app/models/cms/templates.rb +31 -0
  432. data/app/models/cms/user.rb +43 -0
  433. data/app/models/cms/user_group_membership.rb +9 -0
  434. data/app/models/cms/view_context.rb +81 -0
  435. data/app/portlets/deprecated_placeholder.rb +12 -0
  436. data/app/portlets/dynamic_portlet.rb +7 -0
  437. data/app/portlets/email_page_portlet.rb +32 -0
  438. data/app/portlets/forgot_password_portlet.rb +15 -0
  439. data/app/portlets/helpers/cms/list_portlet_helper.rb +5 -0
  440. data/app/portlets/list_portlet.rb +40 -0
  441. data/app/portlets/login_portlet.rb +13 -0
  442. data/app/portlets/tag_cloud_portlet.rb +15 -0
  443. data/app/presenters/cms/user_presenter.rb +47 -0
  444. data/app/views/cms/application/_add_content_modal.html.erb +3 -0
  445. data/app/views/cms/application/_buttons.html.erb +7 -0
  446. data/app/views/cms/application/_exception.html.erb +6 -0
  447. data/app/views/cms/application/_form_errors.html.erb +7 -0
  448. data/app/views/cms/application/_form_with_buttons.html.erb +10 -0
  449. data/app/views/cms/application/_main_content.html.erb +3 -0
  450. data/app/views/cms/application/_main_with_sidebar.html.erb +8 -0
  451. data/app/views/cms/application/_mobile_toolbar.html.erb +16 -0
  452. data/app/views/cms/application/_page_title.html.erb +5 -0
  453. data/app/views/cms/application/_pagination.html.erb +26 -0
  454. data/app/views/cms/application/_row.html.erb +1 -0
  455. data/app/views/cms/application/_save_buttons.html.erb +7 -0
  456. data/app/views/cms/application/_sidebar_layout.html.erb +3 -0
  457. data/app/views/cms/application/_version.html.erb +23 -0
  458. data/app/views/cms/application/_version_conflict_diff.html.erb +11 -0
  459. data/app/views/cms/application/_version_conflict_error.html.erb +6 -0
  460. data/app/views/cms/attachments/_attachment.html.erb +16 -0
  461. data/app/views/cms/attachments/_attachment_manager.html.erb +39 -0
  462. data/app/views/cms/attachments/_attachment_table.html.erb +22 -0
  463. data/app/views/cms/attachments/_attachment_wrapper.html.erb +4 -0
  464. data/app/views/cms/attachments/_no_attachments_defined.html.erb +1 -0
  465. data/app/views/cms/cache/show.html.erb +7 -0
  466. data/app/views/cms/categories/_form.html.erb +27 -0
  467. data/app/views/cms/category_types/_form.html.erb +1 -0
  468. data/app/views/cms/connectors/new.html.erb +38 -0
  469. data/app/views/cms/content/editing_frame.html.erb +1 -0
  470. data/app/views/cms/content/no_page.html.erb +19 -0
  471. data/app/views/cms/content/show.html.erb +21 -0
  472. data/app/views/cms/content_block/_block_form.html.erb +15 -0
  473. data/app/views/cms/content_block/_buttonbar.html.erb +29 -0
  474. data/app/views/cms/content_block/_buttons.html.erb +13 -0
  475. data/app/views/cms/content_block/_hidden_fields.html.erb +13 -0
  476. data/app/views/cms/content_block/_sidebar.html.erb +36 -0
  477. data/app/views/cms/content_block/edit.html.erb +3 -0
  478. data/app/views/cms/content_block/index.html.erb +87 -0
  479. data/app/views/cms/content_block/new.html.erb +3 -0
  480. data/app/views/cms/content_block/render_block_in_main_container.html.erb +10 -0
  481. data/app/views/cms/content_block/show.html.erb +1 -0
  482. data/app/views/cms/content_block/show_in_isolation.html.erb +15 -0
  483. data/app/views/cms/content_block/versions.html.erb +24 -0
  484. data/app/views/cms/content_types/_order_field.html.erb +5 -0
  485. data/app/views/cms/content_types/index.html.erb +3 -0
  486. data/app/views/cms/dashboard/_page_drafts.html.erb +39 -0
  487. data/app/views/cms/dashboard/_tasks.html.erb +41 -0
  488. data/app/views/cms/dashboard/index.html.erb +13 -0
  489. data/app/views/cms/dynamic_views/_form.html.erb +9 -0
  490. data/app/views/cms/dynamic_views/edit.html.erb +2 -0
  491. data/app/views/cms/dynamic_views/index.html.erb +33 -0
  492. data/app/views/cms/dynamic_views/new.html.erb +2 -0
  493. data/app/views/cms/email_messages/index.html.erb +36 -0
  494. data/app/views/cms/email_messages/show.html.erb +50 -0
  495. data/app/views/cms/file_blocks/_form.html.erb +3 -0
  496. data/app/views/cms/file_blocks/_section_selector.html.erb +13 -0
  497. data/app/views/cms/file_blocks/render.html.erb +5 -0
  498. data/app/views/cms/forgot_password_mailer/reset_password.text.html.erb +3 -0
  499. data/app/views/cms/forgot_password_mailer/reset_password.text.plain.erb +3 -0
  500. data/app/views/cms/form_entries/_buttons.html.erb +2 -0
  501. data/app/views/cms/form_entries/_form.html.erb +7 -0
  502. data/app/views/cms/form_entries/_internal_form.html.erb +9 -0
  503. data/app/views/cms/form_entries/edit.html.erb +5 -0
  504. data/app/views/cms/form_entries/error.html.erb +3 -0
  505. data/app/views/cms/form_entries/index.html.erb +5 -0
  506. data/app/views/cms/form_entries/new.html.erb +5 -0
  507. data/app/views/cms/form_entries/show.html.erb +13 -0
  508. data/app/views/cms/form_entries/submit.html.erb +1 -0
  509. data/app/views/cms/form_fields/_form.html.erb +8 -0
  510. data/app/views/cms/form_fields/_select.html.erb +3 -0
  511. data/app/views/cms/form_fields/_text_area.html.erb +3 -0
  512. data/app/views/cms/form_fields/_text_field.html.erb +3 -0
  513. data/app/views/cms/form_fields/edit.html.erb +0 -0
  514. data/app/views/cms/form_fields/new.html.erb +26 -0
  515. data/app/views/cms/form_fields/preview.html.erb +16 -0
  516. data/app/views/cms/forms/_form.html.erb +67 -0
  517. data/app/views/cms/forms/render.html.erb +15 -0
  518. data/app/views/cms/forms/show.html.erb +6 -0
  519. data/app/views/cms/groups/_form.html.erb +38 -0
  520. data/app/views/cms/groups/_permissions.html.erb +14 -0
  521. data/app/views/cms/groups/_sections.html.erb +12 -0
  522. data/app/views/cms/groups/edit.html.erb +2 -0
  523. data/app/views/cms/groups/index.html.erb +36 -0
  524. data/app/views/cms/groups/new.html.erb +2 -0
  525. data/app/views/cms/html_blocks/_form.html.erb +3 -0
  526. data/app/views/cms/html_blocks/render.html.erb +1 -0
  527. data/app/views/cms/image_blocks/_form.html.erb +3 -0
  528. data/app/views/cms/image_blocks/render.html.erb +4 -0
  529. data/app/views/cms/links/_form.html.erb +8 -0
  530. data/app/views/cms/links/edit.html.erb +4 -0
  531. data/app/views/cms/links/new.html.erb +5 -0
  532. data/app/views/cms/menus/_menu.html.erb +9 -0
  533. data/app/views/cms/menus/_menu_item.html.erb +11 -0
  534. data/app/views/cms/page_components/_content.html.erb +18 -0
  535. data/app/views/cms/page_components/new.html.erb +12 -0
  536. data/app/views/cms/page_routes/_form.html.erb +12 -0
  537. data/app/views/cms/page_routes/edit.html.erb +2 -0
  538. data/app/views/cms/page_routes/index.html.erb +33 -0
  539. data/app/views/cms/page_routes/new.html.erb +2 -0
  540. data/app/views/cms/pages/_edit_content.html.erb +28 -0
  541. data/app/views/cms/pages/_form.html.erb +21 -0
  542. data/app/views/cms/pages/_main_form.html.erb +23 -0
  543. data/app/views/cms/pages/_simple_container.html.erb +8 -0
  544. data/app/views/cms/pages/edit.html.erb +2 -0
  545. data/app/views/cms/pages/new.html.erb +19 -0
  546. data/app/views/cms/pages/versions.html.erb +22 -0
  547. data/app/views/cms/passwords/new.html.erb +16 -0
  548. data/app/views/cms/redirects/_form.html.erb +7 -0
  549. data/app/views/cms/redirects/edit.html.erb +2 -0
  550. data/app/views/cms/redirects/index.html.erb +25 -0
  551. data/app/views/cms/redirects/new.html.erb +2 -0
  552. data/app/views/cms/routes/index.html.erb +35 -0
  553. data/app/views/cms/section_nodes/_children.html.erb +5 -0
  554. data/app/views/cms/section_nodes/_row_buttons.html.erb +11 -0
  555. data/app/views/cms/section_nodes/_section_node.html.erb +24 -0
  556. data/app/views/cms/section_nodes/_sitemap_buttons.html.erb +47 -0
  557. data/app/views/cms/section_nodes/_status.html.erb +5 -0
  558. data/app/views/cms/section_nodes/show.html.erb +9 -0
  559. data/app/views/cms/sections/_buttons.html.erb +6 -0
  560. data/app/views/cms/sections/_form.html.erb +30 -0
  561. data/app/views/cms/sections/edit.html.erb +4 -0
  562. data/app/views/cms/sections/new.html.erb +5 -0
  563. data/app/views/cms/sessions/new.html.erb +16 -0
  564. data/app/views/cms/shared/access_denied.html.erb +2 -0
  565. data/app/views/cms/shared/error.html.erb +40 -0
  566. data/app/views/cms/shared/error.xml.erb +8 -0
  567. data/app/views/cms/sites/_flash.html.erb +8 -0
  568. data/app/views/cms/sites/passwords/new.html.erb +2 -0
  569. data/app/views/cms/sites/sessions/new.html.erb +2 -0
  570. data/app/views/cms/tags/_form.html.erb +1 -0
  571. data/app/views/cms/tags/render.html.erb +52 -0
  572. data/app/views/cms/tasks/new.html.erb +22 -0
  573. data/app/views/cms/toolbar/_new_pages_menu.html.erb +10 -0
  574. data/app/views/cms/users/_form.html.erb +9 -0
  575. data/app/views/cms/users/_password.html.erb +2 -0
  576. data/app/views/cms/users/_user_fields.html.erb +7 -0
  577. data/app/views/cms/users/change_password.html.erb +12 -0
  578. data/app/views/cms/users/edit.html.erb +2 -0
  579. data/app/views/cms/users/index.html.erb +65 -0
  580. data/app/views/cms/users/new.html.erb +2 -0
  581. data/app/views/devise/confirmations/new.html.erb +16 -0
  582. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  583. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  584. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  585. data/app/views/devise/passwords/edit.html.erb +19 -0
  586. data/app/views/devise/passwords/new.html.erb +15 -0
  587. data/app/views/devise/registrations/edit.html.erb +28 -0
  588. data/app/views/devise/registrations/new.html.erb +18 -0
  589. data/app/views/devise/shared/_links.erb +25 -0
  590. data/app/views/devise/unlocks/new.html.erb +16 -0
  591. data/app/views/layouts/cms/_content_types.html.erb +13 -0
  592. data/app/views/layouts/cms/_footer.erb +4 -0
  593. data/app/views/layouts/cms/_head.html.erb +8 -0
  594. data/app/views/layouts/cms/_main_menu.html.erb +78 -0
  595. data/app/views/layouts/cms/application.html.erb +23 -0
  596. data/app/views/layouts/cms/content_page.html.erb +5 -0
  597. data/app/views/layouts/cms/page_editor.html.erb +90 -0
  598. data/app/views/portlets/deprecated_placeholders/_form.html.erb +1 -0
  599. data/app/views/portlets/deprecated_placeholders/render.html.erb +8 -0
  600. data/app/views/portlets/dynamic/_form.html.erb +3 -0
  601. data/app/views/portlets/email_page/_form.html.erb +5 -0
  602. data/app/views/portlets/email_page/render.html.erb +17 -0
  603. data/app/views/portlets/forgot_password/_form.html.erb +5 -0
  604. data/app/views/portlets/forgot_password/render.html.erb +2 -0
  605. data/app/views/portlets/list/_form.html.erb +33 -0
  606. data/app/views/portlets/list/_list.html.erb +6 -0
  607. data/app/views/portlets/list/_table.html.erb +13 -0
  608. data/app/views/portlets/list/render.html.erb +1 -0
  609. data/app/views/portlets/login/_form.html.erb +4 -0
  610. data/app/views/portlets/login/render.html.erb +10 -0
  611. data/app/views/portlets/portlets/_form.html.erb +20 -0
  612. data/app/views/portlets/tag_cloud/_form.html.erb +4 -0
  613. data/app/views/portlets/tag_cloud/render.html.erb +5 -0
  614. data/app/views/tests/pretend/open_with_layout.html.erb +5 -0
  615. data/bin/bcms +321 -0
  616. data/bin/browsercms +4 -0
  617. data/bin/rake +16 -0
  618. data/config/routes.rb +135 -0
  619. data/db/browsercms.seeds.rb +63 -0
  620. data/db/migrate/20080815014337_browsercms300.rb +287 -0
  621. data/db/migrate/20130327184912_browsercms400.rb +120 -0
  622. data/db/migrate/20150715173336_create_default_users.rb +12 -0
  623. data/db/seeds.rb +1 -0
  624. data/doc/README_FOR_APP +6 -0
  625. data/doc/design/blue_button.psd +0 -0
  626. data/doc/design/gray_box.psd +0 -0
  627. data/doc/design/main_nav.psd +0 -0
  628. data/doc/features/design_integration.md +45 -0
  629. data/doc/features/external_user.md +7 -0
  630. data/doc/features/form_builder.md +40 -0
  631. data/doc/features/simple_form_refactor.md +60 -0
  632. data/doc/performance_tuning_notes.md +12 -0
  633. data/doc/release_notes.md +837 -0
  634. data/doc/test_procedure.txt +141 -0
  635. data/lib/acts_as_list.rb +257 -0
  636. data/lib/browsercms-artirix.rb +1 -0
  637. data/lib/browsercms.rb +73 -0
  638. data/lib/cms/acts/cms_user.rb +131 -0
  639. data/lib/cms/acts/content_block.rb +61 -0
  640. data/lib/cms/acts/content_page.rb +90 -0
  641. data/lib/cms/acts.rb +7 -0
  642. data/lib/cms/admin_tab.rb +15 -0
  643. data/lib/cms/attachments/attachment_serving.rb +59 -0
  644. data/lib/cms/attachments/configuration.rb +88 -0
  645. data/lib/cms/authentication/controller.rb +120 -0
  646. data/lib/cms/authentication/test_password_strategy.rb +28 -0
  647. data/lib/cms/authentication.rb +4 -0
  648. data/lib/cms/authoring.rb +9 -0
  649. data/lib/cms/behaviors/archiving.rb +43 -0
  650. data/lib/cms/behaviors/attaching.rb +363 -0
  651. data/lib/cms/behaviors/categorizing.rb +31 -0
  652. data/lib/cms/behaviors/connecting.rb +141 -0
  653. data/lib/cms/behaviors/dynamic_attributes.rb +384 -0
  654. data/lib/cms/behaviors/flush_cache_on_change.rb +31 -0
  655. data/lib/cms/behaviors/hiding.rb +46 -0
  656. data/lib/cms/behaviors/namespacing.rb +15 -0
  657. data/lib/cms/behaviors/naming.rb +16 -0
  658. data/lib/cms/behaviors/publishing.rb +205 -0
  659. data/lib/cms/behaviors/rendering.rb +195 -0
  660. data/lib/cms/behaviors/searching.rb +45 -0
  661. data/lib/cms/behaviors/soft_deleting.rb +103 -0
  662. data/lib/cms/behaviors/taggable.rb +66 -0
  663. data/lib/cms/behaviors/userstamping.rb +42 -0
  664. data/lib/cms/behaviors/versioning.rb +360 -0
  665. data/lib/cms/behaviors.rb +34 -0
  666. data/lib/cms/caching.rb +62 -0
  667. data/lib/cms/commands/actions.rb +107 -0
  668. data/lib/cms/commands/to_version400.rb +10 -0
  669. data/lib/cms/concerns/can_be_addressable.rb +326 -0
  670. data/lib/cms/concerns/has_content_type.rb +46 -0
  671. data/lib/cms/concerns/ignores_publishing.rb +9 -0
  672. data/lib/cms/concerns.rb +7 -0
  673. data/lib/cms/configuration/configurable_template.rb +24 -0
  674. data/lib/cms/configuration/devise.rb +256 -0
  675. data/lib/cms/configuration.rb +79 -0
  676. data/lib/cms/configure_simple_form.rb +142 -0
  677. data/lib/cms/configure_simple_form_bootstrap.rb +58 -0
  678. data/lib/cms/content_filter.rb +18 -0
  679. data/lib/cms/content_page.rb +77 -0
  680. data/lib/cms/content_rendering_support.rb +114 -0
  681. data/lib/cms/controllers/admin_controller.rb +78 -0
  682. data/lib/cms/data_loader.rb +54 -0
  683. data/lib/cms/date_picker.rb +23 -0
  684. data/lib/cms/default_accessible.rb +13 -0
  685. data/lib/cms/domain_support.rb +38 -0
  686. data/lib/cms/engine.rb +135 -0
  687. data/lib/cms/engine_helper.rb +103 -0
  688. data/lib/cms/error_handling.rb +84 -0
  689. data/lib/cms/error_pages.rb +8 -0
  690. data/lib/cms/extensions/action_view/base.rb +13 -0
  691. data/lib/cms/extensions/active_model/name.rb +13 -0
  692. data/lib/cms/extensions/active_record/base.rb +37 -0
  693. data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +94 -0
  694. data/lib/cms/extensions/active_record/errors.rb +12 -0
  695. data/lib/cms/extensions/active_support/cache/file_store.rb +9 -0
  696. data/lib/cms/extensions/hash.rb +11 -0
  697. data/lib/cms/extensions/integer.rb +16 -0
  698. data/lib/cms/extensions/nil.rb +19 -0
  699. data/lib/cms/extensions/string.rb +24 -0
  700. data/lib/cms/extensions.rb +5 -0
  701. data/lib/cms/form_builder/content_block_form_builder.rb +45 -0
  702. data/lib/cms/form_builder/default_input.rb +13 -0
  703. data/lib/cms/form_builder/deprecated_inputs.rb +40 -0
  704. data/lib/cms/form_builder/workflow_buttons.rb +38 -0
  705. data/lib/cms/installation_actions.rb +8 -0
  706. data/lib/cms/mobile_aware.rb +67 -0
  707. data/lib/cms/module.rb +36 -0
  708. data/lib/cms/module_installation.rb +31 -0
  709. data/lib/cms/polymorphic_single_table_inheritance.rb +19 -0
  710. data/lib/cms/publish_workflow.rb +26 -0
  711. data/lib/cms/responders/content_responder.rb +14 -0
  712. data/lib/cms/route_extensions.rb +157 -0
  713. data/lib/cms/users_service.rb +208 -0
  714. data/lib/cms/version.rb +11 -0
  715. data/lib/command_line.rb +39 -0
  716. data/lib/generators/browser_cms/demo_site/USAGE +3 -0
  717. data/lib/generators/browser_cms/demo_site/templates/demo.seeds.rb +249 -0
  718. data/lib/generators/browser_cms/demo_site/templates/demo_site.rake +14 -0
  719. data/lib/generators/browser_cms/demo_site/templates/logo.jpg +0 -0
  720. data/lib/generators/browser_cms/demo_site/templates/splash.jpg +0 -0
  721. data/lib/generators/browser_cms/demo_site/templates/style.css +257 -0
  722. data/lib/generators/browser_cms.rb +12 -0
  723. data/lib/generators/cms/content_block/USAGE +22 -0
  724. data/lib/generators/cms/content_block/content_block_generator.rb +103 -0
  725. data/lib/generators/cms/content_block/templates/_form.html.erb +27 -0
  726. data/lib/generators/cms/content_block/templates/application_controller.rb.erb +4 -0
  727. data/lib/generators/cms/content_block/templates/render.html.erb +23 -0
  728. data/lib/generators/cms/install/USAGE +8 -0
  729. data/lib/generators/cms/install/install_generator.rb +16 -0
  730. data/lib/generators/cms/portlet/USAGE +26 -0
  731. data/lib/generators/cms/portlet/portlet_generator.rb +38 -0
  732. data/lib/generators/cms/portlet/templates/_form.html.erb +5 -0
  733. data/lib/generators/cms/portlet/templates/portlet.rb +12 -0
  734. data/lib/generators/cms/portlet/templates/portlet_helper.rb +5 -0
  735. data/lib/generators/cms/portlet/templates/render.html.erb +1 -0
  736. data/lib/generators/cms/portlet/templates/unit_test.erb +9 -0
  737. data/lib/generators/cms/project/USAGE +1 -0
  738. data/lib/generators/cms/project/templates/COPYRIGHT.txt +23 -0
  739. data/lib/generators/cms/project/templates/GPL.txt +674 -0
  740. data/lib/generators/cms/project/templates/LICENSE.txt +165 -0
  741. data/lib/generators/cms/project/templates/USAGE +3 -0
  742. data/lib/generators/cms/project/templates/devise.rb.erb +7 -0
  743. data/lib/generators/cms/project/templates/gitignore.erb +11 -0
  744. data/lib/generators/cms/project/templates/install_generator.erb +21 -0
  745. data/lib/generators/cms/project/templates/module_tasks.rake +10 -0
  746. data/lib/generators/cms/template/USAGE +10 -0
  747. data/lib/generators/cms/template/template_generator.rb +29 -0
  748. data/lib/generators/cms/template/templates/template.erb +2 -0
  749. data/lib/sequence.rb +6 -0
  750. data/lib/tasks/cms.rake +23 -0
  751. data/lib/templates/active_record/model/model.rb +17 -0
  752. data/vendor/assets/javascripts/jquery.cookie.js +91 -0
  753. data/vendor/assets/javascripts/jquery.selectbox.js +209 -0
  754. metadata +1048 -0
@@ -0,0 +1,24 @@
1
+ class TemplateEditorInput < SimpleForm::Inputs::TextInput
2
+
3
+ include Cms::FormBuilder::DefaultInput
4
+
5
+ def label(_wrapper_options = nil)
6
+ super if render_template_input?
7
+ end
8
+
9
+ def input(_wrapper_options = nil)
10
+ if render_template_input?
11
+ options[:default] = object.class.default_template
12
+ options[:default_handler] = "erb" unless options[:default_handler]
13
+ view = @builder.select "#{attribute_name}_handler", ActionView::Template.template_handler_extensions, selected: options[:default_handler]
14
+ view << '<br />'.html_safe
15
+ extract_default
16
+ view << @builder.text_area(attribute_name, input_html_options).html_safe
17
+ end
18
+ end
19
+
20
+ private
21
+ def render_template_input?
22
+ object.class.render_inline
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ class TextEditorInput < SimpleForm::Inputs::TextInput
2
+
3
+ def input(_wrapper_options)
4
+ tag_id = "#{object_name}_#{attribute_name}"
5
+ s = template.select_tag(:dhtml_selector,
6
+ template.options_for_select([["Rich Text", ""],["Simple Text", "disabled"]],
7
+ template.cookies[:editorEnabled] == 'true' ? "" : "disabled"),
8
+ :class => "#{object_name}_#{attribute_name}_dhtml_selector",
9
+ :tabindex => '-1',
10
+ :onchange => "toggleEditor('#{tag_id}', this)".html_safe)
11
+ s += template.content_tag(:div, super, class: 'editor')
12
+
13
+ end
14
+
15
+ # Mark textarea with class for WYSIWYG editor.
16
+ def input_html_classes
17
+ super.push('editor')
18
+ end
19
+ end
@@ -0,0 +1,50 @@
1
+ module Cms
2
+ class AbstractFileBlock < ActiveRecord::Base
3
+ self.table_name = "cms_file_blocks"
4
+
5
+ def self.with_parent_id(parent_id)
6
+ if parent_id == 'all'
7
+ where(true) # Empty scope for chaining
8
+ else
9
+ self.includes({:attachments => :section_node})
10
+ .references(:section_node)
11
+ .where(["#{"cms_section_nodes"}.ancestry = ?", Section.find(parent_id).ancestry_path])
12
+
13
+ end
14
+ end
15
+
16
+ validates_presence_of :name
17
+
18
+ # Return the parent section for this block.
19
+ # @return [Cms::Section]
20
+ def parent
21
+ file.parent
22
+ end
23
+
24
+ # Exists here so FileBrowser can polymorphically call file_size on Page, Images, Files, etc.
25
+ def file_size
26
+ file.size.round_bytes
27
+ end
28
+
29
+ def path
30
+ file.url
31
+ end
32
+
33
+ def self.publishable?
34
+ true
35
+ end
36
+
37
+ def set_attachment_path
38
+ if @attachment_file_path && @attachment_file_path != attachment.file_path
39
+ attachment.file_path = @attachment_file_path
40
+ end
41
+ end
42
+
43
+ def set_attachment_section
44
+ if @attachment_section_id && @attachment_section_id != attachment.section
45
+ attachment.section_id = @attachment_section_id
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,267 @@
1
+ module Cms
2
+ class Attachment < ActiveRecord::Base
3
+
4
+ MULTIPLE = 'multiple'
5
+
6
+ SANITIZATION_REGEXES = [[/\s/, '_'], [/[&+()]/, '-'], [/[=?!'"{}\[\]#<>%]/, '']]
7
+ #' this tic cleans up emacs ruby mode
8
+
9
+ self.table_name = :cms_attachments
10
+
11
+ cattr_accessor :definitions, :instance_writer => false
12
+ @@definitions = {}.with_indifferent_access
13
+ cattr_reader :configuration
14
+
15
+ before_validation :set_cardinality
16
+ before_save :set_section, :sanitized_file_path_and_name
17
+ before_create :setup_attachment
18
+
19
+ belongs_to :attachable, :polymorphic => true
20
+
21
+ extend DefaultAccessible
22
+
23
+ validates :attachment_name, :attachable_type, :presence => true
24
+
25
+ is_addressable
26
+ include Cms::Concerns::Addressable::DeprecatedPageAccessors
27
+
28
+ is_archivable; is_publishable; uses_soft_delete; is_userstamped; is_versioned
29
+
30
+ scope :named, lambda { |name|
31
+ {:conditions => {:attachment_name => name.to_s}}
32
+ }
33
+
34
+ scope :multiple, -> {where(:cardinality => MULTIPLE)}
35
+
36
+ FILE_BLOCKS = "Cms::AbstractFileBlock"
37
+ validates_presence_of :data_file_path, :if => Proc.new { |a| a.attachable_type == FILE_BLOCKS }
38
+ validates_uniqueness_of :data_file_path, :message =>"must be unique. (Another file, image or page is already using '%{value}').", :if => Proc.new { |a| a.attachable_type == FILE_BLOCKS }
39
+
40
+ class << self
41
+
42
+ def permitted_params
43
+ super + [:attachable_class, :data]
44
+ end
45
+ # Makes file paths more URL friendly
46
+ def sanitize_file_path(file_path)
47
+ SANITIZATION_REGEXES.inject(file_path.to_s) do |s, (regex, replace)|
48
+ s.gsub(regex, replace)
49
+ end
50
+ end
51
+
52
+ def definitions_for(klass, type)
53
+ definitions[klass].inject({}) { |d, (k, v)| d[k.capitalize] = v if v["type"] == type; d }
54
+ end
55
+
56
+ def configuration
57
+ @@configuration ||= Cms::Attachments.configuration
58
+ end
59
+
60
+ # Returns a Proc that can be used to dynamically determine styles based on the Cms::Attachment class
61
+ #
62
+ # Paperclip can handle a :styles parameter which responds to :call(Paperclip::Attachment)
63
+ def dynamically_return_styles
64
+ lambda do |paperclip_attachment|
65
+ cms_attachment = paperclip_attachment.instance
66
+
67
+ # Look up the style for the given block
68
+ if cms_attachment.has_assigned_content_type?
69
+ configuration_value(cms_attachment.content_block_class, cms_attachment.attachment_name, :styles)
70
+ else # New attachments that aren't associated with an Attaching type yet have no styles
71
+ {}
72
+ end
73
+ end
74
+ end
75
+
76
+ def find_live_by_file_path(path)
77
+ Attachment.published.not_archived.find_by_data_file_path path
78
+ end
79
+
80
+
81
+ def configure_paperclip
82
+ # @todo This might be better done using subclasses of Attachment for each document instance.
83
+ # We could use single table inheritance to avoid needing to do meta configurations.
84
+ has_attached_file :data,
85
+ :url => configuration.url,
86
+ :path => configuration.path,
87
+ :styles => dynamically_return_styles,
88
+
89
+ # Needed for versioning so that we keep all previous files.
90
+ :preserve_files => true,
91
+
92
+ #TODO: enable custom processors
93
+ :processors => configuration.processors,
94
+ :default_url => configuration.default_url,
95
+ :default_style => configuration.default_style,
96
+ :use_timestamp => configuration.use_timestamp,
97
+ :whiny => configuration.whiny,
98
+ :storage => rail_config(:storage),
99
+ :s3_credentials => rail_config(:s3_credentials),
100
+ :bucket => rail_config(:s3_bucket),
101
+ :s3_host_name => rail_config(:s3_host_name),
102
+ :s3_host_alias => rail_config(:s3_host_alias)
103
+
104
+ end
105
+
106
+ # Looks up a value from Rails config
107
+ def rail_config(key)
108
+ Rails.configuration.cms.attachments[key]
109
+ end
110
+
111
+ # Looks up the configuration value given:
112
+ # @param [Class] block_class The class of a block which has an attachment.
113
+ # @param [String] name_of_attachment The name of the attachment association (i.e. if was 'has_attachment :photos' then pass 'photo')
114
+ # @param [Symbol] key The key for the value to be fetched (i.e. :styles)
115
+ def configuration_value(block_class, name_of_attachment, key)
116
+ class_definitions = definitions[block_class]
117
+ if class_definitions == nil
118
+ raise "Couldn't find any definitions for '#{block_class}'. Available definitions are #{definitions.inspect}."
119
+ end
120
+ attachment_definition = class_definitions[name_of_attachment]
121
+ if attachment_definition == nil
122
+ raise "Verify that '#{block_class}' defines an attachment named ':#{name_of_attachment}'."
123
+ end
124
+ attachment_definition[key] || configuration.send(key)
125
+ end
126
+
127
+ end
128
+
129
+ def attachable_class
130
+ attachable_type
131
+ end
132
+
133
+ # @todo There isn't any good reason I know of why this needs to be a distinct field. Needed to add it to get it working for 4.0 though.
134
+ def attachable_class=(klass)
135
+ self.attachable_type = klass
136
+ end
137
+
138
+ def section=(section)
139
+ dirty! if self.section != section
140
+ super(section)
141
+ end
142
+
143
+ def config_value_for(key)
144
+ self.class.configuration_value(content_block_class, attachment_name, key)
145
+ end
146
+
147
+ def content_block_class
148
+ attachable.try(:class).try(:name) || attachable_type
149
+ #attachable_class || attachable.try(:class).try(:name) || attachable_type
150
+ end
151
+
152
+ def icon
153
+ {
154
+ :doc => %w[doc],
155
+ :gif => %w[gif jpg jpeg png tiff bmp],
156
+ :htm => %w[htm html],
157
+ :pdf => %w[pdf],
158
+ :ppt => %w[ppt],
159
+ :swf => %w[swf],
160
+ :txt => %w[txt],
161
+ :xls => %w[xls],
162
+ :xml => %w[xml],
163
+ :zip => %w[zip rar tar gz tgz]
164
+ }.each do |icon, extensions|
165
+ return icon if extensions.include?(data_file_extension)
166
+ end
167
+ :file
168
+ end
169
+
170
+ # For authorized users, return the path to get the specific version of the file associated with this attachment.
171
+ # Guests should always get 'data_file_path' which is the public version of the asset.
172
+ def attachment_version_path
173
+ "/cms/attachments/#{id}?version=#{version}"
174
+ end
175
+
176
+ def public?
177
+ section ? section.public? : false
178
+ end
179
+
180
+ def is_image?
181
+ %w[jpg gif png jpeg].include?(data_file_extension)
182
+ end
183
+
184
+ # Returns a Paperclip generated relative path to the file (with thumbnail sizing)
185
+ def url(style_name = configuration.default_style)
186
+ data.url(style_name)
187
+ end
188
+
189
+ # Returns the absolute file location of the underlying asset
190
+ def path(style_name = configuration.default_style)
191
+ data.path(style_name)
192
+ end
193
+
194
+ def original_filename
195
+ data_file_name
196
+ end
197
+
198
+ alias :file_name :original_filename
199
+
200
+ def size
201
+ data_file_size
202
+ end
203
+
204
+ def content_type
205
+ data_content_type
206
+ end
207
+
208
+ alias :file_type :content_type
209
+
210
+ # Returns the definitions for this particular attachment type.
211
+ # @return [Hash] Empty Hash if no definition have been defined for this attachment.
212
+ def config
213
+ content_defs = definitions[content_block_class] ? definitions[content_block_class] : {}
214
+ content_defs[attachment_name] ? content_defs[attachment_name] : {}
215
+ end
216
+
217
+ # Determines if this Attachment has access to configuration information yet. Until it is assigned to an Attaching object,
218
+ # it will lack style information.
219
+ def has_assigned_content_type?()
220
+ attachable_type && attachment_name
221
+ end
222
+
223
+ protected
224
+
225
+ private
226
+
227
+ def data_file_extension
228
+ data_file_name.split('.').last.downcase if data_file_name && data_file_name['.']
229
+ end
230
+
231
+ # Filter - Ensure that paths are going to URL friendly (and won't need encoding for special characters.')
232
+ def sanitized_file_path_and_name
233
+ if data_file_path
234
+ self.data_file_path = self.class.sanitize_file_path(data_file_path)
235
+ if !data_file_path.empty? && !data_file_path.starts_with?("/")
236
+ self.data_file_path = "/#{data_file_path}"
237
+ end
238
+ end
239
+
240
+ if data_file_name
241
+ self.data_file_name = self.class.sanitize_file_path(data_file_name)
242
+ end
243
+ end
244
+
245
+ def set_section
246
+ unless parent
247
+ self.parent = Section.root.first
248
+ end
249
+ end
250
+
251
+ def setup_attachment
252
+ data.instance_variable_set :@url, config_value_for(:url)
253
+ data.instance_variable_set :@path, config_value_for(:path)
254
+ data.instance_variable_set :@styles, config_value_for(:styles)
255
+ data.instance_variable_set :@normalized_styles, nil
256
+ data.send :post_process_styles
257
+ end
258
+
259
+ # Attachments should always be configured with a cardinality
260
+ def set_cardinality
261
+ unless cardinality
262
+ self.cardinality = config[:type].to_s
263
+ end
264
+
265
+ end
266
+ end
267
+ end
@@ -0,0 +1,56 @@
1
+ module Cms
2
+ class Category < ActiveRecord::Base
3
+ belongs_to :category_type, :class_name => 'Cms::CategoryType'
4
+ belongs_to :parent, :class_name => 'Cms::Category'
5
+ has_many :children, :class_name => 'Cms::Category', :foreign_key => "parent_id"
6
+ is_searchable
7
+ has_content_type :module => :categorization
8
+
9
+ extend DefaultAccessible
10
+ include Concerns::IgnoresPublishing
11
+
12
+ validates_presence_of :category_type_id, :name
13
+ validates_uniqueness_of :name, :scope => :category_type_id
14
+
15
+ class << self
16
+ def named(name)
17
+ where(["#{table_name}.name = ?", name])
18
+ end
19
+
20
+ def of_type(type_name)
21
+ where(["#{CategoryType.table_name}.name = ?", type_name])
22
+ .order("#{Category.table_name}.name")
23
+ .includes(:category_type)
24
+ .references(:category_type)
25
+ end
26
+ end
27
+ scope :top_level, -> { where(["#{Category.table_name}.parent_id is null"]) }
28
+ scope :list, -> { includes(:category_type) }
29
+
30
+ def ancestors
31
+ fn = lambda do |cat, parents|
32
+ if cat.parent_id
33
+ p = self.class.find(cat.parent)
34
+ fn.call(p, (parents << p))
35
+ else
36
+ parents.reverse
37
+ end
38
+ end
39
+ fn.call(self, [])
40
+ end
41
+
42
+ def path(sep=" > ")
43
+ (ancestors.map(&:name) + [name]).join(sep)
44
+ end
45
+
46
+ def category_type_name
47
+ category_type ? category_type.name : nil
48
+ end
49
+
50
+ def self.columns_for_index
51
+ [{:label => "Name", :method => :name, :order => "#{Category.table_name}.name"},
52
+ {:label => "Type", :method => :category_type_name, :order => "#{CategoryType.table_name}.name"},
53
+ {:label => "Updated On", :method => :updated_on_string, :order => "#{Category.table_name}.updated_at"}]
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,43 @@
1
+ module Cms
2
+ class CategoryType < ActiveRecord::Base
3
+
4
+ has_many :categories, :class_name => 'Cms::Category'
5
+ validates_presence_of :name
6
+ validates_uniqueness_of :name
7
+ is_searchable
8
+ has_content_type :module => :categorization
9
+
10
+ include Concerns::IgnoresPublishing
11
+
12
+ def self.named(name)
13
+ where(name: name)
14
+ end
15
+
16
+ # Return a map when the key is category type id as a string
17
+ # and the value is an array of arrays, each entry having
18
+ # the first value as the category path and the second value
19
+ # being the category id as a string
20
+ def self.category_map
21
+ all.inject(Hash.new([])) do |map, ct|
22
+ map[ct.id.to_s] = ct.category_list.map { |c| [c.path, c.id.to_s] }
23
+ map
24
+ end
25
+ end
26
+
27
+ # This is used to get the full list of categories for this category type in the correct order.
28
+ def category_list(order="name")
29
+ list = []
30
+ fn = lambda do |cat|
31
+ list << cat
32
+ cat.children.order(order).each { |c| fn.call(c) }
33
+ end
34
+ categories.top_level.order(order).each { |cat| fn.call(cat) }
35
+ list
36
+ end
37
+
38
+ def cannot_be_deleted_message
39
+ categories.count.zero? ? nil : "This cannot be deleted because it is in use in #{categories.count} #{"category".pluralize_unless_one(categories.count)}"
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,99 @@
1
+ module Cms
2
+ class Connector < ActiveRecord::Base
3
+
4
+ belongs_to :page, :class_name => 'Cms::Page'
5
+ belongs_to :connectable, :polymorphic => true
6
+
7
+ extend DefaultAccessible
8
+ #attr_accessible :connectable, :page_version, :connectable_version, :container # Need to be explicit due to seed data loading
9
+
10
+ acts_as_list :scope => "#{Connector.table_name}.page_id = \#{page_id} and #{Cms::Connector.table_name}.page_version = \#{page_version} and #{Cms::Connector.table_name}.container = '\#{container}'"
11
+ alias :move_up :move_higher
12
+ alias :move_down :move_lower
13
+
14
+ class << self
15
+ def for_page_version(pv)
16
+ where(:page_version => pv)
17
+ end
18
+
19
+ def for_connectable_version(cv)
20
+ where(:connectable_version => cv)
21
+ end
22
+
23
+ def for_connectable(c)
24
+ where(:connectable_id => c.id, :connectable_type => c.class.base_class.name)
25
+ end
26
+
27
+ def in_container(container)
28
+ where(:container => container)
29
+ end
30
+
31
+ def at_position(position)
32
+ where(:position => position)
33
+ end
34
+
35
+ def like(connector)
36
+ where(:connectable_id => connector.connectable_id,
37
+ :connectable_type => connector.connectable_type,
38
+ :connectable_version => connector.connectable_version,
39
+ :container => connector.container,
40
+ :position => connector.position)
41
+ end
42
+ end
43
+
44
+ validates_presence_of :page_id, :page_version, :connectable_id, :connectable_type, :container
45
+
46
+ def current_connectable
47
+ if versioned?
48
+ connectable.as_of_version(connectable_version) if connectable
49
+ else
50
+ get_connectable
51
+ end
52
+ end
53
+
54
+ def connectable_with_deleted
55
+ c = if connectable_type.constantize.respond_to?(:find_with_deleted)
56
+ connectable_type.constantize.find_with_deleted(id: connectable_id)
57
+ else
58
+ connectable_type.constantize.find(connectable_id)
59
+ end
60
+ (c && c.class.versioned?) ? c.as_of_version(connectable_version) : c
61
+ end
62
+
63
+ def status
64
+ live? ? 'published' : 'draft'
65
+ end
66
+
67
+ def status_name
68
+ status.to_s.titleize
69
+ end
70
+
71
+ def live?
72
+ if publishable?
73
+ connectable.live?
74
+ else
75
+ true
76
+ end
77
+ end
78
+
79
+ def publishable?
80
+ connectable_type.constantize.publishable?
81
+ end
82
+
83
+ def versioned?
84
+ connectable_type.constantize.versioned?
85
+ end
86
+
87
+ # Determines if a connector should be copied when a page is updated/versioned, etc.
88
+ #
89
+ #
90
+ def should_be_copied?
91
+ if connectable && (!connectable.respond_to?(:draft) || !connectable.draft.deleted?)
92
+ return true
93
+ end
94
+
95
+
96
+ false
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,31 @@
1
+ module Cms
2
+ # An API for interacting with the Content API of BrowserCMS.
3
+ module Content
4
+
5
+ # Find a single content item.
6
+ # example:
7
+ # Cms::Content.find("html_block", 12) # Finds a Cms::HtmlBlock with an id of 12.
8
+ #
9
+ # @param [String] content_name The name of the content type to find.
10
+ # @param [Integer] id The id of the content.
11
+ # @return [ContentBlock] A single content block or page
12
+ def self.find(content_type, id)
13
+ if content_type == "page"
14
+ return Cms::Page.find(id)
15
+ end
16
+ type = ContentType.find_by_key(content_type)
17
+ type.model_class.find(id)
18
+ end
19
+
20
+ # Find the latest draft for a single content item.
21
+ # example:
22
+ # Cms::Content.find("html_block", 12) # Finds a Cms::HtmlBlock with an id of 12.
23
+ #
24
+ # @param [String] content_name The name of the content type to find.
25
+ # @param [Integer] id The id of the content.
26
+ # @return [ContentBlock] A single content block or page
27
+ def self.find_draft(content_type, id)
28
+ find(content_type, id).as_of_draft_version
29
+ end
30
+ end
31
+ end