zen 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,3 +1,5 @@
1
+ "use strict";
2
+
1
3
  window.addEvent('domready', function()
2
4
  {
3
5
  $$('table:not(.no_sort)').each(function(table)
@@ -26,17 +28,27 @@ window.addEvent('domready', function()
26
28
  Zen.Editor.create(markup, editor);
27
29
  });
28
30
 
29
- // Initializes a datepicker object whenever it's loaded and the correct
30
- // element was found.
31
- var date_elements = $$('input[type="text"].date');
32
-
33
- if ( date_elements.length > 0 )
31
+ $$('input.date').each(function(el)
34
32
  {
35
- new Picker.Date(date_elements,
33
+ var format = el.get('data-date-format') || Zen.date_format;
34
+ var time = el.get('data-date-time');
35
+ time = (time && (time === '1' || time === 'true')) || false;
36
+ var min = el.get('data-date-min');
37
+ var max = el.get('data-date-max');
38
+
39
+ new Picker.Date(el,
36
40
  {
37
- timePicker: true,
41
+ timePicker: time,
38
42
  pickerClass: 'datepicker',
39
- format: Zen.date_format
43
+ format: format,
44
+ draggable: false,
45
+ minDate: min,
46
+ maxDate: max
40
47
  });
41
- }
48
+ });
49
+
50
+ $$('form[data-autosave-url]').each(function(el)
51
+ {
52
+ new Zen.Autosave(el, el.get('data-autosave-url'));
53
+ });
42
54
  });
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+
3
+ namespace('Zen');
4
+
5
+ /**
6
+ * Zen.Autosave automatically saves form data at a given interval. Automatically
7
+ * saving form data makes it more pleasant for users to work with their data as
8
+ * the risk of data loss is minimized.
9
+ *
10
+ * Basic usage of this class is as following:
11
+ *
12
+ * new Zen.Autosave(
13
+ * $('my_form'),
14
+ * 'http://localhost/admin/category-groups/autosave'
15
+ * );
16
+ *
17
+ * When creating a new instance of this class you are required to specify a
18
+ * single Element instance as well as the URL to submit the data to. The element
19
+ * is specified as the first parameter, the URL as the second one. The optional
20
+ * third parameter can be used for setting optional options such as the interval
21
+ * and the HTTP method to use for submitting the data.
22
+ *
23
+ * By default the interval is set to 10 minutes, this can be changed as
24
+ * following:
25
+ *
26
+ * new Zen.Autosave(element, url, {interval: 300000});
27
+ *
28
+ * This would cause the form data to be saved every 5 minutes instead of every
29
+ * 10 minutes.
30
+ *
31
+ * This class only submits forms for existing objects, this is based on the
32
+ * value of the primary column. By default the name for this column is set to
33
+ * "id" but this can be changed as following:
34
+ *
35
+ * new Zen.Autosave(element, url, {primary: 'my_id'});
36
+ *
37
+ * If the field with this name has a non empty value then the form will be
38
+ * submitted at a given interval, otherwise it will be ignored.
39
+ *
40
+ * @since 15-02-2012
41
+ */
42
+ Zen.Autosave = new Class(
43
+ {
44
+ Implements: Options,
45
+
46
+ /**
47
+ * Element containing the form element.
48
+ *
49
+ * @since 16-02-2012
50
+ */
51
+ element: null,
52
+
53
+ /**
54
+ * The URL to submit the data to.
55
+ *
56
+ * @since 16-02-2012
57
+ */
58
+ url: null,
59
+
60
+ /**
61
+ * Object containing various options to customize the auto saving behaviour.
62
+ *
63
+ * @since 16-02-2012
64
+ */
65
+ options:
66
+ {
67
+ // The amount of miliseconds to wait between each save.
68
+ interval: 600000,
69
+
70
+ // The HTTP method to use for submitting the data.
71
+ method: 'POST',
72
+
73
+ // The name of the field that contains the primary value of an object.
74
+ primary: 'id'
75
+ },
76
+
77
+ /**
78
+ * Creates a new instance of the class.
79
+ *
80
+ * @since 16-02-2012
81
+ * @param {Element} element The form element to submit.
82
+ * @param {String} url The URL to submit the data to.
83
+ * @param {Object} options Object containing custom options. See
84
+ * Zen.Autosave.options for more information.
85
+ */
86
+ initialize: function(element, url, options)
87
+ {
88
+ this.setOptions(options);
89
+
90
+ if ( typeOf(url) !== 'string' )
91
+ {
92
+ throw new TypeError(
93
+ 'You have to specify an instance of String for the URL'
94
+ );
95
+ }
96
+
97
+ this.element = element;
98
+ this.url = url;
99
+ var _this = this;
100
+ var primary = element
101
+ .getElement('input[name="' + this.options.primary + '"]');
102
+
103
+ if ( !primary || primary.get('value').length <= 0 )
104
+ {
105
+ return;
106
+ }
107
+
108
+ setInterval(function() { _this.sendRequest() }, this.options.interval);
109
+ },
110
+
111
+ /**
112
+ * Submits the form data to the server. Upon success the CSRF token is
113
+ * updated, upon failure the validation errors will be displayed.
114
+ *
115
+ * @since 16-02-2012
116
+ */
117
+ sendRequest: function()
118
+ {
119
+ var _this = this;
120
+ var request = new Request.JSON(
121
+ {
122
+ url: this.url,
123
+ method: this.options.method,
124
+ data: this.element.toQueryString(),
125
+ onSuccess: function(response)
126
+ {
127
+ _this.setToken(response.csrf_token);
128
+ _this.element.getElements('span.error').destroy();
129
+ },
130
+ onFailure: function(xhr)
131
+ {
132
+ var response = JSON.decode(xhr.responseText);
133
+
134
+ _this.displayErrors(response.errors);
135
+ }
136
+ });
137
+
138
+ request.send();
139
+ },
140
+
141
+ /**
142
+ * Displays the validation errors of a set of fields.
143
+ *
144
+ * @since 16-02-2012
145
+ * @param {Object} form_errors Object containing the form errors. The keys
146
+ * should be the names of the fields and the values arrays of error messages
147
+ * to display.
148
+ */
149
+ displayErrors: function(form_errors)
150
+ {
151
+ var _this = this;
152
+
153
+ Object.each(form_errors, function(errors, field)
154
+ {
155
+ var label = _this.element
156
+ .getElement('input[name="' + field + '"]')
157
+ .getSiblings('label')[0];
158
+
159
+ if ( label.getElements('span.error').length === 0 )
160
+ {
161
+ errors.each(function(error)
162
+ {
163
+ var span = new Element('span',
164
+ {
165
+ 'class': 'error',
166
+ html: error
167
+ });
168
+
169
+ span.inject(label);
170
+ });
171
+ }
172
+ });
173
+ },
174
+
175
+ /**
176
+ * Updates the CSRF token with the given value.
177
+ *
178
+ * @since 16-02-2012
179
+ * @param {String} token The new CSRF token.
180
+ */
181
+ setToken: function(token)
182
+ {
183
+ this.element.getElement('input[name="csrf_token"]').set('value', token);
184
+ }
185
+ });
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Turns the specified string into an object (and sub objects) that can be used
5
+ * to namespace classes and other data.
6
+ *
7
+ * Basic usage:
8
+ *
9
+ * console.log(Foo); // => ReferenceError
10
+ *
11
+ * namespace('Foo.Bar.Baz');
12
+ *
13
+ * console.log(Foo); // => {Bar: {Baz: {}}}
14
+ *
15
+ * If segments of the namespace already exist they will remain untouched, this
16
+ * function merely creates non existing segments.
17
+ *
18
+ * @example
19
+ * namespace('Zen.Editor');
20
+ *
21
+ * Zen.Editor.Markdown = new Class(...);
22
+ *
23
+ * @since 22-12-2011
24
+ * @param {string} name The namespace to create.
25
+ */
26
+ function namespace(name)
27
+ {
28
+ var stack = window;
29
+
30
+ name.split('.').each(function(segment)
31
+ {
32
+ stack[segment] = stack[segment] || {};
33
+ stack = stack[segment];
34
+ });
35
+ }
36
+
37
+ /**
38
+ * Returns the translation for the given string. This function allows you to
39
+ * retrieve languages in the same way as you would do in the Ruby code for your
40
+ * application:
41
+ *
42
+ * var string = lang('foo.bar');
43
+ *
44
+ * This code is the same as the following:
45
+ *
46
+ * var string = Zen.translations['foo.bar'];
47
+ *
48
+ * @since 22-12-2011
49
+ * @param {string} key The language key to retrieve.
50
+ * @return {string}
51
+ */
52
+ function lang(key)
53
+ {
54
+ if ( !Zen.translations[key] )
55
+ {
56
+ throw new Error('The language key "' + key + '" does not exist');
57
+ }
58
+
59
+ return Zen.translations[key];
60
+ }
@@ -9,17 +9,12 @@ provides: Locale.nl-NL.DatePicker
9
9
  */
