zen 0.3 → 0.4

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 (373) hide show
  1. data/.gems +3 -2
  2. data/.rvmrc +1 -1
  3. data/.travis.yml +5 -0
  4. data/.yardopts +2 -1
  5. data/LICENSE +1 -1
  6. data/README.md +28 -24
  7. data/Rakefile +5 -2
  8. data/guide/asset_management.md +6 -6
  9. data/guide/autosaving_forms.md +42 -0
  10. data/guide/changelog.md +41 -0
  11. data/guide/faq.md +49 -0
  12. data/guide/getting_started.md +24 -13
  13. data/guide/hacking.md +40 -9
  14. data/guide/images/categories/categories.png +0 -0
  15. data/guide/images/categories/category_groups.png +0 -0
  16. data/guide/images/categories/new_category.png +0 -0
  17. data/guide/images/categories/new_category_group.png +0 -0
  18. data/guide/images/comments/comments.png +0 -0
  19. data/guide/images/comments/edit_comment.png +0 -0
  20. data/guide/images/custom_fields/custom_field_groups.png +0 -0
  21. data/guide/images/custom_fields/custom_field_types.png +0 -0
  22. data/guide/images/custom_fields/custom_fields.png +0 -0
  23. data/guide/images/custom_fields/edit_custom_field_general.png +0 -0
  24. data/guide/images/custom_fields/edit_custom_field_group.png +0 -0
  25. data/guide/images/custom_fields/edit_custom_field_settings.png +0 -0
  26. data/guide/images/custom_fields/edit_custom_field_type.png +0 -0
  27. data/guide/images/dashboard/added.png +0 -0
  28. data/guide/images/dashboard/columns.png +0 -0
  29. data/guide/images/dashboard/dashboard.png +0 -0
  30. data/guide/images/dashboard/options.png +0 -0
  31. data/guide/images/menus/edit_menu.png +0 -0
  32. data/guide/images/menus/edit_menu_item.png +0 -0
  33. data/guide/images/menus/menu_item_hierarchy.png +0 -0
  34. data/guide/images/menus/menu_items.png +0 -0
  35. data/guide/images/menus/menus.png +0 -0
  36. data/guide/images/sections/edit_entry.png +0 -0
  37. data/guide/images/sections/edit_entry_categories.png +0 -0
  38. data/guide/images/sections/edit_entry_general.png +0 -0
  39. data/guide/images/sections/edit_entry_meta.png +0 -0
  40. data/guide/images/sections/edit_section_comments.png +0 -0
  41. data/guide/images/sections/edit_section_general.png +0 -0
  42. data/guide/images/sections/edit_section_groups.png +0 -0
  43. data/guide/images/sections/entries.png +0 -0
  44. data/guide/images/sections/sections.png +0 -0
  45. data/guide/images/settings/overview_general.png +0 -0
  46. data/guide/images/settings/overview_security.png +0 -0
  47. data/guide/images/settings/overview_user.png +0 -0
  48. data/guide/images/users/edit_user.png +0 -0
  49. data/guide/images/users/edit_user_group.png +0 -0
  50. data/guide/images/users/edit_user_group_permissions.png +0 -0
  51. data/guide/images/users/edit_user_permissions.png +0 -0
  52. data/guide/images/users/overview.png +0 -0
  53. data/guide/images/users/user_groups_overview.png +0 -0
  54. data/guide/installation.md +7 -1
  55. data/guide/javascript.md +36 -273
  56. data/guide/javascript/zen_autosave.md +26 -0
  57. data/guide/javascript/zen_editor.md +83 -0
  58. data/guide/javascript/zen_hash.md +34 -0
  59. data/guide/javascript/zen_htmltable.md +78 -0
  60. data/guide/javascript/zen_tabs.md +44 -0
  61. data/guide/javascript/zen_window.md +49 -0
  62. data/guide/zen_compared.md +201 -0
  63. data/lib/vendor/sequel_sluggable.rb +1 -1
  64. data/lib/zen.rb +64 -44
  65. data/lib/zen/asset_groups.rb +10 -10
  66. data/lib/zen/bin/create.rb +8 -1
  67. data/lib/zen/helper/breadcrumb.rb +4 -12
  68. data/lib/zen/helper/controller.rb +209 -6
  69. data/lib/zen/helper/locale.rb +19 -0
  70. data/lib/zen/helper/search.rb +1 -1
  71. data/lib/zen/helper/stacked_aspect.rb +7 -43
  72. data/lib/zen/helper/theme.rb +3 -3
  73. data/lib/zen/language.rb +5 -10
  74. data/lib/zen/language/translation.rb +1 -1
  75. data/lib/zen/layout/admin.xhtml +41 -25
  76. data/lib/zen/layout/login.xhtml +8 -3
  77. data/lib/zen/migrator.rb +54 -0
  78. data/lib/zen/model/helper.rb +20 -1
  79. data/lib/zen/model/init.rb +2 -0
  80. data/lib/zen/model/plugin/events.rb +158 -0
  81. data/lib/zen/package.rb +32 -6
  82. data/lib/zen/package/all.rb +1 -0
  83. data/lib/zen/package/categories/lib/categories.rb +6 -6
  84. data/lib/zen/package/categories/lib/categories/controller/categories.rb +20 -83
  85. data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +23 -74
  86. data/lib/zen/package/categories/lib/categories/model/category.rb +58 -1
  87. data/lib/zen/package/categories/lib/categories/model/category_group.rb +62 -2
  88. data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +46 -40
  89. data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +74 -75
  90. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/form.xhtml +27 -24
  91. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +83 -86
  92. data/lib/zen/package/comments/lib/comments.rb +5 -5
  93. data/lib/zen/package/comments/lib/comments/controller/comments.rb +12 -64
  94. data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +4 -22
  95. data/lib/zen/package/comments/lib/comments/model/comment.rb +65 -16
  96. data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +52 -49
  97. data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +52 -60
  98. data/lib/zen/package/comments/migrations/1308774099_comment_status.rb +1 -1
  99. data/lib/zen/package/custom_fields/lib/custom_fields.rb +11 -13
  100. data/lib/zen/package/custom_fields/lib/custom_fields/blue_form_parameters.rb +29 -13
  101. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +21 -50
  102. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_types.rb +27 -71
  103. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +25 -78
  104. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +48 -1
  105. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +35 -1
  106. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_method.rb +3 -0
  107. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_type.rb +40 -1
  108. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +1 -0
  109. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/form.xhtml +29 -26
  110. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +96 -100
  111. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/form.xhtml +56 -53
  112. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/index.xhtml +82 -82
  113. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +88 -85
  114. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +83 -80
  115. data/lib/zen/package/dashboard/lib/dashboard.rb +28 -0
  116. data/lib/zen/package/dashboard/lib/dashboard/controller/dashboard.rb +154 -0
  117. data/lib/zen/package/dashboard/lib/dashboard/language/en/dashboard.rb +35 -0
  118. data/lib/zen/package/dashboard/lib/dashboard/language/nl/dashboard.rb +36 -0
  119. data/lib/zen/package/dashboard/lib/dashboard/model/widget.rb +45 -0
  120. data/lib/zen/package/dashboard/lib/dashboard/public/admin/dashboard/css/dashboard.css +74 -0
  121. data/lib/zen/package/dashboard/lib/dashboard/public/admin/dashboard/js/dashboard.js +102 -0
  122. data/lib/zen/package/dashboard/lib/dashboard/view/admin/index.xhtml +29 -0
  123. data/lib/zen/package/dashboard/lib/dashboard/view/admin/widget/welcome.xhtml +28 -0
  124. data/lib/zen/package/dashboard/lib/dashboard/widget.rb +292 -0
  125. data/lib/zen/package/dashboard/lib/dashboard/widget/welcome.rb +9 -0
  126. data/lib/zen/package/dashboard/migrations/1326411254_create_schema.rb +28 -0
  127. data/lib/zen/package/extensions/lib/extensions.rb +5 -5
  128. data/lib/zen/package/extensions/lib/extensions/view/admin/extensions/index.xhtml +72 -67
  129. data/lib/zen/package/menu.rb +6 -1
  130. data/lib/zen/package/menus/lib/menus.rb +6 -4
  131. data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +69 -104
  132. data/lib/zen/package/menus/lib/menus/controller/menus.rb +19 -76
  133. data/lib/zen/package/menus/lib/menus/helper/menu.rb +54 -38
  134. data/lib/zen/package/menus/lib/menus/helper/menu_frontend.rb +7 -13
  135. data/lib/zen/package/menus/lib/menus/model/menu.rb +158 -2
  136. data/lib/zen/package/menus/lib/menus/model/menu_item.rb +73 -10
  137. data/lib/zen/package/menus/lib/menus/public/admin/menus/css/menus.css +47 -0
  138. data/lib/zen/package/menus/lib/menus/public/admin/menus/js/lib/nested_sortables.js +549 -0
  139. data/lib/zen/package/menus/lib/menus/public/admin/menus/js/menu_items.js +38 -0
  140. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +51 -61
  141. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +18 -81
  142. data/lib/zen/package/menus/lib/menus/view/admin/menus/form.xhtml +49 -44
  143. data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +81 -83
  144. data/lib/zen/package/sections/lib/sections.rb +9 -4
  145. data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +80 -132
  146. data/lib/zen/package/sections/lib/sections/controller/sections.rb +27 -73
  147. data/lib/zen/package/sections/lib/sections/helper/section.rb +44 -1
  148. data/lib/zen/package/sections/lib/sections/language/en/section_entries.rb +2 -0
  149. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.rb +2 -0
  150. data/lib/zen/package/sections/lib/sections/model/section.rb +48 -1
  151. data/lib/zen/package/sections/lib/sections/model/section_entry.rb +55 -5
  152. data/lib/zen/package/sections/lib/sections/model/section_entry_status.rb +2 -0
  153. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +76 -67
  154. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +74 -79
  155. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/recent_entries.xhtml +45 -0
  156. data/lib/zen/package/sections/lib/sections/view/admin/sections/form.xhtml +119 -0
  157. data/lib/zen/package/sections/lib/sections/view/admin/sections/index.xhtml +96 -0
  158. data/lib/zen/package/sections/lib/sections/widget/recent_entries.rb +14 -0
  159. data/lib/zen/package/sections/migrations/1308813320_section_entry_statuses.rb +1 -1
  160. data/lib/zen/package/settings/lib/settings.rb +14 -5
  161. data/lib/zen/package/settings/lib/settings/controller/settings.rb +4 -4
  162. data/lib/zen/package/settings/lib/settings/language/nl/settings.rb +1 -1
  163. data/lib/zen/package/settings/lib/settings/setting.rb +1 -1
  164. data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +21 -17
  165. data/lib/zen/package/users/lib/users.rb +18 -19
  166. data/lib/zen/package/users/lib/users/controller/user_groups.rb +23 -50
  167. data/lib/zen/package/users/lib/users/controller/users.rb +57 -89
  168. data/lib/zen/package/users/lib/users/helper/acl.rb +1 -0
  169. data/lib/zen/package/users/lib/users/language/en/user_groups.rb +1 -0
  170. data/lib/zen/package/users/lib/users/language/en/users.rb +2 -1
  171. data/lib/zen/package/users/lib/users/language/nl/user_groups.rb +1 -0
  172. data/lib/zen/package/users/lib/users/language/nl/users.rb +2 -1
  173. data/lib/zen/package/users/lib/users/model/permission.rb +13 -0
  174. data/lib/zen/package/users/lib/users/model/user.rb +57 -4
  175. data/lib/zen/package/users/lib/users/model/user_group.rb +37 -3
  176. data/lib/zen/package/users/lib/users/model/user_status.rb +4 -0
  177. data/lib/zen/package/users/lib/users/public/admin/{css/users/permissions.css → users/css/users.css} +0 -0
  178. data/lib/zen/package/users/lib/users/public/admin/{js/users/permissions.js → users/js/users.js} +4 -2
  179. data/lib/zen/package/users/lib/users/view/admin/user-groups/form.xhtml +51 -47
  180. data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +62 -69
  181. data/lib/zen/package/users/lib/users/view/admin/users/form.xhtml +92 -82
  182. data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +68 -66
  183. data/lib/zen/package/users/lib/users/view/admin/users/login.xhtml +36 -28
  184. data/lib/zen/package/users/lib/users/view/admin/users/permissions.xhtml +5 -7
  185. data/lib/zen/package/users/lib/users/view/admin/users/register.xhtml +47 -41
  186. data/lib/zen/package/users/migrations/1320272365_status_ids.rb +1 -1
  187. data/lib/zen/public/admin/{js/vendor/mootools → mootools/js}/core.js +113 -108
  188. data/lib/zen/public/admin/{js/vendor/mootools → mootools/js}/more.js +99 -6
  189. data/lib/zen/public/admin/zen/css/buttons.css +106 -0
  190. data/lib/zen/public/admin/{css/zen → zen/css}/datepicker.css +45 -30
  191. data/lib/zen/public/admin/zen/css/editor.css +69 -0
  192. data/lib/zen/public/admin/{css/zen → zen/css}/forms.css +28 -30
  193. data/lib/zen/public/admin/zen/css/general.css +183 -0
  194. data/lib/zen/public/admin/zen/css/layout.css +224 -0
  195. data/lib/zen/public/admin/zen/css/messages.css +34 -0
  196. data/lib/zen/public/admin/{css/zen → zen/css}/reset.css +4 -9
  197. data/lib/zen/public/admin/zen/css/tables.css +57 -0
  198. data/lib/zen/public/admin/zen/css/tabs.css +84 -0
  199. data/lib/zen/public/admin/zen/css/window.css +74 -0
  200. data/lib/zen/public/admin/{images/zen → zen/images}/icons/asc.png +0 -0
  201. data/lib/zen/public/admin/{images/zen → zen/images}/icons/bold.png +0 -0
  202. data/lib/zen/public/admin/zen/images/icons/box.png +0 -0
  203. data/lib/zen/public/admin/zen/images/icons/categories.png +0 -0
  204. data/lib/zen/public/admin/{images/zen → zen/images}/icons/close.png +0 -0
  205. data/lib/zen/public/admin/zen/images/icons/comment.png +0 -0
  206. data/lib/zen/public/admin/{images/zen → zen/images}/icons/desc.png +0 -0
  207. data/lib/zen/public/admin/{images/zen → zen/images}/icons/edit.png +0 -0
  208. data/lib/zen/public/admin/{images/zen → zen/images}/icons/error.png +0 -0
  209. data/lib/zen/public/admin/zen/images/icons/external.png +0 -0
  210. data/lib/zen/public/admin/zen/images/icons/globe.png +0 -0
  211. data/lib/zen/public/admin/{images/zen → zen/images}/icons/italic.png +0 -0
  212. data/lib/zen/public/admin/{images/zen → zen/images}/icons/link.png +0 -0
  213. data/lib/zen/public/admin/zen/images/icons/lock.png +0 -0
  214. data/lib/zen/public/admin/{images/zen → zen/images}/icons/ol.png +0 -0
  215. data/lib/zen/public/admin/zen/images/icons/pages.png +0 -0
  216. data/lib/zen/public/admin/{images/zen → zen/images}/icons/preview.png +0 -0
  217. data/lib/zen/public/admin/zen/images/icons/relation.png +0 -0
  218. data/lib/zen/public/admin/zen/images/icons/settings.png +0 -0
  219. data/lib/zen/public/admin/zen/images/icons/template.png +0 -0
  220. data/lib/zen/public/admin/{images/zen → zen/images}/icons/ul.png +0 -0
  221. data/lib/zen/public/admin/{images/zen → zen/images}/icons/user.png +0 -0
  222. data/lib/zen/public/admin/zen/images/icons/user_group.png +0 -0
  223. data/lib/zen/public/admin/{js/zen → zen/js}/index.js +21 -9
  224. data/lib/zen/public/admin/zen/js/lib/autosave.js +185 -0
  225. data/lib/zen/public/admin/zen/js/lib/base.js +60 -0
  226. data/lib/zen/public/admin/{js/vendor → zen/js/lib}/datepicker.js +52 -28
  227. data/lib/zen/public/admin/{js/zen → zen/js}/lib/editor.js +23 -34
  228. data/lib/zen/public/admin/{js/zen → zen/js}/lib/editor/markdown.js +5 -1
  229. data/lib/zen/public/admin/{js/zen → zen/js}/lib/editor/textile.js +4 -0
  230. data/lib/zen/public/admin/zen/js/lib/hash.js +218 -0
  231. data/lib/zen/public/admin/{js/zen → zen/js}/lib/html_table.js +5 -0
  232. data/lib/zen/public/admin/zen/js/lib/tabs.js +194 -0
  233. data/lib/zen/public/admin/{js/zen → zen/js}/lib/window.js +54 -29
  234. data/lib/zen/security.rb +50 -0
  235. data/lib/zen/spec/helper.rb +5 -120
  236. data/lib/zen/spec/helper/capybara.rb +75 -0
  237. data/lib/zen/spec/helper/general.rb +75 -0
  238. data/lib/zen/spec/simplecov.rb +1 -0
  239. data/lib/zen/task/build.rake +2 -21
  240. data/lib/zen/task/clean.rake +1 -10
  241. data/lib/zen/task/db.rake +4 -10
  242. data/lib/zen/task/package.rake +2 -5
  243. data/lib/zen/task/setup.rake +1 -1
  244. data/lib/zen/task/test.rake +6 -6
  245. data/lib/zen/task/theme.rake +2 -5
  246. data/lib/zen/theme.rb +26 -22
  247. data/lib/zen/version.rb +1 -1
  248. data/lib/zen/view/bottom.xhtml +2 -3
  249. data/lib/zen/view/search.xhtml +3 -5
  250. data/proto/app/config/config.rb.erb +1 -1
  251. data/proto/app/theme/default/index.xhtml +116 -20
  252. data/proto/app/theme/partials/head.xhtml +9 -0
  253. data/proto/app/theme/partials/sidebar.xhtml +40 -0
  254. data/proto/app/theme/theme.rb +3 -0
  255. data/spec/Rakefile +1 -2
  256. data/spec/fixtures/zen/helper/stacked_aspect.rb +54 -0
  257. data/spec/fixtures/zen/package/dashboard/controller/widget.rb +15 -0
  258. data/spec/fixtures/zen/package/dashboard/widget.rb +5 -0
  259. data/spec/fixtures/zen/theme/theme.rb +2 -2
  260. data/spec/helper.rb +19 -10
  261. data/spec/zen/controller/admin_controller.rb +3 -3
  262. data/spec/zen/controller/main_controller.rb +7 -7
  263. data/spec/zen/controller/preview.rb +3 -3
  264. data/spec/zen/event.rb +4 -4
  265. data/spec/zen/helper/breadcrumb.rb +4 -8
  266. data/spec/zen/helper/controller.rb +47 -4
  267. data/spec/zen/helper/locale.rb +3 -3
  268. data/spec/zen/helper/message.rb +4 -4
  269. data/spec/zen/helper/stacked_aspect.rb +40 -0
  270. data/spec/zen/helper/theme.rb +9 -9
  271. data/spec/zen/language.rb +8 -8
  272. data/spec/zen/markup.rb +6 -6
  273. data/spec/zen/package.rb +11 -9
  274. data/spec/zen/package/categories/controller/categories.rb +56 -24
  275. data/spec/zen/package/categories/controller/category_groups.rb +55 -23
  276. data/spec/zen/package/categories/helper/category.rb +5 -5
  277. data/spec/zen/package/categories/helper/category_frontend.rb +5 -5
  278. data/spec/zen/package/comments/anti_spam.rb +4 -4
  279. data/spec/zen/package/comments/controller/comments.rb +95 -24
  280. data/spec/zen/package/comments/controller/comments_form.rb +31 -26
  281. data/spec/zen/package/comments/helper/comment.rb +3 -3
  282. data/spec/zen/package/comments/helper/comment_frontend.rb +6 -6
  283. data/spec/zen/package/custom_fields/blue_form_parameters.rb +8 -8
  284. data/spec/zen/package/custom_fields/controller/custom_field_groups.rb +58 -27
  285. data/spec/zen/package/custom_fields/controller/custom_field_types.rb +57 -27
  286. data/spec/zen/package/custom_fields/controller/custom_fields.rb +58 -27
  287. data/spec/zen/package/custom_fields/helper/custom_field.rb +7 -7
  288. data/spec/zen/package/dashboard/controller/dashboard.rb +147 -0
  289. data/spec/zen/package/dashboard/widget.rb +56 -0
  290. data/spec/zen/package/extensions/controller/extensions.rb +4 -4
  291. data/spec/zen/package/menus/controller/menu_items.rb +48 -39
  292. data/spec/zen/package/menus/controller/menus.rb +55 -24
  293. data/spec/zen/package/menus/helper/menu.rb +6 -14
  294. data/spec/zen/package/menus/helper/menu_frontend.rb +7 -7
  295. data/spec/zen/package/menus/model/menu.rb +121 -0
  296. data/spec/zen/package/menus/model/menu_item.rb +34 -0
  297. data/spec/zen/package/sections/controller/section_entries.rb +104 -39
  298. data/spec/zen/package/sections/controller/sections.rb +60 -27
  299. data/spec/zen/package/sections/helper/section.rb +5 -5
  300. data/spec/zen/package/sections/helper/section_frontend.rb +9 -9
  301. data/spec/zen/package/sections/widget.rb +44 -0
  302. data/spec/zen/package/settings/controller/settings.rb +18 -16
  303. data/spec/zen/package/settings/settings.rb +12 -12
  304. data/spec/zen/package/users/controller/user_groups.rb +61 -29
  305. data/spec/zen/package/users/controller/users.rb +118 -39
  306. data/spec/zen/package/users/helper/access.rb +3 -3
  307. data/spec/zen/package/users/helper/acl.rb +4 -4
  308. data/spec/zen/package/users/helper/users.rb +5 -5
  309. data/spec/zen/security.rb +25 -0
  310. data/spec/zen/theme.rb +20 -18
  311. data/spec/zen/validation.rb +5 -5
  312. data/spec/zen/vendor/sequel_sluggable.rb +12 -0
  313. data/zen.gemspec +27 -4
  314. metadata +182 -124
  315. data/AUTHORS +0 -4
  316. data/guide/_static/categories/categories.png +0 -0
  317. data/guide/_static/categories/category_groups.png +0 -0
  318. data/guide/_static/categories/new_category.png +0 -0
  319. data/guide/_static/categories/new_category_group.png +0 -0
  320. data/guide/_static/comments/comments.png +0 -0
  321. data/guide/_static/comments/edit_comment.png +0 -0
  322. data/guide/_static/custom_fields/custom_field_groups.png +0 -0
  323. data/guide/_static/custom_fields/custom_field_types.png +0 -0
  324. data/guide/_static/custom_fields/custom_fields.png +0 -0
  325. data/guide/_static/custom_fields/edit_custom_field_general.png +0 -0
  326. data/guide/_static/custom_fields/edit_custom_field_group.png +0 -0
  327. data/guide/_static/custom_fields/edit_custom_field_settings.png +0 -0
  328. data/guide/_static/custom_fields/edit_custom_field_type.png +0 -0
  329. data/guide/_static/menus/edit_menu.png +0 -0
  330. data/guide/_static/menus/edit_menu_item.png +0 -0
  331. data/guide/_static/menus/menu_items.png +0 -0
  332. data/guide/_static/menus/menus.png +0 -0
  333. data/guide/_static/sections/edit_entry.png +0 -0
  334. data/guide/_static/sections/edit_entry_categories.png +0 -0
  335. data/guide/_static/sections/edit_entry_general.png +0 -0
  336. data/guide/_static/sections/edit_entry_meta.png +0 -0
  337. data/guide/_static/sections/edit_section_comments.png +0 -0
  338. data/guide/_static/sections/edit_section_general.png +0 -0
  339. data/guide/_static/sections/edit_section_groups.png +0 -0
  340. data/guide/_static/sections/entries.png +0 -0
  341. data/guide/_static/sections/sections.png +0 -0
  342. data/guide/_static/settings/overview_general.png +0 -0
  343. data/guide/_static/settings/overview_security.png +0 -0
  344. data/guide/_static/settings/overview_user.png +0 -0
  345. data/guide/_static/users/edit_user.png +0 -0
  346. data/guide/_static/users/edit_user_group.png +0 -0
  347. data/guide/_static/users/edit_user_group_permissions.png +0 -0
  348. data/guide/_static/users/edit_user_permissions.png +0 -0
  349. data/guide/_static/users/overview.png +0 -0
  350. data/guide/_static/users/user_groups_overview.png +0 -0
  351. data/lib/zen/controller/translations.rb +0 -49
  352. data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +0 -113
  353. data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +0 -97
  354. data/lib/zen/public/admin/css/zen/buttons.css +0 -46
  355. data/lib/zen/public/admin/css/zen/editor.css +0 -88
  356. data/lib/zen/public/admin/css/zen/general.css +0 -109
  357. data/lib/zen/public/admin/css/zen/grid.css +0 -100
  358. data/lib/zen/public/admin/css/zen/layout.css +0 -184
  359. data/lib/zen/public/admin/css/zen/messages.css +0 -54
  360. data/lib/zen/public/admin/css/zen/tables.css +0 -97
  361. data/lib/zen/public/admin/css/zen/tabs.css +0 -47
  362. data/lib/zen/public/admin/css/zen/window.css +0 -73
  363. data/lib/zen/public/admin/images/zen/icons/accept.png +0 -0
  364. data/lib/zen/public/admin/images/zen/icons/add.png +0 -0
  365. data/lib/zen/public/admin/images/zen/icons/back.png +0 -0
  366. data/lib/zen/public/admin/images/zen/icons/delete.png +0 -0
  367. data/lib/zen/public/admin/images/zen/icons/help.png +0 -0
  368. data/lib/zen/public/admin/images/zen/icons/info.png +0 -0
  369. data/lib/zen/public/admin/images/zen/icons/logout.png +0 -0
  370. data/lib/zen/public/admin/images/zen/icons/pdf.png +0 -0
  371. data/lib/zen/public/admin/images/zen/icons/view.png +0 -0
  372. data/lib/zen/public/admin/js/zen/lib/tabs.js +0 -207
  373. data/lib/zen/view/main.xhtml +0 -19
