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
@@ -7,7 +7,9 @@ Zen::Package.add do |p|
7
7
  p.root = __DIR__('sections')
8
8
  p.migrations = __DIR__('../migrations')
9
9
 
10
- p.menu('sections.titles.index', '/admin', :permission => :show_section)
10
+ p.menu 'sections.titles.index',
11
+ '/admin/sections',
12
+ :permission => :show_section
11
13
 
12
14
  p.permission :show_section , 'sections.permissions.show'
13
15
  p.permission :edit_section , 'sections.permissions.edit'
@@ -20,13 +22,16 @@ Zen::Package.add do |p|
20
22
  p.permission :delete_section_entry, 'section_entries.permissions.delete'
21
23
  end
22
24
 
23
- Zen::Language.load('sections')
24
- Zen::Language.load('section_entries')
25
-
26
25
  require __DIR__('sections/model/section')
27
26
  require __DIR__('sections/model/section_entry')
28
27
  require __DIR__('sections/model/section_entry_status')
29
28
  require __DIR__('sections/controller/sections')
30
29
  require __DIR__('sections/controller/section_entries')
30
+ require __DIR__('sections/widget/recent_entries')
31
31
 
32
32
  Zen::Controller::FrontendController.helper(:section_frontend)
33
+
34
+ Zen::Event.listen :post_start do
35
+ Zen::Language.load('sections')
36
+ Zen::Language.load('section_entries')
37
+ end
@@ -1,3 +1,5 @@
1
+ require 'time'
2
+
1
3
  module Sections
2
4
  #:nodoc:
3
5
  module Controller
@@ -10,17 +12,17 @@ module Sections
10
12
  # "Manage entries". This will bring you to an overview of all existing
11
13
  # entries that looks like the one in the image below.
12
14
  #
13
- # ![Section Entries](../../_static/sections/entries.png)
15
+ # ![Section Entries](../../images/sections/entries.png)
14
16
  #
15
17
  # Editing an entry can be done by clicking on it's name, creating a new one
16
18
  # can be done by clicking on the "Add section entry" button. In both cases
17
19
  # you'll see a form that looks similar to the one displayed in the images
18
20
  # below.
19
21
  #
20
- # ![Edit Entry](../../_static/sections/edit_entry.png)
21
- # ![Categories](../../_static/sections/edit_entry_categories.png)
22
- # ![General](../../_static/sections/edit_entry_general.png)
23
- # ![Meta](../../_static/sections/edit_entry_meta.png)
22
+ # ![Edit Entry](../../images/sections/edit_entry.png)
23
+ # ![Categories](../../images/sections/edit_entry_categories.png)
24
+ # ![General](../../images/sections/edit_entry_general.png)
25
+ # ![Meta](../../images/sections/edit_entry_meta.png)
24
26
  #
25
27
  # In the images above there are four tabs displayed. "Basic", "Categories",
26
28
  # "General" and "Meta". The first two are always available, the last two
@@ -54,21 +56,8 @@ module Sections
54
56
  # * edit_section_entry
55
57
  # * delete_section_entry
56
58
  #
57
- # ## Events
58
- #
59
- # All events in this controller receive an instance of
60
- # {Sections::Model::SectionEntry}. The event ``after_delete_section_entry``
61
- # receives an instance of this model that has already been destroyed using
62
- # ``#destroy()``.
63
- #
64
59
  # @since 0.1
65
60
  # @map /admin/section-entries
66
- # @event before_new_section_entry
67
- # @event after_new_section_entry
68
- # @event before_edit_section_entry
69
- # @event after_edit_section_entry
70
- # @event before_delete_section_entry
71
- # @event after_delete_section_entry
72
61
  #
73
62
  class SectionEntries < Zen::Controller::AdminController
74
63
  map '/admin/section-entries'
@@ -76,7 +65,7 @@ module Sections
76
65
  title 'section_entries.titles.%s'
77
66
 
78
67
  load_asset_group [:tabs, :editor, :datepicker], [:edit, :new]
79
- csrf_protection :save, :delete
68
+ csrf_protection :save, :delete, :autosave
80
69
 
81
70
  ##
