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
@@ -81,8 +81,13 @@ module Zen
81
81
 
82
82
  g = Ramaze::Gestalt.new
83
83
  children = []
84
+ attrs = {}
84
85
 
85
- g.li do
86
+ if respond_to?(:request) and url == request.env['SCRIPT_NAME']
87
+ attrs[:class] = 'current'
88
+ end
89
+
90
+ g.li(attrs) do
86
91
  g.a(title, :href => url, :title => title)
87
92
 
88
93
  unless @children.empty?
@@ -7,7 +7,7 @@ Zen::Package.add do |p|
7
7
  p.root = __DIR__('menus')
8
8
  p.migrations = __DIR__('../migrations')
9
9
 
10
- p.menu('menus.titles.index', '/admin/menus', :permission => :show_menu)
10
+ p.menu 'menus.titles.index', '/admin/menus', :permission => :show_menu
11
11
 
12
12
  p.permission :show_menu , 'menus.permissions.show'
13
13
  p.permission :edit_menu , 'menus.permissions.edit'
@@ -20,12 +20,14 @@ Zen::Package.add do |p|
20
20
  p.permission :delete_menu_item, 'menu_items.permissions.delete'
21
21
  end
22
22
 
23
- Zen::Language.load('menus')
24
- Zen::Language.load('menu_items')
25
-
26
23
  require __DIR__('menus/model/menu')
27
24
  require __DIR__('menus/model/menu_item')
28
25
  require __DIR__('menus/controller/menus')
29
26
  require __DIR__('menus/controller/menu_items')
30
27
 
31
28
  Zen::Controller::FrontendController.helper(:menu_frontend)
29
+
30
+ Zen::Event.listen :post_start do
31
+ Zen::Language.load('menus')
32
+ Zen::Language.load('menu_items')
33
+ end
@@ -2,28 +2,36 @@ module Menus
2
2
  #:nodoc:
3
3
  module Controller
4
4
  ##
5
- # The MenuItems controller allows users to manage menu items of a menu
6
- # group. In order to manage menu items you must first navigate to a menu
7
- # group and click the link "Manage menu items" (see
8
- # {Menus::Controller::Menus} for more information). Once you've reached this
9
- # page you'll see an overview that looks like the image below.
5
+ # Managing menu items is divided into two separate parts: specifying the
6
+ # order and hierarchy and editing individual menu items such as their names
7
+ # and URLs. In order to manage a set of menu items you must navigate to the
8
+ # menu to which the items belong and then click on "Manage menu items". Once
9
+ # you've clicked this link you'll be presented with a page that looks
10
+ # somewhat like the one shown in the image below.
10
11
  #
11
- # ![Menu Items](../../_static/menus/menu_items.png)
12
+ # ![Menu Items](../../images/menus/menu_items.png)
12
13
  #
13
- # Editing or creating a menu item can be done by either clicking the name of
14
- # a menu item or by clicking the "Add menu item" button. In both cases
15
- # you'll end up with a form looking like the one in the following image:
14
+ # This overview allows you to sort and specify the hierarchy of menu items,
15
+ # editing individual items can be done by clicking on the name.
16
16
  #
17
- # ![Edit Menu Item](../../_static/menus/edit_menu_item.png)
17
+ # Both sorting and creating the hierarchy is done by dragging the menu
18
+ # items. By dragging them up or down you can change the order, by dragging
19
+ # them to the left or right you can specify the parent element of a set of
20
+ # menu items. For example, in the image below the "User Guide" item has been
21
+ # set to be a child item of the "Home" item.
22
+ #
23
+ # ![Menu Item Hierarchy](../../images/menus/menu_item_hierarchy.png)
24
+ #
25
+ # If you want to edit an individual menu item you can do so by clicking on
26
+ # the name of the item, once done you'll be presented with the following
27
+ # form:
28
+ #
29
+ # ![Edit Menu Item](../../images/menus/edit_menu_item.png)
18
30
  #
