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
@@ -27,7 +27,6 @@ module Ramaze
27
27
  ##
28
28
  # Validates a section entry and returns it if it's valid.
29
29
  #
30
- #
31
30
  # @since 0.2.8
32
31
  # @param [Fixnum] section_entry_id The ID of the section entry to
33
32
  # validate.
@@ -45,6 +44,50 @@ module Ramaze
45
44
  return entry
46
45
  end
47
46
  end
47
+
48
+ ##
49
+ # Creates or updates a set of custom fields for a given section entry.
50
+ #
51
+ # @since 17-02-2012
52
+ # @param [Sections::Model::SectionEntry] entry The entry for which to
53
+ # create or update the fields.
54
+ # @return [Hash] Hash containing any errors for the custom fields.
55
+ #
56
+ def process_custom_fields(entry)
57
+ request.params.delete('id')
58
+
59
+ field_values = {}
60
+ field_errors = {}
61
+
62
+ entry.custom_field_values.each do |value|
63
+ field_values[value.custom_field_id] = value
64
+ end
65
+
66
+ entry.custom_fields.each do |field|
67
+ key = "custom_field_value_#{field.id}"
68
+
69
+ if field.required \
70
+ and (request.POST[key].nil? or request.POST[key].empty?)
71
+ field_errors[:"custom_field_value_#{field.id}"] = \
72
+ lang('zen_models.presence')
73
+
74
+ next
75
+ end
76
+
77
+ next unless request.POST.key?(key)
78
+
79
+ if field_values.key?(field.id)
80
+ field_values[field.id].update(:value => request.POST[key])
81
+ else
82
+ entry.add_custom_field_value(
83
+ :custom_field_id => field.id,
84
+ :value => request.POST[key]
85
+ )
86
+ end
87
+ end
88
+
89
+ return field_errors
90
+ end
48
91
  end # Section
49
92
  end # Helper
50
93
  end # Ramaze
@@ -46,5 +46,7 @@ Zen::Language::Translation.add do |trans|
46
46
  t['permissions.edit'] = 'Edit section entry'
47
47
  t['permissions.new'] = 'Add section entry'
48
48
  t['permissions.delete'] = 'Delete section entry'
49
+
50
+ t['widgets.titles.recent_entries'] = 'Recent Entries'
49
51
  end
50
52
  end
@@ -46,5 +46,7 @@ Zen::Language::Translation.add do |trans|
46
46
  t['permissions.edit'] = 'Sectie item aanpassen'
47
47
  t['permissions.new'] = 'Sectie item aanmaken'
48
48
  t['permissions.delete'] = 'Sectie item verwijderen'
49
+
50
+ t['widgets.titles.recent_entries'] = 'Recente sectie items'
49
51
  end
50
52
  end
@@ -4,11 +4,34 @@ module Sections
4
4
  ##
5
5
  # Model that represents a single section.
6
6
  #
7
- # @since 0.1
7
+ # @since 0.1
8
+ # @event before_new_section
9
+ # @event after_new_section
10
+ # @event before_edit_section
11
+ # @event after_edit_section
12
+ # @event before_delete_section
13
+ # @event after_delete_section
8
14
  #
9
15
  class Section < Sequel::Model
10
16
  include Zen::Model::Helper
11
17
 
18
+ ##
19
+ # Array containing all the columns that can be set by the user.
20
+ #
21
+ # @since 17-02-2012
22
+ #
23
+ COLUMNS = [
24
+ :name,
25
+ :slug,
26
+ :description,
27
+ :comment_allow,
28
+ :comment_require_account,
29
+ :comment_moderate,
30
+ :comment_format,
31
+ :custom_field_group_pks,
32
+ :category_group_pks
33
+ ]
34
+
12
35
  one_to_many :section_entries,
13
36
  :class => 'Sections::Model::SectionEntry',
14
37
  :eager => [:custom_field_values, :section_entry_status]
@@ -21,6 +44,19 @@ module Sections
21
44
 
22
45
  plugin :sluggable, :source => :name, :freeze => false
23
46
 
