yousty-activeadmin 1.0.0.pre

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 (490) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +43 -0
  3. data/.travis.yml +8 -0
  4. data/.yardopts +9 -0
  5. data/CHANGELOG.md +1056 -0
  6. data/CONTRIBUTING.md +110 -0
  7. data/Gemfile +41 -0
  8. data/Guardfile +7 -0
  9. data/LICENSE +25 -0
  10. data/README.md +67 -0
  11. data/Rakefile +25 -0
  12. data/activeadmin.gemspec +33 -0
  13. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  14. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  16. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  17. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  18. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  19. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +10 -0
  20. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +4 -0
  21. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +13 -0
  22. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +3 -0
  23. data/app/assets/images/active_admin/loading.gif +0 -0
  24. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  25. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  26. data/app/assets/images/active_admin/orderable.png +0 -0
  27. data/app/assets/javascripts/active_admin/application.js.coffee +6 -0
  28. data/app/assets/javascripts/active_admin/base.js.coffee +5 -0
  29. data/app/assets/javascripts/active_admin/components/application.js.coffee +23 -0
  30. data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +26 -0
  31. data/app/assets/javascripts/active_admin/components/has_many.js.coffee +41 -0
  32. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +37 -0
  33. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +105 -0
  34. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +97 -0
  35. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +25 -0
  36. data/app/assets/stylesheets/active_admin/_base.css.scss +41 -0
  37. data/app/assets/stylesheets/active_admin/_forms.css.scss +293 -0
  38. data/app/assets/stylesheets/active_admin/_header.css.scss +152 -0
  39. data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
  40. data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
  41. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
  42. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
  43. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  44. data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
  45. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  46. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
  47. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +123 -0
  48. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
  49. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
  50. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  51. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  52. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  53. data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
  54. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  55. data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
  56. data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
  57. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +12 -0
  58. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +95 -0
  59. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +110 -0
  60. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
  61. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
  62. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +21 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +36 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +32 -0
  71. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  72. data/app/assets/stylesheets/active_admin/print.css.scss +284 -0
  73. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  74. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  75. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +43 -0
  76. data/app/views/active_admin/dashboard/index.html.arb +1 -0
  77. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  78. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  79. data/app/views/active_admin/devise/passwords/edit.html.erb +19 -0
  80. data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
  81. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  82. data/app/views/active_admin/devise/shared/_links.erb +27 -0
  83. data/app/views/active_admin/devise/unlocks/new.html.erb +14 -0
  84. data/app/views/active_admin/page/index.html.arb +1 -0
  85. data/app/views/active_admin/resource/edit.html.arb +1 -0
  86. data/app/views/active_admin/resource/index.csv.erb +17 -0
  87. data/app/views/active_admin/resource/index.html.arb +1 -0
  88. data/app/views/active_admin/resource/new.html.arb +1 -0
  89. data/app/views/active_admin/resource/show.html.arb +1 -0
  90. data/app/views/layouts/active_admin.html.arb +1 -0
  91. data/app/views/layouts/active_admin_logged_out.html.erb +37 -0
  92. data/config/locales/bg.yml +101 -0
  93. data/config/locales/ca.yml +98 -0
  94. data/config/locales/cs.yml +105 -0
  95. data/config/locales/da.yml +102 -0
  96. data/config/locales/de-CH.yml +117 -0
  97. data/config/locales/de.yml +119 -0
  98. data/config/locales/en-GB.yml +91 -0
  99. data/config/locales/en.yml +110 -0
  100. data/config/locales/es.yml +106 -0
  101. data/config/locales/es_MX.yml +104 -0
  102. data/config/locales/fi.yml +109 -0
  103. data/config/locales/fr.yml +97 -0
  104. data/config/locales/he.yml +91 -0
  105. data/config/locales/hr.yml +93 -0
  106. data/config/locales/hu.yml +92 -0
  107. data/config/locales/it.yml +89 -0
  108. data/config/locales/ja.yml +104 -0
  109. data/config/locales/ko.yml +84 -0
  110. data/config/locales/lt.yml +90 -0
  111. data/config/locales/lv.yml +89 -0
  112. data/config/locales/nl.yml +90 -0
  113. data/config/locales/no-NB.yml +85 -0
  114. data/config/locales/pl.yml +93 -0
  115. data/config/locales/pt-BR.yml +90 -0
  116. data/config/locales/pt-PT.yml +89 -0
  117. data/config/locales/ro.yml +93 -0
  118. data/config/locales/ru.yml +103 -0
  119. data/config/locales/sv-SE.yml +89 -0
  120. data/config/locales/tr.yml +90 -0
  121. data/config/locales/uk.yml +100 -0
  122. data/config/locales/vi.yml +90 -0
  123. data/config/locales/zh-CN.yml +90 -0
  124. data/config/locales/zh-TW.yml +90 -0
  125. data/cucumber.yml +3 -0
  126. data/docs/0-installation.md +84 -0
  127. data/docs/1-general-configuration.md +137 -0
  128. data/docs/10-custom-pages.md +98 -0
  129. data/docs/11-decorators.md +66 -0
  130. data/docs/12-arbre-components.md +144 -0
  131. data/docs/13-authorization-adapter.md +227 -0
  132. data/docs/2-resource-customization.md +340 -0
  133. data/docs/3-index-pages/create-an-index.md +29 -0
  134. data/docs/3-index-pages/index-as-block.md +21 -0
  135. data/docs/3-index-pages/index-as-blog.md +71 -0
  136. data/docs/3-index-pages/index-as-grid.md +29 -0
  137. data/docs/3-index-pages/index-as-table.md +154 -0
  138. data/docs/3-index-pages.md +206 -0
  139. data/docs/4-csv-format.md +39 -0
  140. data/docs/5-forms.md +110 -0
  141. data/docs/6-show-pages.md +77 -0
  142. data/docs/7-sidebars.md +42 -0
  143. data/docs/8-custom-actions.md +139 -0
  144. data/docs/9-batch-actions.md +155 -0
  145. data/features/action_item.feature +73 -0
  146. data/features/authorization.feature +64 -0
  147. data/features/authorization_cancan.feature +52 -0
  148. data/features/belongs_to.feature +63 -0
  149. data/features/breadcrumb.feature +27 -0
  150. data/features/comments/commenting.feature +140 -0
  151. data/features/comments/viewing_index.feature +19 -0
  152. data/features/dashboard.feature +16 -0
  153. data/features/decorators.feature +41 -0
  154. data/features/development_reloading.feature +31 -0
  155. data/features/edit_page.feature +127 -0
  156. data/features/favicon.feature +20 -0
  157. data/features/first_boot.feature +16 -0
  158. data/features/global_navigation.feature +29 -0
  159. data/features/i18n.feature +38 -0
  160. data/features/index/batch_actions.feature +123 -0
  161. data/features/index/filters.feature +138 -0
  162. data/features/index/format_as_csv.feature +117 -0
  163. data/features/index/formats.feature +66 -0
  164. data/features/index/index_as_block.feature +15 -0
  165. data/features/index/index_as_blog.feature +69 -0
  166. data/features/index/index_as_grid.feature +45 -0
  167. data/features/index/index_as_table.feature +195 -0
  168. data/features/index/index_blank_slate.feature +61 -0
  169. data/features/index/index_parameters.feature +75 -0
  170. data/features/index/index_scope_to.feature +56 -0
  171. data/features/index/index_scopes.feature +251 -0
  172. data/features/index/page_title.feature +30 -0
  173. data/features/index/pagination.feature +59 -0
  174. data/features/index/switch_index_view.feature +73 -0
  175. data/features/menu.feature +53 -0
  176. data/features/new_page.feature +119 -0
  177. data/features/registering_assets.feature +35 -0
  178. data/features/registering_pages.feature +148 -0
  179. data/features/registering_resources.feature +33 -0
  180. data/features/root_to.feature +17 -0
  181. data/features/show/default_content.feature +43 -0
  182. data/features/show/page_title.feature +47 -0
  183. data/features/sidebar_sections.feature +198 -0
  184. data/features/site_title.feature +47 -0
  185. data/features/specifying_actions.feature +93 -0
  186. data/features/step_definitions/action_item_steps.rb +7 -0
  187. data/features/step_definitions/action_link_steps.rb +7 -0
  188. data/features/step_definitions/additional_web_steps.rb +82 -0
  189. data/features/step_definitions/asset_steps.rb +15 -0
  190. data/features/step_definitions/attribute_steps.rb +13 -0
  191. data/features/step_definitions/batch_action_steps.rb +55 -0
  192. data/features/step_definitions/breadcrumb_steps.rb +3 -0
  193. data/features/step_definitions/comment_steps.rb +12 -0
  194. data/features/step_definitions/configuration_steps.rb +100 -0
  195. data/features/step_definitions/dashboard_steps.rb +15 -0
  196. data/features/step_definitions/factory_steps.rb +34 -0
  197. data/features/step_definitions/filter_steps.rb +17 -0
  198. data/features/step_definitions/flash_steps.rb +11 -0
  199. data/features/step_definitions/format_steps.rb +45 -0
  200. data/features/step_definitions/i18n_steps.rb +3 -0
  201. data/features/step_definitions/index_scope_steps.rb +21 -0
  202. data/features/step_definitions/index_views_steps.rb +3 -0
  203. data/features/step_definitions/layout_steps.rb +3 -0
  204. data/features/step_definitions/member_link_steps.rb +7 -0
  205. data/features/step_definitions/menu_steps.rb +11 -0
  206. data/features/step_definitions/pagination_steps.rb +8 -0
  207. data/features/step_definitions/sidebar_steps.rb +8 -0
  208. data/features/step_definitions/site_title_steps.rb +15 -0
  209. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  210. data/features/step_definitions/tab_steps.rb +3 -0
  211. data/features/step_definitions/table_steps.rb +119 -0
  212. data/features/step_definitions/user_steps.rb +39 -0
  213. data/features/step_definitions/web_steps.rb +86 -0
  214. data/features/sti_resource.feature +73 -0
  215. data/features/support/env.rb +112 -0
  216. data/features/support/paths.rb +71 -0
  217. data/features/support/selectors.rb +45 -0
  218. data/features/symbol_leak.feature +35 -0
  219. data/features/users/logging_in.feature +34 -0
  220. data/features/users/logging_out.feature +13 -0
  221. data/features/users/resetting_password.feature +34 -0
  222. data/lib/active_admin/abstract_view_factory.rb +95 -0
  223. data/lib/active_admin/application.rb +242 -0
  224. data/lib/active_admin/asset_registration.rb +29 -0
  225. data/lib/active_admin/authorization_adapter.rb +132 -0
  226. data/lib/active_admin/base_controller/authorization.rb +151 -0
  227. data/lib/active_admin/base_controller/menu.rb +34 -0
  228. data/lib/active_admin/base_controller.rb +78 -0
  229. data/lib/active_admin/batch_actions/controller.rb +24 -0
  230. data/lib/active_admin/batch_actions/resource_extension.rb +127 -0
  231. data/lib/active_admin/batch_actions/views/batch_action_form.rb +35 -0
  232. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
  233. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +66 -0
  234. data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
  235. data/lib/active_admin/batch_actions.rb +17 -0
  236. data/lib/active_admin/callbacks.rb +87 -0
  237. data/lib/active_admin/cancan_adapter.rb +40 -0
  238. data/lib/active_admin/component.rb +5 -0
  239. data/lib/active_admin/controller_action.rb +12 -0
  240. data/lib/active_admin/csv_builder.rb +49 -0
  241. data/lib/active_admin/deprecation.rb +36 -0
  242. data/lib/active_admin/devise.rb +70 -0
  243. data/lib/active_admin/dsl.rb +166 -0
  244. data/lib/active_admin/engine.rb +7 -0
  245. data/lib/active_admin/event.rb +33 -0
  246. data/lib/active_admin/filters/dsl.rb +21 -0
  247. data/lib/active_admin/filters/forms.rb +89 -0
  248. data/lib/active_admin/filters/formtastic_addons.rb +70 -0
  249. data/lib/active_admin/filters/resource_extension.rb +136 -0
  250. data/lib/active_admin/filters.rb +9 -0
  251. data/lib/active_admin/form_builder.rb +152 -0
  252. data/lib/active_admin/helpers/collection.rb +23 -0
  253. data/lib/active_admin/helpers/optional_display.rb +38 -0
  254. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  255. data/lib/active_admin/helpers/settings.rb +108 -0
  256. data/lib/active_admin/iconic/icons.rb +142 -0
  257. data/lib/active_admin/iconic.rb +51 -0
  258. data/lib/active_admin/inputs/datepicker_input.rb +20 -0
  259. data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
  260. data/lib/active_admin/inputs/filter_base.rb +33 -0
  261. data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
  262. data/lib/active_admin/inputs/filter_check_boxes_input.rb +51 -0
  263. data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
  264. data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
  265. data/lib/active_admin/inputs/filter_select_input.rb +61 -0
  266. data/lib/active_admin/inputs/filter_string_input.rb +24 -0
  267. data/lib/active_admin/inputs.rb +15 -0
  268. data/lib/active_admin/menu.rb +107 -0
  269. data/lib/active_admin/menu_collection.rb +96 -0
  270. data/lib/active_admin/menu_item.rb +97 -0
  271. data/lib/active_admin/namespace.rb +224 -0
  272. data/lib/active_admin/orm/active_record/comments/comment.rb +39 -0
  273. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  274. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  275. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  276. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +75 -0
  277. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  278. data/lib/active_admin/orm/active_record/comments.rb +84 -0
  279. data/lib/active_admin/orm/active_record.rb +3 -0
  280. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  281. data/lib/active_admin/orm/mongoid.rb +1 -0
  282. data/lib/active_admin/page.rb +88 -0
  283. data/lib/active_admin/page_controller.rb +29 -0
  284. data/lib/active_admin/page_dsl.rb +28 -0
  285. data/lib/active_admin/page_presenter.rb +32 -0
  286. data/lib/active_admin/resource/action_items.rb +91 -0
  287. data/lib/active_admin/resource/belongs_to.rb +36 -0
  288. data/lib/active_admin/resource/controllers.rb +18 -0
  289. data/lib/active_admin/resource/menu.rb +64 -0
  290. data/lib/active_admin/resource/naming.rb +84 -0
  291. data/lib/active_admin/resource/page_presenters.rb +82 -0
  292. data/lib/active_admin/resource/pagination.rb +19 -0
  293. data/lib/active_admin/resource/routes.rb +99 -0
  294. data/lib/active_admin/resource/scope_to.rb +74 -0
  295. data/lib/active_admin/resource/scopes.rb +50 -0
  296. data/lib/active_admin/resource/sidebars.rb +27 -0
  297. data/lib/active_admin/resource.rb +153 -0
  298. data/lib/active_admin/resource_collection.rb +42 -0
  299. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  300. data/lib/active_admin/resource_controller/data_access.rb +298 -0
  301. data/lib/active_admin/resource_controller/decorators.rb +20 -0
  302. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  303. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  304. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  305. data/lib/active_admin/resource_controller.rb +50 -0
  306. data/lib/active_admin/resource_dsl.rb +134 -0
  307. data/lib/active_admin/router.rb +106 -0
  308. data/lib/active_admin/scope.rb +57 -0
  309. data/lib/active_admin/sidebar_section.rb +37 -0
  310. data/lib/active_admin/version.rb +3 -0
  311. data/lib/active_admin/view_factory.rb +27 -0
  312. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  313. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  314. data/lib/active_admin/view_helpers/auto_link_helper.rb +34 -0
  315. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +26 -0
  316. data/lib/active_admin/view_helpers/display_helper.rb +49 -0
  317. data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
  318. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  319. data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
  320. data/lib/active_admin/view_helpers/form_helper.rb +24 -0
  321. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  322. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -0
  323. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  324. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  325. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  326. data/lib/active_admin/view_helpers.rb +21 -0
  327. data/lib/active_admin/views/action_items.rb +17 -0
  328. data/lib/active_admin/views/components/action_list_popover.rb +29 -0
  329. data/lib/active_admin/views/components/attributes_table.rb +103 -0
  330. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  331. data/lib/active_admin/views/components/columns.rb +150 -0
  332. data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
  333. data/lib/active_admin/views/components/index_list.rb +68 -0
  334. data/lib/active_admin/views/components/paginated_collection.rb +125 -0
  335. data/lib/active_admin/views/components/panel.rb +34 -0
  336. data/lib/active_admin/views/components/popover.rb +27 -0
  337. data/lib/active_admin/views/components/scopes.rb +66 -0
  338. data/lib/active_admin/views/components/sidebar_section.rb +28 -0
  339. data/lib/active_admin/views/components/site_title.rb +55 -0
  340. data/lib/active_admin/views/components/status_tag.rb +56 -0
  341. data/lib/active_admin/views/components/table_for.rb +191 -0
  342. data/lib/active_admin/views/footer.rb +20 -0
  343. data/lib/active_admin/views/header.rb +32 -0
  344. data/lib/active_admin/views/index_as_block.rb +36 -0
  345. data/lib/active_admin/views/index_as_blog.rb +156 -0
  346. data/lib/active_admin/views/index_as_grid.rb +80 -0
  347. data/lib/active_admin/views/index_as_table.rb +264 -0
  348. data/lib/active_admin/views/pages/base.rb +139 -0
  349. data/lib/active_admin/views/pages/form.rb +51 -0
  350. data/lib/active_admin/views/pages/index.rb +147 -0
  351. data/lib/active_admin/views/pages/layout.rb +26 -0
  352. data/lib/active_admin/views/pages/page.rb +30 -0
  353. data/lib/active_admin/views/pages/show.rb +59 -0
  354. data/lib/active_admin/views/tabbed_navigation.rb +62 -0
  355. data/lib/active_admin/views/title_bar.rb +53 -0
  356. data/lib/active_admin/views.rb +8 -0
  357. data/lib/active_admin.rb +125 -0
  358. data/lib/activeadmin.rb +1 -0
  359. data/lib/generators/active_admin/assets/assets_generator.rb +16 -0
  360. data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
  361. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  362. data/lib/generators/active_admin/devise/devise_generator.rb +86 -0
  363. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  364. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +235 -0
  365. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +27 -0
  366. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  367. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
  368. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  369. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  370. data/lib/ransack_ext.rb +12 -0
  371. data/script/local +44 -0
  372. data/script/use_rails +53 -0
  373. data/spec/integration/default_namespace_spec.rb +61 -0
  374. data/spec/integration/javascript_spec.rb +20 -0
  375. data/spec/integration/memory_spec.rb +29 -0
  376. data/spec/integration/stylesheets_spec.rb +41 -0
  377. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  378. data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
  379. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  380. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
  381. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
  382. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
  383. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  384. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  385. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  386. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
  387. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
  388. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
  389. data/spec/javascripts/support/jasmine.yml +74 -0
  390. data/spec/javascripts/support/jasmine_config.rb +23 -0
  391. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  392. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
  393. data/spec/javascripts/support/jquery.min.js +4 -0
  394. data/spec/spec_helper.rb +175 -0
  395. data/spec/spec_helper_without_rails.rb +16 -0
  396. data/spec/support/deferred_garbage_collection.rb +19 -0
  397. data/spec/support/detect_rails_version.rb +42 -0
  398. data/spec/support/integration_example_group.rb +31 -0
  399. data/spec/support/jslint.yml +80 -0
  400. data/spec/support/rails_template.rb +111 -0
  401. data/spec/support/rails_template_with_data.rb +59 -0
  402. data/spec/support/templates/admin/stores.rb +11 -0
  403. data/spec/support/templates/cucumber.rb +24 -0
  404. data/spec/support/templates/cucumber_with_reloading.rb +5 -0
  405. data/spec/support/templates/en.yml +8 -0
  406. data/spec/support/templates/post_decorator.rb +53 -0
  407. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  408. data/spec/unit/action_builder_spec.rb +126 -0
  409. data/spec/unit/active_admin_spec.rb +11 -0
  410. data/spec/unit/application_spec.rb +141 -0
  411. data/spec/unit/asset_registration_spec.rb +52 -0
  412. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  413. data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
  414. data/spec/unit/auto_link_spec.rb +32 -0
  415. data/spec/unit/batch_actions/resource_spec.rb +91 -0
  416. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  417. data/spec/unit/belongs_to_spec.rb +42 -0
  418. data/spec/unit/cancan_adapter_spec.rb +43 -0
  419. data/spec/unit/comments_spec.rb +106 -0
  420. data/spec/unit/component_spec.rb +18 -0
  421. data/spec/unit/config_shared_examples.rb +59 -0
  422. data/spec/unit/controller_filters_spec.rb +32 -0
  423. data/spec/unit/csv_builder_spec.rb +103 -0
  424. data/spec/unit/devise_spec.rb +116 -0
  425. data/spec/unit/dsl_spec.rb +61 -0
  426. data/spec/unit/event_spec.rb +47 -0
  427. data/spec/unit/filters/filter_form_builder_spec.rb +423 -0
  428. data/spec/unit/filters/resource_spec.rb +119 -0
  429. data/spec/unit/form_builder_spec.rb +514 -0
  430. data/spec/unit/generators/install_spec.rb +23 -0
  431. data/spec/unit/helpers/collection_spec.rb +65 -0
  432. data/spec/unit/helpers/scope_chain_spec.rb +36 -0
  433. data/spec/unit/helpers/settings_spec.rb +30 -0
  434. data/spec/unit/menu_collection_spec.rb +62 -0
  435. data/spec/unit/menu_item_spec.rb +143 -0
  436. data/spec/unit/menu_spec.rb +71 -0
  437. data/spec/unit/namespace/authorization_spec.rb +27 -0
  438. data/spec/unit/namespace/register_page_spec.rb +74 -0
  439. data/spec/unit/namespace/register_resource_spec.rb +163 -0
  440. data/spec/unit/namespace_spec.rb +103 -0
  441. data/spec/unit/page_controller_spec.rb +5 -0
  442. data/spec/unit/page_spec.rb +72 -0
  443. data/spec/unit/pretty_format_spec.rb +35 -0
  444. data/spec/unit/resource/action_items_spec.rb +62 -0
  445. data/spec/unit/resource/menu_spec.rb +18 -0
  446. data/spec/unit/resource/naming_spec.rb +122 -0
  447. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  448. data/spec/unit/resource/pagination_spec.rb +38 -0
  449. data/spec/unit/resource/routes_spec.rb +73 -0
  450. data/spec/unit/resource/scopes_spec.rb +43 -0
  451. data/spec/unit/resource/sidebars_spec.rb +43 -0
  452. data/spec/unit/resource_collection_spec.rb +160 -0
  453. data/spec/unit/resource_controller/data_access_spec.rb +73 -0
  454. data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
  455. data/spec/unit/resource_controller_spec.rb +265 -0
  456. data/spec/unit/resource_registration_spec.rb +56 -0
  457. data/spec/unit/resource_spec.rb +243 -0
  458. data/spec/unit/routing_spec.rb +172 -0
  459. data/spec/unit/scope_spec.rb +108 -0
  460. data/spec/unit/settings_spec.rb +88 -0
  461. data/spec/unit/view_factory_spec.rb +21 -0
  462. data/spec/unit/view_helpers/breadcrumbs_spec.rb +149 -0
  463. data/spec/unit/view_helpers/display_name_spec.rb +41 -0
  464. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  465. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  466. data/spec/unit/view_helpers/form_helper_spec.rb +56 -0
  467. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +101 -0
  468. data/spec/unit/views/components/action_list_popover_spec.rb +30 -0
  469. data/spec/unit/views/components/attributes_table_spec.rb +230 -0
  470. data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
  471. data/spec/unit/views/components/blank_slate_spec.rb +17 -0
  472. data/spec/unit/views/components/columns_spec.rb +142 -0
  473. data/spec/unit/views/components/index_list_spec.rb +32 -0
  474. data/spec/unit/views/components/paginated_collection_spec.rb +227 -0
  475. data/spec/unit/views/components/panel_spec.rb +51 -0
  476. data/spec/unit/views/components/popover_spec.rb +33 -0
  477. data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
  478. data/spec/unit/views/components/site_title_spec.rb +78 -0
  479. data/spec/unit/views/components/status_tag_spec.rb +95 -0
  480. data/spec/unit/views/components/table_for_spec.rb +201 -0
  481. data/spec/unit/views/pages/form_spec.rb +35 -0
  482. data/spec/unit/views/pages/layout_spec.rb +63 -0
  483. data/spec/unit/views/pages/show_spec.rb +20 -0
  484. data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
  485. data/tasks/docs.rake +37 -0
  486. data/tasks/js.rake +32 -0
  487. data/tasks/parallel_tests.rake +60 -0
  488. data/tasks/test.rake +79 -0
  489. data/tasks/yard.rake +7 -0
  490. metadata +896 -0
