zen 0.2.8 → 0.3b

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 (422) hide show
  1. data/.gems +20 -0
  2. data/.mailmap +3 -2
  3. data/.rvmrc +1 -1
  4. data/.travis.yml +13 -2
  5. data/.yardopts +13 -0
  6. data/AUTHORS +1 -1
  7. data/README.md +115 -77
  8. data/Rakefile +6 -7
  9. data/bin/zen +12 -5
  10. data/guide/_static/categories/categories.png +0 -0
  11. data/guide/_static/categories/category_groups.png +0 -0
  12. data/guide/_static/categories/new_category.png +0 -0
  13. data/guide/_static/categories/new_category_group.png +0 -0
  14. data/guide/_static/comments/comments.png +0 -0
  15. data/guide/_static/comments/edit_comment.png +0 -0
  16. data/guide/_static/custom_fields/custom_field_groups.png +0 -0
  17. data/guide/_static/custom_fields/custom_field_types.png +0 -0
  18. data/guide/_static/custom_fields/custom_fields.png +0 -0
  19. data/guide/_static/custom_fields/edit_custom_field_general.png +0 -0
  20. data/guide/_static/custom_fields/edit_custom_field_group.png +0 -0
  21. data/guide/_static/custom_fields/edit_custom_field_settings.png +0 -0
  22. data/guide/_static/custom_fields/edit_custom_field_type.png +0 -0
  23. data/guide/_static/menus/edit_menu.png +0 -0
  24. data/guide/_static/menus/edit_menu_item.png +0 -0
  25. data/guide/_static/menus/menu_items.png +0 -0
  26. data/guide/_static/menus/menus.png +0 -0
  27. data/guide/_static/sections/edit_entry.png +0 -0
  28. data/guide/_static/sections/edit_entry_categories.png +0 -0
  29. data/guide/_static/sections/edit_entry_general.png +0 -0
  30. data/guide/_static/sections/edit_entry_meta.png +0 -0
  31. data/guide/_static/sections/edit_section_comments.png +0 -0
  32. data/guide/_static/sections/edit_section_general.png +0 -0
  33. data/guide/_static/sections/edit_section_groups.png +0 -0
  34. data/guide/_static/sections/entries.png +0 -0
  35. data/guide/_static/sections/sections.png +0 -0
  36. data/guide/_static/settings/overview_general.png +0 -0
  37. data/guide/_static/settings/overview_security.png +0 -0
  38. data/guide/_static/settings/overview_user.png +0 -0
  39. data/guide/_static/users/edit_user.png +0 -0
  40. data/guide/_static/users/edit_user_group.png +0 -0
  41. data/guide/_static/users/edit_user_group_permissions.png +0 -0
  42. data/guide/_static/users/edit_user_permissions.png +0 -0
  43. data/guide/_static/users/overview.png +0 -0
  44. data/guide/_static/users/user_groups_overview.png +0 -0
  45. data/guide/asset_management.md +117 -0
  46. data/{CHANGELOG.md → guide/changelog.md} +42 -0
  47. data/guide/css/common.css +20 -0
  48. data/guide/getting_started.md +61 -0
  49. data/guide/hacking.md +52 -0
  50. data/guide/installation.md +44 -0
  51. data/guide/javascript.md +352 -0
  52. data/lib/vendor/sequel_sluggable.rb +137 -0
  53. data/lib/yard/tags.rb +13 -0
  54. data/lib/zen.rb +148 -78
  55. data/lib/zen/asset_groups.rb +85 -0
  56. data/lib/zen/bin/create.rb +267 -56
  57. data/lib/zen/bin/default.rb +84 -0
  58. data/lib/zen/controller/admin_controller.rb +1 -82
  59. data/lib/zen/controller/base_controller.rb +9 -5
  60. data/lib/zen/controller/frontend_controller.rb +0 -1
  61. data/lib/zen/controller/main_controller.rb +30 -42
  62. data/lib/zen/controller/preview.rb +9 -8
  63. data/lib/zen/controller/translations.rb +49 -0
  64. data/lib/zen/error.rb +17 -0
  65. data/lib/zen/event.rb +118 -0
  66. data/lib/zen/helper/asset.rb +63 -0
  67. data/lib/zen/helper/breadcrumb.rb +1 -4
  68. data/lib/zen/helper/controller.rb +73 -0
  69. data/lib/zen/helper/locale.rb +42 -0
  70. data/lib/zen/helper/message.rb +0 -3
  71. data/lib/zen/helper/search.rb +54 -0
  72. data/lib/zen/helper/stacked_aspect.rb +249 -0
  73. data/lib/zen/helper/theme.rb +3 -10
  74. data/lib/zen/language.rb +356 -181
  75. data/lib/zen/language/en/zen_general.rb +52 -0
  76. data/lib/zen/language/en/zen_models.rb +19 -0
  77. data/lib/zen/language/nl/zen_general.rb +57 -0
  78. data/lib/zen/language/nl/zen_models.rb +22 -0
  79. data/lib/zen/language/translation.rb +132 -0
  80. data/lib/zen/languages.rb +9 -0
  81. data/lib/zen/layout/admin.xhtml +3 -3
  82. data/lib/zen/layout/login.xhtml +1 -1
  83. data/lib/zen/markup.rb +189 -0
  84. data/lib/zen/model/helper.rb +65 -0
  85. data/lib/zen/model/init.rb +62 -0
  86. data/lib/zen/model/methods.rb +6 -7
  87. data/lib/zen/package.rb +312 -201
  88. data/lib/zen/package/all.rb +4 -3
  89. data/lib/zen/package/categories/lib/categories.rb +29 -41
  90. data/lib/zen/package/categories/lib/categories/controller/categories.rb +185 -130
  91. data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +172 -102
  92. data/lib/zen/package/categories/lib/categories/helper/category.rb +4 -9
  93. data/lib/zen/package/categories/lib/categories/helper/category_frontend.rb +86 -0
  94. data/lib/zen/package/categories/lib/categories/language/en/categories.rb +40 -0
  95. data/lib/zen/package/categories/lib/categories/language/en/category_groups.rb +39 -0
  96. data/lib/zen/package/categories/lib/categories/language/nl/categories.rb +42 -0
  97. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.rb +42 -0
  98. data/lib/zen/package/categories/lib/categories/model/category.rb +21 -25
  99. data/lib/zen/package/categories/lib/categories/model/category_group.rb +21 -15
  100. data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +25 -26
  101. data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +24 -24
  102. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/form.xhtml +18 -20
  103. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +21 -18
  104. data/lib/zen/package/comments/lib/comments.rb +30 -50
  105. data/lib/zen/package/comments/lib/comments/anti_spam.rb +138 -0
  106. data/lib/zen/package/comments/lib/comments/controller/comments.rb +159 -92
  107. data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +122 -34
  108. data/lib/zen/package/comments/lib/comments/helper/comment.rb +0 -3
  109. data/lib/zen/package/comments/lib/comments/helper/comment_frontend.rb +90 -0
  110. data/lib/zen/package/comments/lib/comments/language/en/comments.rb +57 -0
  111. data/lib/zen/package/comments/lib/comments/language/nl/comments.rb +61 -0
  112. data/lib/zen/package/comments/lib/comments/model/comment.rb +147 -49
  113. data/lib/zen/package/comments/lib/comments/model/comment_status.rb +0 -2
  114. data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +37 -40
  115. data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +23 -42
  116. data/lib/zen/package/comments/migrations/1308774099_comment_status.rb +12 -4
  117. data/lib/zen/package/comments/migrations/1313851786_remove_defensio_signature.rb +11 -0
  118. data/lib/zen/package/custom_fields/lib/custom_fields.rb +40 -43
  119. data/lib/zen/package/custom_fields/lib/custom_fields/blue_form_parameters.rb +72 -17
  120. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +154 -118
  121. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_types.rb +147 -90
  122. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +161 -131
  123. data/lib/zen/package/custom_fields/lib/custom_fields/helper/custom_field.rb +4 -9
  124. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.rb +42 -0
  125. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_types.rb +51 -0
  126. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.rb +60 -0
  127. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.rb +41 -0
  128. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_types.rb +49 -0
  129. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.rb +61 -0
  130. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +18 -23
  131. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +20 -19
  132. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_method.rb +1 -3
  133. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_type.rb +19 -9
  134. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +18 -15
  135. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/form.xhtml +18 -18
  136. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +30 -24
  137. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/form.xhtml +15 -10
  138. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/index.xhtml +24 -19
  139. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +18 -13
  140. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +30 -20
  141. data/lib/zen/package/extensions/lib/extensions.rb +20 -0
  142. data/lib/zen/package/extensions/lib/extensions/controller/extensions.rb +41 -0
  143. data/lib/zen/package/extensions/lib/extensions/language/en/extensions.rb +23 -0
  144. data/lib/zen/package/extensions/lib/extensions/language/nl/extensions.rb +25 -0
  145. data/lib/zen/package/extensions/lib/extensions/view/admin/extensions/index.xhtml +86 -0
  146. data/lib/zen/package/menu.rb +109 -0
  147. data/lib/zen/package/menus/lib/menus.rb +25 -34
  148. data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +143 -107
  149. data/lib/zen/package/menus/lib/menus/controller/menus.rb +166 -115
  150. data/lib/zen/package/menus/lib/menus/helper/menu.rb +2 -8
  151. data/lib/zen/package/menus/lib/menus/helper/menu_frontend.rb +114 -0
  152. data/lib/zen/package/menus/lib/menus/language/en/menu_items.rb +48 -0
  153. data/lib/zen/package/menus/lib/menus/language/en/menus.rb +48 -0
  154. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.rb +48 -0
  155. data/lib/zen/package/menus/lib/menus/language/nl/menus.rb +50 -0
  156. data/lib/zen/package/menus/lib/menus/model/menu.rb +24 -17
  157. data/lib/zen/package/menus/lib/menus/model/menu_item.rb +37 -13
  158. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +32 -25
  159. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +23 -17
  160. data/lib/zen/package/menus/lib/menus/view/admin/menus/form.xhtml +31 -26
  161. data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +20 -22
  162. data/lib/zen/package/sections/lib/sections.rb +25 -68
  163. data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +178 -138
  164. data/lib/zen/package/sections/lib/sections/controller/sections.rb +173 -140
  165. data/lib/zen/package/sections/lib/sections/helper/section.rb +3 -6
  166. data/lib/zen/package/sections/lib/sections/helper/section_frontend.rb +146 -0
  167. data/lib/zen/package/sections/lib/sections/language/en/section_entries.rb +50 -0
  168. data/lib/zen/package/sections/lib/sections/language/en/sections.rb +55 -0
  169. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.rb +50 -0
  170. data/lib/zen/package/sections/lib/sections/language/nl/sections.rb +55 -0
  171. data/lib/zen/package/sections/lib/sections/model/section.rb +36 -36
  172. data/lib/zen/package/sections/lib/sections/model/section_entry.rb +52 -59
  173. data/lib/zen/package/sections/lib/sections/model/section_entry_status.rb +2 -2
  174. data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +24 -21
  175. data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +24 -26
  176. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +33 -31
  177. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +24 -25
  178. data/lib/zen/package/sections/migrations/1308672298_use_id_for_default_section.rb +14 -10
  179. data/lib/zen/package/sections/migrations/1308813320_section_entry_statuses.rb +12 -6
  180. data/lib/zen/package/settings/lib/settings.rb +25 -120
  181. data/lib/zen/package/settings/lib/settings/blue_form_parameters.rb +157 -0
  182. data/lib/zen/package/settings/lib/settings/controller/settings.rb +94 -69
  183. data/lib/zen/package/settings/lib/settings/language/en/settings.rb +41 -0
  184. data/lib/zen/package/settings/lib/settings/language/nl/settings.rb +41 -0
  185. data/lib/zen/package/settings/lib/settings/model/setting.rb +0 -2
  186. data/lib/zen/package/settings/lib/settings/setting.rb +379 -0
  187. data/lib/zen/package/settings/lib/settings/setting_groups.rb +11 -0
  188. data/lib/zen/package/settings/lib/settings/settings.rb +83 -0
  189. data/lib/zen/package/settings/lib/settings/settings_group.rb +84 -0
  190. data/lib/zen/package/settings/lib/settings/singleton_methods.rb +35 -0
  191. data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +15 -57
  192. data/lib/zen/package/settings/migrations/1321197919_remove_unused_columns.rb +17 -0
  193. data/lib/zen/package/users/lib/users.rb +51 -36
  194. data/lib/zen/package/users/lib/users/controller/user_groups.rb +133 -98
  195. data/lib/zen/package/users/lib/users/controller/users.rb +253 -136
  196. data/lib/zen/package/users/lib/users/helper/access.rb +102 -0
  197. data/lib/zen/package/users/lib/users/helper/acl.rb +113 -0
  198. data/lib/zen/package/users/lib/users/helper/users.rb +41 -24
  199. data/lib/zen/package/users/lib/users/language/en/permissions.rb +16 -0
  200. data/lib/zen/package/users/lib/users/language/en/user_groups.rb +39 -0
  201. data/lib/zen/package/users/lib/users/language/en/users.rb +73 -0
  202. data/lib/zen/package/users/lib/users/language/nl/permissions.rb +16 -0
  203. data/lib/zen/package/users/lib/users/language/nl/user_groups.rb +41 -0
  204. data/lib/zen/package/users/lib/users/language/nl/users.rb +74 -0
  205. data/lib/zen/package/users/lib/users/model/permission.rb +28 -0
  206. data/lib/zen/package/users/lib/users/model/user.rb +104 -65
  207. data/lib/zen/package/users/lib/users/model/user_group.rb +28 -24
  208. data/lib/zen/package/users/lib/users/model/user_status.rb +27 -0
  209. data/lib/zen/package/users/lib/users/public/admin/css/users/permissions.css +22 -0
  210. data/lib/zen/package/users/lib/users/public/admin/js/users/permissions.js +33 -0
  211. data/lib/zen/package/users/lib/users/settings.rb +19 -0
  212. data/lib/zen/package/users/lib/users/view/admin/user-groups/form.xhtml +58 -28
  213. data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +19 -15
  214. data/lib/zen/package/users/lib/users/view/admin/users/form.xhtml +93 -62
  215. data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +23 -36
  216. data/lib/zen/package/users/lib/users/view/admin/users/login.xhtml +13 -6
  217. data/lib/zen/package/users/lib/users/view/admin/users/permissions.xhtml +33 -0
  218. data/lib/zen/package/users/lib/users/view/admin/users/register.xhtml +52 -0
  219. data/lib/zen/package/users/migrations/1313786058_update_default_date.rb +41 -0
  220. data/lib/zen/package/users/migrations/1316432327_permissions.rb +36 -0
  221. data/lib/zen/package/users/migrations/1320272365_status_ids.rb +67 -0
  222. data/lib/zen/public/admin/css/zen/buttons.css +3 -11
  223. data/lib/zen/public/admin/css/zen/datepicker.css +23 -13
  224. data/lib/zen/public/admin/css/zen/editor.css +6 -14
  225. data/lib/zen/public/admin/css/zen/forms.css +19 -12
  226. data/lib/zen/public/admin/css/zen/general.css +22 -18
  227. data/lib/zen/public/admin/css/zen/grid.css +1 -20
  228. data/lib/zen/public/admin/css/zen/layout.css +26 -11
  229. data/lib/zen/public/admin/css/zen/messages.css +3 -10
  230. data/lib/zen/public/admin/css/zen/reset.css +13 -15
  231. data/lib/zen/public/admin/css/zen/tables.css +8 -10
  232. data/lib/zen/public/admin/css/zen/tabs.css +2 -10
  233. data/lib/zen/public/admin/css/zen/window.css +2 -8
  234. data/lib/zen/public/admin/js/vendor/datepicker.js +540 -240
  235. data/lib/zen/public/admin/js/vendor/mootools/core.js +273 -283
  236. data/lib/zen/public/admin/js/vendor/mootools/more.js +131 -136
  237. data/lib/zen/public/admin/js/zen/index.js +8 -14
  238. data/lib/zen/public/admin/js/zen/lib/editor.js +36 -33
  239. data/lib/zen/public/admin/js/zen/lib/editor/markdown.js +0 -6
  240. data/lib/zen/public/admin/js/zen/lib/editor/textile.js +0 -6
  241. data/lib/zen/public/admin/js/zen/lib/html_table.js +0 -5
  242. data/lib/zen/public/admin/js/zen/lib/tabs.js +22 -79
  243. data/lib/zen/public/admin/js/zen/lib/window.js +12 -22
  244. data/lib/zen/spec/bacon/color_output.rb +1 -1
  245. data/lib/zen/spec/helper.rb +6 -11
  246. data/lib/zen/spec/simplecov.rb +3 -3
  247. data/lib/zen/task.rb +0 -1
  248. data/lib/zen/task/build.rake +46 -26
  249. data/lib/zen/task/clean.rake +14 -7
  250. data/lib/zen/task/db.rake +31 -29
  251. data/lib/zen/task/package.rake +19 -23
  252. data/lib/zen/task/proto.rake +3 -5
  253. data/lib/zen/task/setup.rake +4 -0
  254. data/lib/zen/task/test.rake +31 -6
  255. data/lib/zen/task/theme.rake +13 -19
  256. data/lib/zen/theme.rb +377 -52
  257. data/lib/zen/validation.rb +22 -30
  258. data/lib/zen/version.rb +1 -2
  259. data/lib/zen/view/bottom.xhtml +9 -1
  260. data/lib/zen/view/head.xhtml +1 -1
  261. data/lib/zen/view/main.xhtml +1 -1
  262. data/lib/zen/view/search.xhtml +9 -0
  263. data/proto/app/Rakefile +0 -1
  264. data/proto/app/app.rb +21 -16
  265. data/proto/app/config/config.rb.erb +41 -0
  266. data/proto/app/config/{database.rb → database.rb.erb} +17 -14
  267. data/proto/app/config/middlewares.rb +1 -1
  268. data/proto/app/theme/default/index.xhtml +25 -0
  269. data/proto/app/theme/theme.rb +19 -0
  270. data/proto/app/{log/database/dev → tmp}/.gitkeep +0 -0
  271. data/proto/migration.rb +3 -5
  272. data/proto/rack/thin.yml +41 -0
  273. data/proto/rack/unicorn.rb +38 -0
  274. data/spec/Rakefile +15 -11
  275. data/spec/fixtures/zen/helper/controller.rb +13 -0
  276. data/spec/fixtures/zen/helper/locale.rb +7 -0
  277. data/spec/fixtures/zen/helper/message.rb +0 -4
  278. data/spec/fixtures/zen/language.rb +31 -0
  279. data/spec/fixtures/zen/language/en/spec.rb +11 -0
  280. data/spec/fixtures/zen/language/nl/spec.rb +11 -0
  281. data/spec/fixtures/zen/package.rb +0 -10
  282. data/spec/fixtures/zen/package/categories/helper/category_frontend.rb +16 -0
  283. data/spec/fixtures/zen/package/comments/helper/comment_frontend.rb +16 -0
  284. data/spec/fixtures/zen/package/sections/helper/section_frontend.rb +16 -0
  285. data/spec/fixtures/zen/package/settings/controller/settings.rb +17 -0
  286. data/spec/fixtures/zen/package/users/helper/access.rb +18 -0
  287. data/spec/fixtures/zen/package/users/helper/acl.rb +23 -0
  288. data/spec/fixtures/zen/theme/{default-section → default}/index.xhtml +0 -0
  289. data/spec/helper.rb +12 -27
  290. data/{proto/app/log/database/live → spec/public}/.gitkeep +0 -0
  291. data/spec/zen/controller/admin_controller.rb +5 -6
  292. data/spec/zen/controller/main_controller.rb +29 -35
  293. data/spec/zen/controller/preview.rb +9 -10
  294. data/spec/zen/event.rb +44 -0
  295. data/spec/zen/helper/breadcrumb.rb +4 -5
  296. data/spec/zen/helper/controller.rb +21 -0
  297. data/spec/zen/helper/locale.rb +25 -0
  298. data/spec/zen/helper/message.rb +4 -11
  299. data/spec/zen/helper/theme.rb +11 -14
  300. data/spec/zen/language.rb +48 -22
  301. data/spec/zen/markup.rb +39 -0
  302. data/spec/zen/package.rb +48 -11
  303. data/spec/zen/package/categories/controller/categories.rb +99 -45
  304. data/spec/zen/package/categories/controller/category_groups.rb +109 -33
  305. data/spec/zen/package/categories/helper/category.rb +19 -32
  306. data/spec/zen/package/categories/helper/category_frontend.rb +61 -0
  307. data/spec/zen/package/comments/anti_spam.rb +50 -0
  308. data/spec/zen/package/comments/controller/comments.rb +121 -61
  309. data/spec/zen/package/comments/controller/comments_form.rb +120 -94
  310. data/spec/zen/package/comments/helper/comment.rb +13 -13
  311. data/spec/zen/package/comments/helper/comment_frontend.rb +92 -0
  312. data/spec/zen/package/custom_fields/blue_form_parameters.rb +50 -50
  313. data/spec/zen/package/custom_fields/controller/custom_field_groups.rb +135 -43
  314. data/spec/zen/package/custom_fields/controller/custom_field_types.rb +153 -48
  315. data/spec/zen/package/custom_fields/controller/custom_fields.rb +130 -51
  316. data/spec/zen/package/custom_fields/helper/custom_field.rb +8 -8
  317. data/spec/zen/package/extensions/controller/extensions.rb +38 -0
  318. data/spec/zen/package/menus/controller/menu_items.rb +121 -42
  319. data/spec/zen/package/menus/controller/menus.rb +125 -38
  320. data/spec/zen/package/menus/helper/menu.rb +26 -26
  321. data/spec/zen/package/menus/helper/menu_frontend.rb +104 -0
  322. data/spec/zen/package/sections/controller/section_entries.rb +145 -89
  323. data/spec/zen/package/sections/controller/sections.rb +130 -35
  324. data/spec/zen/package/sections/helper/section.rb +27 -38
  325. data/spec/zen/package/sections/helper/section_frontend.rb +160 -0
  326. data/spec/zen/package/settings/controller/settings.rb +73 -8
  327. data/spec/zen/package/settings/settings.rb +119 -0
  328. data/spec/zen/package/users/controller/user_groups.rb +134 -34
  329. data/spec/zen/package/users/controller/users.rb +189 -44
  330. data/spec/zen/package/users/helper/access.rb +29 -0
  331. data/spec/zen/package/users/helper/acl.rb +46 -0
  332. data/spec/zen/package/users/helper/users.rb +20 -64
  333. data/spec/zen/theme.rb +7 -9
  334. data/spec/zen/validation.rb +1 -2
  335. data/zen.gemspec +25 -22
  336. metadata +303 -222
  337. data/lib/zen/asset.rb +0 -292
  338. data/lib/zen/bin/runner.rb +0 -118
  339. data/lib/zen/error/language_error.rb +0 -10
  340. data/lib/zen/error/package_error.rb +0 -10
  341. data/lib/zen/error/plugin_error.rb +0 -10
  342. data/lib/zen/error/theme_error.rb +0 -10
  343. data/lib/zen/error/validation_error.rb +0 -10
  344. data/lib/zen/helper/acl.rb +0 -182
  345. data/lib/zen/helper/blue_form_vendor.rb +0 -689
  346. data/lib/zen/language/en/zen_general.yml +0 -25
  347. data/lib/zen/language/en/zen_models.yml +0 -13
  348. data/lib/zen/language/nl/zen_general.yml +0 -25
  349. data/lib/zen/language/nl/zen_models.yml +0 -13
  350. data/lib/zen/model/settings.rb +0 -78
  351. data/lib/zen/package/base.rb +0 -62
  352. data/lib/zen/package/categories/lib/categories/language/en/categories.yml +0 -36
  353. data/lib/zen/package/categories/lib/categories/language/en/category_groups.yml +0 -34
  354. data/lib/zen/package/categories/lib/categories/language/nl/categories.yml +0 -40
  355. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.yml +0 -34
  356. data/lib/zen/package/categories/lib/categories/plugin/categories.rb +0 -141
  357. data/lib/zen/package/comments/lib/comments/language/en/comments.yml +0 -48
  358. data/lib/zen/package/comments/lib/comments/language/nl/comments.yml +0 -50
  359. data/lib/zen/package/comments/lib/comments/plugin/anti_spam.rb +0 -156
  360. data/lib/zen/package/comments/lib/comments/plugin/comments.rb +0 -115
  361. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.yml +0 -33
  362. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_types.yml +0 -40
  363. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.yml +0 -54
  364. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.yml +0 -33
  365. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_types.yml +0 -40
  366. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.yml +0 -54
  367. data/lib/zen/package/menus/lib/menus/language/en/menu_items.yml +0 -41
  368. data/lib/zen/package/menus/lib/menus/language/en/menus.yml +0 -40
  369. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.yml +0 -41
  370. data/lib/zen/package/menus/lib/menus/language/nl/menus.yml +0 -40
  371. data/lib/zen/package/menus/lib/menus/plugin/menus.rb +0 -152
  372. data/lib/zen/package/sections/lib/sections/language/en/section_entries.yml +0 -44
  373. data/lib/zen/package/sections/lib/sections/language/en/sections.yml +0 -48
  374. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.yml +0 -44
  375. data/lib/zen/package/sections/lib/sections/language/nl/sections.yml +0 -48
  376. data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +0 -244
  377. data/lib/zen/package/sections/lib/sections/plugin/sections.rb +0 -87
  378. data/lib/zen/package/settings/lib/settings/language/en/settings.yml +0 -36
  379. data/lib/zen/package/settings/lib/settings/language/nl/settings.yml +0 -37
  380. data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +0 -39
  381. data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +0 -133
  382. data/lib/zen/package/settings/lib/settings/plugin/settings.rb +0 -251
  383. data/lib/zen/package/users/lib/users/controller/access_rules.rb +0 -284
  384. data/lib/zen/package/users/lib/users/language/en/access_rules.yml +0 -38
  385. data/lib/zen/package/users/lib/users/language/en/user_groups.yml +0 -32
  386. data/lib/zen/package/users/lib/users/language/en/users.yml +0 -57
  387. data/lib/zen/package/users/lib/users/language/nl/access_rules.yml +0 -38
  388. data/lib/zen/package/users/lib/users/language/nl/user_groups.yml +0 -32
  389. data/lib/zen/package/users/lib/users/language/nl/users.yml +0 -57
  390. data/lib/zen/package/users/lib/users/model/access_rule.rb +0 -42
  391. data/lib/zen/package/users/lib/users/public/admin/js/users/access_rules.js +0 -65
  392. data/lib/zen/package/users/lib/users/public/admin/js/users/lib/access_rules.js +0 -49
  393. data/lib/zen/package/users/lib/users/view/admin/access-rules/form.xhtml +0 -120
  394. data/lib/zen/package/users/lib/users/view/admin/access-rules/index.xhtml +0 -102
  395. data/lib/zen/plugin.rb +0 -182
  396. data/lib/zen/plugin/base.rb +0 -46
  397. data/lib/zen/plugin/helper.rb +0 -47
  398. data/lib/zen/plugin/markup/lib/markup.rb +0 -14
  399. data/lib/zen/plugin/markup/lib/markup/language/en/markup.yml +0 -6
  400. data/lib/zen/plugin/markup/lib/markup/markup.rb +0 -165
  401. data/lib/zen/public/admin/js/zen/lib/asset.js +0 -111
  402. data/lib/zen/task/plugin.rake +0 -18
  403. data/lib/zen/theme/base.rb +0 -65
  404. data/proto/app/config/config.rb +0 -18
  405. data/spec/fixtures/zen/language/en/spec.yml +0 -10
  406. data/spec/fixtures/zen/language/nl/spec.yml +0 -7
  407. data/spec/fixtures/zen/package/settings/plugin/settings.rb +0 -20
  408. data/spec/zen/asset.rb +0 -97
  409. data/spec/zen/bin/create.rb +0 -89
  410. data/spec/zen/bin/runner.rb +0 -47
  411. data/spec/zen/helper/acl.rb +0 -149
  412. data/spec/zen/package/categories/plugin/categories.rb +0 -92
  413. data/spec/zen/package/comments/plugin/anti_spam.rb +0 -59
  414. data/spec/zen/package/comments/plugin/comments.rb +0 -107
  415. data/spec/zen/package/menus/plugin/menus.rb +0 -120
  416. data/spec/zen/package/sections/plugin/section_entries.rb +0 -161
  417. data/spec/zen/package/sections/plugin/sections.rb +0 -75
  418. data/spec/zen/package/settings/plugin/settings.rb +0 -33
  419. data/spec/zen/package/users/controller/access_rules.rb +0 -90
  420. data/spec/zen/plugin.rb +0 -64
  421. data/spec/zen/plugin/helper.rb +0 -11
  422. data/spec/zen/plugin/markup.rb +0 -44
