activeadministration 0.0.1

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 (522) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +47 -0
  3. data/.travis.yml +19 -0
  4. data/.yardopts +9 -0
  5. data/CHANGELOG.md +1074 -0
  6. data/CONTRIBUTING.md +139 -0
  7. data/Gemfile +52 -0
  8. data/Guardfile +7 -0
  9. data/LICENSE +25 -0
  10. data/README.md +8 -0
  11. data/Rakefile +33 -0
  12. data/activeadministration.gemspec +34 -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 +30 -0
  28. data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
  29. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  30. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  31. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  32. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +36 -0
  33. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +85 -0
  34. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +75 -0
  35. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +36 -0
  36. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
  37. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
  38. data/app/assets/stylesheets/active_admin/_base.css.scss +42 -0
  39. data/app/assets/stylesheets/active_admin/_forms.css.scss +329 -0
  40. data/app/assets/stylesheets/active_admin/_header.css.scss +156 -0
  41. data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
  42. data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
  43. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
  44. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
  45. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  46. data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
  47. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  48. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
  49. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +127 -0
  50. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
  51. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
  52. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  53. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  54. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  55. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +31 -0
  56. data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
  57. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  58. data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
  59. data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
  60. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
  61. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +65 -0
  62. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +111 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +36 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
  71. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  72. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
  73. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +34 -0
  74. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  75. data/app/assets/stylesheets/active_admin/print.css.scss +284 -0
  76. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  77. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  78. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +46 -0
  79. data/app/views/active_admin/dashboard/index.html.arb +1 -0
  80. data/app/views/active_admin/devise/confirmations/new.html.erb +14 -0
  81. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  82. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  83. data/app/views/active_admin/devise/passwords/edit.html.erb +19 -0
  84. data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
  85. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  86. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  87. data/app/views/active_admin/devise/shared/_links.erb +27 -0
  88. data/app/views/active_admin/devise/unlocks/new.html.erb +14 -0
  89. data/app/views/active_admin/page/index.html.arb +1 -0
  90. data/app/views/active_admin/resource/edit.html.arb +1 -0
  91. data/app/views/active_admin/resource/index.csv.erb +17 -0
  92. data/app/views/active_admin/resource/index.html.arb +1 -0
  93. data/app/views/active_admin/resource/new.html.arb +1 -0
  94. data/app/views/active_admin/resource/show.html.arb +1 -0
  95. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  96. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  97. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  98. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  99. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  100. data/app/views/kaminari/active_admin/_paginator.html.erb +23 -0
  101. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  102. data/app/views/layouts/active_admin.html.arb +1 -0
  103. data/app/views/layouts/active_admin_logged_out.html.erb +37 -0
  104. data/config/locales/bg.yml +102 -0
  105. data/config/locales/bs.yml +121 -0
  106. data/config/locales/ca.yml +102 -0
  107. data/config/locales/cs.yml +106 -0
  108. data/config/locales/da.yml +103 -0
  109. data/config/locales/de-CH.yml +118 -0
  110. data/config/locales/de.yml +143 -0
  111. data/config/locales/el.yml +111 -0
  112. data/config/locales/en-GB.yml +95 -0
  113. data/config/locales/en.yml +117 -0
  114. data/config/locales/es.yml +127 -0
  115. data/config/locales/es_MX.yml +110 -0
  116. data/config/locales/fi.yml +110 -0
  117. data/config/locales/fr.yml +109 -0
  118. data/config/locales/he.yml +92 -0
  119. data/config/locales/hr.yml +121 -0
  120. data/config/locales/hu.yml +96 -0
  121. data/config/locales/it.yml +114 -0
  122. data/config/locales/ja.yml +114 -0
  123. data/config/locales/ko.yml +85 -0
  124. data/config/locales/lt.yml +118 -0
  125. data/config/locales/lv.yml +90 -0
  126. data/config/locales/nl.yml +94 -0
  127. data/config/locales/no-NB.yml +111 -0
  128. data/config/locales/pl.yml +100 -0
  129. data/config/locales/pt-BR.yml +117 -0
  130. data/config/locales/pt-PT.yml +90 -0
  131. data/config/locales/ro.yml +94 -0
  132. data/config/locales/ru.yml +121 -0
  133. data/config/locales/sv-SE.yml +90 -0
  134. data/config/locales/tr.yml +94 -0
  135. data/config/locales/uk.yml +121 -0
  136. data/config/locales/vi.yml +91 -0
  137. data/config/locales/zh-CN.yml +112 -0
  138. data/config/locales/zh-TW.yml +94 -0
  139. data/cucumber.yml +3 -0
  140. data/docs/0-installation.md +84 -0
  141. data/docs/1-general-configuration.md +138 -0
  142. data/docs/10-custom-pages.md +84 -0
  143. data/docs/11-decorators.md +50 -0
  144. data/docs/12-arbre-components.md +150 -0
  145. data/docs/13-authorization-adapter.md +239 -0
  146. data/docs/2-resource-customization.md +359 -0
  147. data/docs/3-index-pages.md +245 -0
  148. data/docs/3-index-pages/create-an-index.md +31 -0
  149. data/docs/3-index-pages/index-as-block.md +21 -0
  150. data/docs/3-index-pages/index-as-blog.md +71 -0
  151. data/docs/3-index-pages/index-as-grid.md +29 -0
  152. data/docs/3-index-pages/index-as-table.md +163 -0
  153. data/docs/4-csv-format.md +39 -0
  154. data/docs/5-forms.md +118 -0
  155. data/docs/6-show-pages.md +77 -0
  156. data/docs/7-sidebars.md +63 -0
  157. data/docs/8-custom-actions.md +159 -0
  158. data/docs/9-batch-actions.md +233 -0
  159. data/features/action_item.feature +73 -0
  160. data/features/authorization.feature +64 -0
  161. data/features/authorization_cancan.feature +52 -0
  162. data/features/authorization_pundit.feature +37 -0
  163. data/features/belongs_to.feature +66 -0
  164. data/features/breadcrumb.feature +75 -0
  165. data/features/comments/commenting.feature +159 -0
  166. data/features/comments/viewing_index.feature +19 -0
  167. data/features/dashboard.feature +16 -0
  168. data/features/decorators.feature +41 -0
  169. data/features/development_reloading.feature +31 -0
  170. data/features/edit_page.feature +114 -0
  171. data/features/favicon.feature +20 -0
  172. data/features/first_boot.feature +16 -0
  173. data/features/global_navigation.feature +29 -0
  174. data/features/i18n.feature +43 -0
  175. data/features/index/batch_actions.feature +123 -0
  176. data/features/index/filters.feature +138 -0
  177. data/features/index/format_as_csv.feature +117 -0
  178. data/features/index/formats.feature +66 -0
  179. data/features/index/index_as_block.feature +15 -0
  180. data/features/index/index_as_blog.feature +69 -0
  181. data/features/index/index_as_grid.feature +45 -0
  182. data/features/index/index_as_table.feature +208 -0
  183. data/features/index/index_blank_slate.feature +83 -0
  184. data/features/index/index_parameters.feature +75 -0
  185. data/features/index/index_scope_to.feature +56 -0
  186. data/features/index/index_scopes.feature +251 -0
  187. data/features/index/page_title.feature +41 -0
  188. data/features/index/pagination.feature +59 -0
  189. data/features/index/switch_index_view.feature +73 -0
  190. data/features/menu.feature +53 -0
  191. data/features/new_page.feature +106 -0
  192. data/features/registering_assets.feature +35 -0
  193. data/features/registering_pages.feature +148 -0
  194. data/features/registering_resources.feature +33 -0
  195. data/features/root_to.feature +17 -0
  196. data/features/show/default_content.feature +43 -0
  197. data/features/show/page_title.feature +58 -0
  198. data/features/sidebar_sections.feature +210 -0
  199. data/features/site_title.feature +47 -0
  200. data/features/specifying_actions.feature +93 -0
  201. data/features/step_definitions/action_item_steps.rb +7 -0
  202. data/features/step_definitions/action_link_steps.rb +7 -0
  203. data/features/step_definitions/additional_web_steps.rb +82 -0
  204. data/features/step_definitions/asset_steps.rb +15 -0
  205. data/features/step_definitions/attribute_steps.rb +18 -0
  206. data/features/step_definitions/batch_action_steps.rb +55 -0
  207. data/features/step_definitions/breadcrumb_steps.rb +3 -0
  208. data/features/step_definitions/comment_steps.rb +12 -0
  209. data/features/step_definitions/configuration_steps.rb +100 -0
  210. data/features/step_definitions/dashboard_steps.rb +15 -0
  211. data/features/step_definitions/factory_steps.rb +34 -0
  212. data/features/step_definitions/filter_steps.rb +17 -0
  213. data/features/step_definitions/flash_steps.rb +11 -0
  214. data/features/step_definitions/format_steps.rb +45 -0
  215. data/features/step_definitions/i18n_steps.rb +3 -0
  216. data/features/step_definitions/index_scope_steps.rb +21 -0
  217. data/features/step_definitions/index_views_steps.rb +3 -0
  218. data/features/step_definitions/layout_steps.rb +3 -0
  219. data/features/step_definitions/member_link_steps.rb +7 -0
  220. data/features/step_definitions/menu_steps.rb +11 -0
  221. data/features/step_definitions/pagination_steps.rb +8 -0
  222. data/features/step_definitions/sidebar_steps.rb +12 -0
  223. data/features/step_definitions/site_title_steps.rb +15 -0
  224. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  225. data/features/step_definitions/tab_steps.rb +3 -0
  226. data/features/step_definitions/table_steps.rb +119 -0
  227. data/features/step_definitions/user_steps.rb +41 -0
  228. data/features/step_definitions/web_steps.rb +86 -0
  229. data/features/sti_resource.feature +65 -0
  230. data/features/strong_parameters.feature +72 -0
  231. data/features/support/env.rb +119 -0
  232. data/features/support/paths.rb +71 -0
  233. data/features/support/selectors.rb +45 -0
  234. data/features/symbol_leak.feature +35 -0
  235. data/features/users/logging_in.feature +34 -0
  236. data/features/users/logging_out.feature +13 -0
  237. data/features/users/resetting_password.feature +34 -0
  238. data/lib/active_admin.rb +135 -0
  239. data/lib/active_admin/abstract_view_factory.rb +86 -0
  240. data/lib/active_admin/application.rb +250 -0
  241. data/lib/active_admin/asset_registration.rb +29 -0
  242. data/lib/active_admin/authorization_adapter.rb +132 -0
  243. data/lib/active_admin/base_controller.rb +78 -0
  244. data/lib/active_admin/base_controller/authorization.rb +151 -0
  245. data/lib/active_admin/base_controller/menu.rb +34 -0
  246. data/lib/active_admin/batch_actions.rb +17 -0
  247. data/lib/active_admin/batch_actions/controller.rb +29 -0
  248. data/lib/active_admin/batch_actions/resource_extension.rb +154 -0
  249. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  250. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
  251. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +57 -0
  252. data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
  253. data/lib/active_admin/callbacks.rb +84 -0
  254. data/lib/active_admin/cancan_adapter.rb +40 -0
  255. data/lib/active_admin/component.rb +5 -0
  256. data/lib/active_admin/controller_action.rb +12 -0
  257. data/lib/active_admin/csv_builder.rb +70 -0
  258. data/lib/active_admin/dependencies.rb +38 -0
  259. data/lib/active_admin/deprecation.rb +35 -0
  260. data/lib/active_admin/devise.rb +80 -0
  261. data/lib/active_admin/dsl.rb +165 -0
  262. data/lib/active_admin/engine.rb +7 -0
  263. data/lib/active_admin/error.rb +22 -0
  264. data/lib/active_admin/event.rb +33 -0
  265. data/lib/active_admin/filters.rb +9 -0
  266. data/lib/active_admin/filters/dsl.rb +21 -0
  267. data/lib/active_admin/filters/forms.rb +87 -0
  268. data/lib/active_admin/filters/formtastic_addons.rb +73 -0
  269. data/lib/active_admin/filters/resource_extension.rb +135 -0
  270. data/lib/active_admin/form_builder.rb +185 -0
  271. data/lib/active_admin/helpers/collection.rb +23 -0
  272. data/lib/active_admin/helpers/i18n.rb +7 -0
  273. data/lib/active_admin/helpers/optional_display.rb +38 -0
  274. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  275. data/lib/active_admin/helpers/settings.rb +106 -0
  276. data/lib/active_admin/iconic.rb +54 -0
  277. data/lib/active_admin/iconic/icons.rb +142 -0
  278. data/lib/active_admin/inputs.rb +15 -0
  279. data/lib/active_admin/inputs/datepicker_input.rb +20 -0
  280. data/lib/active_admin/inputs/filter_base.rb +40 -0
  281. data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
  282. data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
  283. data/lib/active_admin/inputs/filter_check_boxes_input.rb +48 -0
  284. data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
  285. data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
  286. data/lib/active_admin/inputs/filter_select_input.rb +53 -0
  287. data/lib/active_admin/inputs/filter_string_input.rb +24 -0
  288. data/lib/active_admin/menu.rb +107 -0
  289. data/lib/active_admin/menu_collection.rb +96 -0
  290. data/lib/active_admin/menu_item.rb +97 -0
  291. data/lib/active_admin/namespace.rb +231 -0
  292. data/lib/active_admin/order_clause.rb +26 -0
  293. data/lib/active_admin/orm/active_record.rb +3 -0
  294. data/lib/active_admin/orm/active_record/comments.rb +84 -0
  295. data/lib/active_admin/orm/active_record/comments/comment.rb +49 -0
  296. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  297. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  298. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  299. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  300. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +75 -0
  301. data/lib/active_admin/orm/mongoid.rb +1 -0
  302. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  303. data/lib/active_admin/page.rb +88 -0
  304. data/lib/active_admin/page_controller.rb +29 -0
  305. data/lib/active_admin/page_dsl.rb +28 -0
  306. data/lib/active_admin/page_presenter.rb +32 -0
  307. data/lib/active_admin/pundit_adapter.rb +42 -0
  308. data/lib/active_admin/resource.rb +156 -0
  309. data/lib/active_admin/resource/action_items.rb +91 -0
  310. data/lib/active_admin/resource/belongs_to.rb +36 -0
  311. data/lib/active_admin/resource/controllers.rb +18 -0
  312. data/lib/active_admin/resource/menu.rb +64 -0
  313. data/lib/active_admin/resource/naming.rb +84 -0
  314. data/lib/active_admin/resource/page_presenters.rb +82 -0
  315. data/lib/active_admin/resource/pagination.rb +19 -0
  316. data/lib/active_admin/resource/routes.rb +99 -0
  317. data/lib/active_admin/resource/scope_to.rb +74 -0
  318. data/lib/active_admin/resource/scopes.rb +50 -0
  319. data/lib/active_admin/resource/sidebars.rb +28 -0
  320. data/lib/active_admin/resource_collection.rb +70 -0
  321. data/lib/active_admin/resource_controller.rb +50 -0
  322. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  323. data/lib/active_admin/resource_controller/data_access.rb +284 -0
  324. data/lib/active_admin/resource_controller/decorators.rb +100 -0
  325. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  326. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  327. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  328. data/lib/active_admin/resource_dsl.rb +171 -0
  329. data/lib/active_admin/router.rb +106 -0
  330. data/lib/active_admin/scope.rb +57 -0
  331. data/lib/active_admin/sidebar_section.rb +45 -0
  332. data/lib/active_admin/version.rb +3 -0
  333. data/lib/active_admin/view_factory.rb +27 -0
  334. data/lib/active_admin/view_helpers.rb +21 -0
  335. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  336. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  337. data/lib/active_admin/view_helpers/auto_link_helper.rb +37 -0
  338. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +27 -0
  339. data/lib/active_admin/view_helpers/display_helper.rb +64 -0
  340. data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
  341. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  342. data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
  343. data/lib/active_admin/view_helpers/form_helper.rb +21 -0
  344. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  345. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -0
  346. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  347. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  348. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  349. data/lib/active_admin/views.rb +8 -0
  350. data/lib/active_admin/views/action_items.rb +17 -0
  351. data/lib/active_admin/views/components/action_list_popover.rb +29 -0
  352. data/lib/active_admin/views/components/attributes_table.rb +105 -0
  353. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  354. data/lib/active_admin/views/components/columns.rb +157 -0
  355. data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
  356. data/lib/active_admin/views/components/index_list.rb +68 -0
  357. data/lib/active_admin/views/components/paginated_collection.rb +126 -0
  358. data/lib/active_admin/views/components/panel.rb +34 -0
  359. data/lib/active_admin/views/components/popover.rb +27 -0
  360. data/lib/active_admin/views/components/scopes.rb +66 -0
  361. data/lib/active_admin/views/components/sidebar_section.rb +29 -0
  362. data/lib/active_admin/views/components/site_title.rb +55 -0
  363. data/lib/active_admin/views/components/status_tag.rb +67 -0
  364. data/lib/active_admin/views/components/table_for.rb +212 -0
  365. data/lib/active_admin/views/footer.rb +20 -0
  366. data/lib/active_admin/views/header.rb +32 -0
  367. data/lib/active_admin/views/index_as_block.rb +36 -0
  368. data/lib/active_admin/views/index_as_blog.rb +156 -0
  369. data/lib/active_admin/views/index_as_grid.rb +80 -0
  370. data/lib/active_admin/views/index_as_table.rb +277 -0
  371. data/lib/active_admin/views/pages/base.rb +139 -0
  372. data/lib/active_admin/views/pages/form.rb +51 -0
  373. data/lib/active_admin/views/pages/index.rb +163 -0
  374. data/lib/active_admin/views/pages/layout.rb +26 -0
  375. data/lib/active_admin/views/pages/page.rb +30 -0
  376. data/lib/active_admin/views/pages/show.rb +59 -0
  377. data/lib/active_admin/views/tabbed_navigation.rb +62 -0
  378. data/lib/active_admin/views/title_bar.rb +55 -0
  379. data/lib/activeadmin.rb +1 -0
  380. data/lib/generators/active_admin/assets/assets_generator.rb +16 -0
  381. data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
  382. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  383. data/lib/generators/active_admin/devise/devise_generator.rb +66 -0
  384. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  385. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +243 -0
  386. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
  387. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  388. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
  389. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  390. data/lib/generators/active_admin/resource/templates/admin.rb +17 -0
  391. data/lib/ransack_ext.rb +12 -0
  392. data/script/local +44 -0
  393. data/script/use_rails +53 -0
  394. data/spec/integration/default_namespace_spec.rb +61 -0
  395. data/spec/integration/javascript_spec.rb +20 -0
  396. data/spec/integration/memory_spec.rb +29 -0
  397. data/spec/integration/stylesheets_spec.rb +18 -0
  398. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  399. data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
  400. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  401. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
  402. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
  403. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
  404. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  405. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  406. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  407. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
  408. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
  409. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
  410. data/spec/javascripts/support/jasmine.yml +74 -0
  411. data/spec/javascripts/support/jasmine_config.rb +23 -0
  412. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  413. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
  414. data/spec/javascripts/support/jquery.min.js +4 -0
  415. data/spec/spec_helper.rb +182 -0
  416. data/spec/spec_helper_without_rails.rb +16 -0
  417. data/spec/support/deferred_garbage_collection.rb +19 -0
  418. data/spec/support/detect_rails_version.rb +42 -0
  419. data/spec/support/integration_example_group.rb +31 -0
  420. data/spec/support/jslint.yml +80 -0
  421. data/spec/support/rails_template.rb +117 -0
  422. data/spec/support/rails_template_with_data.rb +59 -0
  423. data/spec/support/templates/admin/stores.rb +11 -0
  424. data/spec/support/templates/cucumber.rb +24 -0
  425. data/spec/support/templates/cucumber_with_reloading.rb +5 -0
  426. data/spec/support/templates/en.yml +8 -0
  427. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  428. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  429. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  430. data/spec/support/templates/policies/application_policy.rb +45 -0
  431. data/spec/support/templates/policies/category_policy.rb +7 -0
  432. data/spec/support/templates/policies/post_policy.rb +15 -0
  433. data/spec/support/templates/policies/store_policy.rb +11 -0
  434. data/spec/support/templates/policies/user_policy.rb +11 -0
  435. data/spec/support/templates/post_decorator.rb +11 -0
  436. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  437. data/spec/unit/action_builder_spec.rb +126 -0
  438. data/spec/unit/active_admin_spec.rb +11 -0
  439. data/spec/unit/application_spec.rb +140 -0
  440. data/spec/unit/asset_registration_spec.rb +52 -0
  441. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  442. data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
  443. data/spec/unit/auto_link_spec.rb +34 -0
  444. data/spec/unit/batch_actions/resource_spec.rb +92 -0
  445. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  446. data/spec/unit/belongs_to_spec.rb +42 -0
  447. data/spec/unit/cancan_adapter_spec.rb +43 -0
  448. data/spec/unit/comments_spec.rb +144 -0
  449. data/spec/unit/component_spec.rb +18 -0
  450. data/spec/unit/config_shared_examples.rb +59 -0
  451. data/spec/unit/controller_filters_spec.rb +37 -0
  452. data/spec/unit/csv_builder_spec.rb +134 -0
  453. data/spec/unit/devise_spec.rb +116 -0
  454. data/spec/unit/dsl_spec.rb +61 -0
  455. data/spec/unit/event_spec.rb +47 -0
  456. data/spec/unit/filters/filter_form_builder_spec.rb +418 -0
  457. data/spec/unit/filters/resource_spec.rb +121 -0
  458. data/spec/unit/form_builder_spec.rb +576 -0
  459. data/spec/unit/generators/install_spec.rb +23 -0
  460. data/spec/unit/helpers/collection_spec.rb +65 -0
  461. data/spec/unit/helpers/scope_chain_spec.rb +36 -0
  462. data/spec/unit/helpers/settings_spec.rb +30 -0
  463. data/spec/unit/menu_collection_spec.rb +62 -0
  464. data/spec/unit/menu_item_spec.rb +143 -0
  465. data/spec/unit/menu_spec.rb +71 -0
  466. data/spec/unit/namespace/authorization_spec.rb +27 -0
  467. data/spec/unit/namespace/register_page_spec.rb +74 -0
  468. data/spec/unit/namespace/register_resource_spec.rb +163 -0
  469. data/spec/unit/namespace_spec.rb +103 -0
  470. data/spec/unit/order_clause_spec.rb +57 -0
  471. data/spec/unit/page_controller_spec.rb +5 -0
  472. data/spec/unit/page_spec.rb +72 -0
  473. data/spec/unit/pretty_format_spec.rb +63 -0
  474. data/spec/unit/pundit_adapter_spec.rb +36 -0
  475. data/spec/unit/resource/action_items_spec.rb +62 -0
  476. data/spec/unit/resource/menu_spec.rb +18 -0
  477. data/spec/unit/resource/naming_spec.rb +122 -0
  478. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  479. data/spec/unit/resource/pagination_spec.rb +38 -0
  480. data/spec/unit/resource/routes_spec.rb +73 -0
  481. data/spec/unit/resource/scopes_spec.rb +50 -0
  482. data/spec/unit/resource/sidebars_spec.rb +43 -0
  483. data/spec/unit/resource_collection_spec.rb +158 -0
  484. data/spec/unit/resource_controller/data_access_spec.rb +73 -0
  485. data/spec/unit/resource_controller/decorators_spec.rb +86 -0
  486. data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
  487. data/spec/unit/resource_controller_spec.rb +265 -0
  488. data/spec/unit/resource_registration_spec.rb +56 -0
  489. data/spec/unit/resource_spec.rb +263 -0
  490. data/spec/unit/routing_spec.rb +172 -0
  491. data/spec/unit/scope_spec.rb +114 -0
  492. data/spec/unit/settings_spec.rb +88 -0
  493. data/spec/unit/view_factory_spec.rb +21 -0
  494. data/spec/unit/view_helpers/breadcrumbs_spec.rb +180 -0
  495. data/spec/unit/view_helpers/display_name_spec.rb +68 -0
  496. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  497. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  498. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  499. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +97 -0
  500. data/spec/unit/views/components/action_list_popover_spec.rb +29 -0
  501. data/spec/unit/views/components/attributes_table_spec.rb +259 -0
  502. data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
  503. data/spec/unit/views/components/blank_slate_spec.rb +17 -0
  504. data/spec/unit/views/components/columns_spec.rb +172 -0
  505. data/spec/unit/views/components/index_list_spec.rb +32 -0
  506. data/spec/unit/views/components/paginated_collection_spec.rb +229 -0
  507. data/spec/unit/views/components/panel_spec.rb +51 -0
  508. data/spec/unit/views/components/popover_spec.rb +33 -0
  509. data/spec/unit/views/components/sidebar_section_spec.rb +47 -0
  510. data/spec/unit/views/components/site_title_spec.rb +78 -0
  511. data/spec/unit/views/components/status_tag_spec.rb +102 -0
  512. data/spec/unit/views/components/table_for_spec.rb +242 -0
  513. data/spec/unit/views/pages/form_spec.rb +35 -0
  514. data/spec/unit/views/pages/layout_spec.rb +63 -0
  515. data/spec/unit/views/pages/show_spec.rb +20 -0
  516. data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
  517. data/tasks/docs.rake +37 -0
  518. data/tasks/js.rake +32 -0
  519. data/tasks/parallel_tests.rake +60 -0
  520. data/tasks/test.rake +79 -0
  521. data/tasks/yard.rake +7 -0
  522. metadata +741 -0
