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
@@ -0,0 +1,29 @@
1
+ <section>
2
+ <header class="with_search">
3
+ <h1>#{lang('dashboard.titles.index')}</h1>
4
+
5
+ <button class="button" id="toggle_options">
6
+ #{lang('dashboard.buttons.options')}
7
+ </button>
8
+ </header>
9
+
10
+ <div id="widget_options">
11
+ <div id="widget_columns">
12
+ <label>#{lang('dashboard.labels.columns')}</label>
13
+
14
+ #{Dashboard::Widget.columns_html}
15
+ </div>
16
+
17
+ <div id="active_widgets">
18
+ <label>#{lang('dashboard.labels.active_widgets')}</label>
19
+
20
+ #{Dashboard::Widget.checkbox_html}
21
+ </div>
22
+ </div>
23
+
24
+ <div class="body">
25
+ <div id="widgets" class="columns_#{user.widget_columns}">
26
+ #{Dashboard::Widget.html}
27
+ </div>
28
+ </div>
29
+ </section>
@@ -0,0 +1,28 @@
1
+ <p>#{lang('dashboard.widgets.welcome.content.paragraph_1' ) % Zen::VERSION}</p>
2
+
3
+ <p>#{lang('dashboard.widgets.welcome.content.paragraph_2')}</p>
4
+
5
+ <p>#{lang('dashboard.widgets.welcome.content.paragraph_3')}</p>
6
+
7
+ <ul>
8
+ <li>
9
+ <a href="http://zen-cms.com/documentation/index.html"
10
+ title="#{lang('dashboard.labels.documentation')}">
11
+ #{lang('dashboard.labels.documentation')}
12
+ </a>
13
+ </li>
14
+
15
+ <li>
16
+ <a href="http://github.com/zen-cms/zen-core"
17
+ title="#{lang('dashboard.labels.github')}">
18
+ #{lang('dashboard.labels.github')}
19
+ </a>
20
+ </li>
21
+
22
+ <li>
23
+ <a href="https://groups.google.com/forum/#!forum/zen-cms"
24
+ title="#{lang('dashboard.labels.mailing_list')}">
25
+ #{lang('dashboard.labels.mailing_list')}
26
+ </a>
27
+ </li>
28
+ </ul>
@@ -0,0 +1,292 @@
1
+ module Dashboard
2
+ # Error class for the widgets system.
3
+ class WidgetError < StandardError; end
4
+
5
+ ##
6
+ # Widgets are small blocks of content displayed on a user's dashboard. These
7
+ # widgets can contain data such as recent entries, a help message or a graph
8
+ # showing the website's traffic.
9
+ #
10
+ # In order to create a new widget you should call {Dashboard::Widget.add} and
11
+ # pass a block to it. In this block you can set the following attributes:
12
+ #
13
+ # * name: the unique name of the widget.
14
+ # * title: the title of the widget, can either be a language string or a
15
+ # regular one.
16
+ # * data: an object that responds to ``#call()`` and returns the content of
17
+ # the widget. This object is evaluated in the context of the current
18
+ # controller instance ({Dashboard::Controller::Dashboard}). If you're using
19
+ # a lambda you *have to* specify a first parameter as ``#instance_eval``
20
+ # will always pass the evaluated instance as a parameter. If you don't want
21
+ # to do this you can use ``Proc.new { }`` or simply ``proc { }`` as an
22
+ # alternative.
23
+ #
24
+ # An example of adding a widget is the following:
25
+ #
26
+ # Dashboard::Widget.add do |w|
27
+ # w.name = :example_widget
28
+ # w.title = 'dashboard.titles.example_widget'
29
+ # w.data = lambda do |instance|
30
+ # return render_view(:example_view)
31
+ # end
32
+ # end
33
+ #
34
+ # Once a widget has been registered it can be retrieved using
35
+ # {Dashboard::Widget#[]}:
36
+ #
37
+ # Dashboard::Widget[:example_widget] # => <Dashboard::Widget ...>
38
+ #
39
+ # @since 08-01-2012
40
+ #
41
+ class Widget
42
+ include Zen::Validation
43
+ include Ramaze::Trinity
44
+ include Ramaze::Helper::ACL
45
+
46
+ # Hash containing all the registered widgets.
47
+ REGISTERED = {}
48
+
49
+ # Array containing the amount of widget columns.
50
+ COLUMNS = [1, 2, 3, 4]
51
+
52
+ # The name of the widget as a symbol.
53
+ attr_reader :name
54
+
55
+ # The title of the widget (displayed on the dashboard).
56
+ attr_writer :title
57
+
58
+ # A permission required to view a widget.
59
+ attr_accessor :permission
60
+
61
+ # An object that responds to #call() and returns the content of the widget.
62
+ # When called the first parameter is set to ``Ramaze::Current.action``
63
+ # allowing you to use methods such as ``render_view``.
64
+ attr_accessor :data
65
+
66
+ class << self
67
+ ##
68
+ # Adds a new widget. Widgets are defined as following:
69
+ #
70
+ # Dashboard::Widget.add do |w|
71
+ # w.name = :recent_entries
72
+ # w.title = 'Recent Entries'
73
+ # w.data = lambda do |action|
74
+ # return action.node.render_view(:example)
75
+ # end
76
+ # end
77
+ #
78
+ # @since 08-01-2012
79
+ #
80
+ def add
81
+ widget = self.new
82
+
83
+ yield(widget)
84
+ widget.validate
85
+
86
+ REGISTERED[widget.name] = widget
87
+ end
88
+
89
+ ##
90
+ # Retrieves the widget for the given name.
91
+ #
92
+ # @example
93
+ # Dashboard::Widget[:recent_entries]
94
+ #
95
+ # @since 08-01-2012
96
+ #
97
+ def [](name)
98
+ name = name.to_sym
99
+
100
+ unless REGISTERED.key?(name)
101
+ raise(WidgetError, "The widget \"#{name}\" does not exist")
102
+ end
103
+
104
+ return REGISTERED[name]
105
+ end
106
+
107
+ ##
108
+ # Generates the HTML for all active widgets and sorts them by the user's
109
+ # sort order.
110
+ #
111
+ # @since 14-01-2012
112
+ # @return [String]
113
+ #
114
+ def html
115
+ html = ''
116
+ widgets = Dashboard::Model::Widget.select(:name) \
117
+ .filter(:user_id => user.id) \
118
+ .order(:order.asc)
119
+
120
+ widgets.each do |row|
121
+ name = row.name
122
+ html += Widget[name].html if Widget[name].allowed?
123
+ end
124
+
125
+ return html
126
+ end
127
+
128
+ ##
129
+ # Builds the HTML for the radio buttons that can be used to change the
130
+ # amount of widget columns.
131
+ #
132
+ # @since 15-01-2012
133
+ # @return [String]
134
+ #
135
+ def columns_html
136
+ g = Ramaze::Gestalt.new
137
+ current = user.widget_columns
138
+
139
+ COLUMNS.each do |c|
140
+ params = {
141
+ :name => 'widget_columns',
142
+ :type => 'radio',
143
+ :value => c,
144
+ :id => 'widget_columns_%s' % c
145
+ }
146
+
147
+ params[:checked] = 'checked' if c == current
148
+
149
+ g.span(:class => 'radio_wrap') do
150
+ g.input(params)
151
+
152
+ g.out << c
153
+ end
154
+ end
155
+
156
+ return g.to_s
157
+ end
158
+
159
+ ##
160
+ # Generates a chunk of HTML that contains various checkboxes to toggle the
161
+ # state of all widgets.
162
+ #
163
+ # @since 14-01-2012
164
+ # @return [String]
165
+ #
166
+ def checkbox_html
167
+ g = Ramaze::Gestalt.new
168
+ active = Dashboard::Model::Widget.select(:name) \
169
+ .filter(:user_id => user.id) \
170
+ .map { |r| r.name.to_sym }
171
+
172
+ REGISTERED.each do |name, widget|
173
+ next unless widget.allowed?
174
+
175
+ params = {
176
+ :type => 'checkbox',
177
+ :name => 'active_widgets[]',
178
+ :value => 'widget_%s' % name,
179
+ :id => 'toggle_widget_%s' % name
180
+ }
181
+
182
+ params[:checked] = 'checked' if active.include?(name)
183
+
184
+ g.span(:class => 'checkbox_wrap') do
185
+ g.input(params)
186
+
187
+ g.out << widget.title
188
+ end
189
+ end
190
+
191
+ return g.to_s
192
+ end
193
+
194
+ private
195
+
196
+ ##
197
+ # Returns the current user model.
198
+ #
199
+ # @since 15-01-2012
200
+ # @return [Users::Model::User]
201
+ def user
202
+ return Ramaze::Current.action.node.request.env[
203
+ Ramaze::Helper::UserHelper::RAMAZE_HELPER_USER
204
+ ]
205
+ end
206
+ end # class << self
207
+
208
+ ##
209
+ # Sets the name of the widget and converts it to a symbol.
210
+ #
211
+ # @since 11-01-2012
212
+ # @param [#to_sym] name The name of the widget.
213
+ #
214
+ def name=(name)
215
+ @name = name.to_sym
216
+ end
217
+
218
+ ##
219
+ # Returns the title of the widget. If the title is set to a valid language
220
+ # string the value of that string is returned, otherwise the raw title is
221
+ # returned.
222
+ #
223
+ # @since 11-01-2012
224
+ # @return [String]
225
+ #
226
+ def title
227
+ begin
228
+ return lang(@title)
229
+ rescue
230
+ return @title
231
+ end
232
+ end
233
+
234
+ ##
235
+ # Checks if the user is allowed to view the current widget.
236
+ #
237
+ # @since 16-01-2012
238
+ # @return [TrueClass|Falseclass]
239
+ #
240
+ def allowed?
241
+ return true if @permission.nil?
242
+ return user_authorized?(@permission)
243
+ end
244
+
245
+ ##
246
+ # Validates the instance of the widget.
247
+ #
248
+ # @since 11-01-2012
249
+ #
250
+ def validate
251
+ validates_presence([:name, :title, :data])
252
+
253
+ if REGISTERED.key?(name)
254
+ raise(Zen::ValidationError, "The widget \"#{name}\" already exists")
255
+ end
256
+ end
257
+
258
+ ##
259
+ # Returns a string containing the full HTML for the widget. The HTML of each
260
+ # widget looks like the following:
261
+ #
262
+ # <section class="widget" id="widget_example">
263
+ # <header>
264
+ # <h1>Example</h1>
265
+ # </header>
266
+ #
267
+ # <div class="body">
268
+ # Widget content
269
+ # </div>
270
+ # </section>
271
+ #
272
+ # @since 12-01-2012
273
+ # @return [String]
274
+ #
275
+ def html
276
+ g = Ramaze::Gestalt.new
277
+ action = Ramaze::Current.action
278
+
279
+ g.section(:class => 'widget', :id => 'widget_' + name.to_s) do
280
+ g.header do
281
+ g.h1(title)
282
+ end
283
+
284
+ g.div(:class => 'body') do
285
+ action.instance.instance_eval(&data)
286
+ end
287
+ end
288
+
289
+ return g.to_s
290
+ end
291
+ end # Widget
292
+ end # Dashboard
@@ -0,0 +1,9 @@
1
+ # The welcome widget shows a welcome message explaining a few things about Zen.
2
+ # It also shows a list of links to common resources such as the documentation.
3
+ Dashboard::Widget.add do |w|
4
+ w.name = :welcome
5
+ w.title = 'dashboard.widgets.titles.welcome'
6
+ w.data = lambda do |instance|
7
+ return render_file(__DIR__('../view/admin/widget/welcome.xhtml'))
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table :widgets do
4
+ primary_key :id
5
+
6
+ String :name, :null => false
7
+ Integer :order, :null => false
8
+
9
+ foreign_key :user_id, :users, :on_delete => :cascade,
10
+ :on_update => :cascade, :key => :id
11
+ end
12
+
13
+ add_column :users, :widget_columns, Integer, :default => 1
14
+
15
+ rows = []
16
+
17
+ Zen.database[:users].select(:id).each do |user|
18
+ rows << {:user_id => user[:id], :order => 0, :name => 'welcome'}
19
+ end
20
+
21
+ Zen.database[:widgets].multi_insert(rows)
22
+ end
23
+
24
+ down do
25
+ drop_table :widgets
26
+ drop_column :users, :widget_columns
27
+ end
28
+ end
@@ -6,15 +6,15 @@ Zen::Package.add do |p|
6
6
  p.about = 'extensions.description'