47
+ plugin :association_dependencies,
48
+ :section_entries => :delete,
49
+ :custom_field_groups => :nullify,
50
+ :category_groups => :nullify
51
+
52
+ plugin :events,
53
+ :before_create => :before_new_section,
54
+ :after_create => :after_new_section,
55
+ :before_update => :before_edit_section,
56
+ :after_update => :after_edit_section,
57
+ :before_destroy => :before_delete_section,
58
+ :after_destroy => :after_delete_section
59
+
24
60
  ##
25
61
  # Searches for a number of sections of which the title or description
26
62
  # matches the search query.
@@ -61,6 +97,17 @@ module Sections
61
97
 
62
98
  validates_unique(:slug)
63
99
  end
100
+
101
+ ##
102
+ # Hook that is executed before creating or saving an object.
103
+ #
104
+ # @since 03-01-2012
105
+ #
106
+ def before_save
107
+ sanitize_fields([:name, :slug, :description, :comment_format])
108
+
109
+ super
110
+ end
64
111
  end # Section
65
112
  end # Model
66
113
  end # Sections
@@ -4,11 +4,32 @@ module Sections
4
4
  ##
5
5
  # Model that represents a singe section entry.
6
6
  #
7
- # @since 0.1
7
+ # @since 0.1
8
+ # @event before_new_section_entry
9
+ # @event after_new_section_entry
10
+ # @event before_edit_section_entry
11
+ # @event after_edit_section_entry
12
+ # @event before_delete_section_entry
13
+ # @event after_delete_section_entry
8
14
  #
9
15
  class SectionEntry < Sequel::Model
10
16
  include Zen::Model::Helper
11
17
 
18
+ ##
19
+ # Array containing all the columns that can be set by the user.
20
+ #
21
+ # @since 17-02-2012
22
+ #
23
+ COLUMNS = [
24
+ :title,
25
+ :created_at,
26
+ :section_id,
27
+ :user_id,
28
+ :slug,
29
+ :section_entry_status_id,
30
+ :category_pks
31
+ ]
32
+
12
33
  one_to_many :comments,
13
34
  :class => 'Comments::Model::Comment'
14
35
 
@@ -29,7 +50,23 @@ module Sections
29
50
  :class => 'Sections::Model::SectionEntryStatus'
30
51
 
31
52
  plugin :sluggable , :source => :title , :freeze => false
32
- plugin :timestamps, :create => :created_at, :update => false
53
+ plugin :timestamps, :create => :created_at, :update => :updated_at
54
+
55
+ plugin :association_dependencies,
56
+ :comments => :delete,
57
+ :custom_field_values => :delete
58
+
59
+ plugin :events,
60
+ :before_create => :before_new_section_entry,
61
+ :after_create => :after_new_section_entry,
62
+ :before_update => :before_edit_section_entry,
63
+ :after_update => :after_edit_section_entry,
64
+ :before_destroy => :before_delete_section_entry,
65
+ :after_destroy => :after_delete_section_entry
66
+
67
+ # String containing the date format to use for the created_at field when
68
+ # rendering the form.
69
+ DATE_FORMAT = '%Y-%m-%d %H:%M'
33
70
 
34
71
  # A hash that will contain all the custom fields and the values of these
35
72
  # fields for a single entry.
@@ -196,9 +233,7 @@ module Sections
196
233
 
197
234
  begin
198
235
  result[group.id][:fields].push(
199
- CustomFields::BlueFormParameters.send(
200
- m, field, values[field.id]
201
- )
236
+ CustomFields::BlueFormParameters.send(m, field, values[field.id])
202
237
  )
203
238
  rescue => e
204
239
  Ramaze::Log.error(e)
@@ -209,12 +244,27 @@ module Sections
209
244
  return result
210
245
  end
211
246
 
247
+ ##
248
+ # Returns a string containing the name of the entry's status in the
249
+ # currently used language.
250
+ #
251
+ # @since 17-12-2011
252
+ # @return [String]
253
+ #
254
+ def status_name
255
+ return lang(
256
+ 'section_entries.special.status_hash.%s' % section_entry_status.name
257
+ )
258
+ end
259
+
212
260
  ##
213
261
  # Hook that is executed before saving an existing section entry.
214
262
  #
215
263
  # @since 0.2.8
216
264
  #
217
265
  def before_save
266
+ sanitize_fields([:title, :slug])
267
+
218
268
  if self.section_entry_status_id.nil?
