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
@@ -1,98 +1,95 @@
1
1
  <section>
2
- #{render_search_form(::Categories::Controller::CategoryGroups.r(:index))}
3
-
4
- <header>
2
+ <header class="with_search">
5
3
  <h1>#{get_breadcrumbs}</h1>
6
- </header>
7
-
8
- <form method="post"
9
- action="#{Categories::Controller::CategoryGroups.r(:delete)}">
10
- <input type="hidden" name="csrf_token" value="#{get_csrf_token}" />
11
-
12
- <?r if !@category_groups.empty? ?>
13
-
14
- <table>
15
- <thead>
16
- <tr>
17
- <?r if user_authorized?(:delete_category_group) ?>
18
- <th class="no_sort">
19
- <input type="checkbox" />
20
- </th>
21
- <?r end ?>
22
-
23
- <th>#{lang('category_groups.labels.id')}</th>
24
- <th>#{lang('category_groups.labels.name')}</th>
25
-
26
- <?r if user_authorized?(:show_category) ?>
27
- <th></th>
28
- <?r end ?>
29
- </tr>
30
- </thead>
31
- <tbody>
32
- <?r @category_groups.each do |group| ?>
33
- <tr>
34
- <?r if user_authorized?(:delete_category_group) ?>
35
- <td>
36
- <input type="checkbox" name="category_group_ids[]"
37
- value="#{group.id}" />
38
- </td>
39
- <?r end ?>
40
-
41
- <td>#{group.id}</td>
42
-
43
- <?r if user_authorized?(:edit_category_group) ?>
44
-
45
- <td>
46
- #{Categories::Controller::CategoryGroups.a(
47
- group.name, :edit, group.id
48
- )}
49
- </td>
50
-
51
- <?r else ?>
52
4
 
53
- <td>#{group.name}</td>
54
-
55
- <?r end ?>
5
+ #{render_search_form(::Categories::Controller::CategoryGroups.r(:index))}
6
+ </header>
56
7
 
57
- <?r if user_authorized?(:show_category) ?>
58
- <td>
59
- #{Categories::Controller::Categories.a(
60
- lang('category_groups.labels.manage'),
61
- :index,
62
- group.id
63
- )}
64
- </td>
8
+ <div class="body">
9
+ <form method="post"
10
+ action="#{Categories::Controller::CategoryGroups.r(:delete)}">
11
+ <input type="hidden" name="csrf_token" value="#{get_csrf_token}" />
12
+
13
+ <?r if !@category_groups.empty? ?>
14
+
15
+ <table>
16
+ <thead>
17
+ <tr>
18
+ <?r if user_authorized?(:delete_category_group) ?>
19
+ <th class="no_sort">
20
+ <input type="checkbox" />
21
+ </th>
22
+ <?r end ?>
23
+
24
+ <th>#{lang('category_groups.labels.id')}</th>
25
+ <th>#{lang('category_groups.labels.name')}</th>
26
+
27
+ <?r if user_authorized?(:show_category) ?>
28
+ <th></th>
29
+ <?r end ?>
30
+ </tr>
31
+ </thead>
32
+ <tbody>
33
+ <?r @category_groups.each do |group| ?>
34
+ <tr>
35
+ <?r if user_authorized?(:delete_category_group) ?>
36
+ <td>
37
+ <input type="checkbox" name="category_group_ids[]"
38
+ value="#{group.id}" />
39
+ </td>
40
+ <?r end ?>
41
+
42
+ <td>#{group.id}</td>
43
+
44
+ <?r if user_authorized?(:edit_category_group) ?>
45
+ <td>
46
+ #{edit_link(
47
+ Categories::Controller::CategoryGroups.r(
48
+ :edit,
49
+ group.id
50
+ ),
51
+ group.name
52
+ )}
53
+ </td>
54
+ <?r else ?>
55
+ <td>#{group.name}</td>
56
+ <?r end ?>
57
+
58
+ <?r if user_authorized?(:show_category) ?>
59
+ <td>
60
+ #{manage_link(
61
+ Categories::Controller::Categories.r(
62
+ :index,
63
+ group.id
64
+ ),
65
+ lang('category_groups.labels.manage')
66
+ )}
67
+ </td>
68
+ <?r end ?>
69
+ </tr>
65
70
  <?r end ?>
