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
@@ -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,