@@ -0,0 +1,95 @@
1
+ module ActiveAdmin
2
+ class AbstractViewFactory
3
+ @@default_views = {}
4
+
5
+ def self.register(view_hash)
6
+ view_hash.each do |view_key, view_class|
7
+ @@default_views[view_key] = view_class
8
+ end
9
+ end
10
+
11
+ def initialize
12
+ @views = {}
13
+ end
14
+
15
+ # Register a new view key with the view factory
16
+ #
17
+ # eg:
18
+ #
19
+ # factory = AbstractViewFactory.new
20
+ # factory.register :my_view => SomeViewClass
21
+ #
22
+ # You can setup many at the same time:
23
+ #
24
+ # factory.register :my_view => SomeClass,
25
+ # :another_view => OtherViewClass
26
+ #
27
+ def register(view_hash)
28
+ view_hash.each do |view_key, view_class|
29
+ @views[view_key] = view_class
30
+ end
31
+ end
32
+
33
+ def default_for(key)
34
+ @@default_views[key.to_sym]
35
+ end
36
+
37
+ def has_key?(key)
38
+ @views.has_key?(key.to_sym) || @@default_views.has_key?(key.to_sym)
39
+ end
40
+
41
+ def [](key)
42
+ get_view_for_key(key)
43
+ end
44
+
45
+ def []=(key, value)
46
+ set_view_for_key(key, value)
47
+ end
48
+
49
+ # Override respond to to include keys
50
+ def respond_to?(method)
51
+ key = key_from_method_name(method)
52
+ if has_key?(key)
53
+ true
54
+ else
55
+ super
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def method_missing(method, *args)
62
+ key = key_from_method_name(method)
63
+ if has_key?(key)
64
+ if method.to_s.include?('=')
65
+ self.class_eval <<-EOS
66
+ def #{key}=(value)
67
+ set_view_for_key(:#{key}, value)
68
+ end
69
+ EOS
70
+ else
71
+ self.class_eval <<-EOS
72
+ def #{key}
73
+ get_view_for_key(:#{key})
74
+ end
75
+ EOS
76
+ end
77
+ self.send(method, *args)
78
+ else
79
+ super
80
+ end
81
+ end
82
+
83
+ def key_from_method_name(method)
84
+ method.to_s.gsub('=', '').to_sym
85
+ end
86
+
87
+ def get_view_for_key(key)
88
+ @views[key.to_sym] || @@default_views[key.to_sym]
89
+ end
90
+
91
+ def set_view_for_key(key, view)
92
+ @views[key.to_sym] = view
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,242 @@
1
+ require 'active_admin/router'
2
+ require 'active_admin/helpers/settings'
3
+
4
+ module ActiveAdmin
5
+ class Application
6
+ include Settings
7
+ include Settings::Inheritance
8
+
9
+ settings_inherited_by Namespace
10
+
11
+ # The default namespace to put controllers and routes inside. Set this
12
+ # in config/initializers/active_admin.rb using:
13
+ #
14
+ # config.default_namespace = :super_admin
15
+ #
16
+ setting :default_namespace, :admin
17
+
18
+ attr_reader :namespaces
19
+ def initialize
20
+ @namespaces = {}
21
+ end
22
+
23
+ # Load paths for admin configurations. Add folders to this load path
24
+ # to load up other resources for administration. External gems can
25
+ # include their paths in this load path to provide active_admin UIs
26
+ setting :load_paths, [File.expand_path('app/admin', Rails.root)]
27
+
28
+ # The default number of resources to display on index pages
29
+ inheritable_setting :default_per_page, 30
30
+
31
+ # The title which gets displayed in the main layout
32
+ inheritable_setting :site_title, ""
33
+
34
+ # Set the site title link href (defaults to AA dashboard)
35
+ inheritable_setting :site_title_link, ""
36
+
37
+ # Set the site title image displayed in the main layout (has precendence over :site_title)
38
+ inheritable_setting :site_title_image, ""
39
+
40
+ # Set a favicon
41
+ inheritable_setting :favicon, false
42
+
43
+ # The view factory to use to generate all the view classes. Take
44
+ # a look at ActiveAdmin::ViewFactory
45
+ inheritable_setting :view_factory, ActiveAdmin::ViewFactory.new
46
+
47
+ # The method to call in controllers to get the current user
48
+ inheritable_setting :current_user_method, false
49
+
50
+ # The method to call in the controllers to ensure that there
51
+ # is a currently authenticated admin user
52
+ inheritable_setting :authentication_method, false
53
+
54
+ # The path to log user's out with. If set to a symbol, we assume
55
+ # that it's a method to call which returns the path
56
+ inheritable_setting :logout_link_path, :destroy_admin_user_session_path
57
+
58
+ # The method to use when generating the link for user logout
59
+ inheritable_setting :logout_link_method, :get
60
+
61
+ # Whether the batch actions are enabled or not
62
+ inheritable_setting :batch_actions, false
63
+
64
+ # Whether filters are enabled
65
+ inheritable_setting :filters, true
66
+
67
+ # The namespace root.
68
+ inheritable_setting :root_to, 'dashboard#index'
69
+
70
+ # Default CSV options
71
+ inheritable_setting :csv_options, {:col_sep => ','}
72
+
73
+ # Default Download Links options
74
+ inheritable_setting :download_links, true
75
+
76
+ # The authorization adapter to use
77
+ inheritable_setting :authorization_adapter, ActiveAdmin::AuthorizationAdapter
78
+
79
+ # A proc to be used when a user is not authorized to view the current resource
80
+ inheritable_setting :on_unauthorized_access, :rescue_active_admin_access_denied
81
+
82
+ # Active Admin makes educated guesses when displaying objects, this is
83
+ # the list of methods it tries calling in order
84
+ setting :display_name_methods, [ :display_name,
85
+ :full_name,
86
+ :name,
87
+ :username,
88
+ :login,
89
+ :title,
90
+ :email,
91
+ :to_s ]
92
+
93
+ # == Deprecated Settings
94
+
95
+ # (none currently)
96
+
97
+ include AssetRegistration
98
+
99
+ # Event that gets triggered on load of Active Admin
100
+ BeforeLoadEvent = 'active_admin.application.before_load'.freeze
101
+ AfterLoadEvent = 'active_admin.application.after_load'.freeze
102
+
103
+ # Runs before the app's AA initializer
104
+ def setup!
105
+ register_default_assets
106
+ end
107
+
108
+ # Runs after the app's AA initializer
109
+ def prepare!
110
+ remove_active_admin_load_paths_from_rails_autoload_and_eager_load
111
+ attach_reloader
112
+ end
113
+
114
+ # Registers a brand new configuration for the given resource.
115
+ def register(resource, options = {}, &block)
116
+ ns = options.fetch(:namespace){ default_namespace }
117
+ namespace(ns).register resource, options, &block
118
+ end
119
+
120
+ # Creates a namespace for the given name
121
+ #
122
+ # Yields the namespace if a block is given
123
+ #
124
+ # @returns [Namespace] the new or existing namespace
125
+ def namespace(name)
126
+ name ||= :root
127
+
128
+ if namespaces[name]
129
+ namespace = namespaces[name]
130
+ else
131
+ namespace = namespaces[name] = Namespace.new(self, name)
132
+ ActiveAdmin::Event.dispatch ActiveAdmin::Namespace::RegisterEvent, namespace
133
+ end
134
+
135
+ yield(namespace) if block_given?
136
+
137
+ namespace
138
+ end
139
+
140
+ # Register a page
141
+ #
142
+ # @param name [String] The page name
143
+ # @options [Hash] Accepts option :namespace.
144
+ # @&block The registration block.
145
+ #
146
+ def register_page(name, options = {}, &block)
147
+ ns = options.fetch(:namespace){ default_namespace }
148
+ namespace(ns).register_page name, options, &block
149
+ end
150
+
151
+ # Whether all configuration files have been loaded
152
+ def loaded?
153
+ @@loaded ||= false
154
+ end
155
+
156
+ # Removes all defined controllers from memory. Useful in
157
+ # development, where they are reloaded on each request.
158
+ def unload!
159
+ namespaces.values.each &:unload!
160
+ @@loaded = false
161
+ end
162
+
163
+ # Loads all ruby files that are within the load_paths setting.
164
+ # To reload everything simply call `ActiveAdmin.unload!`
165
+ def load!
166
+ unless loaded?
167
+ ActiveAdmin::Event.dispatch BeforeLoadEvent, self # before_load hook
168
+ files.each{ |file| load file } # load files
169
+ namespace(default_namespace) # init AA resources
170
+ ActiveAdmin::Event.dispatch AfterLoadEvent, self # after_load hook
171
+ @@loaded = true
172
+ end
173
+ end
174
+
175
+ # Returns ALL the files to be loaded
176
+ def files
177
+ load_paths.flatten.compact.uniq.map{ |path| Dir["#{path}/**/*.rb"] }.flatten
178
+ end
179
+
180
+ def router
181
+ @router ||= Router.new(self)
182
+ end
183
+
184
+ # One-liner called by user's config/routes.rb file
185
+ def routes(rails_router)
186
+ load!
187
+ router.apply(rails_router)
188
+ end
189
+
190
+ # Adds before, around and after filters to all controllers.
191
+ # Example usage:
192
+ # ActiveAdmin.before_filter :authenticate_admin!
193
+ #
194
+ %w(before_filter skip_before_filter after_filter around_filter skip_filter).each do |name|
195
+ define_method name do |*args, &block|
196
+ ActiveAdmin::BaseController.send name, *args, &block
197
+ ActiveAdmin::Devise::PasswordsController.send name, *args, &block
198
+ ActiveAdmin::Devise::SessionsController.send name, *args, &block
199
+ ActiveAdmin::Devise::UnlocksController.send name, *args, &block
200
+ end
201
+ end
202
+
203
+ private
204
+
205
+ def register_default_assets
206
+ register_stylesheet 'active_admin.css', media: 'screen'
207
+ register_stylesheet 'active_admin/print.css', media: 'print'
208
+
209
+ register_javascript 'active_admin.js'
210
+ end
211
+
212
+ # Since app/admin is alphabetically before app/models, we have to remove it
213
+ # from the host app's +autoload_paths+ to prevent missing constant errors.
214
+ #
215
+ # As well, we have to remove it from +eager_load_paths+ to prevent the
216
+ # files from being loaded twice in production.
217
+ def remove_active_admin_load_paths_from_rails_autoload_and_eager_load
218
+ ActiveSupport::Dependencies.autoload_paths.reject!{ |path| load_paths.include? path }
219
+ Rails.application.config.eager_load_paths = # the array is frozen :/
220
+ Rails.application.config.eager_load_paths.reject do |path|
221
+ load_paths.include?(path)
222
+ end
223
+ end
224
+
225
+ # Hooks the app/admin directory into our Rails Engine's +watchable_dirs+, so the
226
+ # files are automatically reloaded in your development environment.
227
+ #
228
+ # If files have changed on disk, we forcibly unload all AA configurations, and
229
+ # tell the host application to redraw routes (triggering AA itself to reload).
230
+ def attach_reloader
231
+ load_paths.each do |path|
232
+ ActiveAdmin::Engine.config.watchable_dirs[path] = [:rb]
233
+ end
234
+
235
+ app = self
236
+ ActionDispatch::Reloader.to_prepare do
237
+ app.unload!
238
+ Rails.application.reload_routes!
239
+ end
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,29 @@
1
+ module ActiveAdmin
2
+ module AssetRegistration
3
+
4
+ def register_stylesheet(path, options = {})
5
+ stylesheets[path] = options
6
+ end
7
+
8
+ def stylesheets
9
+ @stylesheets ||= {}
10
+ end
11
+
12
+ def clear_stylesheets!
13
+ @stylesheets = {}
14
+ end
15
+
16
+ def register_javascript(name)
17
+ javascripts.add name
18
+ end
19
+
20
+ def javascripts
21
+ @javascripts ||= Set.new
22
+ end
23
+
24
+ def clear_javascripts!
25
+ @javascripts = Set.new
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,132 @@
1
+ module ActiveAdmin
2
+
3
+ # Default Authorization permissions for Active Admin
4
+ module Authorization
5
+ READ = :read
6
+ CREATE = :create
7
+ UPDATE = :update
8
+ DESTROY = :destroy
9
+ end
10
+
11
+ Auth = Authorization
12
+
13
+
14
+ # Active Admin's default authorization adapter. This adapter returns true
15
+ # for all requests to `#authorized?`. It should be the starting point for
16
+ # implementing your own authorization adapter.
17
+ #
18
+ # To view an example subclass, check out `ActiveAdmin::CanCanAdapter`
19
+ class AuthorizationAdapter
20
+ attr_reader :resource, :user
21
+
22
+
23
+ # Initialize a new authorization adapter. This happens on each and
24
+ # every request to a controller.
25
+ #
26
+ # @param [ActiveAdmin::Resource, ActiveAdmin::Page] resource The resource
27
+ # that the user is currently on. Note, we may be authorizing access
28
+ # to a different subject, so don't rely on this other than to
29
+ # pull configuration information from.
30
+ #
31
+ # @param [any] user The current user. The user is set to whatever is returned
32
+ # from `#current_active_admin_user` in the controller.
33
+ #
34
+ def initialize(resource, user)
35
+ @resource = resource
36
+ @user = user
37
+ end
38
+
39
+ # Returns true of false depending on if the user is authorized to perform
40
+ # the action on the subject.
41
+ #
42
+ # @param [Symbol] action The name of the action to perform. Usually this will be
43
+ # one of the `ActiveAdmin::Auth::*` symbols.
44
+ #
45
+ # @param [any] subject The subject the action is being performed on usually this
46
+ # is a model object. Note, that this is NOT always in instance, it can be
47
+ # the class of the subject also. For example, Active Admin uses the class
48
+ # of the resource to decide if the resource should be displayed in the
49
+ # global navigation. To deal with this nicely in a case statement, take
50
+ # a look at `#normalized(klasss)`
51
+ #
52
+ # @returns [Boolean]
53
+ def authorized?(action, subject = nil)
54
+ true
55
+ end
56
+
57
+
58
+ # A hook method for authorization libraries to scope the collection. By
59
+ # default, we just return the same collection. The returned scope is used
60
+ # as the starting point for all queries to the db in the controller.
61
+ #
62
+ # @param [ActiveRecord::Relation] collection The collection the user is
63
+ # attempting to view.
64
+ #
65
+ # @param [Symbol] action The name of the action to perform. Usually this will be
66
+ # one of the `ActiveAdmin::Auth::*` symbols. Defaults to `Auth::READ` if
67
+ # no action passed in.
68
+ #
69
+ # @returns [ActiveRecord::Relation] A new collection, scoped to the
70
+ # objects that the current user has access to.
71
+ def scope_collection(collection, action = Auth::READ)
72
+ collection
73
+ end
74
+
75
+ private
76
+
77
+ # The `#authorized?` method's subject can be set to both instances as well
78
+ # as classes of objects. This can make it much difficult to create simple
79
+ # case statements for authorization since you have to handle both the
80
+ # class level match and the instance level match.
81
+ #
82
+ # For example:
83
+ #
84
+ # class MyAuthAdapter < ActiveAdmin::AuthorizationAdapter
85
+ #
86
+ # def authorized?(action, subject = nil)
87
+ # case subject
88
+ # when Post
89
+ # true
90
+ # when Class
91
+ # if subject == Post
92
+ # true
93
+ # end
94
+ # end
95
+ # end
96
+ #
97
+ # end
98
+ #
99
+ # To handle this, the normalized method takes care of returning a object
100
+ # which implements `===` to be matched in a case statement.
101
+ #
102
+ # The above now becomes:
103
+ #
104
+ # class MyAuthAdapter < ActiveAdmin::AuthorizationAdapter
105
+ #
106
+ # def authorized?(action, subject = nil)
107
+ # case subject
108
+ # when normalized(Post)
109
+ # true
110
+ # end
111
+ # end
112
+ #
113
+ # end
114
+ def normalized(klass)
115
+ NormalizedMatcher.new(klass)
116
+ end
117
+
118
+ class NormalizedMatcher
119
+
120
+ def initialize(klass)
121
+ @klass = klass
122
+ end
123
+
124
+ def ===(other)
125
+ @klass == other || other.is_a?(@klass)
126
+ end
127
+
128
+ end
129
+
130
+ end
131
+
132
+ end
@@ -0,0 +1,151 @@
1
+ module ActiveAdmin
2
+
3
+ # Exception class to raise when there is an authorized access
4
+ # exception thrown. The exception has a few goodies that may
5
+ # be useful for capturing / recognizing security issues.
6
+ class AccessDenied < StandardError
7
+ attr_reader :user, :action, :subject
8
+
9
+ def initialize(user, action, subject)
10
+ @user, @action, @subject = user, action, subject
11
+
12
+ super()
13
+ end
14
+
15
+ def message
16
+ I18n.t("active_admin.access_denied.message")
17
+ end
18
+ end
19
+
20
+ class BaseController < ::InheritedResources::Base
21
+ module Authorization
22
+ include MethodOrProcHelper
23
+ extend ActiveSupport::Concern
24
+
25
+ ACTIONS_DICTIONARY = {
26
+ :index => ActiveAdmin::Authorization::READ,
27
+ :show => ActiveAdmin::Authorization::READ,
28
+ :new => ActiveAdmin::Authorization::CREATE,
29
+ :create => ActiveAdmin::Authorization::CREATE,
30
+ :edit => ActiveAdmin::Authorization::UPDATE,
31
+ :update => ActiveAdmin::Authorization::UPDATE,
32
+ :destroy => ActiveAdmin::Authorization::DESTROY
33
+ }
34
+
35
+ included do
36
+ rescue_from ActiveAdmin::AccessDenied, :with => :dispatch_active_admin_access_denied
37
+
38
+ helper_method :authorized?
39
+ helper_method :authorize!
40
+ end
41
+
42
+ protected
43
+
44
+ # Authorize the action and subject. Available in the controller
45
+ # as well as all the views.
46
+ #
47
+ # @param [Symbol] action The action to check if the user has permission
48
+ # to perform on the subject.
49
+ #
50
+ # @param [any] subject The subject that the user is trying to perform
51
+ # the action on.
52
+ #
53
+ # @returns [Boolean]
54
+ #
55
+ def authorized?(action, subject = nil)
56
+ active_admin_authorization.authorized?(action, subject)
57
+ end
58
+
59
+
60
+ # Authorize the action and subject. Available in the controller
61
+ # as well as all the views. If the action is not allowd, it raises
62
+ # an ActiveAdmin::AccessDenied exception.
63
+ #
64
+ # @param [Symbol] action The action to check if the user has permission
65
+ # to perform on the subject.
66
+ #
67
+ # @param [any] subject The subject that the user is trying to perform
68
+ # the action on.
69
+ #
70
+ # @returns [Boolean] True if authorized, otherwise raises
71
+ # an ActiveAdmin::AccessDenied.
72
+ def authorize!(action, subject = nil)
73
+ unless authorized? action, subject
74
+ raise ActiveAdmin::AccessDenied.new(current_active_admin_user,
75
+ action,
76
+ subject)
77
+ end
78
+ end
79
+
80
+ # Performs authorization on the resource using the current controller
81
+ # action as the permission action.
82
+ #
83
+ def authorize_resource!(resource)
84
+ permission = action_to_permission(params[:action])
85
+ authorize! permission, resource
86
+ end
87
+
88
+ # Retrieve or instantiate the authorization instance for this resource
89
+ #
90
+ # @returns [ActiveAdmin::AuthorizationAdapter]
91
+ def active_admin_authorization
92
+ @active_admin_authorization ||=
93
+ active_admin_authorization_adapter.new active_admin_config, current_active_admin_user
94
+ end
95
+
96
+ # Returns the class to be used as the authorization adapter
97
+ #
98
+ # @returns [Class]
99
+ def active_admin_authorization_adapter
100
+ adapter = active_admin_namespace.authorization_adapter
101
+ if adapter.is_a? String
102
+ ActiveSupport::Dependencies.constantize adapter
103
+ else
104
+ adapter
105
+ end
106
+ end
107
+
108
+ # Converts a controller action into one of the correct Active Admin
109
+ # authorization names. Uses the ACTIONS_DICTIONARY to convert the
110
+ # action name to permission.
111
+ #
112
+ # @param [String, Symbol] action The controller action name.
113
+ #
114
+ # @returns [Symbol] The permission name to use.
115
+ def action_to_permission(action)
116
+ if action && action = action.to_sym
117
+ Authorization::ACTIONS_DICTIONARY[action] || action
118
+ end
119
+ end
120
+
121
+ def dispatch_active_admin_access_denied(exception)
122
+ call_method_or_exec_proc active_admin_namespace.on_unauthorized_access, exception
123
+ end
124
+
125
+ def rescue_active_admin_access_denied(exception)
126
+ error = exception.message
127
+
128
+ respond_to do |format|
129
+ format.html do
130
+ flash[:error] = error
131
+ redirect_backwards_or_to_root
132
+ end
133
+
134
+ format.csv { render text: error, status: :unauthorized }
135
+ format.json { render json: { error: error }, status: :unauthorized }
136
+ format.xml { render xml: "<error>#{error}</error>", status: :unauthorized }
137
+ end
138
+ end
139
+
140
+ def redirect_backwards_or_to_root
141
+ if request.headers.key? "HTTP_REFERER"
142
+ redirect_to :back
143
+ else
144
+ controller, action = active_admin_namespace.root_to.split '#'
145
+ redirect_to controller: controller, action: action
146
+ end
147
+ end
148
+
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,34 @@
1
+ module ActiveAdmin
2
+ class BaseController < ::InheritedResources::Base
3
+ module Menu
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_filter :set_current_tab
8
+ helper_method :current_menu
9
+ end
10
+
11
+ protected
12
+
13
+ def current_menu
14
+ active_admin_config.navigation_menu
15
+ end
16
+
17
+ # Set's @current_tab to be name of the tab to mark as current
18
+ # Get's called through a before filter
19
+ def set_current_tab
20
+ @current_tab = if current_menu && active_admin_config.belongs_to? && parent?
21
+ parent_item = active_admin_config.belongs_to_config.target.menu_item
22
+ if current_menu.include? parent_item
23
+ parent_item
24
+ else
25
+ active_admin_config.menu_item
26
+ end
27
+ else
28
+ active_admin_config.menu_item
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end