@@ -1,43 +1,88 @@
1
- #:nodoc:
2
1
  module CustomFields
3
2
  #:nodoc:
4
3
  module Controller
5
4
  ##
6
- # Controller that can be used to manage individual custom field types.
5
+ # Custom field types allow you to create your own types of fields. Being
6
+ # able to create your own field types without having to write any code can
7
+ # be very useful. For example, say you want to be able to create a textarea
8
+ # with a special class (maybe you can to use CKEditor), all you'd have to do
9
+ # is create a new field type, add the class and you're good to go.
10
+ #
11
+ # In order to manage field types you'll have to navigate to
12
+ # ``/admin/custom-field-types``. This can be done by either manually
13
+ # entering the URL into your browser's URL bar or by hovering over the
14
+ # "Custom fields" menu item, this will cause the menu to expand and show a
15
+ # URL called "Custom field types". Clicking this URL will take you to an
16
+ # overview of all existing field types.
17
+ #
18
+ # ![Types](../../_static/custom_fields/custom_field_types.png)
19
+ #
20
+ # ## Adding/Editing Field Types
21
+ #
22
+ # Editing a field type can be done by clicking on the name of the field
23
+ # type, creating a new one can be done by clicking the "Add field type"
24
+ # button. In both cases you'll end up at a form that looks like the image
25
+ # below.
26
+ #
27
+ # ![Edit Type](../../_static/custom_fields/edit_custom_field_type.png)
28
+ #
29
+ # In this form you can specify the following fields:
30
+ #
31
+ # * **Name** (required): the name of the custom field type. This name can be
32
+ # anything you like.
33
+ # * **Language string** (required): a valid language string that will result
34
+ # in a language specific block of text. This text will be used for the
35
+ # label.
36
+ # * **HTML Class**: a space separated list of HTML classes to apply to the
37
+ # field type. The format of this value has to match the regular expression
38
+ # ``/^[a-zA-Z\-_0-9\s]*$/``.
39
+ # * **Serialize**: whether or not the value of a field using this type
40
+ # should be serialized. Set this to "Yes" if a field takes multiple values
41
+ # such as a checkbox or a select element with the attribute
42
+ # ``multiple="multiple"``.
43
+ # * **Allow markup**: whether or not users can use markup, such as Markdown
44
+ # in a field using this type.
45
+ # * **Custom field method** (required): the name of a method in
46
+ # {CustomFields::BlueFormParameters}. This method will be used to generate
47
+ # all the parameters for the BlueForm helper.
48
+ #
49
+ # Note that the name, language string and HTML class can not be longer than
50
+ # 255 characters.
51
+ #
52
+ # ## Used Permissions
53
+ #
54
+ # * show_custom_field_type
55
+ # * edit_custom_field_type
56
+ # * new_custom_field_type
57
+ # * delete_custom_field_type
58
+ #
59
+ # ## Events
60
+ #
61
+ # All events in this controller will receive an instance of
62
+ # {CustomFields::Model::CustomFieldType}. Just like other packages the event
63
+ # ``after_delete_custom_field_type`` receives an instance that has already
64
+ # been destroyed. This means that this event can not be used to make changes
65
+ # to the object and save them.
7
66
  #