66
- </tr>
67
- <?r end ?>
68
- </tbody>
69
- </table>
71
+ </tbody>
72
+ </table>
70
73
 
71
- #{if @category_groups.respond_to?(:navigation) \
72
- and @category_groups.page_count > 1
73
- @category_groups.navigation
74
- end}
74
+ #{render_pagination(@category_groups)}
75
75
 
76
- <?r else ?>
76
+ <?r else ?>
77
77
 
78
- <p>#{lang('category_groups.messages.no_groups')}</p>
78
+ <p>#{lang('category_groups.messages.no_groups')}</p>
79
79
 
80
- <?r end ?>
80
+ <?r end ?>
81
81
 
82
- <?r if user_authorized?(:new_category_group) ?>
83
- <div class="button">
84
- #{Categories::Controller::CategoryGroups.a(
85
- lang('category_groups.buttons.new'), :new
82
+ <?r if user_authorized?(:new_category_group) ?>
83
+ #{new_button(
84
+ Categories::Controller::CategoryGroups.r(:new),
85
+ lang('category_groups.buttons.new')
86
86
  )}
87
- </div>
88
- <?r end ?>
89
-
90
- <?r if user_authorized?(:delete_category_group) \
91
- and !@category_groups.empty? ?>
92
- <div class="button">
93
- <input type="submit"
94
- value="#{lang('category_groups.buttons.delete')}" />
95
- </div>
96
- <?r end ?>
97
- </form>
87
+ <?r end ?>
88
+
89
+ <?r if user_authorized?(:delete_category_group) \
90
+ and !@category_groups.empty? ?>
91
+ #{delete_button(lang('category_groups.buttons.delete'))}
92
+ <?r end ?>
93
+ </form>
94
+ </div>
98
95
  </section>
@@ -7,19 +7,15 @@ Zen::Package.add do |p|
7
7
  p.root = __DIR__('comments')
8
8
  p.migrations = __DIR__('../migrations')
9
9
 
10
- p.menu(
11
- 'comments.titles.index',
10
+ p.menu 'comments.titles.index',
12
11
  '/admin/comments',
13
12
  :permission => :show_comment
14
- )
15
13
 
16
14
  p.permission :show_comment , 'comments.permissions.show'
17
15
  p.permission :edit_comment , 'comments.permissions.edit'
18
16
  p.permission :delete_comment, 'comments.permissions.delete'
19
17
  end
20
18
 
21
- Zen::Language.load('comments')
22
-
23
19
  require __DIR__('comments/model/comment_status')
24
20
  require __DIR__('comments/model/comment')
25
21
  require __DIR__('comments/controller/comments')
@@ -45,3 +41,7 @@ Settings::Setting.add do |setting|
45
41
  setting.group = 'security'
46
42
  setting.type = 'textbox'
47
43
  end
44
+
45
+ Zen::Event.listen :post_start do
46
+ Zen::Language.load('comments')
47
+ end
@@ -41,7 +41,7 @@ module Comments
41
41
  # ``/admin/comments``. This page will show an overview of all existing
42
42
  # comments (or a message if no comments were found).
43
43
  #
44
- # ![Comments](../../_static/comments/comments.png)
44
+ # ![Comments](../../images/comments/comments.png)
45
45
  #
46
46
  # Comments can be edited by clicking on their name. Deleting comments can be
47
47
  # done by checking the checkboxes in each row followed by clicking the
@@ -49,7 +49,7 @@ module Comments
49
49
  #
50
50
  # ## Editing Comments
51
51
  #
52
- # ![Edit Comment](../../_static/comments/edit_comment.png)
52
+ # ![Edit Comment](../../images/comments/edit_comment.png)
53
53
  #
