activeadmin-rails 1.7.0

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 (584) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +64 -0
  3. data/.github/ISSUE_TEMPLATE.md +20 -0
  4. data/.github/workflows/ci.yaml +64 -0
  5. data/.github/workflows/daily.yaml +64 -0
  6. data/.github/workflows/pages.yml +72 -0
  7. data/.gitignore +23 -0
  8. data/.mdlrc +1 -0
  9. data/.rubocop.yml +84 -0
  10. data/.simplecov +13 -0
  11. data/.yardopts +7 -0
  12. data/CHANGELOG.md +514 -0
  13. data/CODE_OF_CONDUCT.md +22 -0
  14. data/CONTRIBUTING.md +190 -0
  15. data/Gemfile +51 -0
  16. data/LICENSE +20 -0
  17. data/README.md +84 -0
  18. data/Rakefile +56 -0
  19. data/activeadmin-rails.gemspec +39 -0
  20. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  21. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  22. data/app/assets/images/active_admin/orderable.png +0 -0
  23. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  24. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  25. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  26. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  27. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  28. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  29. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  30. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +59 -0
  31. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  32. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  33. data/app/assets/javascripts/active_admin/lib/has_many.es6 +89 -0
  34. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  35. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  36. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  37. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  38. data/app/assets/stylesheets/active_admin/_forms.scss +338 -0
  39. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  40. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  41. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  42. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
  43. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  44. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  45. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  46. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  47. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  48. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  49. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  50. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  51. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  52. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  53. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  54. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  55. data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
  56. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  57. data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
  58. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +17 -0
  59. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  60. data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
  61. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  62. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  71. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  72. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  73. data/app/assets/stylesheets/active_admin/print.scss +287 -0
  74. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  75. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  76. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  77. data/app/views/active_admin/_head.html.erb +14 -0
  78. data/app/views/active_admin/base/_action_items.html.arb +7 -0
  79. data/app/views/active_admin/base/_breadcrumbs.html.arb +8 -0
  80. data/app/views/active_admin/base/_footer.html.arb +11 -0
  81. data/app/views/active_admin/base/_header.html.arb +5 -0
  82. data/app/views/active_admin/base/_sidebar.html.arb +3 -0
  83. data/app/views/active_admin/base/_title_bar.html.arb +9 -0
  84. data/app/views/active_admin/base/_unsupported_browser.html.erb +5 -0
  85. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  86. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  87. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  88. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  89. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  90. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  91. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  92. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  93. data/app/views/active_admin/devise/shared/_links.erb +33 -0
  94. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  95. data/app/views/active_admin/page/_content.html.arb +1 -0
  96. data/app/views/active_admin/page/index.html.arb +8 -0
  97. data/app/views/active_admin/resource/_filters_form.html.erb +1 -0
  98. data/app/views/active_admin/resource/_form.html.arb +11 -0
  99. data/app/views/active_admin/resource/_index_as_table.html.arb +8 -0
  100. data/app/views/active_admin/resource/_show.html.arb +1 -0
  101. data/app/views/active_admin/resource/edit.html.arb +13 -0
  102. data/app/views/active_admin/resource/index.html.arb +101 -0
  103. data/app/views/active_admin/resource/new.html.arb +13 -0
  104. data/app/views/active_admin/resource/show.html.arb +22 -0
  105. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  106. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  107. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  108. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  109. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  110. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  111. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  112. data/app/views/layouts/active_admin.html.erb +33 -0
  113. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  114. data/codecov.yml +25 -0
  115. data/config/i18n-tasks.yml +26 -0
  116. data/config/locales/ar.yml +133 -0
  117. data/config/locales/bg.yml +118 -0
  118. data/config/locales/bs.yml +119 -0
  119. data/config/locales/ca.yml +104 -0
  120. data/config/locales/cs.yml +107 -0
  121. data/config/locales/da.yml +135 -0
  122. data/config/locales/de-CH.yml +99 -0
  123. data/config/locales/de.yml +142 -0
  124. data/config/locales/el.yml +124 -0
  125. data/config/locales/en-CA.yml +137 -0
  126. data/config/locales/en-GB.yml +137 -0
  127. data/config/locales/en.yml +160 -0
  128. data/config/locales/eo.yml +143 -0
  129. data/config/locales/es-MX.yml +94 -0
  130. data/config/locales/es.yml +160 -0
  131. data/config/locales/fa.yml +117 -0
  132. data/config/locales/fi.yml +110 -0
  133. data/config/locales/fr.yml +139 -0
  134. data/config/locales/he.yml +140 -0
  135. data/config/locales/hr.yml +121 -0
  136. data/config/locales/hu.yml +96 -0
  137. data/config/locales/id.yml +133 -0
  138. data/config/locales/it.yml +142 -0
  139. data/config/locales/ja.yml +139 -0
  140. data/config/locales/ko.yml +118 -0
  141. data/config/locales/lt.yml +140 -0
  142. data/config/locales/lv.yml +90 -0
  143. data/config/locales/nb.yml +128 -0
  144. data/config/locales/nl.yml +142 -0
  145. data/config/locales/pl.yml +166 -0
  146. data/config/locales/pt-BR.yml +141 -0
  147. data/config/locales/pt-PT.yml +90 -0
  148. data/config/locales/ro.yml +94 -0
  149. data/config/locales/ru.yml +139 -0
  150. data/config/locales/sk.yml +107 -0
  151. data/config/locales/sv-SE.yml +133 -0
  152. data/config/locales/tr.yml +142 -0
  153. data/config/locales/uk.yml +134 -0
  154. data/config/locales/vi.yml +132 -0
  155. data/config/locales/zh-CN.yml +141 -0
  156. data/config/locales/zh-TW.yml +133 -0
  157. data/config/mdl_style.rb +9 -0
  158. data/cucumber.yml +6 -0
  159. data/docs/0-installation.md +121 -0
  160. data/docs/1-general-configuration.md +207 -0
  161. data/docs/10-custom-pages.md +148 -0
  162. data/docs/11-decorators.md +66 -0
  163. data/docs/12-arbo-components.md +200 -0
  164. data/docs/13-authorization-adapter.md +288 -0
  165. data/docs/14-gotchas.md +141 -0
  166. data/docs/2-resource-customization.md +480 -0
  167. data/docs/3-index-pages/custom-index.md +39 -0
  168. data/docs/3-index-pages/index-as-block.md +23 -0
  169. data/docs/3-index-pages/index-as-blog.md +73 -0
  170. data/docs/3-index-pages/index-as-grid.md +31 -0
  171. data/docs/3-index-pages/index-as-table.md +259 -0
  172. data/docs/3-index-pages.md +349 -0
  173. data/docs/4-csv-format.md +86 -0
  174. data/docs/5-forms.md +233 -0
  175. data/docs/6-show-pages.md +61 -0
  176. data/docs/7-sidebars.md +63 -0
  177. data/docs/8-custom-actions.md +160 -0
  178. data/docs/9-batch-actions.md +248 -0
  179. data/docs/CNAME +1 -0
  180. data/docs/Gemfile +7 -0
  181. data/docs/README.md +24 -0
  182. data/docs/_config.yml +15 -0
  183. data/docs/_includes/nav_footer_custom.html +3 -0
  184. data/docs/documentation.md +61 -0
  185. data/docs/images/activeadmin.png +0 -0
  186. data/docs/images/divider.png +0 -0
  187. data/docs/images/features.png +0 -0
  188. data/docs/index.css +835 -0
  189. data/docs/index.html +105 -0
  190. data/features/action_item.feature +73 -0
  191. data/features/authorization.feature +64 -0
  192. data/features/authorization_cancan.feature +52 -0
  193. data/features/authorization_pundit.feature +37 -0
  194. data/features/belongs_to.feature +124 -0
  195. data/features/breadcrumb.feature +76 -0
  196. data/features/comments/commenting.feature +178 -0
  197. data/features/comments/viewing_index.feature +18 -0
  198. data/features/create_another.feature +55 -0
  199. data/features/dashboard.feature +16 -0
  200. data/features/decorators.feature +43 -0
  201. data/features/development_reloading.feature +28 -0
  202. data/features/edit_page.feature +116 -0
  203. data/features/favicon.feature +20 -0
  204. data/features/filter_attributes.feature +46 -0
  205. data/features/first_boot.feature +16 -0
  206. data/features/footer.feature +29 -0
  207. data/features/global_navigation.feature +29 -0
  208. data/features/i18n.feature +55 -0
  209. data/features/index/batch_actions.feature +218 -0
  210. data/features/index/filters.feature +251 -0
  211. data/features/index/format_as_csv.feature +273 -0
  212. data/features/index/formats.feature +88 -0
  213. data/features/index/index_as_block.feature +15 -0
  214. data/features/index/index_as_blog.feature +69 -0
  215. data/features/index/index_as_grid.feature +45 -0
  216. data/features/index/index_as_table.feature +291 -0
  217. data/features/index/index_blank_slate.feature +83 -0
  218. data/features/index/index_parameters.feature +75 -0
  219. data/features/index/index_scope_to.feature +56 -0
  220. data/features/index/index_scopes.feature +325 -0
  221. data/features/index/page_title.feature +41 -0
  222. data/features/index/pagination.feature +63 -0
  223. data/features/index/switch_index_view.feature +73 -0
  224. data/features/menu.feature +85 -0
  225. data/features/meta_tags.feature +21 -0
  226. data/features/new_page.feature +136 -0
  227. data/features/registering_assets.feature +34 -0
  228. data/features/registering_pages.feature +237 -0
  229. data/features/registering_resources.feature +33 -0
  230. data/features/renamed_resource.feature +29 -0
  231. data/features/root_to.feature +18 -0
  232. data/features/show/attributes_table_title.feature +54 -0
  233. data/features/show/columns.feature +40 -0
  234. data/features/show/default_content.feature +44 -0
  235. data/features/show/page_title.feature +58 -0
  236. data/features/show/tabs.feature +47 -0
  237. data/features/sidebar_sections.feature +210 -0
  238. data/features/site_title.feature +47 -0
  239. data/features/specifying_actions.feature +118 -0
  240. data/features/step_definitions/action_item_steps.rb +7 -0
  241. data/features/step_definitions/action_link_steps.rb +19 -0
  242. data/features/step_definitions/additional_web_steps.rb +81 -0
  243. data/features/step_definitions/asset_steps.rb +15 -0
  244. data/features/step_definitions/attribute_steps.rb +18 -0
  245. data/features/step_definitions/attributes_table_title_steps.rb +11 -0
  246. data/features/step_definitions/batch_action_steps.rb +78 -0
  247. data/features/step_definitions/blog_steps.rb +3 -0
  248. data/features/step_definitions/breadcrumb_steps.rb +13 -0
  249. data/features/step_definitions/column_steps.rb +8 -0
  250. data/features/step_definitions/comment_steps.rb +32 -0
  251. data/features/step_definitions/configuration_steps.rb +102 -0
  252. data/features/step_definitions/dashboard_steps.rb +15 -0
  253. data/features/step_definitions/factory_steps.rb +35 -0
  254. data/features/step_definitions/filter_steps.rb +57 -0
  255. data/features/step_definitions/flash_steps.rb +11 -0
  256. data/features/step_definitions/footer_steps.rb +21 -0
  257. data/features/step_definitions/format_steps.rb +60 -0
  258. data/features/step_definitions/i18n_steps.rb +11 -0
  259. data/features/step_definitions/index_scope_steps.rb +42 -0
  260. data/features/step_definitions/index_views_steps.rb +3 -0
  261. data/features/step_definitions/layout_steps.rb +3 -0
  262. data/features/step_definitions/member_link_steps.rb +7 -0
  263. data/features/step_definitions/menu_steps.rb +11 -0
  264. data/features/step_definitions/meta_tag_steps.rb +3 -0
  265. data/features/step_definitions/pagination_steps.rb +15 -0
  266. data/features/step_definitions/root_steps.rb +9 -0
  267. data/features/step_definitions/sidebar_steps.rb +11 -0
  268. data/features/step_definitions/site_title_steps.rb +31 -0
  269. data/features/step_definitions/tab_steps.rb +17 -0
  270. data/features/step_definitions/table_steps.rb +116 -0
  271. data/features/step_definitions/user_steps.rb +52 -0
  272. data/features/step_definitions/web_steps.rb +86 -0
  273. data/features/sti_resource.feature +65 -0
  274. data/features/strong_parameters.feature +69 -0
  275. data/features/support/env.rb +129 -0
  276. data/features/support/paths.rb +75 -0
  277. data/features/support/regular_env.rb +7 -0
  278. data/features/support/reload_env.rb +7 -0
  279. data/features/support/selectors.rb +45 -0
  280. data/features/users/logging_in.feature +32 -0
  281. data/features/users/logging_out.feature +29 -0
  282. data/features/users/resetting_password.feature +30 -0
  283. data/gemfiles/rails_42.gemfile +12 -0
  284. data/gemfiles/rails_52.gemfile +15 -0
  285. data/gemfiles/rails_60.gemfile +16 -0
  286. data/gemfiles/rails_61.gemfile +15 -0
  287. data/gemfiles/rails_61_turbolinks.gemfile +15 -0
  288. data/gemfiles/rails_70.gemfile +15 -0
  289. data/gemfiles/rails_70_hotwire.gemfile +15 -0
  290. data/gemfiles/rails_71.gemfile +17 -0
  291. data/lib/active_admin/abstract_view_factory.rb +47 -0
  292. data/lib/active_admin/application.rb +255 -0
  293. data/lib/active_admin/application_settings.rb +42 -0
  294. data/lib/active_admin/asset_registration.rb +29 -0
  295. data/lib/active_admin/authorization_adapter.rb +129 -0
  296. data/lib/active_admin/base_controller/authorization.rb +126 -0
  297. data/lib/active_admin/base_controller/menu.rb +34 -0
  298. data/lib/active_admin/base_controller.rb +91 -0
  299. data/lib/active_admin/batch_actions/controller.rb +45 -0
  300. data/lib/active_admin/batch_actions/resource_extension.rb +151 -0
  301. data/lib/active_admin/batch_actions/views/batch_action_form.rb +45 -0
  302. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  303. data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
  304. data/lib/active_admin/batch_actions.rb +16 -0
  305. data/lib/active_admin/callbacks.rb +88 -0
  306. data/lib/active_admin/cancan_adapter.rb +36 -0
  307. data/lib/active_admin/component.rb +5 -0
  308. data/lib/active_admin/controller_action.rb +12 -0
  309. data/lib/active_admin/csv_builder.rb +136 -0
  310. data/lib/active_admin/dependency.rb +96 -0
  311. data/lib/active_admin/deprecation.rb +10 -0
  312. data/lib/active_admin/devise.rb +80 -0
  313. data/lib/active_admin/dsl.rb +193 -0
  314. data/lib/active_admin/dynamic_setting.rb +38 -0
  315. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  316. data/lib/active_admin/engine.rb +22 -0
  317. data/lib/active_admin/error.rb +62 -0
  318. data/lib/active_admin/event.rb +24 -0
  319. data/lib/active_admin/filters/active.rb +29 -0
  320. data/lib/active_admin/filters/active_filter.rb +123 -0
  321. data/lib/active_admin/filters/active_sidebar.rb +50 -0
  322. data/lib/active_admin/filters/dsl.rb +21 -0
  323. data/lib/active_admin/filters/forms.rb +85 -0
  324. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  325. data/lib/active_admin/filters/resource_extension.rb +153 -0
  326. data/lib/active_admin/filters.rb +11 -0
  327. data/lib/active_admin/form_builder.rb +182 -0
  328. data/lib/active_admin/generators/boilerplate.rb +45 -0
  329. data/lib/active_admin/helpers/collection.rb +19 -0
  330. data/lib/active_admin/helpers/i18n.rb +7 -0
  331. data/lib/active_admin/helpers/optional_display.rb +38 -0
  332. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  333. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  334. data/lib/active_admin/inputs/datepicker_input.rb +27 -0
  335. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  336. data/lib/active_admin/inputs/filters/base.rb +44 -0
  337. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  338. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  339. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  340. data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
  341. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  342. data/lib/active_admin/inputs/filters/select_input.rb +58 -0
  343. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  344. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  345. data/lib/active_admin/inputs.rb +21 -0
  346. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  347. data/lib/active_admin/localizers.rb +11 -0
  348. data/lib/active_admin/menu.rb +106 -0
  349. data/lib/active_admin/menu_collection.rb +55 -0
  350. data/lib/active_admin/menu_item.rb +79 -0
  351. data/lib/active_admin/namespace.rb +325 -0
  352. data/lib/active_admin/namespace_settings.rb +107 -0
  353. data/lib/active_admin/order_clause.rb +48 -0
  354. data/lib/active_admin/orm/active_record/comments/comment.rb +35 -0
  355. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  356. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  357. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +95 -0
  358. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  359. data/lib/active_admin/orm/active_record/comments.rb +99 -0
  360. data/lib/active_admin/orm/active_record.rb +5 -0
  361. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  362. data/lib/active_admin/orm/mongoid.rb +1 -0
  363. data/lib/active_admin/page.rb +114 -0
  364. data/lib/active_admin/page_controller.rb +29 -0
  365. data/lib/active_admin/page_dsl.rb +35 -0
  366. data/lib/active_admin/page_presenter.rb +32 -0
  367. data/lib/active_admin/pundit_adapter.rb +68 -0
  368. data/lib/active_admin/resource/action_items.rb +120 -0
  369. data/lib/active_admin/resource/attributes.rb +47 -0
  370. data/lib/active_admin/resource/belongs_to.rb +48 -0
  371. data/lib/active_admin/resource/controllers.rb +19 -0
  372. data/lib/active_admin/resource/includes.rb +12 -0
  373. data/lib/active_admin/resource/menu.rb +65 -0
  374. data/lib/active_admin/resource/naming.rb +62 -0
  375. data/lib/active_admin/resource/ordering.rb +11 -0
  376. data/lib/active_admin/resource/page_presenters.rb +90 -0
  377. data/lib/active_admin/resource/pagination.rb +23 -0
  378. data/lib/active_admin/resource/routes.rb +134 -0
  379. data/lib/active_admin/resource/scope_to.rb +74 -0
  380. data/lib/active_admin/resource/scopes.rb +52 -0
  381. data/lib/active_admin/resource/sidebars.rb +32 -0
  382. data/lib/active_admin/resource.rb +215 -0
  383. data/lib/active_admin/resource_collection.rb +72 -0
  384. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  385. data/lib/active_admin/resource_controller/data_access.rb +341 -0
  386. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  387. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  388. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  389. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  390. data/lib/active_admin/resource_controller/streaming.rb +47 -0
  391. data/lib/active_admin/resource_controller.rb +116 -0
  392. data/lib/active_admin/resource_dsl.rb +221 -0
  393. data/lib/active_admin/router.rb +113 -0
  394. data/lib/active_admin/scope.rb +60 -0
  395. data/lib/active_admin/settings_node.rb +19 -0
  396. data/lib/active_admin/sidebar_section.rb +37 -0
  397. data/lib/active_admin/version.rb +3 -0
  398. data/lib/active_admin/view_factory.rb +10 -0
  399. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  400. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  401. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +52 -0
  402. data/lib/active_admin/view_helpers/display_helper.rb +95 -0
  403. data/lib/active_admin/view_helpers/download_format_links_helper.rb +58 -0
  404. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  405. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  406. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  407. data/lib/active_admin/view_helpers/layout_helper.rb +32 -0
  408. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  409. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  410. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  411. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  412. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  413. data/lib/active_admin/view_helpers.rb +21 -0
  414. data/lib/active_admin/views/components/action_link.rb +13 -0
  415. data/lib/active_admin/views/components/active_admin_form.rb +163 -0
  416. data/lib/active_admin/views/components/attributes_panel.rb +23 -0
  417. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  418. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  419. data/lib/active_admin/views/components/columns.rb +161 -0
  420. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  421. data/lib/active_admin/views/components/index_list.rb +69 -0
  422. data/lib/active_admin/views/components/menu.rb +32 -0
  423. data/lib/active_admin/views/components/menu_item.rb +58 -0
  424. data/lib/active_admin/views/components/paginated_collection.rb +159 -0
  425. data/lib/active_admin/views/components/panel.rb +38 -0
  426. data/lib/active_admin/views/components/scopes.rb +72 -0
  427. data/lib/active_admin/views/components/sidebar_section.rb +34 -0
  428. data/lib/active_admin/views/components/site_title.rb +28 -0
  429. data/lib/active_admin/views/components/status_tag.rb +88 -0
  430. data/lib/active_admin/views/components/table_for.rb +209 -0
  431. data/lib/active_admin/views/components/tabs.rb +40 -0
  432. data/lib/active_admin/views/index_as_block.rb +36 -0
  433. data/lib/active_admin/views/index_as_blog.rb +155 -0
  434. data/lib/active_admin/views/index_as_grid.rb +80 -0
  435. data/lib/active_admin/views/index_as_table.rb +377 -0
  436. data/lib/active_admin/views.rb +8 -0
  437. data/lib/active_admin.rb +132 -0
  438. data/lib/activeadmin-rails.rb +1 -0
  439. data/lib/bug_report_templates/active_admin_main.rb +110 -0
  440. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  441. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  442. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  443. data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
  444. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  445. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +300 -0
  446. data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
  447. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  448. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +16 -0
  449. data/lib/generators/active_admin/page/USAGE +8 -0
  450. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  451. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  452. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  453. data/lib/generators/active_admin/resource/templates/admin.rb.erb +6 -0
  454. data/lib/ransack_ext.rb +20 -0
  455. data/spec/bug_report_templates_spec.rb +28 -0
  456. data/spec/changelog_spec.rb +15 -0
  457. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  458. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  459. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  460. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  461. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  462. data/spec/javascripts/support/jasmine.yml +74 -0
  463. data/spec/javascripts/support/jasmine_runner.rb +19 -0
  464. data/spec/rails_helper.rb +67 -0
  465. data/spec/requests/default_namespace_spec.rb +81 -0
  466. data/spec/requests/memory_spec.rb +25 -0
  467. data/spec/requests/pages/form_spec.rb +73 -0
  468. data/spec/requests/pages/index_spec.rb +96 -0
  469. data/spec/requests/pages/layout_spec.rb +59 -0
  470. data/spec/requests/pages/show_spec.rb +38 -0
  471. data/spec/requests/stylesheets_spec.rb +18 -0
  472. data/spec/spec_helper.rb +1 -0
  473. data/spec/support/active_admin_integration_spec_helper.rb +79 -0
  474. data/spec/support/active_admin_request_helpers.rb +39 -0
  475. data/spec/support/rails_template.rb +224 -0
  476. data/spec/support/rails_template_with_data.rb +328 -0
  477. data/spec/support/templates/admin/stores.rb +7 -0
  478. data/spec/support/templates/en.yml +8 -0
  479. data/spec/support/templates/manifest.js +3 -0
  480. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  481. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  482. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  483. data/spec/support/templates/policies/application_policy.rb +44 -0
  484. data/spec/support/templates/policies/category_policy.rb +7 -0
  485. data/spec/support/templates/policies/post_policy.rb +15 -0
  486. data/spec/support/templates/policies/store_policy.rb +11 -0
  487. data/spec/support/templates/policies/user_policy.rb +11 -0
  488. data/spec/support/templates/post_decorator.rb +24 -0
  489. data/spec/unit/abstract_view_factory_spec.rb +78 -0
  490. data/spec/unit/action_builder_spec.rb +160 -0
  491. data/spec/unit/active_admin_spec.rb +11 -0
  492. data/spec/unit/application_spec.rb +180 -0
  493. data/spec/unit/asset_registration_spec.rb +52 -0
  494. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  495. data/spec/unit/authorization/controller_authorization_spec.rb +43 -0
  496. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  497. data/spec/unit/auto_link_spec.rb +103 -0
  498. data/spec/unit/batch_actions/resource_spec.rb +84 -0
  499. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  500. data/spec/unit/belongs_to_spec.rb +76 -0
  501. data/spec/unit/cancan_adapter_spec.rb +43 -0
  502. data/spec/unit/comments_spec.rb +204 -0
  503. data/spec/unit/component_spec.rb +18 -0
  504. data/spec/unit/config_shared_examples.rb +59 -0
  505. data/spec/unit/controller_filters_spec.rb +41 -0
  506. data/spec/unit/csv_builder_spec.rb +321 -0
  507. data/spec/unit/dependency_spec.rb +135 -0
  508. data/spec/unit/devise_spec.rb +110 -0
  509. data/spec/unit/dsl_spec.rb +120 -0
  510. data/spec/unit/dynamic_settings_spec.rb +28 -0
  511. data/spec/unit/filters/active_filter_spec.rb +222 -0
  512. data/spec/unit/filters/active_spec.rb +24 -0
  513. data/spec/unit/filters/filter_form_builder_spec.rb +524 -0
  514. data/spec/unit/filters/resource_spec.rb +128 -0
  515. data/spec/unit/form_builder_spec.rb +1013 -0
  516. data/spec/unit/generators/install_spec.rb +31 -0
  517. data/spec/unit/helpers/collection_spec.rb +68 -0
  518. data/spec/unit/helpers/scope_chain_spec.rb +35 -0
  519. data/spec/unit/i18n_spec.rb +29 -0
  520. data/spec/unit/localizers/resource_localizer_spec.rb +36 -0
  521. data/spec/unit/menu_collection_spec.rb +40 -0
  522. data/spec/unit/menu_item_spec.rb +82 -0
  523. data/spec/unit/menu_spec.rb +60 -0
  524. data/spec/unit/namespace/authorization_spec.rb +27 -0
  525. data/spec/unit/namespace/register_page_spec.rb +99 -0
  526. data/spec/unit/namespace/register_resource_spec.rb +162 -0
  527. data/spec/unit/namespace_spec.rb +132 -0
  528. data/spec/unit/order_clause_spec.rb +81 -0
  529. data/spec/unit/page_controller_spec.rb +5 -0
  530. data/spec/unit/page_spec.rb +128 -0
  531. data/spec/unit/pretty_format_spec.rb +133 -0
  532. data/spec/unit/pundit_adapter_spec.rb +98 -0
  533. data/spec/unit/resource/action_items_spec.rb +83 -0
  534. data/spec/unit/resource/attributes_spec.rb +56 -0
  535. data/spec/unit/resource/includes_spec.rb +21 -0
  536. data/spec/unit/resource/menu_spec.rb +18 -0
  537. data/spec/unit/resource/naming_spec.rb +120 -0
  538. data/spec/unit/resource/ordering_spec.rb +35 -0
  539. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  540. data/spec/unit/resource/pagination_spec.rb +38 -0
  541. data/spec/unit/resource/routes_spec.rb +125 -0
  542. data/spec/unit/resource/scopes_spec.rb +50 -0
  543. data/spec/unit/resource/sidebars_spec.rb +43 -0
  544. data/spec/unit/resource_collection_spec.rb +175 -0
  545. data/spec/unit/resource_controller/data_access_spec.rb +234 -0
  546. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  547. data/spec/unit/resource_controller/sidebars_spec.rb +37 -0
  548. data/spec/unit/resource_controller_spec.rb +290 -0
  549. data/spec/unit/resource_registration_spec.rb +61 -0
  550. data/spec/unit/resource_spec.rb +320 -0
  551. data/spec/unit/routing_spec.rb +211 -0
  552. data/spec/unit/scope_spec.rb +225 -0
  553. data/spec/unit/settings_node_spec.rb +26 -0
  554. data/spec/unit/view_factory_spec.rb +13 -0
  555. data/spec/unit/view_helpers/breadcrumbs_spec.rb +255 -0
  556. data/spec/unit/view_helpers/display_helper_spec.rb +203 -0
  557. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  558. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  559. data/spec/unit/view_helpers/flash_helper_spec.rb +24 -0
  560. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  561. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +138 -0
  562. data/spec/unit/views/components/attributes_table_spec.rb +271 -0
  563. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  564. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  565. data/spec/unit/views/components/columns_spec.rb +187 -0
  566. data/spec/unit/views/components/index_list_spec.rb +49 -0
  567. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  568. data/spec/unit/views/components/menu_item_spec.rb +29 -0
  569. data/spec/unit/views/components/menu_spec.rb +168 -0
  570. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  571. data/spec/unit/views/components/panel_spec.rb +58 -0
  572. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  573. data/spec/unit/views/components/site_title_spec.rb +82 -0
  574. data/spec/unit/views/components/status_tag_spec.rb +265 -0
  575. data/spec/unit/views/components/table_for_spec.rb +441 -0
  576. data/spec/unit/views/components/tabs_spec.rb +99 -0
  577. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  578. data/tasks/docs.rake +64 -0
  579. data/tasks/lint.rake +21 -0
  580. data/tasks/local.rake +25 -0
  581. data/tasks/parallel_tests.rake +66 -0
  582. data/tasks/test.rake +24 -0
  583. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  584. metadata +1012 -0