8
- # @author Yorick Peterse
9
67
  # @since 0.2.8
68
+ # @map /admin/custom-field-types
69
+ # @event before_new_custom_field_type
70
+ # @event after_new_custom_field_type
71
+ # @event before_edit_custom_field_type
72
+ # @event after_edit_custom_field_type
73
+ # @event before_delete_custom_field_type
74
+ # @event after_delete_custom_field_type
10
75
  #
11
76
  class CustomFieldTypes < Zen::Controller::AdminController
12
- include ::CustomFields::Model
13
-
14
77
  map '/admin/custom-field-types'
15
78
  helper :custom_field
79
+ title 'custom_field_types.titles.%s'
16
80
 
17
- before_all do
18
- csrf_protection(:save, :delete) do
19
- respond(lang('zen_general.errors.csrf'), 403)
20
- end
21
- end
22
-
23
- ##
24
- # Creates a new instance of the controller, loads all the required
25
- # language files and sets the page title.
26
- #
27
- # @author Yorick Peterse
28
- # @since 0.2.8
29
- #
30
- def initialize
31
- super
32
-
33
- Zen::Language.load('custom_field_types')
34
-
35
- if !action.method.nil?
36
- @page_title = lang(
37
- "custom_field_types.titles.#{action.method}"
38
- ) rescue nil
39
- end
81
+ csrf_protection :save, :delete
40
82
 
