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
@@ -4,6 +4,25 @@ module Ramaze
4
4
  # Helper that can be used to display various variables based on the user's
5
5
  # locale and settings.
6
6
  #
7
+ # ## Working With Dates
8
+ #
9
+ # This module includes two separate methods that can be used for working
10
+ # with dates. The method {Ramaze::Helper::Locale#date_format} can be used to
11
+ # return the raw date format for the currently logged in user, the method
12
+ # {Ramaze::Helper::Locale#format_date} can be used to format an object that
13
+ # responds to ``#strftime()``. It is highly recommended to use the latter
14
+ # method whenever you display dates in order for them to be consistent.
15
+ #
16
+ # Usage of the format_date method is very simple, all you need to do is pass
17
+ # it an object that as mentioned above responds to ``#strftime()``:
18
+ #
19
+ # format_date(Time.now) # => "23-02-2012 19:08:59"
20
+ #
21
+ # To use this method in Etanni templates you'll have to wrap it in the
22
+ # correct template tags:
23
+ #
24
+ # #{format_date(Time.now)}
25
+ #
7
26
  # @since 0.3
8
27
  #
9
28
  module Locale
@@ -44,7 +44,7 @@ module Ramaze
44
44
  begin
45
45
  return yield(request.params['query'])
46
46
  rescue => e
47
- Ramaze::Log.error(e.inspect)
47
+ Ramaze::Log.error(e)
48
48
  message(:error, lang('zen_general.errors.invalid_search'))
49
49
  redirect_referrer(::Sections::Controller::Sections.r(:index))
50
50
  end
@@ -1,7 +1,7 @@
1
1
  module Ramaze
2
2
  module Helper
3
3
  ##
4
- # StackedAspect is a helper similar to {Innate::Helper::Aspect} but allows
4
+ # StackedAspect is a helper similar to Innate::Helper::Aspect but allows
5
5
  # calls to methods such as ``before_all`` to stack on top of each other
6
6
  # instead of overwriting previously defined ones.
7
7
  #
@@ -65,22 +65,6 @@ module Ramaze
65
65
  return aop
66
66
  end
67
67
 
68
- ##
69
- # Shows a warning to inform the developer that the aspect name is already
70
- # in use.
71
- #
72
- # @since 06-11-2011
73
- # @param [#to_s] name The name of the aspect.
74
- #
75
- def self.aspect_warn(name)
76
- file, line = caller[1].split(':')
77
-
78
- Ramaze::Log.warn(
79
- "The aspect name \"#{name}\" is already in use, it was redefined " \
80
- "in #{file} on line #{line}"
81
- )
82
- end
83
-
84
68
  ##
85
69
  # Calls a certain AOP action for the specified position and method name.
86
70
  #
@@ -156,13 +140,7 @@ module Ramaze
156
140
  # @param [Proc] block The block to execute.
157
141
  #
158
142
  def stacked_before_all(name, &block)
159
- name = name.to_sym
160
-
161
- if !STACKED_AOP[self][:before_all].key?(name)
162
- STACKED_AOP[self][:before_all][name] = block
163
- else
164
- StackedAspect.aspect_warn(name)
165
- end
143
+ STACKED_AOP[self][:before_all][name.to_sym] = block
166
144
  end
167
145
 
168
146
  ##
@@ -185,13 +163,9 @@ module Ramaze
185
163
 
186
164
  methods.each do |m|
187
165
  m = m.to_sym
188
- STACKED_AOP[self][:before][m] ||= {}
189
166
 
190
- if !STACKED_AOP[self][:before][m].key?(name)
191
- STACKED_AOP[self][:before][m][name] = block
192
- else
193
- StackedAspect.aspect_warn(name)
194
- end
167
+ STACKED_AOP[self][:before][m] ||= {}
168
+ STACKED_AOP[self][:before][m][name] = block
195
169
  end
196
170
  end
197
171
 