@@ -0,0 +1,62 @@
1
+ module ActiveAdmin
2
+ # Exception class to raise when there is an authorized access
3
+ # exception thrown. The exception has a few goodies that may
4
+ # be useful for capturing / recognizing security issues.
5
+ class AccessDenied < StandardError
6
+ attr_reader :user, :action, :subject
7
+
8
+ def initialize(user, action, subject = nil)
9
+ @user, @action, @subject = user, action, subject
10
+
11
+ super()
12
+ end
13
+
14
+ def message
15
+ I18n.t("active_admin.access_denied.message")
16
+ end
17
+ end
18
+
19
+ class Error < RuntimeError
20
+ end
21
+
22
+ class ErrorLoading < Error
23
+ # Locates the most recent file and line from the caught exception's backtrace.
24
+ def find_cause(folder, backtrace)
25
+ backtrace.grep(/\/(#{folder}\/.*\.rb):(\d+)/){ [$1, $2] }.first
26
+ end
27
+ end
28
+
29
+ class DatabaseHitDuringLoad < ErrorLoading
30
+ def initialize(exception)
31
+ file, line = find_cause(:app, exception.backtrace)
32
+
33
+ super "Your file, #{file} (line #{line}), caused a database error while Active Admin was loading. This " +
34
+ "is most common when your database is missing or doesn't have the latest migrations applied. To " +
35
+ "prevent this error, move the code to a place where it will only be run when a page is rendered. " +
36
+ "One solution can be, to wrap the query in a Proc. " +
37
+ "Original error message: #{exception.message}"
38
+ end
39
+
40
+ def self.capture
41
+ yield
42
+ rescue *database_error_classes => exception
43
+ raise new exception
44
+ end
45
+
46
+ private
47
+
48
+ def self.database_error_classes
49
+ @classes ||= []
50
+ end
51
+ end
52
+
53
+ class DependencyError < ErrorLoading
54
+ end
55
+
56
+ class NoMenuError < KeyError
57
+ end
58
+
59
+ class GeneratorError < Error
60
+ end
61
+
62
+ end
@@ -0,0 +1,24 @@
1
+ module ActiveAdmin
2
+
3
+ class EventDispatcher
4
+ def subscribe(*event_names, &block)
5
+ Deprecation.warn "`ActiveAdmin::Event.subscribe` is deprecated, use `ActiveSupport::Notifications.subscribe`"
6
+ event_names.each do |event|
7
+ ActiveSupport::Notifications.subscribe event,
8
+ &wrap_block_for_active_support_notifications(block)
9
+ end
10
+ end
11
+
12
+ def dispatch(event, *args)
13
+ Deprecation.warn "`ActiveAdmin::Event.dispatch` is deprecated, use `ActiveSupport::Notifications.publish`"
14
+ ActiveSupport::Notifications.publish event, *args
15
+ end
16
+
17
+ def wrap_block_for_active_support_notifications block
18
+ proc { |event, *args| block.call *args }
19
+ end
20
+ end
21
+
22
+ # ActiveAdmin::Event is set to a dispatcher
23
+ Event = EventDispatcher.new
24
+ end
@@ -0,0 +1,29 @@
1
+ require 'active_admin/filters/active_filter'
2
+
3
+ module ActiveAdmin
4
+ module Filters
5
+
6
+ class Active
7
+ attr_accessor :filters, :resource
8
+
9
+ # Instantiate a `Active` object containing collection of current active filters
10
+
11
+ # @param resource [ActiveAdmin::Resource] current resource
12
+ # @param search [Ransack::Search] search object
13
+ #
14
+ # @see ActiveAdmin::ResourceController::DataAcces#apply_filtering
15
+ def initialize(resource, search)
16
+ @resource = resource
17
+ @filters = build_filters(search.conditions)
18
+ end
19
+
20
+ private
21
+
22
+ def build_filters(conditions)
23
+ conditions.map { |condition| ActiveFilter.new(resource, condition.dup) }
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,123 @@
1
+ module ActiveAdmin
2
+ module Filters
3
+
4
+ class ActiveFilter
5
+ include ActiveAdmin::ViewHelpers
6
+
7
+ attr_reader :resource, :condition, :related_class
8
+
9
+ # Instantiate a `ActiveFilter`
10
+ #
11
+ # @param resource [ActiveAdmin::Resource] current resource
12
+ # @param condition [Ransack::Nodes::Condition] applied ransack condition
13
+ def initialize(resource, condition)
14
+ @resource = resource
15
+ @condition = condition
16
+ @related_class = find_class if find_class?
17
+ end
18
+
19
+ def values
20
+ condition_values = condition.values.map(&:value)
21
+ if related_class
22
+ related_class.where(related_primary_key => condition_values)
23
+ else
24
+ condition_values
25
+ end
26
+ end
27
+
28
+ def label
29
+ # TODO: to remind us to go back to the simpler str.downcase once we support ruby >= 2.4 only.
30
+ translated_predicate = predicate_name.mb_chars.downcase.to_s
31
+ if filter_label
32
+ "#{filter_label} #{translated_predicate}"
33
+ elsif related_class
34
+ "#{related_class_name} #{translated_predicate}"
35
+ else
36
+ "#{attribute_name} #{translated_predicate}"
37
+ end.strip
38
+ end
39
+
40
+ def predicate_name
41
+ I18n.t("active_admin.filters.predicates.#{condition.predicate.name}",
42
+ default: ransack_predicate_name)
43
+ end
44
+
45
+ def html_options
46
+ { class: "current_filter current_filter_#{condition.key}" }
47
+ end
48
+
49
+ private
50
+
51
+ def resource_class
52
+ resource.resource_class
53
+ end
54
+
55
+ def attribute_name
56
+ resource_class.human_attribute_name(name)
57
+ end
58
+
59
+ def related_class_name
60
+ return unless related_class
61
+
62
+ related_class.model_name.human
63
+ end
64
+
65
+ def filter_label
66
+ return unless filter
67
+
68
+ filter[:label]
69
+ end
70
+
71
+ #@return Ransack::Nodes::Attribute
72
+ def condition_attribute
73
+ condition.attributes[0]
74
+ end
75
+
76
+ def name
77
+ condition_attribute.attr_name
78
+ end
79
+
80
+ def ransack_predicate_name
81
+ Ransack::Translate.predicate(condition.predicate.name)
82
+ end
83
+
84
+ def find_class?
85
+ ['eq', 'in'].include? condition.predicate.arel_predicate
86
+ end
87
+
88
+ # detect related class for Ransack::Nodes::Attribute
89
+ def find_class
90
+ if condition_attribute.klass != resource_class && condition_attribute.klass.primary_key == name.to_s
91
+ condition_attribute.klass
92
+ elsif predicate_association
93
+ predicate_association.klass
94
+ end
95
+ end
96
+
97
+ def filter
98
+ resource.filters[name.to_sym]
99
+ end
100
+
101
+ def related_primary_key
102
+ if predicate_association
103
+ predicate_association.association_primary_key
104
+ elsif related_class
105
+ related_class.primary_key
106
+ end
107
+ end
108
+
109
+ def predicate_association
110
+ @predicate_association = find_predicate_association unless defined?(@predicate_association)
111
+ @predicate_association
112
+ end
113
+
114
+ private
115
+
116
+ def find_predicate_association
117
+ condition_attribute.klass.reflect_on_all_associations.
118
+ reject { |r| r.options[:polymorphic] }. #skip polymorphic
119
+ detect { |r| r.foreign_key.to_s == name.to_s }
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,50 @@
1
+ require 'active_admin/filters/active'
2
+
3
+ module ActiveAdmin
4
+ module Filters
5
+ class ActiveSidebar < ActiveAdmin::SidebarSection
6
+
7
+ def initialize
8
+ super I18n.t("active_admin.search_status.headline"), sidebar_options
9
+ end
10
+
11
+ def block
12
+ -> do
13
+ active_filters = ActiveAdmin::Filters::Active.new(active_admin_config, assigns[:search])
14
+ span do
15
+ if current_scope
16
+ h4 I18n.t("active_admin.search_status.current_scope"), style: 'display: inline'
17
+ b scope_name(current_scope), class: 'current_scope_name', style: "display: inline"
18
+ end
19
+ div style: "margin-top: 10px" do
20
+ h4 I18n.t("active_admin.search_status.current_filters"), style: 'margin-bottom: 10px'
21
+ ul do
22
+ if active_filters.filters.blank?
23
+ li I18n.t("active_admin.search_status.no_current_filters")
24
+ else
25
+ active_filters.filters.each do |filter|
26
+ li filter.html_options do
27
+ span do
28
+ text_node filter.label
29
+ end
30
+ b do
31
+ text_node to_sentence(filter.values.map { |v| pretty_format(v) })
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ protected
43
+
44
+ def sidebar_options
45
+ { only: :index, if: -> { active_admin_config.current_filters_enabled? && (params[:q] || params[:scope]) } }
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,21 @@
1
+ module ActiveAdmin
2
+ module Filters
3
+ module DSL
4
+
5
+ # For docs, please see ActiveAdmin::Filters::ResourceExtension#add_filter
6
+ def filter(attribute, options = {})
7
+ config.add_filter(attribute, options)
8
+ end
9
+
10
+ # For docs, please see ActiveAdmin::Filters::ResourceExtension#remove_filter
11
+ def remove_filter(*attributes)
12
+ config.remove_filter(*attributes)
13
+ end
14
+
15
+ # For docs, please see ActiveAdmin::Filters::ResourceExtension#preserve_default_filters!
16
+ def preserve_default_filters!
17
+ config.preserve_default_filters!
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,85 @@
1
+ module ActiveAdmin
2
+ module Filters
3
+ # This form builder defines methods to build filter forms such
4
+ # as the one found in the sidebar of the index page of a standard resource.
5
+ class FormBuilder < ::ActiveAdmin::FormBuilder
6
+ include ::ActiveAdmin::Filters::FormtasticAddons
7
+ self.input_namespaces = [::Object, ::ActiveAdmin::Inputs::Filters, ::ActiveAdmin::Inputs, ::Formtastic::Inputs]
8
+
9
+ # TODO: remove input class finders after formtastic 4 (where it will be default)
10
+ self.input_class_finder = ::Formtastic::InputClassFinder
11
+
12
+ def filter(method, options = {})
13
+ if method.present? && options[:as] ||= default_input_type(method)
14
+ template.concat input(method, options)
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ # Returns the default filter type for a given attribute. If you want
21
+ # to use a custom search method, you have to specify the type yourself.
22
+ def default_input_type(method, options = {})
23
+ if method =~ /_(eq|equals|cont|contains|start|starts_with|end|ends_with)\z/
24
+ :string
25
+ elsif klass._ransackers.key?(method.to_s)
26
+ klass._ransackers[method.to_s].type
27
+ elsif reflection_for(method) || polymorphic_foreign_type?(method)
28
+ :select
29
+ elsif column = column_for(method)
30
+ case column.type
31
+ when :date, :datetime
32
+ :date_range
33
+ when :string, :text
34
+ :string
35
+ when :integer, :float, :decimal
36
+ :numeric
37
+ when :boolean
38
+ :boolean
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ # This module is included into the view
45
+ module ViewHelper
46
+
47
+ # Helper method to render a filter form
48
+ def active_admin_filters_form_for(search, filters, options = {})
49
+ defaults = { builder: ActiveAdmin::Filters::FormBuilder,
50
+ url: collection_path,
51
+ html: {class: 'filter_form'} }
52
+ required = { html: {method: :get},
53
+ as: :q }
54
+ options = defaults.deep_merge(options).deep_merge(required)
55
+
56
+ form_for search, options do |f|
57
+ filters.each do |attribute, opts|
58
+ next if opts.key?(:if) && !call_method_or_proc_on(self, opts[:if])
59
+ next if opts.key?(:unless) && call_method_or_proc_on(self, opts[:unless])
60
+
61
+ filter_opts = opts.except(:if, :unless)
62
+ filter_opts[:input_html] = instance_exec(&filter_opts[:input_html]) if filter_opts[:input_html].is_a?(Proc)
63
+
64
+ f.filter attribute, filter_opts
65
+ end
66
+
67
+ buttons = content_tag :div, class: "buttons" do
68
+ f.submit(I18n.t('active_admin.filters.buttons.filter')) +
69
+ link_to(I18n.t('active_admin.filters.buttons.clear'), '#', class: 'clear_filters_btn') +
70
+ hidden_field_tags_for(params, except: except_hidden_fields)
71
+ end
72
+
73
+ f.template.concat buttons
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def except_hidden_fields
80
+ [:q, :page]
81
+ end
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,79 @@
1
+ module ActiveAdmin
2
+ module Filters
3
+ module FormtasticAddons
4
+
5
+ #
6
+ # The below are Formtastic method overrides that jump inside of the Ransack
7
+ # search object to get at the object being searched upon.
8
+ #
9
+
10
+ def humanized_method_name
11
+ if klass.respond_to?(:human_attribute_name)
12
+ klass.human_attribute_name(method)
13
+ else
14
+ method.to_s.public_send(builder.label_str_method)
15
+ end
16
+ end
17
+
18
+ def reflection_for(method)
19
+ klass.reflect_on_association(method) if klass.respond_to? :reflect_on_association
20
+ end
21
+
22
+ def column_for(method)
23
+ klass.columns_hash[method.to_s] if klass.respond_to? :columns_hash
24
+ end
25
+
26
+ def column
27
+ column_for method
28
+ end
29
+
30
+ #
31
+ # The below are custom methods that Formtastic does not provide.
32
+ #
33
+
34
+ # The resource class, unwrapped from Ransack
35
+ def klass
36
+ @object.object.klass
37
+ end
38
+
39
+ def polymorphic_foreign_type?(method)
40
+ klass.reflect_on_all_associations.select{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
41
+ .map(&:foreign_type).include? method.to_s
42
+ end
43
+
44
+ #
45
+ # These help figure out whether the given method or association will be recognized by Ransack.
46
+ #
47
+
48
+ def searchable_has_many_through?
49
+ if reflection && reflection.options[:through]
50
+ reflection.through_reflection.klass.ransackable_attributes.include? reflection.foreign_key
51
+ else
52
+ false
53
+ end
54
+ end
55
+
56
+ def seems_searchable?
57
+ has_predicate? || scope?
58
+ end
59
+
60
+ # If the given method has a predicate (like _eq or _lteq), it's pretty
61
+ # likely we're dealing with a valid search method.
62
+ def has_predicate?
63
+ !!Ransack::Predicate.detect_from_string(method.to_s)
64
+ end
65
+
66
+ # Ransack lets you define custom search methods, called ransackers.
67
+ def ransacker?
68
+ klass._ransackers.key? method.to_s
69
+ end
70
+
71
+ # Ransack supports exposing selected scopes on your model for advanced searches.
72
+ def scope?
73
+ context = Ransack::Context.for klass
74
+ context.respond_to?(:ransackable_scope?) && context.ransackable_scope?(method.to_s, klass)
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,153 @@
1
+ module ActiveAdmin
2
+ module Filters
3
+
4
+ class Disabled < RuntimeError
5
+ def initialize
6
+ super "Can't remove a filter when filters are disabled. Enable filters with 'config.filters = true'"
7
+ end
8
+ end
9
+
10
+ module ResourceExtension
11
+
12
+ def initialize(*)
13
+ super
14
+ add_filters_sidebar_section
15
+ add_search_status_sidebar_section
16
+ end
17
+
18
+ # Returns the filters for this resource. If filters are not enabled,
19
+ # it will always return an empty hash.
20
+ #
21
+ # @return [Hash] Filters that apply for this resource
22
+ def filters
23
+ filters_enabled? ? filter_lookup : {}
24
+ end
25
+
26
+ # Setter to enable / disable filters on this resource.
27
+ #
28
+ # Set to `nil` to inherit the setting from the namespace
29
+ def filters=(bool)
30
+ @filters_enabled = bool
31
+ end
32
+
33
+ # Setter to enable/disable showing current filters on this resource.
34
+ #
35
+ # Set to `nil` to inherit the setting from the namespace
36
+ def current_filters=(bool)
37
+ @current_filters_enabled = bool
38
+ end
39
+
40
+ # @return [Boolean] If filters are enabled for this resource
41
+ def filters_enabled?
42
+ @filters_enabled.nil? ? namespace.filters : @filters_enabled
43
+ end
44
+
45
+ # @return [Boolean] If show current filters are enabled for this resource
46
+ def current_filters_enabled?
47
+ @current_filters_enabled.nil? ? namespace.current_filters : @current_filters_enabled
48
+ end
49
+
50
+ def preserve_default_filters!
51
+ @preserve_default_filters = true
52
+ end
53
+
54
+ def preserve_default_filters?
55
+ @preserve_default_filters == true
56
+ end
57
+
58
+ # Remove a filter for this resource. If filters are not enabled, this method
59
+ # will raise a RuntimeError
60
+ #
61
+ # @param [Symbol] attributes The attributes to not filter on
62
+ def remove_filter(*attributes)
63
+ raise Disabled unless filters_enabled?
64
+
65
+ attributes.each { |attribute| (@filters_to_remove ||= []) << attribute.to_sym }
66
+ end
67
+
68
+ # Add a filter for this resource. If filters are not enabled, this method
69
+ # will raise a RuntimeError
70
+ #
71
+ # @param [Symbol] attribute The attribute to filter on
72
+ # @param [Hash] options The set of options that are passed through to
73
+ # ransack for the field definition.
74
+ def add_filter(attribute, options = {})
75
+ raise Disabled unless filters_enabled?
76
+
77
+ (@filters ||= {})[attribute.to_sym] = options
78
+ end
79
+
80
+ # Reset the filters to use defaults
81
+ def reset_filters!
82
+ @filters = nil
83
+ @filters_to_remove = nil
84
+ end
85
+
86
+ private
87
+
88
+ # Collapses the waveform, if you will, of which filters should be displayed.
89
+ # Removes filters and adds in default filters as desired.
90
+ def filter_lookup
91
+ filters = @filters.try(:dup) || {}
92
+
93
+ if filters.empty? || preserve_default_filters?
94
+ default_filters.each do |f|
95
+ filters[f] ||= {}
96
+ end
97
+ end
98
+
99
+ if @filters_to_remove
100
+ @filters_to_remove.each &filters.method(:delete)
101
+ end
102
+
103
+ filters
104
+ end
105
+
106
+ # @return [Array] The array of default filters for this resource
107
+ def default_filters
108
+ result = []
109
+ result.concat default_association_filters if namespace.include_default_association_filters
110
+ result.concat content_columns
111
+ result.concat custom_ransack_filters
112
+ result
113
+ end
114
+
115
+ def custom_ransack_filters
116
+ if resource_class.respond_to?(:_ransackers)
117
+ resource_class._ransackers.keys.map(&:to_sym)
118
+ else
119
+ []
120
+ end
121
+ end
122
+
123
+ # Returns a default set of filters for the associations
124
+ def default_association_filters
125
+ if resource_class.respond_to?(:reflect_on_all_associations)
126
+ poly, not_poly = resource_class.reflect_on_all_associations.partition { |r| r.macro == :belongs_to && r.options[:polymorphic] }
127
+
128
+ # remove deeply nested associations
129
+ not_poly.reject! { |r| r.chain.length > 2 }
130
+
131
+ filters = poly.map(&:foreign_type) + not_poly.map(&:name)
132
+ filters.map &:to_sym
133
+ else
134
+ []
135
+ end
136
+ end
137
+
138
+ def add_filters_sidebar_section
139
+ self.sidebar_sections << filters_sidebar_section
140
+ end
141
+
142
+ def filters_sidebar_section
143
+ ActiveAdmin::SidebarSection.new :filters, only: :index, if: -> { active_admin_config.filters.any? }, partial: 'filters_form'
144
+ end
145
+
146
+ def add_search_status_sidebar_section
147
+ self.sidebar_sections << ActiveAdmin::Filters::ActiveSidebar.new
148
+ end
149
+
150
+ end
151
+
152
+ end
153
+ end
@@ -0,0 +1,11 @@
1
+ require 'active_admin/filters/dsl'
2
+ require 'active_admin/filters/resource_extension'
3
+ require 'active_admin/filters/formtastic_addons'
4
+ require 'active_admin/filters/forms'
5
+ require 'active_admin/helpers/optional_display'
6
+ require 'active_admin/filters/active_sidebar'
7
+
8
+ # Add our Extensions
9
+ ActiveAdmin::ResourceDSL.send :include, ActiveAdmin::Filters::DSL
10
+ ActiveAdmin::Resource.send :include, ActiveAdmin::Filters::ResourceExtension
11
+ ActiveAdmin::ViewHelpers.send :include, ActiveAdmin::Filters::ViewHelper