83
+ # Blck that's executed before CustomFieldTypes#edit() and
84
+ # CustomFieldTypes#new().
85
+ before(:index, :edit, :new) do
41
86
  @boolean_hash = {
42
87
  true => lang('zen_general.special.boolean_hash.true'),
43
88
  false => lang('zen_general.special.boolean_hash.false')
@@ -49,86 +94,86 @@ module CustomFields
49
94
  # user to create new ones, edit existing ones or delete a group of field
50
95
  # types.
51
96
  #
52
- # This method requires read permissions for a user to be able to view all
53
- # the field types.
54
- #
55
- # @author Yorick Peterse
56
- # @since 0.2.8
97
+ # @since 0.2.8
98
+ # @permission show_custom_field_type
57
99
  #
58
100
  def index
59
- require_permissions(:read)
101
+ authorize_user!(:show_custom_field_type)
60
102
 
61
103
  set_breadcrumbs(lang('custom_field_types.titles.index'))
62
104
 
63
- @field_types = paginate(CustomFieldType.eager(:custom_field_method))
105
+ @field_types = search do |query|
106
+ ::CustomFields::Model::CustomFieldType.search(query).order(:id.asc)
107
+ end
108
+
109
+ @field_types ||= ::CustomFields::Model::CustomFieldType \
110
+ .eager(:custom_field_method) \
111
+ .order(:id.asc)
112
+
113
+ @field_types = paginate(@field_types)
64
114
  end
65
115
 
66
116
  ##
67
117
  # Allows a user to edit an existing custom field type.
68
118
  #
69
- # This method requires the following permissions:
70
- #
71
- # * read
72
- # * update
73
- #
74
- # @author Yorick Peterse
75
- # @since 0.2.8
76
- # @param [Fixnum] custom_field_type_id The ID of the custom field type to
77
- # edit.
119
+ # @since 0.2.8
120
+ # @param [Fixnum] id The ID of the custom field type to edit.
121
+ # @permission edit_custom_field_type
78
122
  #
79
- def edit(custom_field_type_id)
80
- require_permissions(:read, :update)
123
+ def edit(id)
124
+ authorize_user!(:edit_custom_field_type)
81
125
 
82
126
  set_breadcrumbs(
83
127
  CustomFieldTypes.a(lang('custom_field_types.titles.index'), :index),
84
128
  lang('custom_field_types.titles.edit')
85
129
  )
86
130
 
87
- if flash[:form_data]
88
- @custom_field_type = flash[:form_data]
89
- else
90
- @custom_field_type = validate_custom_field_type(custom_field_type_id)
91
- end
92
-
93
- @custom_field_methods = CustomFieldMethod.pk_hash(:name)
131
+ @custom_field_type = flash[:form_data] || validate_custom_field_type(id)
132
+ @custom_field_methods = ::CustomFields::Model::CustomFieldMethod \
133
+ .pk_hash(:name)
94
134
 
95
- render_view :form
135
+ render_view(:form)
96
136
  end
97
137
 
98
138
  ##
99
139
  # Allows a user to add a new custom field type.
100
140
  #
101
- # This method requires the following permissions:
102
- #
103
- # * read
104
- # * create
105
- #
106
- # @author Yorick Peterse
107
- # @since 0.2.8
141
+ # @since 0.2.8
142
+ # @permission new_custom_field_type
108
143
  #
109
144
  def new
110
- require_permissions(:read, :create)
145
+ authorize_user!(:new_custom_field_type)
111
146
 
112
147
  set_breadcrumbs(
113
148
  CustomFieldTypes.a(lang('custom_field_types.titles.index'), :index),
114
149
  lang('custom_field_types.titles.new')
115
150
  )
116
151
 
117
- @custom_field_methods = CustomFieldMethod.pk_hash(:name)
118
- @custom_field_type = CustomFieldType.new
152
+ @custom_field_methods = ::CustomFields::Model::CustomFieldMethod \
153
+ .pk_hash(:name)
154
+
155
+ if flash[:form_data]
156
+ @custom_field_type = flash[:form_data]
157
+ else
158
+ @custom_field_type = ::CustomFields::Model::CustomFieldType.new
159
+ end
119
160
 
120
- render_view :form
161
+ render_view(:form)
121
162
  end
122
163
 
123
164
  ##
124
- # Saves the data submitted by CustomFieldTypes#edit() and
125
- # CustomFieldTypes#add().
165
+ # Creates a new custom field type or edits an existing one.
126
166
  #
127
167
  # This method requires either create or update permissions based on the
128
168
  # supplied data.
129
169
  #
130
- # @author Yorick Peterse
131
- # @since 0.2.8
170
+ # @since 0.2.8
171
+ # @event before_edit_custom_field_type
172
+ # @event after_edit_custom_field_type
173
+ # @event before_new_custom_field_type
174
+ # @event after_new_custom_field_type
175
+ # @permission edit_custom_field_type (when editing a field type)
176
+ # @permission new_custom_field_type (when creating a field type)
132
177
  #
133
178
  def save
134
179
  post = request.subset(
@@ -142,15 +187,19 @@ module CustomFields
142
187
  )
143
188
 
144
189
  if post['id'] and !post['id'].empty?
145
- require_permissions(:update)
190
+ authorize_user!(:edit_custom_field_type)
146
191
 
147
- field_type = validate_custom_field_type(post['id'])
148
- save_action = :save
192
+ field_type = validate_custom_field_type(post['id'])
193
+ save_action = :save
194
+ before_event = :before_edit_custom_field_type
195
+ after_event = :after_edit_custom_field_type
149
196
  else
150
- require_permissions(:create)
197
+ authorize_user!(:new_custom_field_type)
151
198
 
152
- field_type = CustomFieldType.new
153
- save_action = :new
199
+ field_type = ::CustomFields::Model::CustomFieldType.new
200
+ save_action = :new
201
+ before_event = :before_new_custom_field_type
202
+ after_event = :after_new_custom_field_type
154
203
  end
155
204
 
156
205
  post.delete('id')
@@ -159,8 +208,10 @@ module CustomFields
159
208
  error = lang("custom_field_types.errors.#{save_action}")
160
209
 
161
210
  begin
162
- field_type.update(post)
163
- message(:success, success)
211
+ post.each { |k, v| field_type.send("#{k}=", v) }
212
+ Zen::Event.call(before_event, field_type)
213
+
214
+ field_type.save
164
215
  rescue => e
165
216
  Ramaze::Log.error(e.inspect)
166
217
  message(:error, error)
@@ -171,24 +222,23 @@ module CustomFields
171
222
  redirect_referrer
172
223
  end
173
224
 
174
- if field_type.id
175
- redirect(CustomFieldTypes.r(:edit, field_type.id))
176
- else
177
- redirect_referrer
178
- end
225
+ Zen::Event.call(after_event, field_type)
226
+
227
+ message(:success, success)
228
+ redirect(CustomFieldTypes.r(:edit, field_type.id))
179
229
  end
180
230
 
181
231
  ##
182
- # Deletes a number of custom field types.
183
- #
184
- # This method requires delete permissions for a user to be able to remove
185
- # a number of database records.
232
+ # Deletes a number of custom field types. These types should be specified
233
+ # in the POST array "custom_field_type_ids".
186
234
  #
187
- # @author Yorick Peterse
188
- # @since 0.2.8
235
+ # @since 0.2.8
236
+ # @event before_delete_custom_field_type
237
+ # @event after_delete_custom_field_type
238
+ # @permission delete_custom_field_type
189
239
  #
190
240
  def delete
191
- require_permissions(:delete)
241
+ authorize_user!(:delete_custom_field_type)
192
242
 
193
243
  if !request.params['custom_field_type_ids'] \
194
244
  or request.params['custom_field_type_ids'].empty?
@@ -197,14 +247,21 @@ module CustomFields
197
247
  end
198
248
 
199
249
  request.params['custom_field_type_ids'].each do |id|
250
+ type = ::CustomFields::Model::CustomFieldType[id]
251
+
252
+ next if type.nil?
253
+ Zen::Event.call(:before_delete_custom_field_type, type)
254
+
200
255
  begin
201
- CustomFieldType[id].destroy
256
+ type.destroy
202
257
  rescue => e
203
258
  Ramaze::Log.error(e.inspect)
204
259
  message(:error, lang('custom_field_types.errors.delete') % id)
205
260
 
206
261
  redirect_referrer
207
262
  end
263
+
264
+ Zen::Event.call(:after_delete_custom_field_type, type)
208
265
  end
209
266
 
210
267
  message(:success, lang('custom_field_types.success.delete'))
@@ -1,67 +1,91 @@
1
- #:nodoc:
2
1
  module CustomFields
3
2
  #:nodoc:
4
3
  module Controller
5
4
  ##
6
- # Controller for managing custom fields. Custom fields are one of
7
- # the most important elements in Zen. Custom fields can be used to
8
- # create radio buttons, textareas, the whole shebang. Before
9
- # being able to use a custom field you'll need to add it to a group
10
- # and bind that group to a section.
5
+ # Custom fields allow you to create fields for your entries in their own
6
+ # format and with their own types. This means you're not restricted to the
7
+ # typical "Title" and "Body" fields you'd get when using other systems.
8
+ #
9
+ # Custom fields can be managed to by going to a custom field group and
10
+ # clicking the link "Manage custom fields" (see
11
+ # {CustomFields::Controller::CustomFieldGroups} for more information). Once
12
+ # you've reached this page you'll see an overview of all your custom fields
13
+ # or a message saying no fields were found (if this is the case).
14
+ #
15
+ # ![Custom Fields](../../_static/custom_fields/custom_fields.png)
16
+ #
17
+ # Editing a custom field can be done by clicking on the name of the field,
18
+ # creating a new one can be done by clicking on the button "Add custom
19
+ # field". In both cases you'll be shown a form that looks like the one in
20
+ # the image below.
21
+ #
22
+ # ![General](../../_static/custom_fields/edit_custom_field_general.png)
23
+ # ![Settings](../../_static/custom_fields/edit_custom_field_settings.png)
24
+ #
25
+ # In this form you can specify the following fields:
26
+ #
27
+ # * **Name** (required): the name of the custom field, can be anything you
28
+ # like. Examples are "Body" and "Date picker".
29
+ # * **Slug**: a URL friendly version of the name. If none is specified one
30
+ # will be generated automatically.
31
+ # * **Field type** (required): the type of custom field.
32
+ # * **Format** (required): the markup engine to use for the custom field. If
33
+ # a custom field type doesn't allow the use of markup this setting will
34
+ # be ignored.
35
+ # * **Description**: a description of the custom field.
36
+ # * **Possible values**: in case a custom field type allows you to specify
37
+ # multiple values (such as a checkbox) you can specify a value on each
38
+ # line. These values can be specified as following:
39
+ #
40
+ # key|value
41
+ #
42
+ # Example:
43
+ #
44
+ # Yes!|yes
45
+ #
46
+ # * **Requires a value**: whether or not this field requires a value.
47
+ # * **Enable a text editor**: when set to "Yes" the user can use the markup
48
+ # editor when adding/editing a value of a field.
49
+ # * **Textarea rows**: the amount of rows when the field type is a textarea.
50
+ # * **Character limit**: the maximum amount of characters a user can enter
51
+ # in the field.
52
+ # * **Sort order**: a number that indicates the sort order of the field.
53
+ #
54
+ # ## Used Permissions
55
+ #
56
+ # * show_custom_field
57
+ # * new_custom_field
58
+ # * edit_custom_field
59
+ # * delete_custom_field
60
+ #
61
+ # ## Events
62
+ #
63
+ # All events in this controller receive an instance of
64
+ # {CustomFields::Model::CustomField}. Just like other packages the event
65
+ # ``after_delete_custom_field`` receives an instance that has already been
66
+ # destroyed, thus you won't be able to make any changes to the object and
67
+ # save them in the database.
11
68
  #
12
- # @author Yorick Peterse
13
69
  # @since 0.1
70
+ # @map /admin/custom-fields
71
+ # @event before_new_custom_field
72
+ # @event after_new_custom_field
73
+ # @event before_edit_custom_field
74
+ # @event after_edit_custom_field
75
+ # @event before_delete_custom_field
76
+ # @event after_delete_custom_field
14
77
  #
15
78
  class CustomFields < Zen::Controller::AdminController
16
- include ::CustomFields::Model
17
-
18
79
  helper :custom_field
19
80
  map '/admin/custom-fields'
81
+ title 'custom_fields.titles.%s'
20
82
 
21
- # Load all required Javascript files
22
- javascript ['zen/lib/tabs']
23
-
24
- before_all do
25
- csrf_protection(:save, :delete) do
26
- respond(lang('zen_general.errors.csrf'), 403)
27
- end
28
- end
83
+ csrf_protection :save; :delete
84
+ load_asset_group :tabs, [:edit, :new]
29
85
 
30
- ##
31
- # Hook that is executed before the index(), edit() and new() methods.
32
- #
33
- # @author Yorick Peterse
34
- # @since 0.2.8
35
- #
36
86
  before(:index, :edit, :new) do
37
- @custom_field_types = CustomFieldType.type_hash
38
- end
39
-
40
- ##
41
- # Constructor method, called upon initialization. It's used to set the
42
- # URL to which forms send their data and load the language pack.
43
- #
44
- # This method loads the following language files:
45
- #
46
- # * custom_fields
47
- # * custom_field_groups
48
- #
49
- # @author Yorick Peterse
50
- # @since 0.1
51
- #
52
- def initialize
53
- super
54
-
55
- Zen::Language.load('custom_fields')
56
- Zen::Language.load('custom_field_groups')
57
-
58
- # Set the page title
59
- if !action.method.nil?
60
- method = action.method.to_sym
61
- @page_title = lang("custom_fields.titles.#{method}") rescue nil
62
- end
63
-
64
- @boolean_hash = {
87
+ @custom_field_types = ::CustomFields::Model::CustomFieldType.type_hash
88
+ @boolean_hash = {
65
89
  true => lang('zen_general.special.boolean_hash.true'),
66
90
  false => lang('zen_general.special.boolean_hash.false')
67
91
  }
@@ -71,29 +95,31 @@ module CustomFields
71
95
  # Show an overview of all existing custom fields. Using this overview a
72
96
  # user can manage an existing field, delete it or create a new one.
73
97
  #
74
- # This method requires the following permissions:
75
- #
76
- # * read
77
- #
78
- # @author Yorick Peterse
79
98
  # @param [Fixnum] custom_field_group_id The ID of the custom field group
80
- # to which all fields belong.
81
- # @since 0.1
99
+ # to which all fields belong.
100
+ # @since 0.1
101
+ # @permission show_custom_field
82
102
  #
83
103
  def index(custom_field_group_id)
84
- require_permissions(:read)
85
-
86
- field_group = validate_custom_field_group(custom_field_group_id)
104
+ authorize_user!(:show_custom_field)
87
105
 
88
106
  set_breadcrumbs(
89
107
  CustomFieldGroups.a(lang('custom_field_groups.titles.index'), :index),
90
108
  lang('custom_fields.titles.index')
91
109
  )
92
110
 
111
+ field_group = validate_custom_field_group(custom_field_group_id)
93
112
  @custom_field_group_id = custom_field_group_id
94
- @custom_fields = CustomField.filter(
95
- :custom_field_group_id => custom_field_group_id
96
- )
113
+ @custom_fields = search do |query|
114
+ ::CustomFields::Model::CustomField \
115
+ .search(query) \
116
+ .filter(:custom_field_group_id => custom_field_group_id) \
117
+ .order(:id.asc)
118
+ end
119
+
120
+ @custom_fields ||= ::CustomFields::Model::CustomField \
121
+ .filter(:custom_field_group_id => custom_field_group_id) \
122
+ .order(:id.asc)
97
123
 
98
124
  @custom_fields = paginate(@custom_fields)
99
125
  end
@@ -101,29 +127,27 @@ module CustomFields
101
127
  ##
102
128
  # Show a form that lets the user edit an existing custom field group.
103
129
  #
104
- # This method requires the following permissions:
105
- #
106
- # * read
107
- # * update
108
- #
109
- # @author Yorick Peterse
110
- # @param [Fixnum] custom_field_group_id The ID of the custom field
111
- # group to which all fields belong.
130
+ # @param [Fixnum] id The ID of the custom field
131
+ # group to which all fields belong.
112
132
  # @param [Fixnum] id The ID of the custom field to retrieve so that we
113
- # can edit it.
114
- # @since 0.1
133
+ # can edit it.
134
+ # @since 0.1
135
+ # @permission edit_custom_field
115
136
  #
116
137
  def edit(custom_field_group_id, id)
117
- require_permissions(:read, :update)
138
+ authorize_user!(:edit_custom_field)
118
139
 
119
140
  validate_custom_field_group(custom_field_group_id)
120
141
 
121
142
  set_breadcrumbs(
122
143
  CustomFieldGroups.a(
123
- lang('custom_field_groups.titles.index'), :index
144
+ lang('custom_field_groups.titles.index'),
145
+ :index
124
146
  ),
125
147
  CustomFields.a(
126
- lang('custom_fields.titles.index'), :index, custom_field_group_id
148
+ lang('custom_fields.titles.index'),
149
+ :index,
150
+ custom_field_group_id
127
151
  ),
128
152
  lang('custom_fields.titles.edit')
129
153
  )
@@ -142,50 +166,50 @@ module CustomFields
142
166
  ##
143
167
  # Show a form that lets the user create a new custom field group.
144
168
  #
145
- # This method requires the following permissions:
146
- #
147
- # * create
148
- # * read
149
- #
150
- # @author Yorick Peterse
151
169
  # @param [Fixnum] custom_field_group_id The ID of the custom field group
152
- # to which all fields belong.
153
- # @since 0.1
170
+ # to which all fields belong.
171
+ # @since 0.1
172
+ # @permission new_custom_field
154
173
  #
155
174
  def new(custom_field_group_id)
156
- require_permissions(:read, :create)
175
+ authorize_user!(:new_custom_field)
157
176
 
158
177
  validate_custom_field_group(custom_field_group_id)
159
178
 
160
179
  set_breadcrumbs(
161
180
  CustomFieldGroups.a(
162
- lang('custom_field_groups.titles.index'), :index
181
+ lang('custom_field_groups.titles.index'),
182
+ :index
163
183
  ),
164
184
  CustomFields.a(
165
- lang('custom_fields.titles.index'), :index, custom_field_group_id
185
+ lang('custom_fields.titles.index'),
186
+ :index,
187
+ custom_field_group_id
166
188
  ),
167
189
  lang('custom_fields.titles.new')
168
190
  )
169
191
 
170
192
  @custom_field_group_id = custom_field_group_id
171
- @custom_field = CustomField.new
193
+
194
+ if flash[:form_data]
195
+ @custom_field = flash[:form_data]
196
+ else
197
+ @custom_field = ::CustomFields::Model::CustomField.new
198
+ end
172
199
 
173
200
  render_view(:form)
174
201
  end
175
202
 
176
203
  ##
177
- # Method used for processing the form data and redirecting the user back
178
- # to the proper URL. Based on the value of a hidden field named 'id' we'll
179
- # determine if the data will be used to create a new custom field or to
180
- # update an existing one.
181
- #
182
- # This method requires the following permissions:
204
+ # Saves the changes made by {#edit} and {#new}.
183
205
  #
184
- # * create
185
- # * update
186
- #
187
- # @author Yorick Peterse
188
- # @since 0.1
206
+ # @since 0.1
207
+ # @event before_new_custom_field
208
+ # @event after_new_custom_field
209
+ # @event before_edit_custom_field
210
+ # @event after_edit_custom_field
211
+ # @permission edit_custom_field (when editing a field)
212
+ # @permission new_custom_field (when creating a new field)
189
213
  #
190
214
  def save
191
215
  post = request.subset(
@@ -209,32 +233,37 @@ module CustomFields
209
233
  # Get or create a custom field group based on the ID from the hidden
210
234
  # field.
211
235
  if post['id'] and !post['id'].empty?
212
- require_permissions(:update)
236
+ authorize_user!(:edit_custom_field)
213
237
 
214
238
  custom_field = validate_custom_field(
215
239
  post['id'], post['custom_field_group_id']
216
240
  )
217
241
 
218
242
  save_action = :save
243
+ before_event = :before_edit_custom_field
244
+ after_event = :after_edit_custom_field
219
245
  else
220
- require_permissions(:create)
246
+ authorize_user!(:new_custom_field)
221
247
 
222
- custom_field = CustomField.new
248
+ custom_field = ::CustomFields::Model::CustomField.new
223
249
  save_action = :new
250
+ before_event = :before_new_custom_field
251
+ after_event = :after_new_custom_field
224
252
  end
225
253
 
226
- post.delete('slug') if post['slug'].empty?
227
254
  post.delete('id')
228
255
 
229
- flash_success = lang("custom_fields.success.#{save_action}")
230
- flash_error = lang("custom_fields.errors.#{save_action}")
256
+ success = lang("custom_fields.success.#{save_action}")
257
+ error = lang("custom_fields.errors.#{save_action}")
231
258
 
232
259
  begin
233
- custom_field.update(post)
234
- message(:success, flash_success)
260
+ post.each { |k, v| custom_field.send("#{k}=", v) }
261
+ Zen::Event.call(before_event, custom_field)
262
+
263
+ custom_field.save
235
264
  rescue => e
236
265
  Ramaze::Log.error(e.inspect)
237
- message(:error, flash_error)
266
+ message(:error, error)
238
267
 
239
268
  flash[:form_data] = custom_field
240
269
  flash[:form_errors] = custom_field.errors
@@ -242,15 +271,12 @@ module CustomFields
242
271
  redirect_referrer
243
272
  end
244
273
 
245
- if custom_field.id
246
- redirect(
247
- CustomFields.r(
248
- :edit, post['custom_field_group_id'], custom_field.id
249
- )
250
- )
251
- else
252
- redirect_referrer
253
- end
274
+ Zen::Event.call(after_event, custom_field)
275
+
276
+ message(:success, success)
277
+ redirect(
278
+ CustomFields.r(:edit, post['custom_field_group_id'], custom_field.id)
279
+ )
254
280
  end
255
281
 
256
282
  ##
@@ -260,36 +286,40 @@ module CustomFields
260
286
  # request that contains a field named 'custom_field_ids[]'. This field
261
287
  # should contain the primary values of each field that has to be deleted.
262
288
  #
263
- # This method requires the following permissions:
264
- #
265
- # * delete
266
- #
267
- # @author Yorick Peterse
268
- # @since 0.1
289
+ # @since 0.1
290
+ # @event before_delete_custom_field
291
+ # @event after_delete_custom_field
292
+ # @permission delete_custom_field
269
293
  #
270
294
  def delete
271
- require_permissions(:delete)
295
+ authorize_user!(:delete_custom_field)
272
296
 
273
- post = request.subset(:custom_field_ids, :custom_field_group_id)
297
+ post = request.subset(:custom_field_ids)
274
298
 
275
- if !request.params['custom_field_ids'] \
276
- or request.params['custom_field_ids'].empty?
299
+ if post['custom_field_ids'].nil? or post['custom_field_ids'].empty?
277
300
  message(:error, lang('custom_fields.errors.no_delete'))
278
- redirect(CustomFields.r(:index, post['custom_field_group_id']))
301
+ redirect_referrer
279
302
  end
280
303
 
281
304
  request.params['custom_field_ids'].each do |id|
305
+ custom_field = ::CustomFields::Model::CustomField[id]
306
+
307
+ next if custom_field.nil?
308
+ Zen::Event.call(:before_delete_custom_field, custom_field)
309
+
282
310
  begin
283
- CustomField[id].destroy
284
- message(:success, lang('custom_fields.success.delete'))
311
+ custom_field.destroy
285
312
  rescue => e
286
313
  Ramaze::Log.error(e.inspect)
287
314
  message(:error, lang('custom_fields.errors.delete') % id)
288
315
 
289
316
  redirect_referrer
290
317
  end
318
+
319
+ Zen::Event.call(:after_delete_custom_field, custom_field)
291
320
  end
292
321
 
322
+ message(:success, lang('custom_fields.success.delete'))
293
323
  redirect_referrer
294
324
  end
295
325
  end # CustomFields