@@ -2,7 +2,7 @@ require File.expand_path('../../../../../helper', __FILE__)
2
2
 
3
3
  Zen::Language.load('category_groups')
4
4
 
5
- describe("Categories::Controller::CategoryGroups") do
5
+ describe "Categories::Controller::CategoryGroups" do
6
6
  behaves_like :capybara
7
7
 
8
8
  index_url = Categories::Controller::CategoryGroups.r(:index).to_s
@@ -22,16 +22,7 @@ describe("Categories::Controller::CategoryGroups") do
22
22
  )
23
23
  end
24
24
 
25
- it('Submit a form without a CSRF token') do
26
- response = page.driver.post(
27
- Categories::Controller::CategoryGroups.r(:save).to_s
28
- )
29
-
30
- response.body.include?(lang('zen_general.errors.csrf')).should == true
31
- response.status.should == 403
32
- end
33
-
34
- it('Find no existing category groups') do
25
+ it 'Find no existing category groups' do
35
26
  message = lang('category_groups.messages.no_groups')
36
27
 
37
28
  visit(index_url)
@@ -40,7 +31,18 @@ describe("Categories::Controller::CategoryGroups") do
40
31
  page.has_selector?('table tbody tr').should == false
41
32
  end
42
33
 
43
- it("Create a new category group") do
34
+ it 'Try to create a new category group with a missing CSRF token' do
35
+ visit(new_url)
36
+
37
+ within '#category_group_form' do
38
+ find('input[name="csrf_token"]').set('')
39
+ click_on(save_button)
40
+ end
41
+
42
+ page.has_content?(lang('zen_general.errors.csrf')).should == true
43
+ end
44
+
45
+ it "Create a new category group" do
44
46
  new_button = lang('category_groups.buttons.new')
