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
@@ -88,6 +88,7 @@ module Ramaze
88
88
  return [session[:super_group], session[:permissions]]
89
89
  end
90
90
 
91
+ user = Ramaze::Current.action.instance.user
91
92
  super_group = false
92
93
  perms = user.permissions.map { |p| p.permission.to_sym }
93
94
  group_ids = []
@@ -35,5 +35,6 @@ Zen::Language::Translation.add do |trans|
35
35
  t['permissions.edit'] = 'Edit group'
36
36
  t['permissions.new'] = 'Add group'
37
37
  t['permissions.delete'] = 'Delete group'
38
+ t['permissions.assign'] = 'Assign group'
38
39
  end
39
40
  end
@@ -59,7 +59,7 @@ Zen::Language::Translation.add do |trans|
59
59
  t['buttons.new'] = 'Add user'
60
60
  t['buttons.delete'] = 'Delete selected users'
61
61
  t['buttons.save'] = 'Save user'
62
- t['buttons.register'] = 'Register'
62
+ t['buttons.register'] = 'Confirm registration'
63
63
 
64
64
  t['description'] = 'Manage users, user groups and permissions.'
65
65
 
@@ -67,6 +67,7 @@ Zen::Language::Translation.add do |trans|
67
67
  t['permissions.edit'] = 'Edit user'
68
68
  t['permissions.new'] = 'Add user'
69
69
  t['permissions.delete'] = 'Delete user'
70
+ t['permissions.status'] = 'Change user status'
70
71
 
71
72
  t['tabs.settings'] = 'User Settings'
72
73
  end
@@ -37,5 +37,6 @@ Zen::Language::Translation.add do |trans|
37
37
  t['permissions.edit'] = 'Groep aanpassen'
38
38
  t['permissions.new'] = 'Groep aanmaken'
39
39
  t['permissions.delete'] = 'Groep verwijderen'
40
+ t['permissions.assign'] = 'Groep toekennen'
40
41
  end
41
42
  end
@@ -60,7 +60,7 @@ Zen::Language::Translation.add do |trans|
60
60
  t['buttons.new'] = 'Gebruiker toevoegen'
61
61
  t['buttons.save'] = 'Gebruiker opslaan'
62
62
  t['buttons.delete'] = 'Geselecteerde gebruikers verwijderen'
63
- t['buttons.register'] = 'Registreer'
63
+ t['buttons.register'] = 'Bevestig registratie'
64
64
 
65
65
  t['description'] = 'Beheer gebruikers, gebruikers groepen en rechten.'
66
66
 
@@ -68,6 +68,7 @@ Zen::Language::Translation.add do |trans|
68
68
  t['permissions.edit'] = 'Rechten aanpassen'
69
69
  t['permissions.new'] = 'Rechten aanmaken'
70
70
  t['permissions.delete'] = 'Rechten verwijderen'
71
+ t['permissions.status'] = 'Gebruikers status aanpassen'
71
72
 
72
73
  t['tabs.settings'] = 'Gebruikers instellingen'
73
74
  end
@@ -6,6 +6,8 @@ module Users
6
6
  # @since 0.3
7
7
  #
8
8
  class Permission < Sequel::Model
9
+ include Zen::Model::Helper
10
+
9
11
  many_to_one :user , :class => 'Users::Model::User'
10
12
  many_to_one :user_group, :class => 'Users::Model::UserGroup'
11
13
 
@@ -23,6 +25,17 @@ module Users
23
25
  validates_presence(:user_id)
24
26
  end
25
27
  end
28
+
29
+ ##
30
+ # Hook that is executed before creating or saving an object.
31
+ #
32
+ # @since 03-01-2012
33
+ #
34
+ def before_save
35
+ sanitize_fields([:permission])
36
+
37
+ super
38
+ end
26
39
  end # Permission
27
40
  end # Model
28
41
  end # Users
@@ -1,16 +1,52 @@
1
1
  module Users
2
- #:nodoc:
3
2
  module Model
4
3
  ##
5
4
  # Model that represents a single user.
6
5
  #