54
54
  # When editing a comment you can specify/update the following fields:
55
55
  #
@@ -77,39 +77,8 @@ module Comments
77
77
  # * new_comment
78
78
  # * delete_comment
79
79
  #
80
- # ## Events
81
- #
82
- # All events called in this controller receive an instance of
83
- # {Comments::Model::Comment}. However, just like all other controllers the
84
- # ``delete_comment`` receives an instance of this model that has already
85
- # been destroyed.
86
- #
87
- # An example of using one of these events is to notify a user when his
88
- # comment has been marked as spam:
89
- #
90
- # require 'mail'
91
- #
92
- # Zen::Event.call(:after_edit_comment) do |comment|
93
- # email = comment.user.email
94
- # spam = Comments::Model::CommentStatus[:name => 'spam']
95
- #
96
- # if comment.comment_status_id == spam.id
97
- # Mail.deliver do
98
- # from 'example@domain.tld'
99
- # to email
100
- # subject 'Your comment has been marked as spam'
101
- # body "Dear #{comment.user.name}, your comment has been " \
102
- # "marked as spam"
103
- # end
104
- # end
105
- # end
106
- #
107
80
  # @since 0.1
108
81
  # @map /admin/comments
109
- # @event before_edit_comment
110
- # @event after_edit_comment
111
- # @event beore_delete_comment
112
- # @event after_delete_comment
113
82
  #
114
83
  class Comments < Zen::Controller::AdminController
115
84
  map '/admin/comments'
@@ -118,6 +87,8 @@ module Comments
118
87
 
119
88
  csrf_protection :save, :delete
120
89
 
90
+ autosave Model::Comment, Model::Comment::COLUMNS, :edit_comment
91
+
121
92
  ##
122
93
  # Shows an overview of all existing comments and allows the user to edit
123
94
  # or remove these comments.
@@ -156,7 +127,8 @@ module Comments
156
127
  @page_title
157
128
  )
158
129
 
159
- @comment = flash[:form_data] || validate_comment(id)
130
+ @comment = validate_comment(id)
131
+ @comment.set(flash[:form_data]) if flash[:form_data]
160
132
 
161
133
  render_view(:form)
162
134
  end
@@ -166,45 +138,26 @@ module Comments
166
138
  #
167
139
  # @since 0.1
168
140
  # @permission edit_comment
169
- # @event before_edit_comment
170
- # @event after_edit_comment
171
141
  #
172
142
  def save
173
143
  authorize_user!(:edit_comment)
174
144
 
175
- # Copy the POST data so we can work with it without messing things up
176
- post = request.subset(
177
- :id,
178
- :user_id,
179
- :name,
180
- :website,
181
- :email,
182
- :comment,
183
- :comment_status_id,
184
- :section_entry_id
185
- )
186
-
187
- comment = validate_comment(post['id'])
188
-
189
- post.delete('id')
145
+ post = post_fields(*Model::Comment::COLUMNS)
146
+ comment = validate_comment(request.params['id'])
190
147
 
191
148
  begin
192
- post.each { |k, v| comment.send("#{k}=", v) }
193
- Zen::Event.call(:before_edit_comment, comment)
194
-
149
+ comment.set(post)
195
150
  comment.save
196
151
  rescue => e
197
- Ramaze::Log.error(e.inspect)
152
+ Ramaze::Log.error(e)
198
153
  message(:error, lang('comments.errors.save'))
199
154
 
200
155
  flash[:form_errors] = comment.errors
201
- flash[:form_data] = comment
156
+ flash[:form_data] = post
202
157
 
203
158
  redirect_referrer
204
159
  end
205
160
 
206
- Zen::Event.call(:after_edit_comment, comment)
207
-
208
161
  message(:success, lang('comments.success.save'))
209
162
  redirect(Comments.r(:edit, comment.id))
210
163
  end
@@ -215,8 +168,6 @@ module Comments
215
168
  #