219
269
  self.section_entry_status_id = ::Sections::Model::SectionEntryStatus[
220
270
  :name => 'draft'
@@ -8,6 +8,8 @@ module Sections
8
8
  class SectionEntryStatus < Sequel::Model
9
9
  many_to_one :section_entry,
10
10
  :class => 'Sections::Model::SectionEntryStatus'
11
+
12
+ plugin :association_dependencies, :section_entry => :delete
11
13
  end # SectionEntryStatus
12
14
  end # Model
13
15
  end # Sections
@@ -6,12 +6,13 @@
6
6
  <div class="tabs">
7
7
  <ul>
8
8
  <li>
9
- <a href="#basic" title="#{lang('section_entries.tabs.basic')}">
9
+ <a href="#basic" class="icon edit"
10
+ title="#{lang('section_entries.tabs.basic')}">
10
11
  #{lang('section_entries.tabs.basic')}
11
12
  </a>
12
13
  </li>
13
14
  <li>
14
- <a href="#categories"
15
+ <a href="#categories" class="icon categories"
15
16
  title="#{lang('section_entries.tabs.categories')}">
16
17
  #{lang('section_entries.tabs.categories')}
17
18
  </a>
@@ -27,85 +28,93 @@
27
28
  </ul>
28
29
  </div>
29
30
 
30
- #{form_for(
31
- @entry,
32
- :method => :post,
33
- :action => Sections::Controller::SectionEntries.r(:save),
34
- :id => :section_entry_form
35
- ) do |f|
36
- f.input_hidden(:csrf_token, get_csrf_token)
37
- f.input_hidden(:section_id, @section_id)
38
- f.input_hidden(:id , @entry.id)
31
+ <div class="body">
32
+ #{form_for(
33
+ @entry,
34
+ :method => :post,
35
+ :action => Sections::Controller::SectionEntries.r(:save),
36
+ :id => :section_entry_form,
37
+ :'data-autosave-url' => Sections::Controller::SectionEntries \
38
+ .r(:autosave)
39
+ ) do |f|
40
+ f.input_hidden(:csrf_token, get_csrf_token)
41
+ f.input_hidden(:section_id, @section_id)
42
+ f.input_hidden(:id , @entry.id)
39
43
 
40
- f.g.div(:id => :basic) do
41
- f.input_text(
42
- lang('section_entries.labels.title'),
43
- :title,
44
- :required => :required,
45
- :maxlength => 255
46
- )
47
-
48
- f.input_text(
49
- lang('section_entries.labels.slug'),
50
- :slug,
51
- :maxlength => 255
52
- )
53
-
54
- # Only show the date field when modifying an existing entry
55
- if !@entry.nil?
44
+ f.g.div(:id => :basic) do
56
45
  f.input_text(
57
- lang('section_entries.labels.created_at'),
58
- :created_at,
59
- :class => 'date'
46
+ lang('section_entries.labels.title'),
47
+ :title,
48
+ :required => :required,
49
+ :maxlength => 255
60
50
  )
61
- end
62
51
 
63
- f.select(
64
- lang('section_entries.labels.author'),
65
- :user_id,
66
- :values => ::Users::Model::User.pk_hash(:name),
67
- :size => 1,
68
- :required => :required
69
- )
52
+ f.input_text(
53
+ lang('section_entries.labels.slug'),
54
+ :slug,
55
+ :maxlength => 255
56
+ )
70
57
 
71
- f.select(
72
- lang('section_entries.labels.status'),
73
- :section_entry_status_id,
74
- :values => ::Sections::Model::SectionEntry.status_hash,
75
- :selected => @entry.section_entry_status_id,
76
- :size => 1
77
- )
78
- end
58
+ # Only show the date field when modifying an existing entry
59
+ if @entry.exists?
60
+ format = Sections::Model::SectionEntry::DATE_FORMAT
79
61
 