7
- # @since 0.1
6
+ # @example Sending an Email for a new user
7
+ # Zen::Event.listen(:after_new_user) do |user|
8
+ # Mail.deliver do
9
+ # from 'user@domain.tld'
10
+ # to user.email
11
+ # subject 'Your new account'
12
+ # body "Dear #{user.name}, your account has been created."
13
+ # end
14
+ # end
15
+ #
16
+ # @since 0.1
17
+ # @event before_new_user
18
+ # @event after_new_user
19
+ # @event before_edit_user
20
+ # @event after_edit_user
21
+ # @event before_delete_user
22
+ # @event after_delete_user
8
23
  #
9
24
  class User < Sequel::Model
25
+ ##
10
26
  # Regex to do some basic Email validation. Emails such as foo@bar,
11
- # foo@bar.com and foo@bar.a.b are all valid but foo bar@bar.com isn't.
27
+ # "foo@bar.com" and "foo@bar.a.b" are all valid but "foo bar@bar.com"
28
+ # isn't.
29
+ #
12
30
  EMAIL_REGEX = '^[^@]\S+@\S+(\.[a-z]+)*[^.]$'
13
31
 
32
+ ##
33
+ # Array containing the columns that can be set by the user.
34
+ #
35
+ # @since 17-02-2012
36
+ #
37
+ COLUMNS = [
38
+ :email,
39
+ :name,
40
+ :website,
41
+ :password,
42
+ :confirm_password,
43
+ :user_status_id,
44
+ :language,
45
+ :frontend_language,
46
+ :date_format,
47
+ :user_group_pks
48
+ ]
49
+
14
50
  include Zen::Model::Helper
15
51
 
16
52
  many_to_many :user_groups, :class => 'Users::Model::UserGroup',
@@ -18,10 +54,19 @@ module Users
18
54
 
19
55
  many_to_one :user_status, :class => 'Users::Model::UserStatus'
20
56
  one_to_many :permissions, :class => 'Users::Model::Permission'
57
+ one_to_many :widgets, :class => 'Dashboard::Model::Widget'
21
58
 
22
59
  plugin :timestamps, :create => :created_at, :update => :updated_at
23
60
  plugin :association_dependencies, :permissions => :delete
24
61
 
62
+ plugin :events,
63
+ :before_create => :before_new_user,
64
+ :after_create => :after_new_user,
65
+ :before_update => :before_edit_user,
66
+ :after_update => :after_edit_user,
67
+ :before_destroy => :before_delete_user,
68
+ :after_destroy => :after_delete_user
69
+
25
70
  ##
26
71
  # Searches for a set of users that match the given query.
27
72
  #
@@ -83,7 +128,10 @@ module Users
83
128
  def password=(password)
84
129
  return if password.nil? or password.empty?
85
130
 
86
- password = BCrypt::Password.create(password, :cost => 10)
131
+ password = BCrypt::Password.create(
132
+ Zen::Security.sanitize(password),
133
+ :cost => 10
134
+ )
87
135
 
88
136
  super(password)
89
137
  end
@@ -106,6 +154,11 @@ module Users
106
154
  # @since 0.3
107
155
  #
108
156
  def before_save
157
+ # Password is sanitized in password=.
158
+ sanitize_fields([
159
+ :email, :name, :website, :language, :frontend_language, :date_format
160
+ ])
161
+
109
162
  if self.user_status_id.nil?
110
163
  self.user_status_id = Users::Model::UserStatus[:name => 'closed'].id
111
164
  end
@@ -4,17 +4,40 @@ module Users
4
4
  ##
5
5
  # Model that represents a single user group.
6
6
  #
7
- # @since 0.1
7
+ # @since 0.1
8
+ # @event before_new_user_group
9
+ # @event after_new_user_user
10
+ # @event before_edit_user_group
11
+ # @event after_edit_user_group
12
+ # @event before_delete_user_group
13
+ # @event after_delete_user_group
8
14
  #
9
15
  class UserGroup < Sequel::Model
10
16
  include Zen::Model::Helper
11
17
 
18
+ ##
19
+ # Array containing the columns that can be set by the user.
20
+ #
21
+ # @since 17-02-2012
22
+ #
23
+ COLUMNS = [:name, :slug, :description, :super_group]
24
+
12
25
  many_to_many :users , :class => 'Users::Model::User'