45
47
  name = 'Spec category group'
46
48
  event_name = nil
@@ -59,7 +61,7 @@ describe("Categories::Controller::CategoryGroups") do
59
61
 
60
62
  current_path.should == new_url
61
63
 
62
- within('#category_group_form') do
64
+ within '#category_group_form' do
63
65
  fill_in('name', :with => name)
64
66
  click_on(save_button)
65
67
  end
@@ -72,12 +74,12 @@ describe("Categories::Controller::CategoryGroups") do
72
74
  event_name2.should == event_name
73
75
  end
74
76
 
75
- it('Search for a category group') do
77
+ it 'Search for a category group' do
76
78
  visit(index_url)
77
79
  search_button = lang('zen_general.buttons.search')
78
80
  error = lang('zen_general.errors.invalid_search')
79
81
 
80
- within('#search_form') do
82
+ within '#search_form' do
81
83
  fill_in('query', :with => 'Spec category group')
82
84
  click_on(search_button)
83
85
  end
@@ -85,7 +87,7 @@ describe("Categories::Controller::CategoryGroups") do
85
87
  page.has_content?(error).should == false
86
88
  page.has_content?('Spec category group').should == true
87
89
 
88
- within('#search_form') do
90
+ within '#search_form' do
89
91
  fill_in('query', :with => 'does not exist')
