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,10 @@
1
+ module ActiveAdmin
2
+ module Inputs
3
+ class FilterNumericInput < ::Formtastic::Inputs::NumberInput
4
+ include FilterBase
5
+ include FilterBase::SearchMethodSelect
6
+
7
+ filter :equals, :greater_than, :less_than
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,53 @@
1
+ module ActiveAdmin
2
+ module Inputs
3
+ class FilterSelectInput < ::Formtastic::Inputs::SelectInput
4
+ include FilterBase
5
+
6
+ def input_name
7
+ return method if seems_searchable?
8
+
9
+ searchable_method_name.concat multiple? ? '_in' : '_eq'
10
+ end
11
+
12
+ def searchable_method_name
13
+ if searchable_has_many_through?
14
+ "#{reflection.through_reflection.name}_#{reflection.foreign_key}"
15
+ else
16
+ name = method.to_s
17
+ name.concat '_id' if reflection
18
+ name
19
+ end
20
+ end
21
+
22
+ # Provide the AA translation to the blank input field.
23
+ def include_blank
24
+ I18n.t 'active_admin.any' if super
25
+ end
26
+
27
+ # was "#{object_name}[#{association_primary_key}]"
28
+ def input_html_options_name
29
+ "#{object_name}[#{input_name}]"
30
+ end
31
+
32
+ # Would normally return true for has_many and HABTM, which would subsequently
33
+ # cause the select field to be multi-select instead of a dropdown.
34
+ def multiple_by_association?
35
+ false
36
+ end
37
+
38
+ # Provides an efficient default lookup query if the attribute is a DB column.
39
+ def collection
40
+ if !options[:collection] && column
41
+ pluck_column
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ def pluck_column
48
+ klass.reorder("#{method} asc").uniq.pluck method
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,24 @@
1
+ module ActiveAdmin
2
+ module Inputs
3
+ class FilterStringInput < ::Formtastic::Inputs::StringInput
4
+ include FilterBase
5
+ include FilterBase::SearchMethodSelect
6
+
7
+ filter :contains, :equals, :starts_with, :ends_with
8
+
9
+ # If the filter method includes a search condition, build a normal string search field.
10
+ # Else, build a search field with a companion dropdown to choose a search condition from.
11
+ def to_html
12
+ if seems_searchable?
13
+ input_wrapping do
14
+ label_html <<
15
+ builder.text_field(method, input_html_options)
16
+ end
17
+ else
18
+ super # SearchMethodSelect#to_html
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,107 @@
1
+ module ActiveAdmin
2
+
3
+ # Each Namespace builds up it's own menu as the global navigation
4
+ #
5
+ # To build a new menu:
6
+ #
7
+ # menu = Menu.new do |m|
8
+ # m.add label: 'Dashboard', url: '/'
9
+ # m.add label: 'Users', url: '/users'
10
+ # end
11
+ #
12
+ # If you're interested in configuring a menu item, take a look at the
13
+ # options available in `ActiveAdmin::MenuItem`
14
+ #
15
+ class Menu
16
+
17
+ def initialize
18
+ super # MenuNode
19
+ yield(self) if block_given?
20
+ end
21
+
22
+ module MenuNode
23
+ def initialize
24
+ @children = {}
25
+ end
26
+
27
+ def [](id)
28
+ @children[normalize_id(id)]
29
+ end
30
+ def []=(id, child)
31
+ @children[normalize_id(id)] = child
32
+ end
33
+
34
+ # Recursively builds any given menu items. There are two syntaxes supported,
35
+ # as shown in the below examples. Both create an identical menu structure.
36
+ #
37
+ # Example 1:
38
+ # menu = Menu.new
39
+ # menu.add label: 'Dashboard' do |dash|
40
+ # dash.add label: 'My Child Dashboard'
41
+ # end
42
+ #
43
+ # Example 2:
44
+ # menu = Menu.new
45
+ # menu.add label: 'Dashboard'
46
+ # menu.add parent: 'Dashboard', label: 'My Child Dashboard'
47
+ #
48
+ def add(options)
49
+ item = if parent = options.delete(:parent)
50
+ (self[parent] || add(label: parent)).add options
51
+ else
52
+ _add options.merge parent: self
53
+ end
54
+
55
+ yield(item) if block_given?
56
+
57
+ item
58
+ end
59
+
60
+ # Whether any children match the given item.
61
+ def include?(item)
62
+ @children.values.include? item
63
+ end
64
+
65
+ # Used in the UI to visually distinguish which menu item is selected.
66
+ def current?(item)
67
+ self == item || include?(item)
68
+ end
69
+
70
+ # Returns sorted array of menu items that should be displayed in this context.
71
+ # Sorts by priority first, then alphabetically by label if needed.
72
+ def items(context = nil)
73
+ @children.values.select{ |i| i.display?(context) }.sort do |a,b|
74
+ result = a.priority <=> b.priority
75
+ result = a.label(context) <=> b.label(context) if result == 0
76
+ result
77
+ end
78
+ end
79
+
80
+ attr_reader :children
81
+ private
82
+ attr_writer :children
83
+
84
+ # The method that actually adds new menu items. Called by the public method.
85
+ # If this ID is already taken, transfer the children of the existing item to the new item.
86
+ def _add(options)
87
+ item = ActiveAdmin::MenuItem.new(options)
88
+ item.send :children=, self[item.id].children if self[item.id]
89
+ self[item.id] = item
90
+ end
91
+
92
+ def normalize_id(id)
93
+ case id
94
+ when String, Symbol, ActiveModel::Name
95
+ id.to_s.downcase.gsub ' ', '_'
96
+ when ActiveAdmin::Resource::Name
97
+ id.param_key
98
+ else
99
+ raise TypeError, "#{id.class} isn't supported as a Menu ID"
100
+ end
101
+ end
102
+ end
103
+
104
+ include MenuNode
105
+
106
+ end
107
+ end
@@ -0,0 +1,96 @@
1
+ module ActiveAdmin
2
+
3
+ DEFAULT_MENU = :default
4
+
5
+ # A MenuCollection stores multiple menus for any given namespace. Namespaces delegate
6
+ # the addition of menu items to this class.
7
+ class MenuCollection
8
+
9
+ NoMenuError = Class.new(KeyError)
10
+
11
+ def initialize
12
+ @menus = {}
13
+ @build_callbacks = []
14
+ @built = false
15
+ end
16
+
17
+ # Add a new menu item to a menu in the collection
18
+ def add(menu_name, menu_item_options = {})
19
+ menu = find_or_create(menu_name)
20
+
21
+ menu.add menu_item_options
22
+ end
23
+
24
+ def clear!
25
+ @menus = {}
26
+ @built = false
27
+ end
28
+
29
+ def exists?(menu_name)
30
+ @menus.keys.include? menu_name
31
+ end
32
+
33
+ def fetch(menu_name)
34
+ build_menus!
35
+
36
+ @menus[menu_name] or
37
+ raise NoMenuError, "No menu by the name of #{menu_name.inspect} in availble menus: #{@menus.keys.join(", ")}"
38
+ end
39
+
40
+ # Add callbacks that will be run when the menu is going to be built. This
41
+ # helps use with reloading and allows configurations to add items to menus.
42
+ #
43
+ # @param [Proc] block A block which will be ran when the menu is built. The
44
+ # will have the menu collection yielded.
45
+ def on_build(&block)
46
+ @build_callbacks << block
47
+ end
48
+
49
+ # Add callbacks that will be run before the menu is built
50
+ def before_build(&block)
51
+ @build_callbacks.unshift(block)
52
+ end
53
+
54
+ def menu(menu_name)
55
+ menu = find_or_create(menu_name)
56
+
57
+ yield(menu) if block_given?
58
+
59
+ menu
60
+ end
61
+
62
+ private
63
+
64
+ def built?
65
+ @built
66
+ end
67
+
68
+ def build_menus!
69
+ return if built?
70
+
71
+ build_default_menu
72
+ run_on_build_callbacks
73
+
74
+ @built = true
75
+ end
76
+
77
+ def run_on_build_callbacks
78
+ @build_callbacks.each do |callback|
79
+ callback.call(self)
80
+ end
81
+ end
82
+
83
+ def build_default_menu
84
+ find_or_create DEFAULT_MENU
85
+ end
86
+
87
+ def find_or_create(menu_name)
88
+ menu_name ||= DEFAULT_MENU
89
+ @menus[menu_name] ||= ActiveAdmin::Menu.new
90
+ end
91
+
92
+
93
+
94
+ end
95
+
96
+ end
@@ -0,0 +1,97 @@
1
+ require 'active_admin/view_helpers/method_or_proc_helper'
2
+
3
+ module ActiveAdmin
4
+ class MenuItem
5
+ include Menu::MenuNode
6
+ include MethodOrProcHelper
7
+
8
+ attr_reader :html_options, :parent, :priority
9
+
10
+ # Builds a new menu item
11
+ #
12
+ # @param [Hash] options The options for the menu
13
+ #
14
+ # @option options [String, Symbol, Proc] :label
15
+ # The label to display for this menu item.
16
+ # Default: Titleized Resource Name
17
+ #
18
+ # @option options [String] :id
19
+ # A custom id to reference this menu item with.
20
+ # Default: underscored_resource_name
21
+ #
22
+ # @option options [String, Symbol, Proc] :url
23
+ # The URL this item will link to.
24
+ #
25
+ # @option options [Integer] :priority
26
+ # The lower the priority, the earlier in the menu the item will be displayed.
27
+ # Default: 10
28
+ #
29
+ # @option options [Symbol, Proc] :if
30
+ # This decides whether the menu item will be displayed. Evaluated on each request.
31
+ #
32
+ # @option options [Hash] :html_options
33
+ # A hash of options to pass to `link_to` when rendering the item
34
+ #
35
+ # @option [ActiveAdmin::MenuItem] :parent
36
+ # This menu item's parent. It will be displayed nested below its parent.
37
+ #
38
+ # NOTE: for :label, :url, and :if
39
+ # These options are evaluated in the view context at render time. Symbols are called
40
+ # as methods on `self`, and Procs are exec'd within `self`.
41
+ # Here are some examples of what you can do:
42
+ #
43
+ # menu if: :admin?
44
+ # menu url: :new_book_path
45
+ # menu url: :awesome_helper_you_defined
46
+ # menu label: ->{ User.some_method }
47
+ # menu label: ->{ I18n.t 'menus.user' }
48
+ #
49
+ def initialize(options = {})
50
+ super() # MenuNode
51
+ @label = options[:label]
52
+ @dirty_id = options[:id] || options[:label]
53
+ @url = options[:url] || '#'
54
+ @priority = options[:priority] || 10
55
+ @html_options = options[:html_options] || {}
56
+ @should_display = options[:if] || proc{true}
57
+ @parent = options[:parent]
58
+
59
+ yield(self) if block_given? # Builder style syntax
60
+ end
61
+
62
+ def id
63
+ @id ||= normalize_id @dirty_id
64
+ end
65
+
66
+ def label(context = nil)
67
+ render_in_context context, @label
68
+ end
69
+
70
+ def url(context = nil)
71
+ render_in_context context, @url
72
+ end
73
+
74
+ # Don't display if the :if option passed says so
75
+ # Don't display if the link isn't real, we have children, and none of the children are being displayed.
76
+ def display?(context = nil)
77
+ return false unless render_in_context(context, @should_display)
78
+ return false if !real_url?(context) && @children.any? && !items(context).any?
79
+ true
80
+ end
81
+
82
+ # Returns an array of the ancestory of this menu item.
83
+ # The first item is the immediate parent of the item.
84
+ def ancestors
85
+ parent ? [parent, parent.ancestors].flatten : []
86
+ end
87
+
88
+ private
89
+
90
+ # URL is not nil, empty, or '#'
91
+ def real_url?(context = nil)
92
+ url = url context
93
+ url.present? && url != '#'
94
+ end
95
+
96
+ end
97
+ end
@@ -0,0 +1,231 @@
1
+ require 'active_admin/resource_collection'
2
+
3
+ module ActiveAdmin
4
+
5
+ # Namespaces are the basic organizing principle for resources within Active Admin
6
+ #
7
+ # Each resource is registered into a namespace which defines:
8
+ # * the namespaceing for routing
9
+ # * the module to namespace controllers
10
+ # * the menu which gets displayed (other resources in the same namespace)
11
+ #
12
+ # For example:
13
+ #
14
+ # ActiveAdmin.register Post, namespace: :admin
15
+ #
16
+ # Will register the Post model into the "admin" namespace. This will namespace the
17
+ # urls for the resource to "/admin/posts" and will set the controller to
18
+ # Admin::PostsController
19
+ #
20
+ # You can also register to the "root" namespace, which is to say no namespace at all.
21
+ #
22
+ # ActiveAdmin.register Post, namespace: false
23
+ #
24
+ # This will register the resource to an instantiated namespace called :root. The
25
+ # resource will be accessible from "/posts" and the controller will be PostsController.
26
+ #
27
+ class Namespace
28
+ RegisterEvent = 'active_admin.namespace.register'.freeze
29
+
30
+ attr_reader :application, :resources, :name, :menus
31
+
32
+ def initialize(application, name)
33
+ @application = application
34
+ @name = name.to_s.underscore.to_sym
35
+ @resources = ResourceCollection.new
36
+ register_module unless root?
37
+ build_menu_collection
38
+ end
39
+
40
+ # Register a resource into this namespace. The preffered method to access this is to
41
+ # use the global registration ActiveAdmin.register which delegates to the proper
42
+ # namespace instance.
43
+ def register(resource_class, options = {}, &block)
44
+ config = find_or_build_resource(resource_class, options)
45
+
46
+ # Register the resource
47
+ register_resource_controller(config)
48
+ parse_registration_block(config, resource_class, &block) if block_given?
49
+ reset_menu!
50
+
51
+ # Dispatch a registration event
52
+ ActiveAdmin::Event.dispatch ActiveAdmin::Resource::RegisterEvent, config
53
+
54
+ # Return the config
55
+ config
56
+ end
57
+
58
+ def register_page(name, options = {}, &block)
59
+ config = build_page(name, options)
60
+
61
+ # Register the resource
62
+ register_page_controller(config)
63
+ parse_page_registration_block(config, &block) if block_given?
64
+ reset_menu!
65
+
66
+ config
67
+ end
68
+
69
+ def root?
70
+ name == :root
71
+ end
72
+
73
+ # Returns the name of the module if required. Will be nil if none
74
+ # is required.
75
+ #
76
+ # eg:
77
+ # Namespace.new(:admin).module_name # => 'Admin'
78
+ # Namespace.new(:root).module_name # => nil
79
+ #
80
+ def module_name
81
+ return nil if root?
82
+ @module_name ||= name.to_s.camelize
83
+ end
84
+
85
+ # Unload all the registered resources for this namespace
86
+ def unload!
87
+ unload_resources!
88
+ reset_menu!
89
+ end
90
+
91
+ # Returns the first registered ActiveAdmin::Resource instance for a given class
92
+ def resource_for(klass)
93
+ resources[klass]
94
+ end
95
+
96
+ # Override from ActiveAdmin::Settings to inherit default attributes
97
+ # from the application
98
+ def read_default_setting(name)
99
+ application.send(name)
100
+ end
101
+
102
+ def fetch_menu(name)
103
+ @menus.fetch(name)
104
+ end
105
+
106
+ def reset_menu!
107
+ @menus.clear!
108
+ end
109
+
110
+ # Add a callback to be ran when we build the menu
111
+ #
112
+ # @param [Symbol] name The name of the menu. Default: :default
113
+ # @param [Proc] block The block to be ran when the menu is built
114
+ #
115
+ # @returns [void]
116
+ def build_menu(name = DEFAULT_MENU, &block)
117
+ @menus.before_build do |menus|
118
+ menus.menu name do |menu|
119
+ block.call(menu)
120
+ end
121
+ end
122
+ end
123
+
124
+ # The default logout menu item
125
+ #
126
+ # @param [ActiveAdmin::MenuItem] menu The menu to add the logout link to
127
+ # @param [Fixnum] priority The numeric priority for the order in which it appears
128
+ # @param [Hash] html_options An options hash to pass along to link_to
129
+ #
130
+ def add_logout_button_to_menu(menu, priority = 20, html_options = {})
131
+ if logout_link_path
132
+ html_options = html_options.reverse_merge(method: logout_link_method || :get)
133
+ menu.add id: 'logout', priority: priority, html_options: html_options,
134
+ label: ->{ I18n.t 'active_admin.logout' },
135
+ url: ->{ render_or_call_method_or_proc_on self, active_admin_namespace.logout_link_path },
136
+ if: :current_active_admin_user?
137
+ end
138
+ end
139
+
140
+ # The default user session menu item
141
+ #
142
+ # @param [ActiveAdmin::MenuItem] menu The menu to add the logout link to
143
+ # @param [Fixnum] priority The numeric priority for the order in which it appears
144
+ # @param [Hash] html_options An options hash to pass along to link_to
145
+ #
146
+ def add_current_user_to_menu(menu, priority = 10, html_options = {})
147
+ if current_user_method
148
+ menu.add id: 'current_user', priority: priority, html_options: html_options,
149
+ label: ->{ display_name current_active_admin_user },
150
+ url: ->{ auto_url_for(current_active_admin_user) || '#' },
151
+ if: :current_active_admin_user?
152
+ end
153
+ end
154
+
155
+ protected
156
+
157
+ def build_menu_collection
158
+ @menus = MenuCollection.new
159
+
160
+ @menus.on_build do |menus|
161
+ build_default_utility_nav
162
+
163
+ resources.each do |resource|
164
+ resource.add_to_menu(@menus)
165
+ end
166
+ end
167
+ end
168
+
169
+ # Builds the default utility navigation in top right header with current user & logout button
170
+ def build_default_utility_nav
171
+ return if @menus.exists? :utility_navigation
172
+ @menus.menu :utility_navigation do |menu|
173
+ add_current_user_to_menu menu
174
+ add_logout_button_to_menu menu
175
+ end
176
+ end
177
+
178
+ # Either returns an existing Resource instance or builds a new one.
179
+ def find_or_build_resource(resource_class, options)
180
+ resources.add Resource.new(self, resource_class, options)
181
+ end
182
+
183
+ def build_page(name, options)
184
+ resources.add Page.new(self, name, options)
185
+ end
186
+
187
+ # TODO: replace `eval` with `Class.new`
188
+ def register_page_controller(config)
189
+ eval "class ::#{config.controller_name} < ActiveAdmin::PageController; end"
190
+ config.controller.active_admin_config = config
191
+ end
192
+
193
+ def unload_resources!
194
+ resources.each do |resource|
195
+ parent = (module_name || 'Object').constantize
196
+ name = resource.controller_name.split('::').last
197
+ parent.send(:remove_const, name) if parent.const_defined? name
198
+
199
+ # Remove circular references
200
+ resource.controller.active_admin_config = nil
201
+ if resource.is_a?(Resource) && resource.dsl
202
+ resource.dsl.run_registration_block { @config = nil }
203
+ end
204
+ end
205
+ @resources = ResourceCollection.new
206
+ end
207
+
208
+ # Creates a ruby module to namespace all the classes in if required
209
+ def register_module
210
+ unless Object.const_defined? module_name
211
+ Object.const_set module_name, Module.new
212
+ end
213
+ end
214
+
215
+ # TODO replace `eval` with `Class.new`
216
+ def register_resource_controller(config)
217
+ eval "class ::#{config.controller_name} < ActiveAdmin::ResourceController; end"
218
+ config.controller.active_admin_config = config
219
+ end
220
+
221
+ def parse_registration_block(config, resource_class, &block)
222
+ config.dsl = ResourceDSL.new(config, resource_class)
223
+ config.dsl.run_registration_block(&block)
224
+ end
225
+
226
+ def parse_page_registration_block(config, &block)
227
+ PageDSL.new(config).run_registration_block(&block)
228
+ end
229
+
230
+ end
231
+ end