13
26
  one_to_many :permissions, :class => 'Users::Model::Permission'
14
27
 
15
28
  plugin :sluggable, :source => :name, :freeze => false
16
- plugin :association_dependencies, :permissions => :delete,
17
- :users => :nullify
29
+
30
+ plugin :association_dependencies,
31
+ :permissions => :delete,
32
+ :users => :nullify
33
+
34
+ plugin :events,
35
+ :before_create => :before_new_user_group,
36
+ :after_create => :after_new_user_group,
37
+ :before_update => :before_edit_user_group,
38
+ :after_update => :after_edit_user_group,
39
+ :before_destroy => :before_delete_user_group,
40
+ :after_destroy => :after_delete_user_group
18
41
 
19
42
  ##
20
43
  # Searches for a set of users that match the given query.
@@ -40,6 +63,17 @@ module Users
40
63
 
41
64
  validates_type(TrueClass, :super_group)
42
65
  end
66
+
67
+ ##
68
+ # Hook that is executed before creating or saving an object.
69
+ #
70
+ # @since 03-01-2012
71
+ #
72
+ def before_save
73
+ sanitize_fields([:name, :slug, :description])
74
+
75
+ super
76
+ end
43
77
  end # UserGroup
44
78
  end # Model
45
79
  end # Users
@@ -6,6 +6,10 @@ module Users
6
6
  # @since 03-11-2011
7
7
  #
8
8
  class UserStatus < Sequel::Model
9
+ one_to_many :users, :class => 'Users::Model::User'
10
+
11
+ plugin :association_dependencies, :users => :delete
12
+
9
13
  ##
10
14
  # Returns a hash where the keys are the IDs of the various statuses and
11
15
  # the values the translations.