19
31
  # In this form you can specify the following fields:
20
32
  #
21
33
  # * **Name**: the name of the menu item.
22
34
  # * **URL**: the URL of the menu item.
23
- # * **Order**: a number that indicates the sort order when the menu is
24
- # built.
25
- # * **Parent**: a parent menu item. This allows you to easily create sub
26
- # menus.
27
35
  # * **HTML class**: a space separated list of classes to apply to the HTML
28
36
  # element.
29
37
  # * **HTML ID**: a single ID to apply to the HTML element.
@@ -38,36 +46,27 @@ module Menus
38
46
  # * edit_menu_item
39
47
  # * delete_menu_item
40
48
  #
41
- # ## Events
42
- #
43
- # All events in this controller receive an instance of
44
- # {Menus::Model::MenuItem}. Just like other packages the event
45
- # ``delete_menu_item`` receives an instance that has already been destroyed.
46
- #
47
- # @example Automatically prefix URLs with http
48
- # Zen::Event.listen(:new_menu_item) do |item|
49
- # unless item.url =~ /^http/
50
- # item.url = 'http://' + item.url
51
- # item.save
52
- # end
53
- # end
54
- #
55
49
  # @since 0.2a
56
50
  # @map /admin/menu-items
57
- # @event before_new_menu_item
58
- # @event after_new_menu_item
59
- # @event before_edit_menu_item
60
- # @event after_edit_menu_item
61
- # @event before_delete_menu_item
62
- # @event after_delete_menu_item
63
51
  #
64
52
  class MenuItems < Zen::Controller::AdminController
65
53
  map '/admin/menu-items'
66
54
  helper :menu
67
55
  title 'menu_items.titles.%s'
68
56
 
57
+ autosave Model::MenuItem, Model::MenuItem::COLUMNS, :edit_menu_item
58
+
69
59
  csrf_protection :save, :delete
70
60
 
61
+ serve :css, ['/admin/menus/css/menus'],
62
+ :name => 'menus',
63
+ :methods => [:index]
64
+
65
+ serve :javascript,
66
+ ['/admin/menus/js/lib/nested_sortables', '/admin/menus/js/menu_items'],
67
+ :name => 'menus',
68
+ :methods => [:index]
69
+
71
70
  ##
72
71
  # Shows an overview of all the menu items for a menu group.
73
72
  #
@@ -86,17 +85,7 @@ module Menus
86
85
  )
87
86
 
88
87
  @menu_id = menu_id
89
- @menu_items = search do |query|
90
- ::Menus::Model::MenuItem.search(query) \
91
- .filter(:menu_id => menu_id) \
92
- .order(:id.asc)
93
- end
94
-
95
- @menu_items ||= ::Menus::Model::MenuItem \
96
- .filter(:menu_id => menu_id) \
97
- .order(:id.asc)
98
-
99
- @menu_items = paginate(@menu_items)
88
+ @menu_items = Model::Menu[menu_id].menu_items_tree
100
89
  end
101
90
 
102
91
  ##
@@ -117,13 +106,10 @@ module Menus
117
106
  lang('menu_items.titles.new')
118
107
  )
119
108
 
120
- @menu_id = menu_id
109
+ @menu_id = menu_id
110
+ @menu_item = Model::MenuItem.new
121
111
 
122
- if flash[:form_data]
123
- @menu_item = flash[:form_data]
124
- else
125
- @menu_item = ::Menus::Model::MenuItem.new
126
- end
112
+ @menu_item.set(flash[:form_data]) if flash[:form_data]
127
113
 
128
114
  render_view(:form)
129
115
  end
@@ -147,13 +133,10 @@ module Menus
147
133
  lang('menu_items.titles.edit')
148
134
  )
149
135
 
150
- @menu_id = menu_id
136
+ @menu_id = menu_id
137
+ @menu_item = validate_menu_item(id, menu_id)
151
138
 