80
- f.g.div(:id => :categories) do
81
- if !@possible_categories.empty?
82
- @possible_categories.each do |group, categories|
83
- f.input_checkbox(
84
- group,
85
- :category_pks,
86
- @entry.category_pks,
87
- :values => categories.invert,
62
+ f.input_text(
63
+ lang('section_entries.labels.created_at'),
64
+ :created_at,
65
+ :class => 'date',
66
+ :value => @entry.created_at.strftime(format),
67
+ :'data-date-format' => format,
68
+ :'data-date-time' => true,
88
69
  )
89
70
  end
90
- else
91
- f.g.p(lang('section_entries.messages.no_categories'))
71
+
72
+ f.select(
73
+ lang('section_entries.labels.author'),
74
+ :user_id,
75
+ :values => ::Users::Model::User.pk_hash(:name),
76
+ :size => 1,
77
+ :required => :required
78
+ )
79
+
80
+ f.select(
81
+ lang('section_entries.labels.status'),
82
+ :section_entry_status_id,
83
+ :values => ::Sections::Model::SectionEntry.status_hash,
84
+ :selected => @entry.section_entry_status_id,
85
+ :size => 1
86
+ )
92
87
  end
93
- end
94
88
 
95
- # Display all the custom fields for this entry
96
- @custom_fields_hash.each do |id, group|
97
- f.g.div(:id => "group_#{id}") do
98
- group[:fields].each do |field|
99
- f.send(*field)
89
+ f.g.div(:id => :categories) do
90
+ if !@possible_categories.empty?
91
+ @possible_categories.each do |group, categories|
92
+ f.input_checkbox(
93
+ group,
94
+ :category_pks,
95
+ @entry.category_pks,
96
+ :values => categories.invert,
97
+ )
98
+ end
99
+ else
100
+ f.g.p(lang('section_entries.messages.no_categories'))
101
+ end
102
+ end
103
+
104
+ # Display all the custom fields for this entry
105
+ @custom_fields_hash.each do |id, group|
106
+ f.g.div(:id => "group_#{id}") do
107
+ group[:fields].each do |field|
108
+ f.send(*field)
109
+ end
100
110
  end
101
111
  end
102
- end
103
112
 
104
- f.g.div(:class => 'button') do
105
113
  f.g.input(
106
114
  :type => 'submit',
107
- :value => lang('section_entries.buttons.save')
115
+ :value => lang('section_entries.buttons.save'),
116
+ :class => 'button'
108
117
  )
109
- end
110
- end}
118
+ end}
119
+ </div>
111
120
  </section>
@@ -1,95 +1,90 @@
1
1
  <section>
2
- #{render_search_form(
3
- ::Sections::Controller::SectionEntries.r(:index, @section_id)
4
- )}
5
-
6
- <header>
2
+ <header class="with_search">
7
3
  <h1>#{get_breadcrumbs}</h1>
4
+
5
+ #{render_search_form(
6
+ ::Sections::Controller::SectionEntries.r(:index, @section_id)
7
+ )}
8
8
  </header>
9
9
 
10
- <form method="post"
11
- action="#{Sections::Controller::SectionEntries.r(:delete)}">
12
- <input type="hidden" name="csrf_token" value="#{get_csrf_token}" />
10
+ <div class="body">
11
+ <form method="post"
12
+ action="#{Sections::Controller::SectionEntries.r(:delete)}">
13
+ <input type="hidden" name="csrf_token" value="#{get_csrf_token}" />
13
14
 
14
- <?r if !@entries.empty? ?>
15
+ <?r if !@entries.empty? ?>
15
16
 
16
- <table>
17
- <thead>
18
- <tr>
19
- <?r if user_authorized?(:delete_section_entry) ?>
20
- <th class="no_sort">
21
- <input type="checkbox" />
22
- </th>
23
- <?r end ?>
17
+ <table>
18
+ <thead>
19
+ <tr>
20
+ <?r if user_authorized?(:delete_section_entry) ?>
21
+ <th class="no_sort">
22
+ <input type="checkbox" />
23
+ </th>
24
+ <?r end ?>
24
25
 