90
92
  click_on(search_button)
91
93
  end
@@ -95,7 +97,7 @@ describe("Categories::Controller::CategoryGroups") do
95
97
  page.has_selector?('table tbody tr').should == false
96
98
  end
97
99
 
98
- it("Edit an existing category group") do
100
+ it "Edit an existing category group" do
99
101
  event_name = nil
100
102
  event_name2 = nil
101
103
  name = 'Spec category group 123'
@@ -113,7 +115,7 @@ describe("Categories::Controller::CategoryGroups") do
113
115
 
114
116
  current_path.should =~ /#{edit_url}\/[0-9]+/
115
117
 
116
- within('#category_group_form') do
118
+ within '#category_group_form' do
117
119
  fill_in('name', :with => name)
118
120
  click_on(save_button)
119
121
  end
@@ -128,7 +130,7 @@ describe("Categories::Controller::CategoryGroups") do
128
130
  group.name = 'Spec category group modified'
129
131
  end
130
132
 
131
- within('#category_group_form') do
133
+ within '#category_group_form' do
132
134
  click_on(save_button)
133
135
  end
134
136
 
@@ -136,13 +138,13 @@ describe("Categories::Controller::CategoryGroups") do
136
138
  .value.should == 'Spec category group modified'
137
139
  end
138
140
 