82
71
  # Show an overview of all entries for the current section.
@@ -130,15 +119,10 @@ module Sections
130
119
 
131
120
  validate_section(section_id)
132
121
 
133
- @section_id = section_id
122
+ @section_id = section_id
123
+ @entry = Model::SectionEntry.new(:section_id => section_id)
134
124
 
135
- if flash[:form_data]
136
- @entry = flash[:form_data]
137
- else
138
- @entry = ::Sections::Model::SectionEntry.new(
139
- :section_id => section_id
140
- )
141
- end
125
+ @entry.set(flash[:form_data]) if flash[:form_data]
142
126
 
143
127
  @possible_categories = @entry.possible_categories
144
128
  @custom_fields_hash = @entry.custom_fields_hash
@@ -169,11 +153,8 @@ module Sections
169
153
 
170
154
  validate_section(section_id)
171
155
 
172
- if flash[:form_data]
173
- @entry = flash[:form_data]
174
- else
175
- @entry = validate_section_entry(entry_id, section_id)
176
- end
156
+ @entry = validate_section_entry(entry_id, section_id)
157
+ @entry.set(flash[:form_data]) if flash[:form_data]
177
158
 
178
159
  @section_id = section_id
179
160
  @possible_categories = @entry.possible_categories
@@ -187,141 +168,111 @@ module Sections
187
168
  # creates a new entry.
188
169
  #
189
170
  # @since 0.1
190
- # @event before_new_section_entry
191
- # @event after_new_section_entry
192
- # @event before_edit_section_entry
193
- # @event after_edit_section_entry
194
171
  # @permission edit_section_entry (when editing an entry)
195
172
  # @permission new_section_entry (when creating a new entry)
196
173
  #
197
174
  def save
175
+ post_data = post_fields(*Model::SectionEntry::COLUMNS)
198
176
  section_id = request.params['section_id']
199
177
 
200
- validate_section(section_id)
178
+ if post_data['created_at']
179
+ post_data['created_at'] = Time.strptime(
180
+ post_data['created_at'],
181
+ Model::SectionEntry::DATE_FORMAT
182
+ )
183
+ end
201
184
 
202
185
  if request.params['id'] and !request.params['id'].empty?
203
186
  authorize_user!(:edit_section_entry)
204
187
 
205
- entry = ::Sections::Model::SectionEntry[request.params['id']]
206
- save_action = :save
207
- before_event = :before_edit_section_entry
208
- after_event = :after_edit_section_entry
209
-
210
- # Section entries aren't considered to be updated whenever a custom
211
- # field value is modified, this solves that problem
212
- request.params['updated_at'] = Time.new
188
+ entry = validate_section_entry(request.params['id'], section_id)
189
+ save_action = :save
213
190
  else
214
191
  authorize_user!(:new_section_entry)
215
192
 
216
- entry = ::Sections::Model::SectionEntry.new(:section_id => section_id)
217
- before_event = :before_new_section_entry
218
- after_event = :after_new_section_entry
219
- save_action = :new
193
+ entry = Model::SectionEntry.new(:section_id => section_id)
194
+ save_action = :new
220
195
  end
221
196
 
222
- request.params.delete('id')
223
-
224
- success = lang("section_entries.success.#{save_action}")
225
- error = lang("section_entries.errors.#{save_action}")
226
- custom_fields = entry.custom_fields
227
- field_errors = {}
228
- field_values = {}
229
-
230
- entry.custom_field_values.each do |value|
231
- field_values[value.custom_field_id] = value
232
- end
197
+ success = lang("section_entries.success.#{save_action}")
198
+ error = lang("section_entries.errors.#{save_action}")
199
+ field_errors = {}
200
+ field_values = {}
233
201
 
234
202
  begin
235
203
  Zen.database.transaction do