@@ -202,13 +176,7 @@ module Ramaze
202
176
  # @see Ramaze::Helper::StackedAspect::ClassMethods#stacked_before_all
203
177
  #
204
178
  def stacked_after_all(name, &block)
205
- name = name.to_sym
206
-
207
- if !STACKED_AOP[self][:after_all].key?(name)
208
- STACKED_AOP[self][:after_all][name] = block
209
- else
210
- StackedAspect.aspect_warn(name)
211
- end
179
+ STACKED_AOP[self][:after_all][name.to_sym] = block
212
180
  end
213
181
 
214
182
  ##
@@ -222,13 +190,9 @@ module Ramaze
222
190
 
223
191
  methods.each do |m|
224
192
  m = m.to_sym
225
- STACKED_AOP[self][:after][m] ||= {}
226
193
 
227
- if !STACKED_AOP[self][:after][m].key?(name)
228
- STACKED_AOP[self][:after][m][name] = block
229
- else
230
- StackedAspect.aspect_warn(name)
231
- end
194
+ STACKED_AOP[self][:after][m] ||= {}
195
+ STACKED_AOP[self][:after][m][name] = block
232
196
  end
233
197
  end
234
198
 
@@ -28,14 +28,14 @@ module Ramaze
28
28
  theme = get_setting(:theme).value
29
29
  theme = Zen::Theme[theme]
30
30
 
31
- if !theme.respond_to?(:partial_dir) or theme.partial_dir.nil?
31
+ if !theme.respond_to?(:partials) or theme.partials.nil?
32
32
  raise(
33
33
  ::Zen::ThemeError,
34
34
  "The theme #{theme.name} has no partial directory set."
35
35
  )
36
36
  end
37
37
 
38
- template = File.join(theme.partial_dir, "#{file}.xhtml")
38
+ template = File.join(theme.partials, "#{file}.xhtml")
39
39
 
40
40
  if !File.exist?(template)
41
41
  raise(::Zen::ThemeError, "The template #{template} doesn't exist.")
@@ -60,7 +60,7 @@ module Ramaze
60
60
  #
61
61
  def show_404(variables = {})
62
62
  theme = ::Zen::Theme[get_setting(:theme).value]
63
- template = File.join(theme.template_dir, '404.xhtml')
63
+ template = File.join(theme.templates, '404.xhtml')
64
64
  template = render_file(template, variables)
65
65
 
66
66
  respond(template, 404)
@@ -309,21 +309,16 @@ module Zen
309
309
  end
310
310
 
311
311
  ##
312
- # Builds an HTML opening tag with the lang and rtl attributes set for the
313
- # currently used language.
312
+ # Returns a string containing the text direction if the current language
313
+ # is an rtl language.
314
314
  #
315
315
  # @since 14-11-2011
316
316
  # @return [String]
317
317
  #
318
- def html_head
319
- curr = Zen::Language.current
320
- head = "<html lang=\"#{curr.name}\""
321
-
322
- if curr.rtl == true
323
- header += ' dir="rtl"'
318
+ def html_text_direction
319
+ if Zen::Language.current.rtl == true
320
+ return 'dir="rtl"'
324
321
  end
325
-
326
- return head + '>'
327
322
  end
328
323
  end # class << self
329
324
 
@@ -23,7 +23,7 @@ module Zen
23
23
  include Zen::Validation
24
24
 
25
25
  # A regex that specifies the allowed format of language keys.
26
- KEY_REGEX = /^[a-z_\.]+$/
26
+ KEY_REGEX = /^[0-9a-z_\.]+$/
27
27
 
28
28
  # The name of the language this set of translations belongs to.
29
29
  attr_reader :language
@@ -1,37 +1,53 @@
1
1
  <!DOCTYPE html>
2
- #{Zen::Language.html_head}
2
+ <html #{Zen::Language.html_text_direction} id="admin" class="#{browser_name}">
3
3
  <head>
4
4
  #{render_file(__DIR__('../view/head.xhtml'))}
5
5
  </head>
6
6
 