216
169
  # @since 0.1
217
170
  # @permission delete_comment
218
- # @event before_delete_comment
219
- # @event after_delete_comment
220
171
  #
221
172
  def delete
222
173
  authorize_user!(:delete_comment)
@@ -233,18 +184,15 @@ module Comments
233
184
  comment = ::Comments::Model::Comment[id]
234
185
 
235
186
  next if comment.nil?
236
- Zen::Event.call(:before_delete_comment, comment)
237
187
 
238
188
  begin
239
189
  comment.destroy
240
190
  rescue => e
241
- Ramaze::Log.error(e.inspect)
191
+ Ramaze::Log.error(e)
242
192
  message(:error, lang('comments.errors.delete') % id)
243
193
 
244
194
  redirect_referrer
245
195
  end
246
-
247
- Zen::Event.call(:after_delete_comment, comment)
248
196
  end
249
197
 
250
198
  message(:success, lang('comments.success.delete'))
@@ -63,22 +63,8 @@ module Comments
63
63
  #
64
64
  # Zen::Controller::MainController.helper(:some_helper_name)
65
65
  #
66
- # ## Events
67
- #
68
- # Just like {Comments::Controller::Comments} newly created comments are
69
- # passed to an event called "new_comment".
70
- #
71
- # @example Logging whenever a new comment is created
72
- # Zen::Event.call(:new_comment) do |comment|
73
- # Ramaze::Log.info(
74
- # "A new comment has been created with ID ##{comment.id}"
75
- # )
76
- # end
77
- #
78
- # @since 0.1
79
- # @map /comments-form
80
- # @event before_new_comment
81
- # @event after_new_comment
66
+ # @since 0.1
67
+ # @map /comments-form
82
68
  #
83
69
  class CommentsForm < Zen::Controller::FrontendController
84
70
  map '/comments-form'
@@ -91,12 +77,10 @@ module Comments
91
77
  # saved the user will be redirected back to the previous page.
92
78
  #
93
79
  # @since 0.1
94
- # @event before_new_comment
95
- # @event after_new_comment
96
80
  #
97
81
  def save
98
82
  comment = ::Comments::Model::Comment.new