7
7
  p.root = __DIR__('extensions')
8
8
 
9
- p.menu(
10
- 'extensions.titles.index',
9
+ p.menu 'extensions.titles.index',
11
10
  '/admin/extensions',
12
11
  :permission => :show_extension
13
- )
14
12
 
15
13
  p.permission :show_extension, 'extensions.permissions.show'
16
14
  end
17
15
 
18
- Zen::Language.load('extensions')
19
-
20
16
  require __DIR__('extensions/controller/extensions')
17
+
18
+ Zen::Event.listen :post_start do
19
+ Zen::Language.load('extensions')
20
+ end
@@ -6,81 +6,86 @@
6
6
  <div class="tabs">
7
7
  <ul>
8
8
  <li>
9
- <a href="#packages">#{lang('extensions.labels.packages')}</a>
9
+ <a class="icon box"
10
+ href="#packages">#{lang('extensions.labels.packages')}</a>
10
11
  </li>
11
12
  <li>
12
- <a href="#themes">#{lang('extensions.labels.themes')}</a>
13
+ <a class="icon template"
14
+ href="#themes">#{lang('extensions.labels.themes')}</a>
13
15
  </li>
14
16
  <li>
15
- <a href="#languages">#{lang('extensions.labels.languages')}</a>
17
+ <a class="icon globe"
18
+ href="#languages">#{lang('extensions.labels.languages')}</a>
16
19
  </li>