7
- <body id="admin">
8
- <div id="top">
9
- <header class="container">
10
- <nav id="main_nav" class="grid_12">
11
- #{Zen::Package.build_menu('left', session[:permissions])}
7
+ <body>
8
+ #{display_messages}
12
9
 
13
- <ul class="right clearfix">
14
- <li>
15
- <a href="/admin/users/logout">
16
- #{lang('zen_general.labels.logout')}
17
- </a>
18
- </li>
19
- <li>
20
- <a href="/admin/users/edit/#{user.id}">
21
- #{lang('zen_general.labels.profile')}
22
- </a>
23
- </li>
24
- <li>
25
- <a href="/">
26
- #{lang('zen_general.labels.view_website')}
27
- </a>
28
- </li>
29
- </ul>
30
- </nav>
10
+ <aside id="sidebar" role="complementary">
11
+ <header>
12
+ <h1>
13
+ <a href="/admin">
14
+ #{get_setting(:website_name).value || 'Zen'}
15
+ </a>
16
+ </h1>
31
17
  </header>
18
+
19
+ <nav id="user_navigation" role="navigation">
20
+ <ul>
21
+ <li>
22
+ <a href="/">
23
+ #{lang('zen_general.labels.view_website')}
24
+ </a>
25
+ </li>
26
+ <li>
27
+ #{Users::Controller::Users.a(
28
+ lang('zen_general.labels.profile'),
29
+ :edit,
30
+ user.id
31
+ )}
32
+ </li>
33
+ <li>
34
+ #{Users::Controller::Users.a(
35
+ lang('zen_general.labels.logout'),
36
+ :logout
37
+ )}
38
+ </li>
39
+ </ul>
40
+ </nav>
41
+
42
+ <nav id="admin_navigation" role="navigation">
43
+ #{Zen::Package.build_menu(nil, session[:permissions])}
44
+ </nav>
45
+ </aside>
46
+
47
+ <div id="main" role="main">
48
+ #{@content}
32
49
  </div>
33
50
 
34
- #{render_file(__DIR__('../view/main.xhtml'))}
35
51
  #{render_file(__DIR__('../view/bottom.xhtml'))}
36
52
  </body>
37
53
  </html>
@@ -1,11 +1,16 @@
1
1
  <!DOCTYPE html>
2
- #{Zen::Language.html_head}
2
+ <html #{Zen::Language.html_text_direction} id="login" class="#{browser_name}">
3
3
  <head>
4
4
  #{render_file(__DIR__('../view/head.xhtml'))}
5
5
  </head>
6
6
 
7
- <body id="login">
8
- #{render_file(__DIR__('../view/main.xhtml'))}
7
+ <body>
8
+ #{display_messages}
9
+
10
+ <div id="main" role="main">
11
+ #{@content}
12
+ </div>
13
+
9
14
  #{render_file(__DIR__('../view/bottom.xhtml'))}
10
15
  </body>
11
16
  </html>