10
10
 
11
11
  Locale.define('en-US', 'DatePicker', {
12
- select_a_time: Zen.translations[
13
- 'zen_general.datepicker.select_a_time'],
14
- use_mouse_wheel: Zen.translations[
15
- 'zen_general.datepicker.use_mouse_wheel'
16
- ],
17
- time_confirm_button: Zen.translations[
18
- 'zen_general.datepicker.time_confirm_button'
19
- ],
20
- apply_range: Zen.translations['zen_general.datepicker.apply_range'],
21
- cancel : Zen.translations['zen_general.datepicker.cancel'],
22
- week : Zen.translations['zen_general.datepicker.week']
12
+ select_a_time: lang('zen_general.datepicker.select_a_time'),
13
+ use_mouse_wheel: lang('zen_general.datepicker.use_mouse_wheel'),
14
+ time_confirm_button: lang('zen_general.datepicker.time_confirm_button'),
15
+ apply_range: lang('zen_general.datepicker.apply_range'),
16
+ cancel: lang('zen_general.datepicker.cancel'),
17
+ week: lang('zen_general.datepicker.week')
23
18
  });
24
19
 
25
20
  /*
@@ -31,6 +26,8 @@ requires: [Core/Element.Dimensions, Core/Fx.Tween, Core/Fx.Transitions]
31
26
  provides: Picker
32
27
  ...
33
28
  */