17
20
  </ul>
18
21
  </div>
19
22
 
20
- <div id="packages">
21
- <table class="no_sort">
22
- <thead>
23
- <tr>
24
- <th>#{lang('extensions.labels.package')}</th>
25
- <th>#{lang('extensions.labels.author')}</th>
26
- <th>#{lang('extensions.labels.description')}</th>
27
- </tr>
28
- </thead>
29
- <tbody>
30
- <?r Zen::Package::REGISTERED.each do |name, package| ?>
31
- <tr>
32
- <td>#{package.formatted_title}</td>
33
- <td>#{package.author}</td>
34
- <td>#{package.about}</td>
35
- </tr>
36
- <?r end ?>
37
- </tbody>
38
- </table>
39
- </div>
23
+ <div class="body">
24
+ <div id="packages">
25
+ <table class="no_sort">
26
+ <thead>
27
+ <tr>
28
+ <th>#{lang('extensions.labels.package')}</th>
29
+ <th>#{lang('extensions.labels.author')}</th>
30
+ <th>#{lang('extensions.labels.description')}</th>
31
+ </tr>
32
+ </thead>
33
+ <tbody>
34
+ <?r Zen::Package::REGISTERED.each do |name, package| ?>
35
+ <tr>
36
+ <td>#{package.formatted_title}</td>
37
+ <td>#{package.author}</td>
38
+ <td>#{package.about}</td>
39
+ </tr>
40
+ <?r end ?>
41
+ </tbody>
42
+ </table>
43
+ </div>
40
44
 