@@ -0,0 +1,150 @@
1
+ # Arbre Components
2
+
3
+ Arbre allows the creation of shareable and extendable HTML components and is
4
+ used throughout Active Admin to create view components.
5
+
6
+ ## Text Node
7
+
8
+ Sometimes it makes sense to insert something into a registered resource like a
9
+ non-breaking space or some text. The text_node method can be used to insert
10
+ these elements into the page inside of other Arbre components or resource
11
+ controller functions.
12
+
13
+ ```ruby
14
+ ActiveAdmin.register Post do
15
+ show do
16
+ panel "Post Details" do
17
+ attributes_table_for post do
18
+ row :id
19
+ row 'Tags' do
20
+ post.tags.each do |tag|
21
+ a tag, href: admin_post_path(q: {tagged_with_contains: tag})
22
+ text_node "&nbsp".html_safe
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ ```
30
+
31
+ ## Panels
32
+
33
+ A panel is a component that takes up all available horizontal space and takes a
34
+ title and a hash of attributes as arguments. If a sidebar is present, a panel
35
+ will take up the remaining space.
36
+
37
+ This will create two stacked panels:
38
+
39
+ ```ruby
40
+ show do
41
+ panel "Post Details" do
42
+ render partial: "details", locals: {post: post}
43
+ end
44
+
45
+ panel "Post Tags" do
46
+ render partial: "tags", locals: {post: post}
47
+ end
48
+ end
49
+ ```
50
+
51
+ ## Columns
52
+
53
+ The Columns component allows you draw content into scalable columns. All you
54
+ need to do is define the number of columns and the component will take care of
55
+ the rest.
56
+
57
+ #### Simple Columns
58
+
59
+ To create simple columnns, use the `columns` method. Within the block, call
60
+ the #column method to create a new column.
61
+
62
+ ```ruby
63
+ columns do
64
+ column do
65
+ span "Column #1"
66
+ end
67
+
68
+ column do
69
+ span "Column #2"
70
+ end
71
+ end
72
+ ```
73
+
74
+ ### Spanning Multiple Columns
75
+
76
+ To create columns that have multiple spans, pass the :span option to the column
77
+ method.
78
+
79
+ ```ruby
80
+ columns do
81
+ column span: 2 do
82
+ span "Column # 1"
83
+ end
84
+ column do
85
+ span "Column # 2"
86
+ end
87
+ end
88
+ ```
89
+
90
+ By default, each column spans 1 column. The above layout would have 2 columns,
91
+ the first being twice as large as the second.
92
+
93
+ ### Custom Column Widths
94
+
95
+ Active Admin uses a fluid width layout, causing column width to be defined
96
+ using percentages. Due to using this style of layout, columns can shrink or
97
+ expand past points that may not be desirable. To overcome this issue,
98
+ columns provide `:max_width` and `:min_width` options.
99
+
100
+ ```ruby
101
+ columns do
102
+ column max_width: "200px", min_width: "100px" do
103
+ span "Column # 1"
104
+ end
105
+ column do
106
+ span "Column # 2"
107
+ end
108
+ end
109
+ ```
110
+
111
+ In the above example, the first column will not grow larger than 200px and will
112
+ not shrink less than 100px.
113
+
114
+ ## Table For
115
+
116
+ Table For provides the ability to create tables like those present
117
+ in `index_as_table`. It takes a collection and a hash of options and then
118
+ uses `column` to build the fields to show with the table.
119
+
120
+ ```ruby
121
+ table_for order.payments do
122
+ column(:payment_type) { |payment| payment.payment_type.titleize }
123
+ column "Received On", :created_at
124
+ column "Details & Notes", :payment_details
125
+ column "Amount", :amount_in_dollars
126
+ end
127
+ ```
128
+
129
+ the `column` method can take a title as its first argument and data
130
+ (`:your_method`) as its second (or first if no title provided). Column also
131
+ takes a block.
132
+
133
+ ## Status tag
134
+
135
+ Status tags provide convenient syntactic sugar for styling items that have
136
+ status. A common example of where the status tag could be useful is for orders
137
+ that are complete or in progress. `status_tag` takes a status, like
138
+ "In Progress", a type, which defaults to nil, and a hash of options. The
139
+ status_tag will generate html markup that Active Admin css uses in styling.
140
+
141
+ ```ruby
142
+ status_tag 'In Progress'
143
+ # => <span class='status_tag in_progress'>In Progress</span>
144
+
145
+ status_tag 'active', :ok
146
+ # => <span class='status_tag active ok'>Active</span>
147
+
148
+ status_tag 'active', :ok, class: 'important', id: 'status_123', label: 'on'
149
+ # => <span class='status_tag active ok important' id='status_123'>on</span>
150
+ ```
@@ -0,0 +1,239 @@
1
+ # Authorization Adapter
2
+
3
+ Active Admin offers the ability to define and use your own authorization
4
+ adapter. If implemented, the '#authorized?' will be called when an action is
5
+ taken. By default, '#authorized?' returns true.
6
+
7
+
8
+ ## Setting up your own AuthorizationAdapter
9
+
10
+ Setting up your own `AuthorizationAdapter` is easy! The following example shows
11
+ how to set up and tie your authorization adapter class to Active Admin:
12
+
13
+ # app/models/only_authors_authorization.rb
14
+ class OnlyAuthorsAuthorization < ActiveAdmin::AuthorizationAdapter
15
+
16
+ def authorized?(action, subject = nil)
17
+ case subject
18
+ when normalized(Post)
19
+
20
+ # Only let the author update and delete posts
21
+ if action == :update || action == :destroy
22
+ subject.author == user
23
+
24
+ # If it's not an update or destroy, anyone can view it
25
+ else
26
+ true
27
+ end
28
+
29
+ else
30
+ true
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ In order to hook up `OnlyAuthorsAuthorization` to Active Admin, go to your
37
+ application's `config/initializers/active_admin.rb` and add/modify the line:
38
+
39
+ config.authorization_adapter = "OnlyAuthorsAuthorization"
40
+
41
+ Authorization adapters can be configured per ActiveAdmin namespace as well, for example:
42
+
43
+ ActiveAdmin.setup do |config|
44
+ config.namespace :admin do |ns|
45
+ ns.authorization_adapter = "AdminAuthorization"
46
+ end
47
+ config.namespace :my do |ns|
48
+ ns.authorization_adapter = "DashboardAuthorization"
49
+ end
50
+ end
51
+
52
+ Now, whenever a controller action is performed, the `OnlyAuthorsAuthorization`'s
53
+ `#authorized?` method will be called.
54
+
55
+
56
+ ## Getting Access to the Current User
57
+
58
+ From within your authorization adapter, you can call the `#user` method to
59
+ retrieve the current user.
60
+
61
+ class OnlyAdmins < ActiveAdmin::AuthorizationAdapter
62
+
63
+ def authorized?(action, subject = nil)
64
+ user.admin?
65
+ end
66
+
67
+ end
68
+
69
+
70
+ ## Scoping Collections in Authorization Adapters
71
+
72
+ `ActiveAdmin::AuthorizationAdapter` also provides a hook method (`#scope_collection`)
73
+ for the adapter to scope the resource's collection. For example, you may want to
74
+ centralize the scoping:
75
+
76
+ class OnlyMyAccount < ActiveAdmin::AuthorizationAdapter
77
+
78
+ def authorized?(action, subject = nil)
79
+ subject.account == user.account
80
+ end
81
+
82
+ def scope_collection(collection, action = Auth::READ)
83
+ collection.where(:account_id => user.account_id)
84
+ end
85
+
86
+ end
87
+
88
+ All collections presented on Index Screens will be passed through this method
89
+ and will be scoped accordingly.
90
+
91
+
92
+ ## Managing Access to Pages
93
+
94
+ Pages, just like resources, get authorized also. When authorization a page, the
95
+ subject will be an instance of `ActiveAdmin::Page`.
96
+
97
+ class OnlyDashboard < ActiveAdmin::AuthorizationAdapter
98
+ def authorized?(action, subject = nil)
99
+ case subject
100
+ when ActiveAdmin::Page
101
+ if action == :read && subject.name == "Dashboard"
102
+ true
103
+ else
104
+ false
105
+ end
106
+ else
107
+ false
108
+ end
109
+ end
110
+ end
111
+
112
+
113
+ ## Action Types
114
+
115
+ By default Active Admin simplifies the controller actions into 4 actions:
116
+
117
+ * `:read` - This controls if the user can view the menu item as well as the
118
+ index and show screens.
119
+ * `:create` - This controls if the user can view the new screen and submit
120
+ the form to the create action.
121
+ * `:update` - This controls if the user can view the edit screen and submit
122
+ the form to the update action.
123
+ * `:destroy` - This controls if the user can delete a resource.
124
+
125
+ Each of these actions is available as a constant. Eg: `:read` is available as
126
+ `ActiveAdmin::Authorization::READ`.
127
+
128
+
129
+ ## Checking for Authorization in Controllers and Views
130
+
131
+ Active Admin provides a helper method to check if the current user is
132
+ authorized to perform an action on a subject.
133
+
134
+ Simply use the `#authorized?(action, subject) method to check.
135
+
136
+ ActiveAdmin.register Post do
137
+
138
+ index do
139
+ column :title
140
+ column "" do |post|
141
+ if authorized?(:update, post)
142
+ link_to("Edit", admin_post_path(post))
143
+ end
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+
150
+ If you are implementing a custom controller action, you can use the
151
+ `#authorize!` method to raise an `ActiveAdmin::AccessDenied` exception.
152
+
153
+ ActiveAdmin.register Post do
154
+
155
+ member_action :publish, :method => :post do
156
+ post = Post.find(params[:id])
157
+
158
+ authorize! :publish, post
159
+ post.publish!
160
+
161
+ flash[:notice] = "Post has been published"
162
+ redirect_to [:admin, post]
163
+ end
164
+
165
+ action_item :only => :show do
166
+ if !post.published? && authorized?(:publish, post)
167
+ link_to("Publish", publish_admin_post_path(post), :method => :post)
168
+ end
169
+ end
170
+
171
+ end
172
+
173
+
174
+ ## Using the CanCan Adapter
175
+
176
+ Sub-classing `ActiveAdmin::AuthorizationAdapter` is fairly low level. Many times
177
+ it's nicer to have a simpler DSL for managing authorization. Active Admin
178
+ provides an adapter out of the box for [CanCan](https://github.com/ryanb/cancan).
179
+
180
+ To use the CanCan adapter, simply update the configuration in the Active Admin
181
+ initializer:
182
+
183
+ config.authorization_adapter = ActiveAdmin::CanCanAdapter
184
+
185
+ You can also specify a method to be called on unauthorized access. This is necessary
186
+ in order to prevent a redirect loop that can happen if a user tries to access a page
187
+ they don't have permissions for (see [#2081](https://github.com/gregbell/active_admin/issues/2081)).
188
+ ```ruby
189
+ config.on_unauthorized_access = :access_denied
190
+ ```
191
+ The method `access_denied` would be defined in `application_controller.rb`. Here is one
192
+ example that redirects the user from the page they don't have permission to
193
+ access to a resource they have permission to access (organizations in this case), and
194
+ also displays the error message in the browser:
195
+
196
+ ```ruby
197
+ class ApplicationController < ActionController::Base
198
+ protect_from_forgery
199
+
200
+ def access_denied(exception)
201
+ redirect_to admin_organizations_path, :alert => exception.message
202
+ end
203
+ end
204
+ ```
205
+
206
+ By default this will use the ability class named "Ability". This can also be
207
+ changed from the initializer:
208
+
209
+ config.cancan_ability_class = "MyCustomAbility"
210
+
211
+ Now you can simply use CanCan the way that you would expect and Active Admin
212
+ will use it for authorization:
213
+
214
+ # app/models/ability.rb
215
+ class Ability
216
+ include CanCan::Ability
217
+
218
+ def initialize(user)
219
+ can :manage, Post
220
+ can :read, User
221
+ can :manage, User, :id => user.id
222
+ can :read, ActiveAdmin::Page, :name => "Dashboard"
223
+ end
224
+
225
+ end
226
+
227
+ To view more details about the CanCan API, visit [https://github.com/ryanb/cancan](https://github.com/ryanb/cancan).
228
+
229
+ ## Using the Pundit Adapter
230
+
231
+ Active Admin provides an adapter out of the box also for [Pundit](https://github.com/elabs/pundit).
232
+
233
+ To use the Pundit adapter, simply update the configuration in the Active Admin
234
+ initializer:
235
+
236
+ config.authorization_adapter = ActiveAdmin::PunditAdapter
237
+
238
+ You can simply use Pundit the way that you would expect and Active Admin will use it for authorization. Check Pundit's documentation to [set up Pundit in your application](https://github.com/elabs/pundit#installation). If you want to use batch actions just ensure that `destroy_all?` method is defined in your policy class. You can use this [template policy](spec/support/templates/policies/application_policy.rb) in your application instead of default one generated by Pundit's `rails g pundit:install` command.
239
+
@@ -0,0 +1,359 @@
1
+ # Working with Resources
2
+
3
+ Every Active Admin resource corresponds to a Rails model. So before creating a
4
+ resource you must first create a Rails model for it.
5
+
6
+ ## Create a Resource
7
+
8
+ The basic command for creating a resource is `rails g active_admin:resource Post`.
9
+ The generator will produce an empty `app/admin/post.rb` file like so:
10
+
11
+ ```ruby
12
+ ActiveAdmin.register Post do
13
+ # everything happens here :D
14
+ end
15
+ ```
16
+
17
+ ## Setting up Strong Parameters
18
+
19
+ Rails 4 replaces `attr_accessible` with [Strong Parameters](https://github.com/rails/strong_parameters),
20
+ which moves attribute whitelisting from the model to the controller.
21
+
22
+ Use the `permit_params` method to define which attributes may be changed:
23
+
24
+ ```ruby
25
+ ActiveAdmin.register Post do
26
+ permit_params :title, :content, :publisher_id
27
+ end
28
+ ```
29
+
30
+ For nested associations in your form, this is how you define their attributes:
31
+
32
+ ```ruby
33
+ ActiveAdmin.register Post do
34
+ permit_params :title, :content, :publisher_id,
35
+ tags_attributes: [:id, :name, :description, :_destroy]
36
+ end
37
+
38
+ # Note that `accepts_nested_attributes_for` is still required:
39
+ class Post < ActiveRecord::Base
40
+ accepts_nested_attributes_for :tags, allow_destroy: true
41
+ end
42
+ ```
43
+
44
+ If you want to dynamically choose which attributes can be set, pass a block:
45
+
46
+ ```ruby
47
+ ActiveAdmin.register Post do
48
+ permit_params do
49
+ params = [:title, :content, :publisher_id]
50
+ params.push :author_id if current_user.admin?
51
+ params
52
+ end
53
+ end
54
+ ```
55
+
56
+ ## Disabling Actions on a Resource
57
+
58
+ All CRUD actions are enabled by default. These can be disabled for a given resource:
59
+
60
+ ```ruby
61
+ ActiveAdmin.register Post do
62
+ actions :all, except: [:update, :destroy]
63
+ end
64
+ ```
65
+
66
+ ## Rename the Resource
67
+
68
+ By default, any references to the resource (menu, routes, buttons, etc) in the
69
+ interface will use the name of the class. You can rename the resource by using
70
+ the `:as` option.
71
+
72
+ ```ruby
73
+ ActiveAdmin.register Post, as: "Article"
74
+ ```
75
+
76
+ The resource will then be available at `/admin/articles`.
77
+
78
+ ## Customize the Namespace
79
+
80
+ We use the `admin` namespace by default, but you can use anything:
81
+
82
+ ```ruby
83
+ # Available at /today/posts
84
+ ActiveAdmin.register Post, namespace: :today
85
+
86
+ # Available at /posts
87
+ ActiveAdmin.register Post, namespace: false
88
+ ```
89
+
90
+ ## Customize the Menu
91
+
92
+ The resource will be displayed in the global navigation by default. To disable
93
+ the resource from being displayed in the global navigation:
94
+
95
+ ```ruby
96
+ ActiveAdmin.register Post do
97
+ menu false
98
+ end
99
+ ```
100
+
101
+ The menu method accepts a hash with the following options:
102
+
103
+ * `:label` - The string or proc label to display in the menu. If it's a proc, it
104
+ will be called each time the menu is rendered.
105
+ * `:parent` - The string id (or label) of the parent used for this menu
106
+ * `:if` - A block or a symbol of a method to call to decide if the menu item
107
+ should be displayed
108
+ * `:priority` - The integer value of the priority, which defaults to `10`
109
+
110
+ ### Labels
111
+
112
+ To change the name of the label in the menu:
113
+
114
+ ```ruby
115
+ ActiveAdmin.register Post do
116
+ menu label: "My Posts"
117
+ end
118
+ ```
119
+
120
+ If you want something more dynamic, pass a proc instead:
121
+
122
+ ```ruby
123
+ ActiveAdmin.register Post do
124
+ menu label: proc{ I18n.t "mypost" }
125
+ end
126
+ ```
127
+
128
+ ### Menu Priority
129
+
130
+ Menu items are sorted first by their numeric priority, then alphabetically. Since
131
+ every menu by default has a priority of `10`, the menu is normally alphabetical.
132
+
133
+ You can easily customize this:
134
+
135
+ ```ruby
136
+ ActiveAdmin.register Post do
137
+ menu priority: 1 # so it's on the very left
138
+ end
139
+ ```
140
+
141
+ ### Conditionally Showing / Hiding Menu Items
142
+
143
+ Menu items can be shown or hidden at runtime using the `:if` option.
144
+ ```ruby
145
+ ActiveAdmin.register Post do
146
+ menu if: proc{ current_user.can_edit_posts? }
147
+ end
148
+ ```
149
+
150
+ The proc will be called in the context of the view, so you have access to all
151
+ your helpers and current user session information.
152
+
153
+ ### Drop Down Menus
154
+
155
+ In many cases, a single level navigation will not be enough to manage a large
156
+ application. In that case, you can group your menu items under a parent menu item.
157
+
158
+ ```ruby
159
+ ActiveAdmin.register Post do
160
+ menu parent: "Blog"
161
+ end
162
+ ```
163
+
164
+ Note that the "Blog" parent menu item doesn't even have to exist yet; it can be
165
+ dynamically generated for you.
166
+
167
+ ### Customizing Parent Menu Items
168
+
169
+ All of the options given to a standard menu item are also available to
170
+ parent menu items. In the case of complex parent menu items, you should
171
+ configure them in the Active Admin initializer.
172
+
173
+ ```ruby
174
+ # config/initializers/active_admin.rb
175
+ config.namespace :admin do |admin|
176
+ admin.build_menu do |menu|
177
+ menu.add label: 'Blog', priority: 0
178
+ end
179
+ end
180
+
181
+ # app/admin/post.rb
182
+ ActiveAdmin.register Post do
183
+ menu parent: 'Blog'
184
+ end
185
+ ```
186
+
187
+ ### Dynamic Parent Menu Items
188
+
189
+ While the above works fine, what if you want a parent menu item with a dynamic
190
+ name? Well, you have to refer to it by its `:id`.
191
+
192
+ ```ruby
193
+ # config/initializers/active_admin.rb
194
+ config.namespace :admin do |admin
195
+ admin.build_menu do |menu|
196
+ menu.add id: 'blog', label: proc{"Something dynamic"}, priority: 0
197
+ end
198
+ end
199
+
200
+ # app/admin/post.rb
201
+ ActiveAdmin.register Post do
202
+ menu parent: 'blog'
203
+ end
204
+ ```
205
+
206
+ ### Adding Custom Menu Items
207
+
208
+ Sometimes it's not enough to just customize the menu label. In this case, you
209
+ can customize the menu for the namespace within the Active Admin initializer.
210
+
211
+ ```ruby
212
+ # config/initializers/active_admin.rb
213
+ config.namespace :admin do |admin|
214
+ admin.build_menu do |menu|
215
+ menu.add label: "The Application", url: "/", priority: 0
216
+
217
+ menu.add label: "Sites" do |sites|
218
+ sites.add label: "Google", url: "http://google.com", html_options: { target: :blank }
219
+ sites.add label: "Facebook", url: "http://facebook.com"
220
+ sites.add label: "Github", url: "http://github.com"
221
+ end
222
+ end
223
+ end
224
+ ```
225
+
226
+ This will be registered on application start before your resources are loaded.
227
+
228
+ ## Scoping the queries
229
+
230
+ If your administrators have different access levels, you may sometimes want to
231
+ scope what they have access to. Assuming your User model has the proper
232
+ has_many relationships, you can simply scope the listings and finders like so:
233
+
234
+ ```ruby
235
+ ActiveAdmin.register Post do
236
+ scope_to :current_user # limits the accessible posts to `current_user.posts`
237
+
238
+ # Or if the association doesn't have the default name:
239
+ scope_to :current_user, association_method: :blog_posts
240
+
241
+ # Finally, you can pass a block to be called:
242
+ scope_to do
243
+ User.most_popular_posts
244
+ end
245
+ end
246
+ ```
247
+
248
+ You can also conditionally apply the scope:
249
+
250
+ ```ruby
251
+ ActiveAdmin.register Post do
252
+ scope_to :current_user, if: proc{ current_user.limited_access? }
253
+ scope_to :current_user, unless: proc{ current_user.admin? }
254
+ end
255
+ ```
256
+
257
+ ## Customizing resource retrieval
258
+
259
+ A common way to increase page performance is to elimate N+1 queries by eager loading associations:
260
+
261
+ ```ruby
262
+ ActiveAdmin.register Post do
263
+ controller do
264
+ def scoped_collection
265
+ super.includes :author, :categories
266
+ end
267
+ end
268
+ end
269
+ ```
270
+
271
+ If you need to completely replace the record retrieving code (e.g., you have a custom
272
+ `to_param` implementation in your models), override the `resource` method on the controller:
273
+
274
+ ```ruby
275
+ ActiveAdmin.register Post do
276
+ controller do
277
+ def find_resource
278
+ Post.where(id: params[:id]).first!
279
+ end
280
+ end
281
+ end
282
+ ```
283
+
284
+ Our controllers are built on [Inherited Resources](https://github.com/josevalim/inherited_resources),
285
+ so you can use [all of its features](https://github.com/josevalim/inherited_resources#overwriting-defaults).
286
+
287
+ ## Belongs To
288
+
289
+ It's common to want to scope a series of resources to a relationship. For
290
+ example a Project may have many Milestones and Tickets. To nest the resource
291
+ within another, you can use the `belongs_to` method:
292
+
293
+ ```ruby
294
+ ActiveAdmin.register Project
295
+ ActiveAdmin.register Ticket do
296
+ belongs_to :project
297
+ end
298
+ ```
299
+
300
+ Projects will be available as usual and tickets will be availble by visiting
301
+ `/admin/projects/1/tickets` assuming that a Project with the id of 1 exists.
302
+ Active Admin does not add "Tickets" to the global navigation because the routes
303
+ can only be generated when there is a project id.
304
+
305
+ To create links to the resource, you can add them to a sidebar (one of the many
306
+ possibilities for how you may with to handle your user interface):
307
+
308
+ ```ruby
309
+ ActiveAdmin.register Project do
310
+
311
+ sidebar "Project Details", only: [:show, :edit] do
312
+ ul do
313
+ li link_to "Tickets", admin_project_tickets_path(project)
314
+ li link_to "Milestones", admin_project_milestones_path(project)
315
+ end
316
+ end
317
+ end
318
+
319
+ ActiveAdmin.register Ticket do
320
+ belongs_to :project
321
+ end
322
+
323
+ ActiveAdmin.register Milestone do
324
+ belongs_to :project
325
+ end
326
+ ```
327
+
328
+ In some cases (like Projects), there are many sub resources and you would
329
+ actually like the global navigation to switch when the user navigates "into" a
330
+ project. To accomplish this, Active Admin stores the `belongs_to` resources in a
331
+ seperate menu which you can use if you so wish. To use:
332
+
333
+ ```ruby
334
+ ActiveAdmin.register Ticket do
335
+ belongs_to :project
336
+ navigation_menu :project
337
+ end
338
+
339
+ ActiveAdmin.register Milestone do
340
+ belongs_to :project
341
+ navigation_menu :project
342
+ end
343
+ ```
344
+
345
+ Now, when you navigate to the tickets section, the global navigation will
346
+ only display "Tickets" and "Milestones". When you navigate back to a
347
+ non-belongs_to resource, it will switch back to the default menu.
348
+
349
+ You can also defer the menu lookup until runtime so that you can dynamically show
350
+ different menus, say perhaps based on user permissions. For example:
351
+
352
+ ```ruby
353
+ ActiveAdmin.register Ticket do
354
+ belongs_to: :project
355
+ navigation_menu do
356
+ authorized?(:manage, SomeResource) ? :project : :restricted_menu
357
+ end
358
+ end
359
+ ```