139
- it("Edit an existing category group with invalid data") do
141
+ it "Edit an existing category group with invalid data" do
140
142
  visit(index_url)
141
143
  click_link('Spec category group')
142
144
 
143
145
  current_path.should =~ /#{edit_url}\/[0-9]+/
144
146
 
145
- within('#category_group_form') do
147
+ within '#category_group_form' do
146
148
  fill_in('name', :with => '')
147
149
  click_on(save_button)
148
150
  end
@@ -150,14 +152,44 @@ describe("Categories::Controller::CategoryGroups") do
150
152
  page.has_selector?('span.error').should == true
151
153
  end
152
154
 
153
- it('Fail to delete a category group without an ID') do
155
+ enable_javascript
156
+
157
+ it 'Automatically save a category group' do
158
+ visit(index_url)
159
+ click_link('Spec category group')
160
+
161
+ within '#category_group_form' do
162
+ fill_in('name', :with => 'Spec category group autosave')
163
+ end
164
+
165
+ autosave_form('category_group_form')
166
+
167
+ # Check if the content was actually saved.
168
+ visit(index_url)
169
+
170
+ page.has_content?('Spec category group autosave').should == true
171
+
172
+ click_link('Spec category group autosave')
173
+
174
+ within '#category_group_form' do
175
+ fill_in('name', :with => 'Spec category group modified')
176
+ click_on(save_button)
177
+ end
178
+
179
+ page.has_selector?('span.error').should == false
180
+ page.find('input[name="name"]').value.should == 'Spec category group modified'
181
+ end
182
+
183
+ disable_javascript
184
+
185
+ it 'Fail to delete a category group without an ID' do
154
186
  visit(index_url)