152
- if flash[:form_data]
153
- @menu_item = flash[:form_data]
154
- else
155
- @menu_item = validate_menu_item(id, menu_id)
156
- end
139
+ @menu_item.set(flash[:form_data]) if flash[:form_data]
157
140
 
158
141
  render_view(:form)
159
142
  end
@@ -165,86 +148,71 @@ module Menus
165
148
  # @since 0.2a
166
149
  # @permission edit_menu_item (when editing an item)
167
150
  # @permission new_menu_item (when creating an item)
168
- # @event before_edit_menu_item
169
- # @event after_edit_menu_item
170
- # @event before_new_menu_item
171
- # @event after_new_menu_item
172
151
  #
173
152
  def save
174
- post = request.subset(
175
- :id,
176
- :parent_id,
177
- :name,
178
- :url,
179
- :sort_order,
180
- :html_class,
181
- :html_id,
182
- :menu_id
183
- )
184
-
185
- if post['parent_id'].empty? or post['parent_id'] == post['id']
186
- post['parent_id'] = nil
187
- end
153
+ post = post_fields(*Model::MenuItem::COLUMNS)
154
+ id = request.params['id']
188
155
 
189
- # Determine if we're saving changes made to an existing menu item or
190
- # if we're going to create a new one.
191
- if post.key?('id') and !post['id'].empty?
156
+ if id and !id.empty?
192
157
  authorize_user!(:edit_menu_item)
193
158
 
194
- menu_item = validate_menu_item(post['id'], post['menu_id'])
195
- save_action = :save
196
- before_event = :before_edit_menu_item
197
- after_event = :after_edit_menu_item
159
+ menu_item = validate_menu_item(id, post['menu_id'])
160
+ save_action = :save
198
161
  else
199
162
  authorize_user!(:new_menu_item)
200
163
 
201
- menu_item = ::Menus::Model::MenuItem.new
202
- save_action = :new
203
- before_event = :before_new_menu_item
204
- after_event = :after_new_menu_item
164
+ menu_item = ::Menus::Model::MenuItem.new
165
+ save_action = :new
205
166
  end
206
167
 
207
- post.delete('id')
208
-
209
- # Set our notifications
210
168
  success = lang("menu_items.success.#{save_action}")
211
169
  error = lang("menu_items.errors.#{save_action}")
212
170
 
213
- # Time to save the data
214
171
  begin
215
- post.each { |k, v| menu_item.send("#{k}=", v) }
216
- Zen::Event.call(before_event, menu_item)
217
-
172
+ menu_item.set(post)
218
173
  menu_item.save
219
174
  rescue => e
220
- Ramaze::Log.error(e.inspect)
175
+ Ramaze::Log.error(e)
221
176
  message(:error, error)
222
177
 
223
- flash[:form_data] = menu_item
178
+ flash[:form_data] = post
224
179
  flash[:form_errors] = menu_item.errors
225
180
 
226
181
  redirect_referrer
227
182
  end
228
183
 
229
- Zen::Event.call(after_event, menu_item)
230
-
231
184
  message(:success, success)
232
185
  redirect(MenuItems.r(:edit, menu_item.menu_id, menu_item.id))
233
186
  end
234
187
 
188
+ ##
189
+ # Updates the sort order and parent IDs for the given menu items.
190
+ #
191
+ # @since 11-02-2012
192
+ # @permission edit_menu_item
193
+ #
194
+ def tree
195
+ authorize_user!(:edit_menu_item)
196
+
197
+ request.POST['menu_items'].each do |item|
198
+ Model::MenuItem[item[1]['id']].update(
199
+ :sort_order => item[0],
200
+ :parent_id => item[1]['parent_id']
201
+ )
202
+ end
203
+ end
204
+
235
205
  ##
236
206
  # Delete all specified menu items based on the values in the POST array
237
207
  # "menu_item_ids".
238
208
  #
239
209
  # @since 0.2a
240
210
  # @permission delete_menu_item
241
- # @event before_delete_menu_item
242
- # @event after_delete_menu_item
243
211
  #