236
- # Update the entry itself
237
- post_data = request.subset(
238
- :title,
239
- :created_at,
240
- :updated_at,
241
- :section_id,
242
- :user_id,
243
- :slug,
244
- :section_entry_status_id,
245
- :category_pks
246
- )
247
-
248
- # Transform the dates properly
249
- if post_data[:created_at]
250
- post_data[:created_at] = Time.strptime(
251
- post_data[:created_at],
252
- date_format
253
- )
254
- end
255
-
256
- if post_data[:updated_at]
257
- post_data[:updated_at] = Time.strptime(
258
- post_data[:updated_at],
259
- date_format
260
- )
261
- end
262
-
263
- post_data.each { |k, v| entry.send("#{k}=", v) }
264
- Zen::Event.call(before_event, entry)
265
-
204
+ entry.set(post_data)
266
205
  entry.save
267
206
 
268
- # Update/add all the custom field values
269
- custom_fields.each do |field|
270
- key = "custom_field_value_#{field.id}"
271
-
272
- # The custom field has been submitted, let's see if we have to
273
- # update it or add it.
274
- if request.params.key?(key)
275
- # Validate it
276
- if field.required and request.params[key].empty?
277
- field_errors[:"custom_field_value_#{field.id}"] = \
278
- lang('zen_models.presence')
279
-
280
- raise
281
- end
282
-
283
- # Update it
284
- if field_values.key?(field.id)
285
- field_values[field.id].update(:value => request.params[key])
286
- # Add it
287
- else
288
- entry.add_custom_field_value(
289
- :custom_field_id => field.id,
290
- :value => request.params[key]
291
- )
292
- end
293
- end
294
- end
207
+ field_errors = process_custom_fields(entry)
208
+
209
+ raise unless field_errors.empty?
295
210
  end
296
- # The rescue statement is called whenever the following happens:
297
- #
298
- # 1. The fields for the section entry (title, slug, etc) are invalid
299
- # 2. Any custom field marked as required didn't have a value
300
- # 3. Something else went wrong, god knows what.
301
211
  rescue => e
302
- Ramaze::Log.error(e.inspect)
212
+ Ramaze::Log.error(e)
303
213
  message(:error, error)
304
214
 
215
+ request.POST.delete('id')
216
+
305
217
  flash[:form_errors] = entry.errors.merge(field_errors)
306
- flash[:form_data] = entry
218
+ flash[:form_data] = request.POST
307
219
 
308
220
  redirect_referrer
309
221
  end
310
222
 
311
- Zen::Event.call(after_event, entry)
312
-
313
223
  message(:success, success)
314
224
  redirect(SectionEntries.r(:edit, section_id, entry.id))
315
225
  end
316
226
 
227
+ ##
228
+ # Automatically saves a section entry. This is needed to take care of the
229
+ # custom fields, something the helper method itself can not do.
230
+ #
231
+ # @since 17-02-2012
232
+ #
233
+ def autosave
234
+ entry = Model::SectionEntry[request.params['id']]
235
+ post_data = post_fields(*Model::SectionEntry::COLUMNS)
236
+ field_errors = {}
237
+
238
+ if post_data['created_at']
239
+ post_data['created_at'] = Time.strptime(
240
+ post_data['created_at'],
241
+ Model::SectionEntry::DATE_FORMAT
242
+ )
243
+ end
244
+
245
+ if entry.nil? or !user_authorized?(:edit_section_entry)
246
+ respond_json(
247
+ {:error => lang('zen_general.errors.invalid_request')},
248
+ 404
249
+ )
250
+ end
251
+
252
+ begin
253
+ Zen.database.transaction do
254
+ entry.set(post_data)
255
+ entry.save
256
+
257
+ field_errors = process_custom_fields(entry)
258
+
259
+ raise unless field_errors.empty?
260
+ end
261
+ rescue => e
262
+ Ramaze::Log.error(e)
263
+
264
+ respond_json({:errors => entry.errors.merge(field_errors)}, 400)
265
+ end
266
+
267
+ respond_json({:csrf_token => get_csrf_token})
268
+ end
269
+
317
270
  ##
318
271
  # Delete a set of section entries based on the supplied POST
319
272
  # field "section_entry_ids".
320
273
  #
321
274
  # @since 0.1
322
275
  # @permission delete_section_entry
323
- # @event before_delete_section_entry
324
- # @event after_delete_section_entry
325
276
  #
326
277
  def delete
327
278
  authorize_user!(:delete_section_entry)