99
- post = request.subset(
83
+ post = post_fields(
100
84
  :section_entry,
101
85
  :user_id,
102
86
  :comment,
@@ -202,10 +186,9 @@ module Comments
202
186
 
203
187
  # Save the comment
204
188
  begin
205
- Zen::Event.call(:before_new_comment, comment)
206
189
  comment.save
207
190
  rescue => e
208
- Ramaze::Log.error(e.inspect)
191
+ Ramaze::Log.error(e)
209
192
  message(:error, lang('comments.errors.new'))
210
193
 
211
194
  flash[:form_data] = comment
@@ -220,7 +203,6 @@ module Comments
220
203
  message(:success, lang('comments.success.new'))
221
204
  end
222
205
 
223
- Zen::Event.call(:after_new_comment, comment)
224
206
  redirect_referrer
225
207
  end
226
208
  end # CommentsForm
@@ -4,19 +4,71 @@ module Comments
4
4
  ##
5
5
  # Model for managing and retrieving comments.
6
6
  #
7
- # @since 0.1
7
+ # ## Events
8
+ #
9
+ # All events called in this model receive an instance of
10
+ # {Comments::Model::Comment}. However, just like all other models the
11
+ # ``delete_comment`` event receives an instance of this model that has
12
+ # already been destroyed.
13
+ #
14
+ # An example of using one of these events is to notify a user when his
15
+ # comment has been marked as spam:
16
+ #
17
+ # require 'mail'
18
+ #
19
+ # Zen::Event.call(:after_edit_comment) do |comment|
20
+ # email = comment.user.email
21
+ # spam = Comments::Model::CommentStatus[:name => 'spam']
22
+ #
23
+ # if comment.comment_status_id == spam.id
24
+ # Mail.deliver do
25
+ # from 'example@domain.tld'
26
+ # to email
27
+ # subject 'Your comment has been marked as spam'
28
+ # body "Dear #{comment.user.name}, your comment has been " \
29
+ # "marked as spam"
30
+ # end
31
+ # end
32
+ # end
33
+ #
34
+ # @since 0.1
35
+ # @event before_new_comment
36
+ # @event after_new_comment
37
+ # @event before_edit_comment
38
+ # @event after_edit_comment
39
+ # @event beore_delete_comment
40
+ # @event after_delete_comment
8
41
  #
9
42
  class Comment < Sequel::Model
10
43
  include Zen::Model::Helper
11
44
 
12
- many_to_one :section_entry, :class => 'Sections::Model::SectionEntry',
45
+ ##
46
+ # Array containing all the columns that can be set by the user.
47
+ #
48
+ # @since 17-02-2012
49
+ #
50
+ COLUMNS = [
51
+ :user_id, :name, :website, :email, :comment, :comment_status_id,
52
+ :section_entry_id
53
+ ]
54
+
55
+ many_to_one :section_entry,
56
+ :class => 'Sections::Model::SectionEntry',
13
57
  :eager => [:section]
14
58
 
15
- many_to_one :user , :class => 'Users::Model::User'
59
+ many_to_one :user, :class => 'Users::Model::User'
16
60
  many_to_one :comment_status, :class => 'Comments::Model::CommentStatus'
17
61
 
18
62
  plugin :timestamps, :create => :created_at, :update => :updated_at
19
63
 
64
+ plugin :events,
65
+ :before_create => :before_new_comment,
66
+ :after_create => :after_new_comment,
67
+ :before_update => :before_edit_comment,
68
+ :after_update => :after_edit_comment,
69
+ :before_destroy => :before_delete_comment,
70
+ :after_destroy => :after_delete_comment
71
+
20
72
  ##
21
73
  # Searches for a number of comments based on the given search query. The
22
74
  # following fields can be searched:
@@ -86,15 +138,7 @@ module Comments
86
138
  # @since 0.2.6
87
139
  #
88
140
  def before_save
89
- [:name, :website, :email, :comment].each do |field|
90
- got = send(field)
91
-
92
- if !got.nil?
93
- send("#{field}=", Loofah.fragment(got) \
94
- .scrub!(:whitewash) \
95
- .scrub!(:nofollow).to_s)
96
- end
97
- end
141
+ sanitize_fields([:name, :website, :email, :comment], true)
98
142
 
99
143
  # Get the default status of a comment
100
144
  if self.comment_status_id.nil?
@@ -143,9 +187,10 @@ module Comments
143
187
  # @since 16-10-2011
144
188
  # @param [TrueClass|FalseClass] with_link When set to true the website
145
189
  # will be returned as an ``<a>`` tag.
190
+ # @param [String] text The alternative text to use for the link tag.
146
191
  # @return [String]
147
192
  #
148
- def user_website(with_link = false)
193
+ def user_website(with_link = false, text = nil)
149
194
  if user.nil?
150
195
  website = website
151
196
  else
@@ -153,10 +198,11 @@ module Comments
153
198
  end
154
199
 
155
200
  if !website.nil? and !website.empty? and with_link == true
156
- website = '<a href="%s" title="%s">%s</a>' % [
201
+ link_text = text || website
202
+ website = '<a href="%s" title="%s" class="icon external">%s</a>' % [
157
203
  website,
158
204
  website,
159
- website
205
+ link_text
160
206
  ]
161
207
  end
162
208
 
@@ -177,7 +223,10 @@ module Comments
177
223
  _comment = _comment[0, 15] + '...'
178
224
 
179
225
  if with_link == true
180
- return ::Comments::Controller::Comments.a(_comment, :edit, id)
226
+ return '<a href="%s" class="icon edit">%s</a>' % [
227
+ Comments::Controller::Comments.r(:edit, id),
228
+ _comment
229
+ ]
181
230
  else
182
231
  return _comment
183
232
  end