244
212
  def delete
245
213
  authorize_user!(:delete_menu_item)
246
214
 
247
- post = request.subset(:menu_item_ids)
215
+ post = post_fields(:menu_item_ids)
248
216
 
249
217
  if !post['menu_item_ids'] or post['menu_item_ids'].empty?
250
218
  message(:error, lang('menu_items.errors.no_delete'))
@@ -255,18 +223,15 @@ module Menus
255
223
  menu = ::Menus::Model::MenuItem[id]
256
224
 
257
225
  next if menu.nil?
258
- Zen::Event.call(:before_delete_menu_item, menu)
259
226
 
260
227
  begin
261
228
  menu.destroy
262
229
  rescue => e
263
- Ramaze::Log.error(e.inspect)
230
+ Ramaze::Log.error(e)
264
231
  message(:error, lang('menu_items.errors.delete') % id)
265
232
 
266
233
  redirect_referrer
267
234
  end
268
-
269
- Zen::Event.call(:after_delete_menu_item, menu)
270
235
  end
271
236
 
272
237
  message(:success, lang('menu_items.success.delete'))
@@ -29,7 +29,7 @@ module Menus
29
29
  # this is the case). An example of such an overview can be seen in the image
30
30
  # below.
31
31
  #
32
- # ![Menus Overview](../../_static/menus/menus.png)
32
+ # ![Menus Overview](../../images/menus/menus.png)
33
33
  #
34
34
  # This overview allows you to edit, create or remove menu groups as well as
35
35
  # managing the menu items of a group. Editing a group can be done by
@@ -37,7 +37,7 @@ module Menus
37
37
  # the button "Add menu". In both cases you'll end up with the form shown in
38
38
  # the image below.
39
39
  #
40
- # ![Edit Menu](../../_static/menus/edit_menu.png)
40
+ # ![Edit Menu](../../images/menus/edit_menu.png)
41
41
  #
42
42
  # In this form you can use the following fields:
43
43
  #
@@ -61,44 +61,16 @@ module Menus
61
61
  # * edit_menu
62
62
  # * delete_menu
63
63
  #
64
- # ## Events
65
- #
66
- # All events in this controller receive an instance of {Menus::Model::Menu}.
67
- # Just like other packages the event ``delete_menu`` receives an instance
68
- # that has already been destroyed.
69
- #
70
- # @example Automatically add a menu item
71
- # Zen::Event.listen(:new_menu) do |menu|
72
- # menu.add_menu_item(:name => 'Home', :url => '/', :html_id => 'home')
73
- # end
74
- #
75
- # @example Remove duplicate menu items when editing a menu
76
- # Zen::Event.listen(:edit_menu) do |menu|
77
- # urls = []
78
- #
79
- # menu.items.each do |item|
80
- # if urls.include?(item.url)
81
- # item.destroy
82
- # else
83
- # urls << item.url
84
- # end
85
- # end
86
- # end
87
- #
88
64
  # @since 0.2a
89
65
  # @map /admin/menus
90
- # @event before_new_menu
91
- # @event after_new_menu
92
- # @event before_edit_menu
93
- # @event after_edit_menu
94
- # @event before_delete_menu
95
- # @event after_delete_menu
96
66
  #
97
67
  class Menus < Zen::Controller::AdminController
98
68
  map '/admin/menus'
99
69
  helper :menu
100
70
  title 'menus.titles.%s'
101
71
 
72
+ autosave Model::Menu, Model::Menu::COLUMNS, :edit_menu
73
+
102
74
  csrf_protection :save, :delete
103
75
 
104
76
  ##
@@ -137,7 +109,8 @@ module Menus
137
109
  @page_title
138
110
  )
139
111
 
140
- @menu = ::Menus::Model::Menu.new
112
+ @menu = Model::Menu.new
113
+ @menu.set(flash[:form_data]) if flash[:form_data]
141
114
 
142
115
  render_view(:form)
143
116
  end