25
- <th>#{lang('section_entries.labels.id')}</th>
26
- <th>#{lang('section_entries.labels.title')}</th>
27
- <th>#{lang('section_entries.labels.slug')}</th>
28
- <th>#{lang('section_entries.labels.status')}</th>
29
- <th>#{lang('section_entries.labels.created_at')}</th>
30
- <th>#{lang('section_entries.labels.updated_at')}</th>
31
- </tr>
32
- </thead>
33
- <tbody>
34
- <?r @entries.each do |entry| ?>
35
- <tr>
36
- <?r if user_authorized?(:delete_section_entry) ?>
37
- <td>
38
- <input type="checkbox" name="section_entry_ids[]"
39
- value="#{entry.id}" />
40
- </td>
41
- <?r end ?>
26
+ <th>#{lang('section_entries.labels.id')}</th>
27
+ <th>#{lang('section_entries.labels.title')}</th>
28
+ <th>#{lang('section_entries.labels.slug')}</th>
29
+ <th>#{lang('section_entries.labels.status')}</th>
30
+ <th>#{lang('section_entries.labels.created_at')}</th>
31
+ <th>#{lang('section_entries.labels.updated_at')}</th>
32
+ </tr>
33
+ </thead>
34
+ <tbody>
35
+ <?r @entries.each do |entry| ?>
36
+ <tr>
37
+ <?r if user_authorized?(:delete_section_entry) ?>
38
+ <td>
39
+ <input type="checkbox" name="section_entry_ids[]"
40
+ value="#{entry.id}" />
41
+ </td>
42
+ <?r end ?>
42
43
 
43
- <td>#{entry.id}</td>
44
+ <td>#{entry.id}</td>
45
+
46
+ <td>
47
+ #{if user_authorized?(:edit_section_entry)
48
+ edit_link(
49
+ Sections::Controller::SectionEntries.r(
50
+ :edit,
51
+ @section_id,
52
+ entry.id
53
+ ),
54
+ entry.title
55
+ )
56
+ else
57
+ entry.title
58
+ end}
59
+ </td>
60
+
61
+ <td>#{entry.slug}</td>
62
+ <td>#{entry.status_name}</td>
63
+ <td>#{format_date(entry.created_at)}</td>
64
+ <td>#{format_date(entry.updated_at)}</td>
65
+ </tr>
66
+ <?r end ?>
67
+ </tbody>
68
+ </table>
44
69
 
45
- <td>
46
- #{if user_authorized?(:edit_section_entry)
47
- Sections::Controller::SectionEntries.a(
48
- entry.title,
49
- :edit,
50
- @section_id,
51
- entry.id
52
- )
53
- else
54
- entry.title
55
- end}
56
- </td>
70
+ #{render_pagination(@entries)}
57
71
 
58
- <td>#{entry.slug}</td>
59
- <td>
60
- #{lang(
61
- "section_entries.special.status_hash.#{entry. \
62
- section_entry_status.name}"
63
- )}
64
- </td>
65
- <td>#{format_date(entry.created_at)}</td>
66
- <td>#{format_date(entry.updated_at)}</td>
67
- </tr>
68
- <?r end ?>
69
- </tbody>
70
- </table>
72
+ <?r else ?>
71
73
 
72
- #{if @entries.respond_to?(:navigation) and @entries.page_count > 1
73
- @entries.navigation
74
- end}
74
+ <p>#{lang('section_entries.messages.no_entries')}</p>
75
75
 
76
- <?r else ?>
77
- <p>#{lang('section_entries.messages.no_entries')}</p>
78
- <?r end ?>
76
+ <?r end ?>
79
77
 
80
- <?r if user_authorized?(:new_section_entry) ?>
81
- <div class="button">
82
- #{Sections::Controller::SectionEntries.a(
83
- lang('section_entries.buttons.new'), :new, @section_id
78
+ <?r if user_authorized?(:new_section_entry) ?>
79
+ #{new_button(
80
+ Sections::Controller::SectionEntries.r(:new, @section_id),
81
+ lang('section_entries.buttons.new')
84
82
  )}
85
- </div>
86
- <?r end ?>
83
+ <?r end ?>
87
84
 
88
- <?r if user_authorized?(:delete_section_entry) and !@entries.empty? ?>
89
- <div class="button">
90
- <input type="submit"
91
- value="#{lang('section_entries.buttons.delete')}" />
92
- </div>
93
- <?r end ?>
94
- </form>
85
+ <?r if user_authorized?(:delete_section_entry) and !@entries.empty? ?>
86
+ #{delete_button(lang('section_entries.buttons.delete'))}
87
+ <?r end ?>
88
+ </form>
89
+ </div>
95
90
  </section>