@@ -0,0 +1,54 @@
1
+ module Zen
2
+ ##
3
+ # Small wrapper around Sequel::Migrator to fix various issues and make it a
4
+ # bit easier to log data.
5
+ #
6
+ # @since 07-01-2012
7
+ #
8
+ module Migrator
9
+ ##
10
+ # Runs a set of migrations and logs the actions.
11
+ #
12
+ # @since 07-01-2012
13
+ # @see Sequel::Migrator.run
14
+ # @param [String] name The name of the package/theme/etc to migrate.
15
+ # @param [String] dir The directory containing the migrations.
16
+ # @param [String] table The name of the table to store the migrations in.
17
+ # @param [NilClass|Fixnum] target The target version to migrate to.
18
+ #
19
+ def self.run(name, dir, table, target = nil)
20
+ # Sequel 3.31.0 changed the way altering tables works, this causes some
21
+ # annoying issues to occur when using foreign keys in SQLite3. This can be
22
+ # fixed by turning off foreign keys while running the migrations.
23
+ #
24
+ # See this pastie for an example of this issue: http://pastie.org/3140474
25
+ if Zen.database.database_type == :sqlite
26
+ Ramaze::Log.debug('Turning off foreign keys for SQLite3')
27
+ Zen.database.execute('PRAGMA foreign_keys = OFF;')
28
+ end
29
+
30
+ Sequel::Migrator.run(
31
+ Zen.database,
32
+ dir,
33
+ :table => table,
34
+ :target => target
35
+ )
36
+
37
+ if target.nil?
38
+ Ramaze::Log.info("Migrated #{name} to the latest version")
39
+ else
40
+ Ramaze::Log.info("Migrated #{name} to version #{target}")
41
+ end
42
+
43
+ if target == 0
44
+ Ramaze::Log.info("Dropping table #{table}")
45
+ Zen.database.drop_table(table)
46
+ end
47
+
48
+ if Zen.database.database_type == :sqlite
49
+ Ramaze::Log.debug('Turning foreign keys on again')
50
+ Zen.database.execute('PRAGMA foreign_keys = ON;')
51
+ end
52
+ end
53
+ end # Migrator
54
+ end # Zen
@@ -28,6 +28,25 @@ module Zen
28
28
  into.extend(ClassMethods)
29
29
  end
30
30
 
31
+ ##
32
+ # Sanitizes the given fields.
33
+ #
34
+ # @example
35
+ # sanitize_fields([:name, :description])
36
+ #
37
+ # @since 03-01-2012
38
+ # @param [Array] fields An array containing all the fields to sanitize.
39
+ # @param [TrueClass|FalseClass] clean_html When set to true Loofah will be
40
+ # used to get rid of nasty HTML.
41
+ #
42
+ def sanitize_fields(fields, clean_html = false)
43
+ fields.each do |field|
44
+ got = send(field)
45
+
46
+ send("#{field}=", Zen::Security.sanitize(got, clean_html)) unless got.nil?
47
+ end
48
+ end
49
+
31
50
  # The methods in this module will be added as class methods to the
32
51
  # including class.
33
52
  module ClassMethods
@@ -53,7 +72,7 @@ module Zen
53
72
  # @return [Hash|Sequel::SQL::BooleanExpression]
54
73
  #
55
74
  def search_column(column, value)
56
- if NoRegexpSupport.include?(Zen.database.adapter_scheme)
75
+ if NoRegexpSupport.include?(Zen.database.database_type)
57
76
  return column.like("%#{value}%")
58
77
  else