155
187
  click_on(delete_button)
156
188
 
157
189
  page.has_selector?('input[name="category_group_ids[]"]').should == true
158
190
  end
159
191
 
160
- it("Delete an existing category group") do
192
+ it "Delete an existing category group" do
161
193
  message = lang('category_groups.messages.no_groups')
162
194
  event_name = nil
163
195
  event_name2 = nil
@@ -1,6 +1,6 @@
1
1
  require File.expand_path('../../../../../helper', __FILE__)
2
2
 
3
- describe('Ramaze::Helper::Category') do
3
+ describe 'Ramaze::Helper::Category' do
4
4
  behaves_like :capybara
5
5
 
6
6
  category_group = ::Categories::Model::CategoryGroup.create(
@@ -12,7 +12,7 @@ describe('Ramaze::Helper::Category') do
12
12
  :category_group_id => category_group.id
13
13
  )
14
14
 
15
- it('Validate a valid category group') do
15
+ it 'Validate a valid category group' do
16
16
  url = ::Categories::Controller::Categories.r(
17
17
  :index, category_group.id
18
18
  ).to_s
@@ -22,7 +22,7 @@ describe('Ramaze::Helper::Category') do
22
22
  current_path.should == "/admin/categories/index/#{category_group.id}"
23
23
  end
24
24
 
25
- it('Validate an invalid category group') do
25
+ it 'Validate an invalid category group' do
26
26
  url = ::Categories::Controller::Categories.r(
27
27
  :index, category_group.id + 1
28
28
  ).to_s
@@ -32,7 +32,7 @@ describe('Ramaze::Helper::Category') do
32
32
  current_path.should == '/admin/category-groups/index'
33
33
  end
34
34
 
35
- it('Validate a valid category') do
35
+ it 'Validate a valid category' do
36
36
  group_id = category_group.id
37
37
  cat_id = category.id
38
38
 
@@ -45,7 +45,7 @@ describe('Ramaze::Helper::Category') do
45
45
  current_path.should == "/admin/categories/edit/#{group_id}/#{cat_id}"
46
46
  end