@@ -336,18 +287,15 @@ module Sections
336
287
  entry = ::Sections::Model::SectionEntry[id]
337
288
 
338
289
  next if entry.nil?
339
- Zen::Event.call(:before_delete_section_entry, entry)
340
290
 
341
291
  begin
342
292
  entry.destroy
343
293
  rescue => e
344
- Ramaze::Log.error(e.inspect)
294
+ Ramaze::Log.error(e)
345
295
  message(:error,lang('section_entries.errors.delete') % id)
346
296
 
347
297
  redirect_referrer
348
298
  end
349
-
350
- Zen::Event.call(:after_delete_section_entry, entry)
351
299
  end
352
300
 
353
301
  message(:success, lang('section_entries.success.delete'))
@@ -27,12 +27,12 @@ module Sections
27
27
  # the other data types (such as those mentioned earlier) together to form
28
28
  # the content displayed on your website.
29
29
  #
30
- # Sections can be managed by going to ``/admin``. This page will show an
31
- # overview of all existing sections as well as a few buttons and links that
32
- # allow you to edit, create or delete sections as well as managing the
33
- # entries for each existing section.
30
+ # Sections can be managed by going to ``/admin/sections``. This page will
31
+ # show an overview of all existing sections as well as a few buttons and
32
+ # links that allow you to edit, create or delete sections as well as
33
+ # managing the entries for each existing section.
34
34
  #
35
- # ![Sections](../../_static/sections/sections.png)
35
+ # ![Sections](../../images/sections/sections.png)
36
36
  #
37
37
  # ## Creating/Editing Sections
38
38
  #
@@ -41,9 +41,9 @@ module Sections
41
41
  # both cases you'll end up with a form that looks like the one in the images
42
42
  # below.
43
43
  #
44
- # ![General](../../_static/sections/edit_section_general.png)
45
- # ![Comments](../../_static/sections/edit_section_comments.png)
46
- # ![Groups](../../_static/sections/edit_section_groups.png)
44
+ # ![General](../../images/sections/edit_section_general.png)
45
+ # ![Comments](../../images/sections/edit_section_comments.png)
46
+ # ![Groups](../../images/sections/edit_section_groups.png)
47
47
  #
48
48
  # In this form you can specify the following fields:
49
49
  #
@@ -76,38 +76,19 @@ module Sections
76
76
  # * edit_section
77
77
  # * delete_section
78
78
  #
79
- # ## Events
80
- #
81
- # All events in this controller receive an instance of
82
- # {Sections::Model::Section}. The event ``after_delete_section`` receives an
83
- # instance that has already been removed, thus you can't make any changes to
84
- # it and save those in the database.
85
- #
86
- # Example of creating a dummy section entry:
87
- #
88
- # Zen::Event.listen(:new_section) do |section|
89
- # section.add_section_entry(:title => 'My Entry', :user_id => user.id)
90
- # end
91
- #
92
79
  # @since 0.1
93
- # @map /admin
94
- # @event before_new_section
95
- # @event after_new_section
96
- # @event before_edit_section
97
- # @event after_edit_section
98
- # @event before_delete_section
99
- # @event after_delete_section
80
+ # @map /admin/sections
100
81
  #
101
82
  class Sections < Zen::Controller::AdminController
102
- map '/admin'
83
+ map '/admin/sections'
103
84
  helper :section
104
85
  title 'sections.titles.%s'
105
86
 
106
87
  csrf_protection :save, :delete
107
88
  load_asset_group :tabs, [:edit, :new]
108
89
 
109
- # Hook that is executed before Sections#index(), Sections#new() and
110
- # Sections#edit().
90
+ autosave Model::Section, Model::Section::COLUMNS, :edit_section
91
+
111
92
  before(:index, :new, :edit) do
112
93
  @boolean_hash = {
113
94
  true => lang('zen_general.special.boolean_hash.true'),
@@ -156,7 +137,8 @@ module Sections
156
137
  @page_title
157
138
  )
158
139
 
159
- @section = flash[:form_data] || validate_section(id)
140
+ @section = validate_section(id)
141
+ @section.set(flash[:form_data]) if flash[:form_data]
160
142
 