59
78
  return {column => /#{value}/i}
@@ -1,5 +1,7 @@
1
1
  Zen::Language.load('zen_models')
2
2
 
3
+ Sequel::Model.strict_param_setting = false
4
+
3
5
  Sequel::Model.plugin(:validation_helpers)
4
6
  Sequel::Model.plugin(:association_pks)
5
7
 
@@ -0,0 +1,158 @@
1
+ module Sequel
2
+ module Plugins
3
+ ##
4
+ # Plugin for Sequel that acts as a bridge between Sequel hooks and events
5
+ # fired by {Zen::Event}. Based on the specified options it creates events
6
+ # for the following Sequel hooks:
7
+ #
8
+ # * before_create
9
+ # * after_create
10
+ # * before_update
11
+ # * after_update
12
+ # * before_destroy
13
+ # * after_destroy
14
+ #
15
+ # For example, to add the Zen event "before_new_post" and have it called by
16
+ # the Sequel hook "before_create" you'd do the following:
17
+ #
18
+ # class Posts < Sequel::Model
19
+ # plugin :events, :before_create => :before_new_post
20
+ # end
21
+ #
22
+ # Each event will receive an instance of the model. This means that you're
23
+ # free to modify the model in your events as long as you take into account
24
+ # that other events might do the same:
25
+ #
26
+ # Zen::Event.listen(:before_new_post) do |post|
27
+ # post.title = 'a'
28
+ # end
29
+ #
30
+ # Events don't have to return the modified object as objects are assigned by
31
+ # reference.
32
+ #
33
+ # @since 05-02-2012
34
+ #
35
+ module Events
36
+ ##
37
+ # Configures the plugin for a single model.
38
+ #
39
+ # @since 06-02-2012
40
+ # @param [Class] model The model for which to enable the plugin.
41
+ # @param [Hash] options A hash containing the Sequel hook names and the
42
+ # Zen events to fire.
43
+ # @option options [Symbol] :before_create The name of the event to call in
44
+ # the before_create hook.
45
+ # @option options [Symbol] :after_create The name of the event to call in
46
+ # the after_create hook.
47
+ # @option options [Symbol] :before_update The name of the event to call in
48
+ # the before_update hook.
49
+ # @option options [Symbol] :after_update The name of the event to call in
50
+ # the after_update hook.
51
+ # @option options [Symbol] :before_destroy The name of the event to call
52
+ # in the before_destroy hook.
53
+ # @option options [Symbol] :after_destroy The name of the event to call in
54
+ # the after_destroy hook.
55
+ #
56
+ def self.configure(model, options = {})
57
+ model.events = options
58
+ end
59
+
60
+ ##
61
+ # Module containing the methods and attributes to make available on class
62
+ # level.
63
+ #
64
+ # @since 06-02-2012
65
+ #
66
+ module ClassMethods
67
+ # Hash containing all the Sequel hooks and the corresponding Zen events.
68
+ attr_accessor :events
69
+ end
70
+
71
+ ##
72
+ # Module containing the methods and attributes to make available on
73
+ # instance leve.
74
+ #
75
+ # @since 06-02-2012
76
+ #
77
+ module InstanceMethods
78
+ ##
79
+ # Hook executed before creating a new object.
80
+ #
81
+ # @since 06-02-2012
82
+ #
83
+ def before_create
84
+ if self.class.events and self.class.events.key?(:before_create)
85
+ Zen::Event.call(self.class.events[:before_create], self)
86
+ end
87
+
88
+ super
89
+ end
90
+
91
+ ##
92
+ # Hook executed after creating a new object.
93
+ #
94
+ # @since 06-02-2012
95
+ #
96
+ def after_create
97
+ super
98
+
99
+ if self.class.events and self.class.events.key?(:after_create)
100
+ Zen::Event.call(self.class.events[:after_create], self)
101
+ end
102
+ end
103
+
104
+ ##
105
+ # Hook executed before updating an existing object.
106
+ #
107
+ # @since 06-02-2012
108
+ #
109
+ def before_update
110
+ if self.class.events and self.class.events.key?(:before_update)
111
+ Zen::Event.call(self.class.events[:before_update], self)
112
+ end
113
+
114
+ super
115
+ end
116
+
117
+ ##
118
+ # Hook executed after updating an existing object.
119
+ #
120
+ # @since 06-02-2012
121
+ #
122
+ def after_update
123
+ super
124
+
125
+ if self.class.events and self.class.events.key?(:after_update)
126
+ Zen::Event.call(self.class.events[:after_update], self)
127
+ end
128
+ end
129
+
130
+ ##
131
+ # Hook executed before removing an existing object.
132
+ #
133
+ # @since 06-02-2012
134
+ #
135
+ def before_destroy
136
+ if self.class.events and self.class.events.key?(:before_destroy)
137
+ Zen::Event.call(self.class.events[:before_destroy], self)
138
+ end
139
+
140
+ super
141
+ end
142
+
143
+ ##
144
+ # Hook executed after removing an existing object.
145
+ #
146
+ # @since 06-02-2012
147
+ #
148
+ def after_destroy
149
+ super
150
+
151
+ if self.class.events and self.class.events.key?(:after_destroy)
152
+ Zen::Event.call(self.class.events[:after_destroy], self)
153
+ end
154
+ end
155
+ end # InstanceMethods
156
+ end # Events
157
+ end # Plugins
158
+ end # Sequel