@@ -1,3 +1,5 @@
1
+ "use strict";
2
+
1
3
  /**
2
4
  * Javascript file loaded by the Users package. The code in this file is used to
3
5
  * make it easier for users to check all the checkboxes for a package when
@@ -8,7 +10,7 @@
8
10
  window.addEvent('domready', function()
9
11
  {
10
12
  // Button that can be used to allow all the permissions for a package.
11
- $$('.package .button.allow input').addEvent('click', function()
13
+ $$('.package .button.allow').addEvent('click', function()
12
14
  {
13
15
  var checkboxes = this.getParent('.package')
14
16
  .getChildren('.permissions input[type="checkbox"]');
@@ -20,7 +22,7 @@ window.addEvent('domready', function()
20
22
  });
21
23
 
22
24
  // Button that can be used to deny all the permissions for a package.
23
- $$('.package .button.deny input').addEvent('click', function()
25
+ $$('.package .button.deny').addEvent('click', function()
24
26
  {
25
27
  var checkboxes = this.getParent('.package')
26
28
  .getChildren('.permissions input[type="checkbox"]');
@@ -3,10 +3,11 @@
3
3
  <h1>#{get_breadcrumbs}</h1>
4
4
  </header>
5
5
 
6
+ <?r if @user_group.exists? ?>
6
7
  <div class="tabs">
7
8
  <ul>
8
9
  <li>
9
- <a href="#user_group_tab"
10
+ <a href="#user_group_tab" class="icon user_group"
10
11
  title="#{lang('user_groups.titles.edit')}">
11
12
  #{lang('user_groups.titles.edit')}
12
13
  </a>
@@ -14,7 +15,7 @@
14
15
 
15
16
  <?r if user_authorized?(:show_permission) ?>
16
17
  <li>
17
- <a href="#permissions"
18
+ <a href="#permissions" class="icon lock"
18
19
  title="#{lang('permissions.titles.index')}">
19
20
  #{lang('permissions.titles.index')}
20
21
  </a>
@@ -22,56 +23,59 @@
22
23
  <?r end ?>
23
24
  </ul>
24
25
  </div>
26
+ <?r end ?>
25
27
 
26
- #{form_for(
27
- @user_group,
28
- :method => :post,
29
- :action => Users::Controller::UserGroups.r(:save),
30
- :id => :user_group_form
31
- ) do |f|
32
- f.input_hidden(:id, @user_group.id)
33
- f.input_hidden(:csrf_token, get_csrf_token)
28
+ <div class="body">
29
+ #{form_for(
30
+ @user_group,
31
+ :method => :post,
32
+ :action => Users::Controller::UserGroups.r(:save),
33
+ :id => :user_group_form,
34
+ :'data-autosave-url' => Users::Controller::UserGroups.r(:autosave)
35
+ ) do |f|
36
+ f.input_hidden(:id, @user_group.id)
37
+ f.input_hidden(:csrf_token, get_csrf_token)
34
38
 
35
- f.g.div(:id => 'user_group_tab') do
36
- f.input_text(
37
- lang('user_groups.labels.name'),
38
- :name,
39
- :required => :required,
40
- :maxlength => 255
41
- )
39
+ f.g.div(:id => 'user_group_tab') do
40
+ f.input_text(
41
+ lang('user_groups.labels.name'),
42
+ :name,
43
+ :required => :required,
44
+ :maxlength => 255
45
+ )
42
46
 
43
- f.input_text(
44
- lang('user_groups.labels.slug'),
45
- :slug,
46
- :maxlength => 255
47
- )
47
+ f.input_text(
48
+ lang('user_groups.labels.slug'),
49
+ :slug,
50
+ :maxlength => 255
51
+ )
48
52
 
49
- f.input_radio(
50
- lang('user_groups.labels.super_group'),
51
- :super_group,
52
- @user_group.super_group,
53
- :values => @boolean_hash.invert,
54
- :required => :required
55
- )
53
+ f.input_radio(
54
+ lang('user_groups.labels.super_group'),
55
+ :super_group,
56
+ @user_group.super_group,
57
+ :values => @boolean_hash.invert,
58
+ :required => :required
59
+ )
56
60
 
57
- f.textarea(
58
- lang('user_groups.labels.description'),
59
- :description,
60
- :rows => 10
61
- )
62
- end
61
+ f.textarea(
62
+ lang('user_groups.labels.description'),
63
+ :description,
64
+ :rows => 10
65
+ )
66
+ end
63
67
 
64
- if user_authorized?(:show_permission)
65
- f.g.div(:id => 'permissions') do
66
- render_file(__DIR__('../users/permissions.xhtml'))
67
- end
68
- end
68
+ if user_authorized?(:show_permission) and @user_group.exists?
69
+ f.g.div(:id => 'permissions') do
70
+ render_file(__DIR__('../users/permissions.xhtml'))
71
+ end
72
+ end
69
73
 
70
- f.g.div(:class => 'button') do
71
- f.g.input(
72
- :type => 'submit',
73
- :value => lang('user_groups.buttons.save')
74
- )
75
- end
76
- end}
74
+ f.g.input(
75
+ :type => 'submit',
76
+ :value => lang('user_groups.buttons.save'),
77
+ :class => 'button'
78
+ )
79
+ end}
80
+ </div>
77
81
  </section>
@@ -1,85 +1,78 @@
1
1
  <section>
2
- #{render_search_form(Users::Controller::UserGroups.r(:index))}
3
-
4
- <header>
2
+ <header class="with_search">
5
3
  <h1>#{get_breadcrumbs}</h1>
4
+
5
+ #{render_search_form(Users::Controller::UserGroups.r(:index))}
6
6
  </header>
7
7
 
8
- <form method="post" action="#{Users::Controller::UserGroups.r(:delete)}">
9
- <input type="hidden" name="csrf_token" value="#{get_csrf_token}" />
8
+ <div class="body">
9
+ <form method="post" action="#{Users::Controller::UserGroups.r(:delete)}">
10
+ <input type="hidden" name="csrf_token" value="#{get_csrf_token}" />
10
11
 
11
- <?r if !@user_groups.empty? ?>
12
+ <?r if !@user_groups.empty? ?>
12
13
 
13
- <table>
14
- <thead>
15
- <tr>
16
- <?r if user_authorized?(:delete_user_group) ?>
17
- <th class="no_sort">
18
- <input type="checkbox" />
19
- </th>
20
- <?r end ?>
14
+ <table>
15
+ <thead>
16
+ <tr>
17
+ <?r if user_authorized?(:delete_user_group) ?>
18
+ <th class="no_sort">
19
+ <input type="checkbox" />
20
+ </th>
21
+ <?r end ?>
21
22
 
22
- <th>#{lang('user_groups.labels.id')}</th>
23
- <th>#{lang('user_groups.labels.name')}</th>
24
- <th>#{lang('user_groups.labels.slug')}</th>
25
- <th>#{lang('user_groups.labels.super_group')}</th>
26
- </tr>
27
- </thead>
28
- <tbody>
29
- <?r @user_groups.each do |group| ?>
30
- <tr>
31
- <?r if user_authorized?(:delete_user_group) ?>
32
- <td>
33
- <input type="checkbox" name="user_group_ids[]"
34
- value="#{group.id}" />
35
- </td>
36
- <?r end ?>
23
+ <th>#{lang('user_groups.labels.id')}</th>
24
+ <th>#{lang('user_groups.labels.name')}</th>
25
+ <th>#{lang('user_groups.labels.slug')}</th>
26
+ <th>#{lang('user_groups.labels.super_group')}</th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ <?r @user_groups.each do |group| ?>
31
+ <tr>
32
+ <?r if user_authorized?(:delete_user_group) ?>
33
+ <td>
34
+ <input type="checkbox" name="user_group_ids[]"
35
+ value="#{group.id}" />
36
+ </td>
37
+ <?r end ?>
37
38
 
38
- <td>#{group.id}</td>
39
- <td>
40
- #{if user_authorized?(:edit_user_group)
41
- Users::Controller::UserGroups.a(
42
- group.name,
43
- :edit,
44
- group.id
45
- )
46
- else
47
- group.name
48
- end}
49
- </td>
50
- <td>#{group.slug}</td>
51
- <td>#{@boolean_hash[group.super_group]}</td>
52
- </tr>
53
- <?r end ?>
54
- </tbody>
55
- </table>
39
+ <td>#{group.id}</td>
40
+ <td>
41
+ #{if user_authorized?(:edit_user_group)
42
+ edit_link(
43
+ Users::Controller::UserGroups.r(:edit, group.id),
44
+ group.name
45
+ )
46
+ else
47
+ group.name
48
+ end}
49
+ </td>
50
+ <td>#{group.slug}</td>
51
+ <td>#{@boolean_hash[group.super_group]}</td>
52
+ </tr>
53
+ <?r end ?>
54
+ </tbody>
55
+ </table>
56
56
 
57
- #{if @user_groups.respond_to?(:navigation) \
58
- and @user_groups.page_count > 1
59
- @user_groups.navigation
60
- end}
57
+ #{render_pagination(@user_groups)}
61
58
 
62
- <?r else ?>
59
+ <?r else ?>
63
60
 
64
- <p>#{lang('user_groups.messages.no_groups')}</p>
61
+ <p>#{lang('user_groups.messages.no_groups')}</p>
65
62
 
66
- <?r end ?>
63
+ <?r end ?>
67
64
 
68
- <?r if user_authorized?(:new_user_group) ?>
69
- <div class="button">
70
- #{Users::Controller::UserGroups.a(
71
- lang('user_groups.buttons.new'),
72
- :new
65
+ <?r if user_authorized?(:new_user_group) ?>
66
+ #{new_button(
67
+ Users::Controller::UserGroups.r(:new),
68
+ lang('user_groups.buttons.new')
73
69
  )}
74
- </div>
75
- <?r end ?>
70
+ <?r end ?>
76
71
 
77
- <?r if user_authorized?(:delete_user_group) \
78
- and !@user_groups.empty? ?>
79
- <div class="button">
80
- <input type="submit"
81
- value="#{lang('user_groups.buttons.delete')}" />
82
- </div>
83
- <?r end ?>
84
- </form>
72
+ <?r if user_authorized?(:delete_user_group) \
73
+ and !@user_groups.empty? ?>
74
+ #{delete_button(lang('user_groups.buttons.delete'))}
75
+ <?r end ?>
76
+ </form>
77
+ </div>
85
78
  </section>