47
47
 
48
- it('Validate an invalid category') do
48
+ it 'Validate an invalid category' do
49
49
  group_id = category_group.id
50
50
 
51
51
  url = ::Categories::Controller::Categories.r(
@@ -1,7 +1,7 @@
1
1
  require File.expand_path('../../../../../helper', __FILE__)
2
2
  require File.join(Zen::FIXTURES, 'package/categories/helper/category_frontend')
3
3
 
4
- describe('Ramaze::Helper::CategoryFrontend') do
4
+ describe 'Ramaze::Helper::CategoryFrontend' do
5
5
  behaves_like :capybara
6
6
 
7
7
  extend Ramaze::Helper::CategoryFrontend
@@ -20,28 +20,28 @@ describe('Ramaze::Helper::CategoryFrontend') do
20
20
  :category_group_id => category_group.id
21
21
  )
22
22
 
23
- it('Retrieve categories for a group ID') do
23
+ it 'Retrieve categories for a group ID' do
24
24
  categories = get_categories(category_group.id).all
25
25
 
26
26
  categories.length.should == 2
27
27
  categories[0].name.should == category1.name
28
28
  end
29
29
 
30
- it('Retrieve categories for a group slug') do
30
+ it 'Retrieve categories for a group slug' do
31
31
  categories = get_categories(category_group.name).all
32
32
 
33
33
  categories.length.should == 2
34
34
  categories[0].name.should == category1.name
35
35
  end
36
36
 
37
- it('Limit the amount of results') do
37
+ it 'Limit the amount of results' do
38
38
  categories = get_categories(category_group.id, :limit => 1).all
39
39
 
40
40
  categories.length.should == 1
41
41
  categories[0].name.should == category1.name
42
42
  end
43
43
 
44
- it('Retrieve and paginate two categories') do
44
+ it 'Retrieve and paginate two categories' do
45
45
  visit('/spec-category-frontend')
46
46
 
47
47
  page.has_selector?('p').should == true
@@ -1,6 +1,6 @@
1
1
  require File.expand_path('../../../../helper', __FILE__)
2
2
 
3
- describe('Comments::AntiSpam') do
3
+ describe 'Comments::AntiSpam' do
4
4
  behaves_like :capybara
5
5
 
6
6
  spam_comment = 'Hello, you can buy viagra here ' \
@@ -23,20 +23,20 @@ describe('Comments::AntiSpam') do
23
23
  'http://api.defensio.com/2.0/users/test/documents.yaml'
24
24
  ).to_return(:body => yaml_response)
25
25
 
26
- it('Fail to use an invalid engine') do
26
+ it 'Fail to use an invalid engine' do
27
27
  should.raise?(ArgumentError) do
28
28
  Comments::AntiSpam.validate(:foobar, nil, nil, nil, spam_comment)
29
29
  end
30
30
  end
31
31
 
32
- it('Validate a spam comment using Defensio') do
32
+ it 'Validate a spam comment using Defensio' do
33
33
  get_setting(:defensio_key).value = 'test'
34
34
 
35
35
  Comments::AntiSpam.validate(:defensio, nil, nil, nil, spam_comment) \
36
36
  .should == true
37
37
  end
38
38
 
39
- it('Fail to validate using defensio without an API key') do
39
+ it 'Fail to validate using defensio without an API key' do
40
40
  get_setting(:defensio_key).value = nil
41
41
 
42
42
  should.raise? do
@@ -1,6 +1,6 @@
1
1
  require File.expand_path('../../../../../helper', __FILE__)
2
2
 
3
- describe('Comments::Controller::Comments') do
3
+ describe 'Comments::Controller::Comments' do
4
4
  behaves_like :capybara
5
5
 
6
6
  index_url = Comments::Controller::Comments.r(:index).to_s
@@ -30,16 +30,7 @@ describe('Comments::Controller::Comments') do
30
30
  )
31
31
  end
32
32
 
33
- it('Submit a form without a CSRF token') do
34
- response = page.driver.post(
35
- Comments::Controller::Comments.r(:save).to_s
36
- )
37
-
38
- response.body.include?(lang('zen_general.errors.csrf')).should == true
39
- response.status.should == 403
40
- end
41
-
42
- it('Find no existing comments') do
33
+ it 'Find no existing comments' do
43
34
  message = lang('comments.messages.no_comments')
44
35
 
45
36
  visit(index_url)
@@ -48,9 +39,9 @@ describe('Comments::Controller::Comments') do
48
39
  page.has_selector?('table tbody tr').should == false
49
40
  end
50
41
 