41
- <div id="themes">
42
- <table class="no_sort">
43
- <thead>
44
- <tr>
45
- <th>#{lang('extensions.labels.theme')}</th>
46
- <th>#{lang('extensions.labels.author')}</th>
47
- <th>#{lang('extensions.labels.description')}</th>
48
- </tr>
49
- </thead>
50
- <tbody>
51
- <?r Zen::Theme::REGISTERED.each do |name, theme| ?>
52
- <tr>
53
- <td>#{theme.formatted_name}</td>
54
- <td>#{theme.author}</td>
55
- <td>#{theme.about}</td>
56
- </tr>
57
- <?r end ?>
58
- </tbody>
59
- </table>
60
- </div>
45
+ <div id="themes">
46
+ <table class="no_sort">
47
+ <thead>
48
+ <tr>
49
+ <th>#{lang('extensions.labels.theme')}</th>
50
+ <th>#{lang('extensions.labels.author')}</th>
51
+ <th>#{lang('extensions.labels.description')}</th>
52
+ </tr>
53
+ </thead>
54
+ <tbody>
55
+ <?r Zen::Theme::REGISTERED.each do |name, theme| ?>
56
+ <tr>
57
+ <td>#{theme.formatted_name}</td>
58
+ <td>#{theme.author}</td>
59
+ <td>#{theme.about}</td>
60
+ </tr>
61
+ <?r end ?>
62
+ </tbody>
63
+ </table>
64
+ </div>
61
65
 
62
- <div id="languages">
63
- <table class="no_sort">
64
- <thead>
65
- <tr>
66
- <th>#{lang('extensions.labels.language')}</th>
67
- <th>#{lang('extensions.labels.rtl')}</th>
68
- <th>#{lang('extensions.labels.loaded_translations')}</th>
69
- </tr>
70
- </thead>
71
- <tbody>
72
- <?r Zen::Language::REGISTERED.each do |name, lang| ?>
73
- <tr>
74
- <td>#{lang.title}</td>
75
- <td>
76
- #{lang(
77
- "zen_general.special.boolean_hash.#{lang.rtl}"
78
- )}
79
- </td>
80
- <td>#{lang.collections.keys.length}</td>
81
- </tr>
82
- <?r end ?>
83
- </tbody>
84
- </table>
85
- </div>
66
+ <div id="languages">
67
+ <table class="no_sort">
68
+ <thead>
69
+ <tr>
70
+ <th>#{lang('extensions.labels.language')}</th>
71
+ <th>#{lang('extensions.labels.rtl')}</th>
72
+ <th>#{lang('extensions.labels.loaded_translations')}</th>
73
+ </tr>
74
+ </thead>
75
+ <tbody>
76
+ <?r Zen::Language::REGISTERED.each do |name, lang| ?>
77
+ <tr>
78
+ <td>#{lang.title}</td>
79
+ <td>
80
+ #{lang(
81
+ "zen_general.special.boolean_hash.#{lang.rtl}"
82
+ )}
83
+ </td>
84
+ <td>#{lang.collections.keys.length}</td>
85
+ </tr>
86
+ <?r end ?>
87
+ </tbody>
88
+ </table>
89
+ </div>
90
+ </div>
86
91
  </section>