161
143
  render_view(:form)
162
144
  end
@@ -175,7 +157,8 @@ module Sections
175
157
  @page_title
176
158
  )
177
159
 
178
- @section = flash[:form_data] || ::Sections::Model::Section.new
160
+ @section = Model::Section.new
161
+ @section.set(flash[:form_data]) if flash[:form_data]
179
162
 
180
163
  render_view(:form)
181
164
  end
@@ -184,41 +167,23 @@ module Sections
184
167
  # Saves any changes made to an existing section or creates a new one.
185
168
  #
186
169
  # @since 0.1
187
- # @event before_new_section
188
- # @event after_new_section
189
- # @event before_edit_section
190
- # @event ater_edit_section
191
170
  # @permission new_section (when creating a section)
192
171
  # @permission edit_section (when editing a section)
193
172
  #
194
173
  def save
195
- post = request.subset(
196
- :id,
197
- :name,
198
- :slug,
199
- :description,
200
- :comment_allow,
201
- :comment_require_account,
202
- :comment_moderate,
203
- :comment_format,
204
- :custom_field_group_pks,
205
- :category_group_pks
206
- )
174
+ post = post_fields(*Model::Section::COLUMNS)
175
+ id = request.params['id']
207
176
 
208
- if post['id'] and !post['id'].empty?
177
+ if id and !id.empty?
209
178
  authorize_user!(:edit_section)
210
179
 
211
- section = validate_section(post['id'])
212
- save_action = :save
213
- before_event = :before_edit_section
214
- after_event = :after_edit_section
180
+ section = validate_section(id)
181
+ save_action = :save
215
182
  else
216
183
  authorize_user!(:new_section)
217
184
 
218
- section = ::Sections::Model::Section.new
219
- save_action = :new
220
- before_event = :before_new_section
221
- after_event = :after_new_section
185
+ section = ::Sections::Model::Section.new
186
+ save_action = :new
222
187
  end
223
188
 
224
189
  success = lang("sections.success.#{save_action}")
@@ -227,12 +192,8 @@ module Sections
227
192
  post['custom_field_group_pks'] ||= []
228
193
  post['category_group_pks'] ||= []
229
194
 
230
- post.delete('id')
231
-
232
195
  begin
233
- post.each { |k, v| section.send("#{k}=", v) }
234
- Zen::Event.call(before_event, section)
235
-
196
+ section.set(post)
236
197
  section.save
237
198
 
238
199
  if save_action == :new
@@ -240,17 +201,15 @@ module Sections
240
201
  section.category_group_pks = post['category_group_pks']
241
202
  end
242
203
  rescue => e
243
- Ramaze::Log.error(e.inspect)
204
+ Ramaze::Log.error(e)
244
205
  message(:error, error)
245
206
 
246
- flash[:form_data] = section
207
+ flash[:form_data] = post
247
208
  flash[:form_errors] = section.errors
248
209
 
249
210
  redirect_referrer
250
211
  end
251
212
 
252
- Zen::Event.call(after_event, section)
253
-
254
213
  message(:success, success)
255
214
  redirect(Sections.r(:edit, section.id))
256
215
  end
@@ -260,8 +219,6 @@ module Sections
260
219
  # should be specified in the POST array "section_ids[]".
261
220
  #
262
221
  # @since 0.1
263
- # @event before_delete_section
264
- # @event after_delete_section
265
222
  # @permission delete_section
266
223
  #
267
224
  def delete
@@ -277,18 +234,15 @@ module Sections
277
234
  section = ::Sections::Model::Section[id]
278
235
 
279
236
  next if section.nil?
280
- Zen::Event.call(:before_delete_section, section)
281
237
 
282
238
  begin
283
239
  section.destroy
284
240
  rescue => e
285
- Ramaze::Log.error(e.inspect)
241
+ Ramaze::Log.error(e)
286
242
  message(:error, lang('sections.errors.delete') % id)
287
243
 
288
244
  redirect_referrer
289
245
  end
290
-
291
- Zen::Event.call(:after_delete_section, section)
292
246
  end
293
247
 
294
248
  message(:success, lang('sections.success.delete'))