29
+
30
+
34
31
  var Picker = new Class({
35
32
 
36
33
  Implements: [Options, Events],
@@ -117,18 +114,18 @@ var Picker = new Class({
117
114
  transition: Fx.Transitions.Quad.easeInOut
118
115
  }).inject(body);
119
116
 
120
- this.oldContents = new Element('div', {
117
+ this.newContents = new Element('div', {
121
118
  styles: {
122
119
  position: 'absolute',
123
- top: 0
120
+ top: 0,
121
+ left: 0
124
122
  }
125
123
  }).inject(slider);
126
124
 
127
- this.newContents = new Element('div', {
125
+ this.oldContents = new Element('div', {
128
126
  styles: {
129
127
  position: 'absolute',
130
- top: 0,
131
- left: 0
128
+ top: 0
132
129
  }
133
130
  }).inject(slider);
134
131
 
@@ -150,11 +147,15 @@ var Picker = new Class({
150
147
  open: function(noFx){
151
148
  if (this.opened == true) return this;
152
149
  this.opened = true;
153
- var picker = this.picker.setStyle('display', 'block').set('aria-hidden', 'false')
150
+ var self = this,
151
+ picker = this.picker.setStyle('display', 'block').set('aria-hidden', 'false')
154
152
  if (this.shim) this.shim.show();
155
153
  this.fireEvent('open');
156
154
  if (this.options.useFadeInOut && !noFx){
157
- picker.fade('in').get('tween').chain(this.fireEvent.pass('show', this));
155
+ picker.get('tween').start('opacity', 1).chain(function(){
156
+ self.fireEvent('show');
157
+ this.callChain();
158
+ });
158
159
  } else {
159
160
  picker.setStyle('opacity', 1);
160
161
  this.fireEvent('show');
@@ -176,7 +177,7 @@ var Picker = new Class({
176
177
  self.fireEvent('hide');
177
178
  };
178
179
  if (this.options.useFadeInOut && !noFx){
179
- picker.fade('out').get('tween').chain(hide);
180
+ picker.get('tween').start('opacity', 0).chain(hide);
180
181
  } else {
181
182
  picker.setStyle('opacity', 0);
182
183
  hide();
@@ -370,6 +371,8 @@ requires: [Picker, Core/Element.Event]
370
371
  provides: Picker.Attach
371
372
  ...
372
373
  */
374
+
375
+
373
376
  Picker.Attach = new Class({
374
377
 
375
378
  Extends: Picker,
@@ -379,6 +382,7 @@ Picker.Attach = new Class({
379
382
 
380
383
  toggleElements: null, // deprecated
381
384
  toggle: null, // When set it deactivate toggling by clicking on the input */
385
+ togglesOnly: true, // set to false to always make calendar popup on input element, if true, it depends on the toggles elements set.
382
386
  showOnInit: false, // overrides the Picker option
383
387
  blockKeydown: true
384
388
  },
@@ -461,7 +465,7 @@ Picker.Attach = new Class({
461
465
 
462
466
  if (tag == 'input'){
463
467
  // Fix in order to use togglers only
464
- if (!toggles.length){
468
+ if (!self.options.togglesOnly || !toggles.length){
465
469
  events = {
466
470
  focus: openEvent,
467
471
  click: openEvent,
@@ -529,6 +533,8 @@ requires: [Picker, Picker.Attach, Locale.en-US.DatePicker, More/Locale, More/Dat
529
533
  provides: Picker.Date
530
534
  ...
531
535
  */
536
+
537
+
532
538
  (function(){
533
539
 
534
540
  this.DatePicker = Picker.Date = new Class({
@@ -553,6 +559,7 @@ this.DatePicker = Picker.Date = new Class({
553
559
  yearsPerPage: 20,
554
560
 
555
561
  startDay: 1, // Sunday (0) through Saturday (6) - be aware that this may affect your layout, since the days on the right might have a different margin
562
+ rtl: false,
556
563
 
557
564
  startView: 'days', // allowed values: {time, days, months, years}
558
565
  openLastView: false,
@@ -644,8 +651,17 @@ this.DatePicker = Picker.Date = new Class({
644
651
 
645
652
  getInputDate: function(input){
646
653
  this.date = new Date();
654
+
647
655
  if (!input) return;
648
- var date = Date.parse(input.get('value'));
656
+
657
+ // Taken from <https://github.com/brenard/mootools-datepicker/commit/
658
+ // e8f93156cf8ed989a31c9c8d5e75b1bdb294afb2>
659
+ var date = Date.parse(input.get('value'), this.options.format);
660
+
661
+ if (date == null) {
662
+ date = Date.parse(input.get('value'));
663
+ }
664
+
649
665
  if (date == null || !date.isValid()){
650
666
  var storeDate = input.retrieve('datepicker:value');
651
667
  if (storeDate) date = Date.parse(storeDate);
@@ -658,8 +674,13 @@ this.DatePicker = Picker.Date = new Class({
658
674
  constructPicker: function(){
659
675
  this.parent();
660
676
 
661
- this.previous = new Element('div.previous[html=&#171;]').inject(this.header);
662
- this.next = new Element('div.next[html=&#187;]').inject(this.header);
677
+ if (!this.options.rtl){
678
+ this.previous = new Element('div.previous[html=&#171;]').inject(this.header);
679
+ this.next = new Element('div.next[html=&#187;]').inject(this.header);
680
+ } else {
681
+ this.next = new Element('div.previous[html=&#171;]').inject(this.header);
682
+ this.previous = new Element('div.next[html=&#187;]').inject(this.header);
683
+ }
663
684
  },
664
685
 
665
686
  hidePrevious: function(_next, _show){
@@ -995,16 +1016,18 @@ var renderers = {
995
1016
  body = new Element('tbody').inject(container),
996
1017
  titles = new Element('tr.titles').inject(header),
997
1018
  localeDaysShort = options.days_abbr || Locale.get('Date.days_abbr'),
998
- day, classes, element, weekcontainer, dateString;
1019
+ day, classes, element, weekcontainer, dateString,
1020
+ where = options.rtl ? 'top' : 'bottom';
999
1021
 
1000
1022
  if (weeknumbers) new Element('th.title.day.weeknumber', {
1001
1023
  text: Locale.get('DatePicker.week')
1002
1024
  }).inject(titles);
1025
+
1003
1026
  for (day = options.startDay; day < (options.startDay + 7); day++){
1004
1027
  new Element('th.title.day.day' + (day % 7), {
1005
1028
  text: localeDaysShort[(day % 7)],
1006
1029
  role: 'columnheader'
1007
- }).inject(titles);
1030
+ }).inject(titles, where);
1008
1031
  }
1009
1032
 
1010
1033
  days.each(function(_date, i){
@@ -1012,14 +1035,14 @@ var renderers = {
1012
1035
 
1013
1036
  if (i % 7 == 0){
1014
1037
  weekcontainer = new Element('tr.week.week' + (Math.floor(i / 7))).set('role', 'row').inject(body);
1015
- if (weeknumbers) new Element('td.day.weeknumber', {text: date.get('week')}).inject(weekcontainer);
1038
+ if (weeknumbers) new Element('th.day.weeknumber', {text: date.get('week'), scope: 'row', role: 'rowheader'}).inject(weekcontainer);
1016
1039
  }
1017
1040
 
1018
1041
  dateString = date.toDateString();
1019
1042
  classes = '.day.day' + date.get('day');
1020
1043
  if (dateString == todayString) classes += '.today';
1021
1044
  if (date.get('month') != month) classes += '.otherMonth';
1022
- element = new Element('td' + classes, {text: date.getDate(), role: 'gridcell'}).inject(weekcontainer);
1045
+ element = new Element('td' + classes, {text: date.getDate(), role: 'gridcell'}).inject(weekcontainer, where);
1023
1046
 
1024
1047
  if (dateString == currentString) element.addClass('selected').set('aria-selected', 'true');
1025
1048
  else element.set('aria-selected', 'false');
@@ -1165,7 +1188,7 @@ var isUnavailable = function(type, date, options){
1165
1188
  month = date.get('month') + 1;
1166
1189
  day = date.get('date');
1167
1190
 
1168
- var dateAllow = (minDate && date < minDate) || (minDate && date > maxDate);
1191
+ var dateAllow = (minDate && date < minDate) || (maxDate && date > maxDate);
1169
1192
  if (availableDates != null){
1170
1193
  dateAllow = dateAllow
1171
1194
  || availableDates[year] == null
@@ -1188,6 +1211,7 @@ requires: [Picker, Picker.Date]
1188
1211
  provides: Picker.Date.Range
1189
1212
  ...
1190
1213
  */
1214
+
1191
1215
  Picker.Date.Range = new Class({
1192
1216
 
1193
1217
  Extends: Picker.Date,