@@ -159,11 +132,8 @@ module Menus
159
132
  @page_title
160
133
  )
161
134
 
162
- if flash[:form_data]
163
- @menu = flash[:form_data]
164
- else
165
- @menu = validate_menu(id)
166
- end
135
+ @menu = validate_menu(id)
136
+ @menu.set(flash[:form_data]) if flash[:form_data]
167
137
 
168
138
  render_view(:form)
169
139
  end
@@ -172,63 +142,41 @@ module Menus
172
142
  # Saves any changes made to an existing menu or creates a new menu.
173
143
  #
174
144
  # @since 0.2a
175
- # @event before_edit_menu
176
- # @event after_edit_menu
177
- # @event before_new_menu
178
- # @event after_new_menu
179
145
  # @permission edit_menu (when editing an existing menu)
180
146
  # @permission new_menu (when creating a new menu)
181
147
  #
182
148
  def save
183
- post = request.subset(
184
- :name,
185
- :slug,
186
- :description,
187
- :html_class,
188
- :html_id,
189
- :id
190
- )
149
+ post = post_fields(*Model::Menu::COLUMNS)
150
+ id = request.params['id']
191
151
 
192
- # Determine if we're creating a new group or modifying an existing one.
193
- if post.key?('id') and !post['id'].empty?
152
+ if id and !id.empty?
194
153
  authorize_user!(:edit_menu)
195
154
 
196
- menu = validate_menu(post['id'])
197
- save_action = :save
198
- before_event = :before_edit_menu
199
- after_event = :after_edit_menu
155
+ menu = validate_menu(id)
156
+ save_action = :save
200
157
  else
201
158
  authorize_user!(:new_menu)
202
159
 
203
- menu = ::Menus::Model::Menu.new
204
- save_action = :new
205
- before_event = :before_new_menu
206
- after_event = :after_new_menu
160
+ menu = ::Menus::Model::Menu.new
161
+ save_action = :new
207
162
  end
208
163
 
209
- post.delete('id')
210
-
211
164
  success = lang("menus.success.#{save_action}")
212
165
  error = lang("menus.errors.#{save_action}")
213
166
 
214
- # Let's see if we can insert/update the data
215
167
  begin
216
- post.each { |k, v| menu.send("#{k}=", v) }
217
- Zen::Event.call(before_event, menu)
218
-
168
+ menu.set(post)
219
169
  menu.save
220
170
  rescue => e
221
- Ramaze::Log.error(e.inspect)
171
+ Ramaze::Log.error(e)
222
172
  message(:error, error)
223
173
 
224
- flash[:form_data] = menu
174
+ flash[:form_data] = post
225
175
  flash[:form_errors] = menu.errors
226
176
 
227
177
  redirect_referrer
228
178
  end
229
179
 
230
- Zen::Event.call(after_event, menu)
231
-
232
180
  message(:success, success)
233
181
  redirect(Menus.r(:edit, menu.id))
234
182
  end
@@ -239,8 +187,6 @@ module Menus
239
187
  # "menu_ids".
240
188
  #
241
189
  # @since 0.2a
242
- # @event before_delete_menu
243
- # @event after_delete_menu
244
190
  # @permission delete_menu
245
191
  #
246
192
  def delete
@@ -258,18 +204,15 @@ module Menus
258
204
  menu = ::Menus::Model::Menu[id]
259
205
 
260
206
  next if menu.nil?
261
- Zen::Event.call(:before_delete_menu, menu)
262
207
 
263
208
  begin
264
209
  menu.destroy
265
210
  rescue => e
266
- Ramaze::Log.error(e.inspect)
211
+ Ramaze::Log.error(e)
267
212
  message(:error, lang('menus.errors.delete') % id)
268
213
 
269
214
  redirect_referrer
270
215
  end
271
-
272
- Zen::Event.call(:after_delete_menu, menu)
273
216
  end
274
217
 
275
218
  message(:success, lang('menus.success.delete'))