51
- it('Create a new comment') do
42
+ it 'Create a new comment' do
52
43
  comment = Comments::Model::Comment.create(
53
- :user_id => 1,
44
+ :user_id => user_id,
54
45
  :section_entry_id => entry.id,
55
46
  :email => 'spec@domain.tld',
56
47
  :comment => 'Spec comment'
@@ -60,16 +51,29 @@ describe('Comments::Controller::Comments') do
60
51
 
61
52
  visit(index_url)
62
53
 
54
+ comment.exists?.should == true
63
55
  page.has_content?(message).should == false
64
56
  page.has_selector?('table tbody tr').should == true
65
57
  end
66
58
 
67
- it('Search for a comment') do
59
+ it 'Try to edit an existing comment with a missing CSRF token' do
60
+ visit(index_url)
61
+ click_link('Spec comment')
62
+
63
+ within '#comment_form' do
64
+ find('input[name="csrf_token"]').set('')
65
+ click_on(save_button)
66
+ end
67
+
68
+ page.has_content?(lang('zen_general.errors.csrf')).should == true
69
+ end
70
+
71
+ it 'Search for a comment' do
68
72
  visit(index_url)
69
73
  search_button = lang('zen_general.buttons.search')
70
74
  error = lang('zen_general.errors.invalid_search')
71
75
 
72
- within('#search_form') do
76
+ within '#search_form' do
73
77
  fill_in('query', :with => 'Spec comment')
74
78
  click_on(search_button)
75
79
  end
@@ -77,7 +81,7 @@ describe('Comments::Controller::Comments') do
77
81
  page.has_content?(error).should == false
78
82
  page.has_content?('Spec comment').should == true
79
83
 
80
- within('#search_form') do
84
+ within '#search_form' do
81
85
  fill_in('query', :with => 'spec@domain.tld')
82
86
  click_on(search_button)
83
87
  end
@@ -85,7 +89,7 @@ describe('Comments::Controller::Comments') do
85
89
  page.has_content?(error).should == false
86
90
  page.has_content?('Spec comment').should == true
87
91
 
88
- within('#search_form') do
92
+ within '#search_form' do
89
93
  fill_in('query', :with => 'does not exist')
90
94
  click_on(search_button)
91
95
  end
@@ -94,7 +98,7 @@ describe('Comments::Controller::Comments') do
94
98
  page.has_content?('Spec comment').should == false
95
99
  end
96
100
 
97
- it('Edit an existing comment') do
101
+ it 'Edit an existing comment' do
98
102
  event_comment = nil
99
103
  event_comment2 = nil
100
104
  comment = 'Spec modified 123'
@@ -112,7 +116,7 @@ describe('Comments::Controller::Comments') do
112
116
 
113
117
  current_path.should =~ /#{edit_url}\/[0-9]+/
114
118
 
115
- within('#comment_form') do
119
+ within '#comment_form' do
116
120
  fill_in('comment', :with => comment)
117
121
  select(lang('comments.labels.open'), :from => 'comment_status_id')
118
122
  click_on(save_button)
@@ -133,7 +137,7 @@ describe('Comments::Controller::Comments') do
133
137
  comment.comment = 'Spec comment modified'
134
138
  end
135
139
 
136
- within('#comment_form') do
140
+ within '#comment_form' do
137
141
  click_on(save_button)
138
142
  end
139
143
 
@@ -141,13 +145,13 @@ describe('Comments::Controller::Comments') do
141
145
  .value.should == 'Spec comment modified'
142
146
  end
143
147
 
144
- it('Edit an existing comment with invalid data') do
148
+ it 'Edit an existing comment with invalid data' do
145
149
  visit(index_url)
146
150
  click_link('Spec comment')
147
151
 
148
152
  current_path.should =~ /#{edit_url}\/[0-9]+/
149
153
 
150
- within('#comment_form') do
154
+ within '#comment_form' do
151
155
  fill_in('comment', :with => '')
152
156
  click_on(save_button)
153
157
  end
@@ -155,7 +159,37 @@ describe('Comments::Controller::Comments') do
155
159
  page.has_selector?('span.error').should == true
156
160
  end
157
161
 
158
- it('Fail to delete a set of comments without IDs') do
162
+ enable_javascript
163
+
164
+ it 'Automatically save a comment' do
165
+ visit(index_url)
166
+ click_link('Spec comment')
167
+
168
+ within '#comment_form' do
169
+ fill_in('comment', :with => 'Spec comment autosave')
170
+ end
171
+
172
+ autosave_form('comment_form')
173
+
174
+ visit(index_url)
175
+
176
+ # Comments are truncated in the index overview.
177
+ page.has_content?('Spec comment au...').should == true
178
+
179
+ click_link('Spec comment au...')
180
+
181
+ within '#comment_form' do
182
+ fill_in('comment', :with => 'Spec comment modified')
183
+ click_on(save_button)
184
+ end
185
+
186
+ page.has_selector?('span.error').should == false
187
+ page.find('textarea[name="comment"]').value.should == 'Spec comment modified'
188
+ end
189
+
190
+ disable_javascript
191
+
192
+ it 'Fail to delete a set of comments without IDs' do
159
193
  delete_button = lang('comments.buttons.delete')
160
194
 
161
195
  visit(index_url)
@@ -164,7 +198,7 @@ describe('Comments::Controller::Comments') do
164
198
  page.has_selector?('input[name="comment_ids[]"]').should == true
165
199
  end
166
200
 
167
- it('Delete an existing comment') do
201
+ it 'Delete an existing comment' do
168
202
  delete_button = lang('comments.buttons.delete')
169
203
  message = lang('comments.messages.no_comments')
170
204
  event_comment = nil
@@ -189,6 +223,43 @@ describe('Comments::Controller::Comments') do
189
223
  event_comment2.should == event_comment
190
224
  end
191
225
 
226
+ it 'Comments should not be able to use Etanni tags' do
227
+ comment = Comments::Model::Comment.create(
228
+ :user_id => user_id,
229
+ :section_entry_id => entry.id,
230
+ :email => 'spec@domain.tld',
231
+ :comment => '<?r puts "hello" ?>'
232
+ )
233
+
234
+ comment.exists?.should == true
235
+
236
+ # Loofah completely strips the <?r ?> tags so all that remains are two
237
+ # backslashes.
238
+ comment.comment.should == '\\'
239
+
240
+ # Lets try #{}
241
+ comment.comment = 'hello #{name}'
242
+ comment.save
243
+
244
+ comment.comment.should == 'hello \#\{name\}'
245
+
246
+ comment.destroy
247
+ end
248
+
249
+ it 'Comments should not contain evil HTML elements' do
250
+ comment = Comments::Model::Comment.create(
251
+ :user_id => user_id,
252
+ :section_entry_id => entry.id,
253
+ :email => 'spec@domain.tld',
254
+ :comment => '<script src="foobar.js"></script>'
255
+ )
256
+
257
+ comment.exists?.should == true
258
+ comment.comment.empty?.should == true
259
+
260
+ comment.destroy
261
+ end
262
+
192
263
  entry.destroy
193
264
  section.destroy
194
265
  end