activeadmin 1.0.0.pre4 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activeadmin might be problematic. Click here for more details.

Files changed (542) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +529 -52
  3. data/CODE_OF_CONDUCT.md +64 -12
  4. data/CONTRIBUTING.md +129 -58
  5. data/README.md +80 -79
  6. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  7. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  8. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  9. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  10. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  11. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  12. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  13. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +59 -0
  14. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  15. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  16. data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
  17. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  18. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  19. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  20. data/app/assets/stylesheets/active_admin/_base.scss +2 -2
  21. data/app/assets/stylesheets/active_admin/_forms.scss +19 -26
  22. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +0 -5
  23. data/app/assets/stylesheets/active_admin/components/_pagination.scss +11 -0
  24. data/app/assets/stylesheets/active_admin/components/_scopes.scss +3 -0
  25. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -4
  26. data/app/assets/stylesheets/active_admin/components/_tables.scss +4 -1
  27. data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
  28. data/app/assets/stylesheets/active_admin/mixins/_all.scss +0 -2
  29. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
  30. data/app/assets/stylesheets/active_admin/print.scss +2 -3
  31. data/app/views/active_admin/devise/confirmations/new.html.erb +2 -2
  32. data/app/views/active_admin/devise/passwords/edit.html.erb +2 -2
  33. data/app/views/active_admin/devise/passwords/new.html.erb +2 -2
  34. data/app/views/active_admin/devise/registrations/new.html.erb +3 -4
  35. data/app/views/active_admin/devise/sessions/new.html.erb +2 -2
  36. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  37. data/app/views/active_admin/devise/shared/_links.erb +12 -6
  38. data/app/views/active_admin/devise/unlocks/new.html.erb +2 -2
  39. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  40. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  41. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  42. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  43. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  44. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  45. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  46. data/app/views/kaminari/active_admin_countless/_first_page.html.erb +11 -0
  47. data/app/views/kaminari/active_admin_countless/_gap.html.erb +8 -0
  48. data/app/views/kaminari/active_admin_countless/_next_page.html.erb +11 -0
  49. data/app/views/kaminari/active_admin_countless/_page.html.erb +12 -0
  50. data/app/views/kaminari/active_admin_countless/_paginator.html.erb +24 -0
  51. data/app/views/kaminari/active_admin_countless/_prev_page.html.erb +11 -0
  52. data/app/views/layouts/active_admin_logged_out.html.erb +2 -2
  53. data/config/locales/ar.yml +4 -5
  54. data/config/locales/bg.yml +1 -3
  55. data/config/locales/bs.yml +1 -2
  56. data/config/locales/ca.yml +2 -4
  57. data/config/locales/cs.yml +1 -2
  58. data/config/locales/da.yml +45 -14
  59. data/config/locales/de-CH.yml +2 -3
  60. data/config/locales/de.yml +30 -3
  61. data/config/locales/el.yml +3 -4
  62. data/config/locales/en-CA.yml +139 -0
  63. data/config/locales/en-GB.yml +44 -3
  64. data/config/locales/en.yml +31 -5
  65. data/config/locales/eo.yml +145 -0
  66. data/config/locales/es-MX.yml +5 -3
  67. data/config/locales/es.yml +32 -6
  68. data/config/locales/fa.yml +1 -2
  69. data/config/locales/fi.yml +2 -3
  70. data/config/locales/fr.yml +27 -5
  71. data/config/locales/he.yml +53 -7
  72. data/config/locales/hr.yml +1 -2
  73. data/config/locales/hu.yml +5 -2
  74. data/config/locales/id.yml +2 -3
  75. data/config/locales/it.yml +15 -7
  76. data/config/locales/ja.yml +8 -3
  77. data/config/locales/ko.yml +1 -2
  78. data/config/locales/lt.yml +27 -6
  79. data/config/locales/lv.yml +1 -2
  80. data/config/locales/mk.yml +134 -0
  81. data/config/locales/nb.yml +16 -7
  82. data/config/locales/nl.yml +13 -3
  83. data/config/locales/pl.yml +75 -5
  84. data/config/locales/pt-BR.yml +10 -3
  85. data/config/locales/pt-PT.yml +1 -2
  86. data/config/locales/ro.yml +1 -2
  87. data/config/locales/ru.yml +5 -3
  88. data/config/locales/sk.yml +168 -0
  89. data/config/locales/sv-SE.yml +4 -3
  90. data/config/locales/tr.yml +10 -2
  91. data/config/locales/uk.yml +4 -3
  92. data/config/locales/vi.yml +48 -8
  93. data/config/locales/zh-CN.yml +38 -7
  94. data/config/locales/zh-TW.yml +2 -3
  95. data/docs/.gitignore +1 -0
  96. data/docs/0-installation.md +19 -13
  97. data/docs/1-general-configuration.md +37 -4
  98. data/docs/10-custom-pages.md +47 -3
  99. data/docs/11-decorators.md +4 -0
  100. data/docs/12-arbre-components.md +73 -9
  101. data/docs/13-authorization-adapter.md +72 -35
  102. data/docs/14-gotchas.md +57 -19
  103. data/docs/2-resource-customization.md +64 -20
  104. data/docs/3-index-pages/custom-index.md +5 -1
  105. data/docs/3-index-pages/index-as-block.md +3 -5
  106. data/docs/3-index-pages/index-as-blog.md +4 -6
  107. data/docs/3-index-pages/index-as-grid.md +3 -5
  108. data/docs/3-index-pages/index-as-table.md +33 -12
  109. data/docs/3-index-pages.md +65 -9
  110. data/docs/4-csv-format.md +16 -0
  111. data/docs/5-forms.md +78 -17
  112. data/docs/6-show-pages.md +5 -29
  113. data/docs/7-sidebars.md +5 -1
  114. data/docs/8-custom-actions.md +18 -1
  115. data/docs/9-batch-actions.md +8 -4
  116. data/docs/CNAME +1 -0
  117. data/docs/Gemfile +3 -0
  118. data/docs/Gemfile.lock +248 -0
  119. data/docs/_config.yml +4 -0
  120. data/docs/_includes/footer.html +8 -0
  121. data/docs/_includes/google-analytics.html +16 -0
  122. data/docs/_includes/head.html +7 -0
  123. data/docs/_includes/toc.html +98 -0
  124. data/docs/_includes/top-menu.html +17 -0
  125. data/docs/_layouts/default.html +21 -0
  126. data/docs/documentation.md +60 -0
  127. data/docs/images/activeadmin.png +0 -0
  128. data/docs/images/code-header.png +0 -0
  129. data/docs/images/divider.png +0 -0
  130. data/docs/images/features.png +0 -0
  131. data/docs/images/tidelift.svg +14 -0
  132. data/docs/index.html +226 -0
  133. data/docs/stylesheets/main.css +1205 -0
  134. data/lib/active_admin/abstract_view_factory.rb +13 -51
  135. data/lib/active_admin/application.rb +50 -140
  136. data/lib/active_admin/application_settings.rb +42 -0
  137. data/lib/active_admin/authorization_adapter.rb +0 -3
  138. data/lib/active_admin/base_controller/authorization.rb +4 -7
  139. data/lib/active_admin/base_controller/menu.rb +10 -14
  140. data/lib/active_admin/base_controller.rb +8 -14
  141. data/lib/active_admin/batch_actions/controller.rb +3 -3
  142. data/lib/active_admin/batch_actions/resource_extension.rb +9 -13
  143. data/lib/active_admin/batch_actions/views/batch_action_form.rb +1 -1
  144. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +1 -1
  145. data/lib/active_admin/batch_actions/views/selection_cells.rb +6 -5
  146. data/lib/active_admin/callbacks.rb +1 -1
  147. data/lib/active_admin/controller_action.rb +2 -1
  148. data/lib/active_admin/csv_builder.rb +15 -12
  149. data/lib/active_admin/dependency.rb +8 -76
  150. data/lib/active_admin/deprecation.rb +0 -25
  151. data/lib/active_admin/devise.rb +3 -3
  152. data/lib/active_admin/dsl.rb +3 -16
  153. data/lib/active_admin/dynamic_setting.rb +38 -0
  154. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  155. data/lib/active_admin/engine.rb +5 -0
  156. data/lib/active_admin/error.rb +5 -3
  157. data/lib/active_admin/filters/active.rb +13 -14
  158. data/lib/active_admin/filters/active_filter.rb +124 -0
  159. data/lib/active_admin/filters/active_sidebar.rb +54 -0
  160. data/lib/active_admin/filters/forms.rb +6 -4
  161. data/lib/active_admin/filters/formtastic_addons.rb +2 -2
  162. data/lib/active_admin/filters/resource_extension.rb +28 -43
  163. data/lib/active_admin/filters.rb +2 -0
  164. data/lib/active_admin/form_builder.rb +100 -59
  165. data/lib/active_admin/generators/boilerplate.rb +12 -4
  166. data/lib/active_admin/helpers/collection.rb +2 -0
  167. data/lib/active_admin/helpers/scope_chain.rb +1 -0
  168. data/lib/active_admin/inputs/datepicker_input.rb +12 -5
  169. data/lib/active_admin/inputs/filters/base/search_method_select.rb +2 -2
  170. data/lib/active_admin/inputs/filters/date_range_input.rb +21 -8
  171. data/lib/active_admin/inputs/filters/select_input.rb +6 -3
  172. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  173. data/lib/active_admin/inputs.rb +1 -0
  174. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  175. data/lib/active_admin/localizers.rb +11 -0
  176. data/lib/active_admin/menu.rb +6 -12
  177. data/lib/active_admin/menu_collection.rb +0 -2
  178. data/lib/active_admin/menu_item.rb +4 -32
  179. data/lib/active_admin/namespace.rb +36 -17
  180. data/lib/active_admin/namespace_settings.rb +123 -0
  181. data/lib/active_admin/order_clause.rb +30 -8
  182. data/lib/active_admin/orm/active_record/comments/comment.rb +3 -17
  183. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +19 -7
  184. data/lib/active_admin/orm/active_record/comments.rb +17 -11
  185. data/lib/active_admin/page.rb +23 -4
  186. data/lib/active_admin/page_controller.rb +2 -6
  187. data/lib/active_admin/page_dsl.rb +5 -1
  188. data/lib/active_admin/page_presenter.rb +2 -1
  189. data/lib/active_admin/pundit_adapter.rb +18 -5
  190. data/lib/active_admin/resource/action_items.rb +17 -5
  191. data/lib/active_admin/resource/attributes.rb +47 -0
  192. data/lib/active_admin/resource/belongs_to.rb +10 -1
  193. data/lib/active_admin/resource/menu.rb +7 -4
  194. data/lib/active_admin/resource/model.rb +15 -0
  195. data/lib/active_admin/resource/naming.rb +3 -3
  196. data/lib/active_admin/resource/ordering.rb +11 -0
  197. data/lib/active_admin/resource/page_presenters.rb +1 -1
  198. data/lib/active_admin/resource/routes.rb +52 -20
  199. data/lib/active_admin/resource/scopes.rb +5 -3
  200. data/lib/active_admin/resource/sidebars.rb +1 -1
  201. data/lib/active_admin/resource.rb +59 -7
  202. data/lib/active_admin/resource_collection.rb +2 -2
  203. data/lib/active_admin/resource_controller/action_builder.rb +10 -0
  204. data/lib/active_admin/resource_controller/data_access.rb +32 -27
  205. data/lib/active_admin/resource_controller/decorators.rb +5 -5
  206. data/lib/active_admin/resource_controller/polymorphic_routes.rb +36 -0
  207. data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
  208. data/lib/active_admin/resource_controller/scoping.rb +1 -1
  209. data/lib/active_admin/resource_controller.rb +15 -0
  210. data/lib/active_admin/resource_dsl.rb +58 -24
  211. data/lib/active_admin/router.rb +90 -82
  212. data/lib/active_admin/scope.rb +20 -12
  213. data/lib/active_admin/settings_node.rb +19 -0
  214. data/lib/active_admin/sidebar_section.rb +3 -1
  215. data/lib/active_admin/version.rb +1 -1
  216. data/lib/active_admin/view_helpers/auto_link_helper.rb +2 -2
  217. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +2 -2
  218. data/lib/active_admin/view_helpers/display_helper.rb +28 -16
  219. data/lib/active_admin/view_helpers/download_format_links_helper.rb +13 -0
  220. data/lib/active_admin/view_helpers/fields_for.rb +1 -2
  221. data/lib/active_admin/view_helpers/form_helper.rb +2 -2
  222. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +8 -1
  223. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  224. data/lib/active_admin/view_helpers.rb +2 -1
  225. data/lib/active_admin/views/action_items.rb +1 -1
  226. data/lib/active_admin/views/components/active_admin_form.rb +43 -11
  227. data/lib/active_admin/views/components/attributes_table.rb +4 -4
  228. data/lib/active_admin/views/components/columns.rb +3 -3
  229. data/lib/active_admin/views/components/dropdown_menu.rb +4 -4
  230. data/lib/active_admin/views/components/index_list.rb +4 -3
  231. data/lib/active_admin/views/components/menu.rb +32 -0
  232. data/lib/active_admin/views/components/menu_item.rb +58 -0
  233. data/lib/active_admin/views/components/paginated_collection.rb +7 -11
  234. data/lib/active_admin/views/components/scopes.rb +14 -8
  235. data/lib/active_admin/views/components/sidebar.rb +13 -0
  236. data/lib/active_admin/views/components/site_title.rb +5 -6
  237. data/lib/active_admin/views/components/status_tag.rb +11 -16
  238. data/lib/active_admin/views/components/table_for.rb +7 -16
  239. data/lib/active_admin/views/components/tabs.rb +15 -3
  240. data/lib/active_admin/views/footer.rb +14 -4
  241. data/lib/active_admin/views/header.rb +3 -16
  242. data/lib/active_admin/views/index_as_blog.rb +2 -3
  243. data/lib/active_admin/views/index_as_grid.rb +25 -25
  244. data/lib/active_admin/views/index_as_table.rb +39 -13
  245. data/lib/active_admin/views/pages/base.rb +36 -57
  246. data/lib/active_admin/views/pages/form.rb +2 -3
  247. data/lib/active_admin/views/pages/layout.rb +1 -1
  248. data/lib/active_admin/views/pages/show.rb +8 -2
  249. data/lib/active_admin/views/tabbed_navigation.rb +4 -59
  250. data/lib/active_admin/views/title_bar.rb +4 -4
  251. data/lib/active_admin/views.rb +1 -1
  252. data/lib/active_admin.rb +11 -7
  253. data/lib/generators/active_admin/assets/assets_generator.rb +2 -2
  254. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  255. data/lib/generators/active_admin/devise/devise_generator.rb +8 -5
  256. data/lib/generators/active_admin/install/install_generator.rb +7 -3
  257. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +60 -4
  258. data/lib/generators/active_admin/install/templates/{admin_user.rb.erb → admin_users.rb.erb} +1 -3
  259. data/lib/generators/active_admin/install/templates/dashboard.rb +2 -3
  260. data/lib/generators/active_admin/install/templates/migrations/{create_active_admin_comments.rb → create_active_admin_comments.rb.erb} +2 -5
  261. data/lib/generators/active_admin/page/page_generator.rb +1 -1
  262. data/lib/generators/active_admin/resource/resource_generator.rb +2 -2
  263. data/lib/generators/active_admin/resource/templates/admin.rb.erb +46 -0
  264. data/lib/ransack_ext.rb +5 -5
  265. data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
  266. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
  267. data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
  268. data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
  269. data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
  270. data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
  271. data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
  272. data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
  273. data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
  274. data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
  275. data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
  276. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
  277. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
  278. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
  279. data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
  280. data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
  281. data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
  282. data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
  283. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
  284. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +291 -0
  285. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
  286. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
  287. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
  288. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
  289. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
  290. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
  291. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
  292. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  293. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  294. metadata +190 -539
  295. data/.gitignore +0 -49
  296. data/.hound.yml +0 -14
  297. data/.travis.yml +0 -46
  298. data/.yardopts +0 -8
  299. data/Gemfile +0 -75
  300. data/Guardfile +0 -8
  301. data/Rakefile +0 -33
  302. data/activeadmin.gemspec +0 -31
  303. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  304. data/app/assets/javascripts/active_admin/base.js.coffee +0 -9
  305. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +0 -6
  306. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +0 -7
  307. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +0 -7
  308. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +0 -10
  309. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +0 -15
  310. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +0 -3
  311. data/app/assets/javascripts/active_admin/jquery_ui.js.erb +0 -11
  312. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +0 -39
  313. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +0 -36
  314. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +0 -101
  315. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +0 -19
  316. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +0 -79
  317. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +0 -45
  318. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +0 -31
  319. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +0 -24
  320. data/app/assets/stylesheets/active_admin/mixins/_reset.scss +0 -165
  321. data/cucumber.yml +0 -3
  322. data/features/action_item.feature +0 -73
  323. data/features/authorization.feature +0 -64
  324. data/features/authorization_cancan.feature +0 -52
  325. data/features/authorization_pundit.feature +0 -37
  326. data/features/belongs_to.feature +0 -66
  327. data/features/breadcrumb.feature +0 -75
  328. data/features/comments/commenting.feature +0 -171
  329. data/features/comments/viewing_index.feature +0 -19
  330. data/features/dashboard.feature +0 -16
  331. data/features/decorators.feature +0 -43
  332. data/features/development_reloading.feature +0 -30
  333. data/features/edit_page.feature +0 -117
  334. data/features/favicon.feature +0 -20
  335. data/features/first_boot.feature +0 -16
  336. data/features/global_navigation.feature +0 -29
  337. data/features/i18n.feature +0 -43
  338. data/features/index/batch_actions.feature +0 -196
  339. data/features/index/filters.feature +0 -161
  340. data/features/index/format_as_csv.feature +0 -203
  341. data/features/index/formats.feature +0 -66
  342. data/features/index/index_as_block.feature +0 -15
  343. data/features/index/index_as_blog.feature +0 -69
  344. data/features/index/index_as_grid.feature +0 -45
  345. data/features/index/index_as_table.feature +0 -291
  346. data/features/index/index_blank_slate.feature +0 -83
  347. data/features/index/index_parameters.feature +0 -75
  348. data/features/index/index_scope_to.feature +0 -56
  349. data/features/index/index_scopes.feature +0 -251
  350. data/features/index/page_title.feature +0 -42
  351. data/features/index/pagination.feature +0 -63
  352. data/features/index/switch_index_view.feature +0 -73
  353. data/features/menu.feature +0 -53
  354. data/features/meta_tags.feature +0 -21
  355. data/features/new_page.feature +0 -109
  356. data/features/registering_assets.feature +0 -34
  357. data/features/registering_pages.feature +0 -148
  358. data/features/registering_resources.feature +0 -33
  359. data/features/renamed_resource.feature +0 -32
  360. data/features/root_to.feature +0 -17
  361. data/features/show/columns.feature +0 -40
  362. data/features/show/default_content.feature +0 -44
  363. data/features/show/page_title.feature +0 -59
  364. data/features/show/tabs.feature +0 -27
  365. data/features/sidebar_sections.feature +0 -210
  366. data/features/site_title.feature +0 -47
  367. data/features/specifying_actions.feature +0 -93
  368. data/features/step_definitions/action_item_steps.rb +0 -7
  369. data/features/step_definitions/action_link_steps.rb +0 -20
  370. data/features/step_definitions/additional_web_steps.rb +0 -81
  371. data/features/step_definitions/asset_steps.rb +0 -15
  372. data/features/step_definitions/attribute_steps.rb +0 -18
  373. data/features/step_definitions/batch_action_steps.rb +0 -81
  374. data/features/step_definitions/blog_steps.rb +0 -3
  375. data/features/step_definitions/breadcrumb_steps.rb +0 -3
  376. data/features/step_definitions/column_steps.rb +0 -8
  377. data/features/step_definitions/comment_steps.rb +0 -12
  378. data/features/step_definitions/configuration_steps.rb +0 -100
  379. data/features/step_definitions/dashboard_steps.rb +0 -15
  380. data/features/step_definitions/factory_steps.rb +0 -35
  381. data/features/step_definitions/filter_steps.rb +0 -39
  382. data/features/step_definitions/flash_steps.rb +0 -11
  383. data/features/step_definitions/format_steps.rb +0 -52
  384. data/features/step_definitions/i18n_steps.rb +0 -3
  385. data/features/step_definitions/index_scope_steps.rb +0 -21
  386. data/features/step_definitions/index_views_steps.rb +0 -3
  387. data/features/step_definitions/layout_steps.rb +0 -3
  388. data/features/step_definitions/member_link_steps.rb +0 -7
  389. data/features/step_definitions/menu_steps.rb +0 -11
  390. data/features/step_definitions/meta_tag_steps.rb +0 -3
  391. data/features/step_definitions/pagination_steps.rb +0 -15
  392. data/features/step_definitions/sidebar_steps.rb +0 -13
  393. data/features/step_definitions/site_title_steps.rb +0 -17
  394. data/features/step_definitions/symbol_leak_steps.rb +0 -3
  395. data/features/step_definitions/tab_steps.rb +0 -8
  396. data/features/step_definitions/table_steps.rb +0 -120
  397. data/features/step_definitions/user_steps.rb +0 -45
  398. data/features/step_definitions/web_steps.rb +0 -85
  399. data/features/sti_resource.feature +0 -65
  400. data/features/strong_parameters.feature +0 -73
  401. data/features/support/env.rb +0 -162
  402. data/features/support/paths.rb +0 -71
  403. data/features/support/selectors.rb +0 -45
  404. data/features/symbol_leak.feature +0 -35
  405. data/features/users/logging_in.feature +0 -34
  406. data/features/users/logging_out.feature +0 -13
  407. data/features/users/resetting_password.feature +0 -34
  408. data/lib/active_admin/event.rb +0 -24
  409. data/lib/active_admin/filters/humanized.rb +0 -68
  410. data/lib/active_admin/helpers/settings.rb +0 -115
  411. data/lib/active_admin/reloader.rb +0 -25
  412. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +0 -1
  413. data/lib/generators/active_admin/resource/templates/admin.rb +0 -45
  414. data/script/local +0 -53
  415. data/script/travis_cache +0 -107
  416. data/script/use_rails +0 -53
  417. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +0 -50
  418. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +0 -25
  419. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +0 -34
  420. data/spec/javascripts/fixtures/checkboxes.html +0 -9
  421. data/spec/javascripts/fixtures/flashes.html +0 -2
  422. data/spec/javascripts/fixtures/table_checkboxes.html +0 -17
  423. data/spec/javascripts/helpers/SpecHelper.js +0 -3
  424. data/spec/javascripts/support/jasmine.yml +0 -74
  425. data/spec/javascripts/support/jasmine_config.rb +0 -23
  426. data/spec/javascripts/support/jasmine_runner.rb +0 -32
  427. data/spec/rails_helper.rb +0 -169
  428. data/spec/requests/default_namespace_spec.rb +0 -61
  429. data/spec/requests/javascript_spec.rb +0 -22
  430. data/spec/requests/memory_spec.rb +0 -21
  431. data/spec/requests/stylesheets_spec.rb +0 -18
  432. data/spec/spec_helper.rb +0 -17
  433. data/spec/support/active_admin_request_helpers.rb +0 -27
  434. data/spec/support/deferred_garbage_collection.rb +0 -19
  435. data/spec/support/detect_rails_version.rb +0 -34
  436. data/spec/support/jslint.yml +0 -80
  437. data/spec/support/rails_template.rb +0 -158
  438. data/spec/support/rails_template_with_data.rb +0 -55
  439. data/spec/support/templates/admin/stores.rb +0 -9
  440. data/spec/support/templates/en.yml +0 -8
  441. data/spec/support/templates/policies/active_admin/comment_policy.rb +0 -9
  442. data/spec/support/templates/policies/active_admin/page_policy.rb +0 -18
  443. data/spec/support/templates/policies/admin_user_policy.rb +0 -11
  444. data/spec/support/templates/policies/application_policy.rb +0 -45
  445. data/spec/support/templates/policies/category_policy.rb +0 -7
  446. data/spec/support/templates/policies/post_policy.rb +0 -15
  447. data/spec/support/templates/policies/store_policy.rb +0 -11
  448. data/spec/support/templates/policies/user_policy.rb +0 -11
  449. data/spec/support/templates/post_decorator.rb +0 -11
  450. data/spec/unit/abstract_view_factory_spec.rb +0 -79
  451. data/spec/unit/action_builder_spec.rb +0 -134
  452. data/spec/unit/active_admin_spec.rb +0 -11
  453. data/spec/unit/application_spec.rb +0 -165
  454. data/spec/unit/asset_registration_spec.rb +0 -52
  455. data/spec/unit/authorization/authorization_adapter_spec.rb +0 -61
  456. data/spec/unit/authorization/controller_authorization_spec.rb +0 -39
  457. data/spec/unit/authorization/index_overriding_spec.rb +0 -23
  458. data/spec/unit/auto_link_spec.rb +0 -69
  459. data/spec/unit/batch_actions/resource_spec.rb +0 -97
  460. data/spec/unit/batch_actions/settings_spec.rb +0 -61
  461. data/spec/unit/belongs_to_spec.rb +0 -65
  462. data/spec/unit/cancan_adapter_spec.rb +0 -43
  463. data/spec/unit/comments_spec.rb +0 -188
  464. data/spec/unit/component_spec.rb +0 -18
  465. data/spec/unit/config_shared_examples.rb +0 -59
  466. data/spec/unit/controller_filters_spec.rb +0 -41
  467. data/spec/unit/csv_builder_spec.rb +0 -303
  468. data/spec/unit/dependency_spec.rb +0 -135
  469. data/spec/unit/devise_spec.rb +0 -96
  470. data/spec/unit/dsl_spec.rb +0 -122
  471. data/spec/unit/filters/filter_form_builder_spec.rb +0 -434
  472. data/spec/unit/filters/humanized_spec.rb +0 -56
  473. data/spec/unit/filters/resource_spec.rb +0 -128
  474. data/spec/unit/form_builder_spec.rb +0 -815
  475. data/spec/unit/generators/install_spec.rb +0 -24
  476. data/spec/unit/helpers/collection_spec.rb +0 -65
  477. data/spec/unit/helpers/scope_chain_spec.rb +0 -36
  478. data/spec/unit/helpers/settings_spec.rb +0 -30
  479. data/spec/unit/i18n_spec.rb +0 -12
  480. data/spec/unit/menu_collection_spec.rb +0 -62
  481. data/spec/unit/menu_item_spec.rb +0 -143
  482. data/spec/unit/menu_spec.rb +0 -71
  483. data/spec/unit/namespace/authorization_spec.rb +0 -27
  484. data/spec/unit/namespace/register_page_spec.rb +0 -73
  485. data/spec/unit/namespace/register_resource_spec.rb +0 -160
  486. data/spec/unit/namespace_spec.rb +0 -103
  487. data/spec/unit/order_clause_spec.rb +0 -81
  488. data/spec/unit/page_controller_spec.rb +0 -5
  489. data/spec/unit/page_spec.rb +0 -78
  490. data/spec/unit/pretty_format_spec.rb +0 -77
  491. data/spec/unit/pundit_adapter_spec.rb +0 -98
  492. data/spec/unit/resource/action_items_spec.rb +0 -65
  493. data/spec/unit/resource/includes_spec.rb +0 -21
  494. data/spec/unit/resource/menu_spec.rb +0 -18
  495. data/spec/unit/resource/naming_spec.rb +0 -122
  496. data/spec/unit/resource/page_presenters_spec.rb +0 -44
  497. data/spec/unit/resource/pagination_spec.rb +0 -38
  498. data/spec/unit/resource/routes_spec.rb +0 -77
  499. data/spec/unit/resource/scopes_spec.rb +0 -50
  500. data/spec/unit/resource/sidebars_spec.rb +0 -43
  501. data/spec/unit/resource_collection_spec.rb +0 -175
  502. data/spec/unit/resource_controller/data_access_spec.rb +0 -140
  503. data/spec/unit/resource_controller/decorators_spec.rb +0 -94
  504. data/spec/unit/resource_controller/sidebars_spec.rb +0 -38
  505. data/spec/unit/resource_controller_spec.rb +0 -269
  506. data/spec/unit/resource_registration_spec.rb +0 -56
  507. data/spec/unit/resource_spec.rb +0 -331
  508. data/spec/unit/routing_spec.rb +0 -185
  509. data/spec/unit/scope_spec.rb +0 -185
  510. data/spec/unit/settings_spec.rb +0 -118
  511. data/spec/unit/view_factory_spec.rb +0 -19
  512. data/spec/unit/view_helpers/breadcrumbs_spec.rb +0 -217
  513. data/spec/unit/view_helpers/display_helper_spec.rb +0 -165
  514. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +0 -39
  515. data/spec/unit/view_helpers/fields_for_spec.rb +0 -50
  516. data/spec/unit/view_helpers/flash_helper_spec.rb +0 -25
  517. data/spec/unit/view_helpers/form_helper_spec.rb +0 -43
  518. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +0 -139
  519. data/spec/unit/views/components/attributes_table_spec.rb +0 -272
  520. data/spec/unit/views/components/batch_action_selector_spec.rb +0 -43
  521. data/spec/unit/views/components/blank_slate_spec.rb +0 -27
  522. data/spec/unit/views/components/columns_spec.rb +0 -189
  523. data/spec/unit/views/components/index_list_spec.rb +0 -35
  524. data/spec/unit/views/components/index_table_for_spec.rb +0 -127
  525. data/spec/unit/views/components/paginated_collection_spec.rb +0 -249
  526. data/spec/unit/views/components/panel_spec.rb +0 -58
  527. data/spec/unit/views/components/sidebar_section_spec.rb +0 -68
  528. data/spec/unit/views/components/site_title_spec.rb +0 -78
  529. data/spec/unit/views/components/status_tag_spec.rb +0 -249
  530. data/spec/unit/views/components/table_for_spec.rb +0 -434
  531. data/spec/unit/views/components/tabs_spec.rb +0 -39
  532. data/spec/unit/views/components/unsupported_browser_spec.rb +0 -41
  533. data/spec/unit/views/index_as_blog_spec.rb +0 -76
  534. data/spec/unit/views/pages/form_spec.rb +0 -51
  535. data/spec/unit/views/pages/index_spec.rb +0 -60
  536. data/spec/unit/views/pages/layout_spec.rb +0 -59
  537. data/spec/unit/views/pages/show_spec.rb +0 -33
  538. data/spec/unit/views/tabbed_navigation_spec.rb +0 -158
  539. data/tasks/docs.rake +0 -37
  540. data/tasks/parallel_tests.rake +0 -66
  541. data/tasks/test.rake +0 -91
  542. data/tasks/yard.rake +0 -9
@@ -41,7 +41,6 @@ module ActiveAdmin
41
41
  end
42
42
  end
43
43
 
44
-
45
44
  # This module is included into the view
46
45
  module ViewHelper
47
46
 
@@ -49,8 +48,8 @@ module ActiveAdmin
49
48
  def active_admin_filters_form_for(search, filters, options = {})
50
49
  defaults = { builder: ActiveAdmin::Filters::FormBuilder,
51
50
  url: collection_path,
52
- html: {class: 'filter_form'} }
53
- required = { html: {method: :get},
51
+ html: { class: 'filter_form' } }
52
+ required = { html: { method: :get },
54
53
  as: :q }
55
54
  options = defaults.deep_merge(options).deep_merge(required)
56
55
 
@@ -59,7 +58,10 @@ module ActiveAdmin
59
58
  next if opts.key?(:if) && !call_method_or_proc_on(self, opts[:if])
60
59
  next if opts.key?(:unless) && call_method_or_proc_on(self, opts[:unless])
61
60
 
62
- f.filter attribute, opts.except(:if, :unless)
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
63
65
  end
64
66
 
65
67
  buttons = content_tag :div, class: "buttons" do
@@ -37,7 +37,7 @@ module ActiveAdmin
37
37
  end
38
38
 
39
39
  def polymorphic_foreign_type?(method)
40
- klass.reflect_on_all_associations.select{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
40
+ klass.reflect_on_all_associations.select { |r| r.macro == :belongs_to && r.options[:polymorphic] }
41
41
  .map(&:foreign_type).include? method.to_s
42
42
  end
43
43
 
@@ -54,7 +54,7 @@ module ActiveAdmin
54
54
  end
55
55
 
56
56
  def seems_searchable?
57
- has_predicate? || ransacker? || scope?
57
+ has_predicate? || scope?
58
58
  end
59
59
 
60
60
  # If the given method has a predicate (like _eq or _lteq), it's pretty
@@ -1,5 +1,3 @@
1
- require 'active_admin/filters/active'
2
-
3
1
  module ActiveAdmin
4
2
  module Filters
5
3
 
@@ -85,7 +83,7 @@ module ActiveAdmin
85
83
  @filters_to_remove = nil
86
84
  end
87
85
 
88
- private
86
+ private
89
87
 
90
88
  # Collapses the waveform, if you will, of which filters should be displayed.
91
89
  # Removes filters and adds in default filters as desired.
@@ -109,7 +107,7 @@ module ActiveAdmin
109
107
  def default_filters
110
108
  result = []
111
109
  result.concat default_association_filters if namespace.include_default_association_filters
112
- result.concat default_content_filters
110
+ result.concat content_columns
113
111
  result.concat custom_ransack_filters
114
112
  result
115
113
  end
@@ -125,25 +123,40 @@ module ActiveAdmin
125
123
  # Returns a default set of filters for the associations
126
124
  def default_association_filters
127
125
  if resource_class.respond_to?(:reflect_on_all_associations)
128
- poly, not_poly = resource_class.reflect_on_all_associations.partition{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
126
+ poly, not_poly = resource_class.reflect_on_all_associations.partition { |r| r.macro == :belongs_to && r.options[:polymorphic] }
129
127
 
130
128
  # remove deeply nested associations
131
- not_poly.reject!{ |r| r.chain.length > 2 }
129
+ not_poly.reject! { |r| r.chain.length > 2 }
132
130
 
133
131
  filters = poly.map(&:foreign_type) + not_poly.map(&:name)
132
+
133
+ # Check high-arity associations for filterable columns
134
+ max = namespace.maximum_association_filter_arity
135
+ if max != :unlimited
136
+ high_arity, low_arity = not_poly.partition do |r|
137
+ r.klass.reorder(nil).limit(max + 1).count > max
138
+ end
139
+
140
+ # Remove high-arity associations with no searchable column
141
+ high_arity = high_arity.select(&method(:searchable_column_for))
142
+
143
+ high_arity = high_arity.map { |r| r.name.to_s + "_" + searchable_column_for(r) + namespace.filter_method_for_large_association }
144
+
145
+ filters = poly.map(&:foreign_type) + low_arity.map(&:name) + high_arity
146
+ end
147
+
134
148
  filters.map &:to_sym
135
149
  else
136
150
  []
137
151
  end
138
152
  end
139
153
 
140
- # Returns a default set of filters for the content columns
141
- def default_content_filters
142
- if resource_class.respond_to? :content_columns
143
- resource_class.content_columns.map{ |c| c.name.to_sym }
144
- else
145
- []
146
- end
154
+ def search_columns
155
+ @search_columns ||= namespace.filter_columns_for_large_association.map(&:to_s)
156
+ end
157
+
158
+ def searchable_column_for(relation)
159
+ relation.klass.column_names.find { |name| search_columns.include?(name) }
147
160
  end
148
161
 
149
162
  def add_filters_sidebar_section
@@ -151,43 +164,15 @@ module ActiveAdmin
151
164
  end
152
165
 
153
166
  def filters_sidebar_section
154
- ActiveAdmin::SidebarSection.new :filters, only: :index, if: ->{ active_admin_config.filters.any? } do
167
+ ActiveAdmin::SidebarSection.new :filters, only: :index, if: -> { active_admin_config.filters.any? } do
155
168
  active_admin_filters_form_for assigns[:search], active_admin_config.filters
156
169
  end
157
170
  end
158
171
 
159
172
  def add_search_status_sidebar_section
160
- if current_filters_enabled?
161
- self.sidebar_sections << search_status_section
162
- end
173
+ self.sidebar_sections << ActiveAdmin::Filters::ActiveSidebar.new
163
174
  end
164
175
 
165
- def search_status_section
166
- ActiveAdmin::SidebarSection.new I18n.t("active_admin.search_status.headline"), only: :index, if: -> { params[:q] || params[:scope] } do
167
- active = ActiveAdmin::Filters::Active.new(resource_class, params)
168
-
169
- span do
170
- h4 I18n.t("active_admin.search_status.current_scope"), style: 'display: inline'
171
- b active.scope, style: "display: inline"
172
-
173
- div style: "margin-top: 10px" do
174
- h4 I18n.t("active_admin.search_status.current_filters"), style: 'margin-bottom: 10px'
175
- ul do
176
- if active.filters.blank?
177
- li I18n.t("active_admin.search_status.no_current_filters")
178
- else
179
- active.filters.each do |filter|
180
- li do
181
- span filter.body
182
- b filter.value
183
- end
184
- end
185
- end
186
- end
187
- end
188
- end
189
- end
190
- end
191
176
  end
192
177
 
193
178
  end
@@ -2,6 +2,8 @@ require 'active_admin/filters/dsl'
2
2
  require 'active_admin/filters/resource_extension'
3
3
  require 'active_admin/filters/formtastic_addons'
4
4
  require 'active_admin/filters/forms'
5
+ require 'active_admin/helpers/optional_display'
6
+ require 'active_admin/filters/active_sidebar'
5
7
 
6
8
  # Add our Extensions
7
9
  ActiveAdmin::ResourceDSL.send :include, ActiveAdmin::Filters::DSL
@@ -13,13 +13,14 @@ end
13
13
 
14
14
  module ActiveAdmin
15
15
  class FormBuilder < ::Formtastic::FormBuilder
16
+
16
17
  self.input_namespaces = [::Object, ::ActiveAdmin::Inputs, ::Formtastic::Inputs]
17
18
 
18
19
  # TODO: remove both class finders after formtastic 4 (where it will be default)
19
20
  self.input_class_finder = ::Formtastic::InputClassFinder
20
21
  self.action_class_finder = ::Formtastic::ActionClassFinder
21
22
 
22
- def cancel_link(url = {action: "index"}, html_options = {}, li_attrs = {})
23
+ def cancel_link(url = { action: "index" }, html_options = {}, li_attrs = {})
23
24
  li_attrs[:class] ||= "cancel"
24
25
  li_content = template.link_to I18n.t('active_admin.cancel'), url, html_options
25
26
  template.content_tag(:li, li_content, li_attrs)
@@ -27,109 +28,142 @@ module ActiveAdmin
27
28
 
28
29
  attr_accessor :already_in_an_inputs_block
29
30
 
30
- def assoc_heading(assoc)
31
- object.class.reflect_on_association(assoc).klass.model_name.
32
- human(count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT)
31
+ def has_many(assoc, options = {}, &block)
32
+ HasManyBuilder.new(self, assoc, options).render(&block)
33
33
  end
34
+ end
34
35
 
35
- def has_many(assoc, options = {}, &block)
36
- # remove options that should not render as attributes
37
- custom_settings = :new_record, :allow_destroy, :heading, :sortable, :sortable_start
38
- builder_options = {new_record: true}.merge! options.slice *custom_settings
39
- options = {for: assoc }.merge! options.except *custom_settings
40
- options[:class] = [options[:class], "inputs has_many_fields"].compact.join(' ')
41
- sortable_column = builder_options[:sortable]
42
- sortable_start = builder_options.fetch(:sortable_start, 0)
36
+ # Decorates a FormBuilder with the additional attributes and methods
37
+ # to build a has_many block. Nested has_many blocks are handled by
38
+ # nested decorators.
39
+ class HasManyBuilder < SimpleDelegator
40
+ attr_reader :assoc
41
+ attr_reader :options
42
+ attr_reader :heading, :sortable_column, :sortable_start
43
+ attr_reader :new_record, :destroy_option
44
+
45
+ def initialize(has_many_form, assoc, options)
46
+ super has_many_form
47
+ @assoc = assoc
48
+ @options = extract_custom_settings!(options.dup)
49
+ @options.reverse_merge!(for: assoc)
50
+ @options[:class] = [options[:class], "inputs has_many_fields"].compact.join(' ')
43
51
 
44
52
  if sortable_column
45
- options[:for] = [assoc, sorted_children(assoc, sortable_column)]
53
+ @options[:for] = [assoc, sorted_children(sortable_column)]
46
54
  end
55
+ end
47
56
 
57
+ def render(&block)
48
58
  html = "".html_safe
49
- unless builder_options.key?(:heading) && !builder_options[:heading]
50
- html << template.content_tag(:h3) do
51
- builder_options[:heading] || assoc_heading(assoc)
52
- end
53
- end
54
-
55
- html << template.capture do
56
- contents = "".html_safe
57
- form_block = proc do |has_many_form|
58
- index = parent_child_index options[:parent] if options[:parent]
59
- block.call has_many_form, index
60
- template.concat has_many_actions(has_many_form, builder_options, "".html_safe)
61
- end
62
-
63
- template.assign(has_many_block: true)
64
- contents = without_wrapper { inputs(options, &form_block) } || "".html_safe
65
-
66
- if builder_options[:new_record]
67
- contents << js_for_has_many(assoc, form_block, template, builder_options[:new_record], options[:class])
68
- else
69
- contents
70
- end
71
- end
72
-
73
- tag = @already_in_an_inputs_block ? :li : :div
74
- html = template.content_tag(tag, html, class: "has_many_container #{assoc}", 'data-sortable' => sortable_column, 'data-sortable-start' => sortable_start)
59
+ html << template.content_tag(:h3) { heading } if heading.present?
60
+ html << template.capture { content_has_many(&block) }
61
+ html = wrap_div_or_li(html)
75
62
  template.concat(html) if template.output_buffer
76
63
  html
77
64
  end
78
65
 
79
66
  protected
80
67
 
81
- def has_many_actions(has_many_form, builder_options, contents)
82
- if has_many_form.object.new_record?
68
+ # remove options that should not render as attributes
69
+ def extract_custom_settings!(options)
70
+ @heading = options.key?(:heading) ? options.delete(:heading) : default_heading
71
+ @sortable_column = options.delete(:sortable)
72
+ @sortable_start = options.delete(:sortable_start) || 0
73
+ @new_record = options.key?(:new_record) ? options.delete(:new_record) : true
74
+ @destroy_option = options.delete(:allow_destroy)
75
+ options
76
+ end
77
+
78
+ def default_heading
79
+ assoc_klass.model_name.
80
+ human(count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT)
81
+ end
82
+
83
+ def assoc_klass
84
+ @assoc_klass ||= __getobj__.object.class.reflect_on_association(assoc).klass
85
+ end
86
+
87
+ def content_has_many(&block)
88
+ form_block = proc do |form_builder|
89
+ render_has_many_form(form_builder, options[:parent], &block)
90
+ end
91
+
92
+ template.assigns[:has_many_block] = true
93
+ contents = without_wrapper { inputs(options, &form_block) }
94
+ contents ||= "".html_safe
95
+
96
+ js = new_record ? js_for_has_many(options[:class], &form_block) : ''
97
+ contents << js
98
+ end
99
+
100
+ # Renders the Formtastic inputs then appends ActiveAdmin delete and sort actions.
101
+ def render_has_many_form(form_builder, parent, &block)
102
+ index = parent && form_builder.send(:parent_child_index, parent)
103
+ template.concat template.capture { yield(form_builder, index) }
104
+ template.concat has_many_actions(form_builder, "".html_safe)
105
+ end
106
+
107
+ def has_many_actions(form_builder, contents)
108
+ if form_builder.object.new_record?
83
109
  contents << template.content_tag(:li) do
84
110
  template.link_to I18n.t('active_admin.has_many_remove'), "#", class: 'button has_many_remove'
85
111
  end
86
- elsif builder_options[:allow_destroy]
87
- has_many_form.input(:_destroy, as: :boolean,
88
- wrapper_html: {class: 'has_many_delete'},
112
+ elsif allow_destroy?(form_builder.object)
113
+ form_builder.input(:_destroy, as: :boolean,
114
+ wrapper_html: { class: 'has_many_delete' },
89
115
  label: I18n.t('active_admin.has_many_delete'))
90
116
  end
91
117
 
92
- if builder_options[:sortable]
93
- has_many_form.input builder_options[:sortable], as: :hidden
118
+ if sortable_column
119
+ form_builder.input sortable_column, as: :hidden
94
120
 
95
121
  contents << template.content_tag(:li, class: 'handle') do
96
- "MOVE"
122
+ I18n.t('active_admin.move')
97
123
  end
98
124
  end
99
125
 
100
126
  contents
101
127
  end
102
128
 
103
- def sorted_children(assoc, column)
104
- object.public_send(assoc).sort_by do |o|
129
+ def allow_destroy?(form_object)
130
+ !! case destroy_option
131
+ when Symbol, String
132
+ form_object.public_send destroy_option
133
+ when Proc
134
+ destroy_option.call form_object
135
+ else
136
+ destroy_option
137
+ end
138
+ end
139
+
140
+ def sorted_children(column)
141
+ __getobj__.object.public_send(assoc).sort_by do |o|
105
142
  attribute = o.public_send column
106
143
  [attribute.nil? ? Float::INFINITY : attribute, o.id || Float::INFINITY]
107
144
  end
108
145
  end
109
146
 
110
- private
111
-
112
147
  def without_wrapper
113
- is_being_wrapped = @already_in_an_inputs_block
114
- @already_in_an_inputs_block = false
148
+ is_being_wrapped = already_in_an_inputs_block
149
+ self.already_in_an_inputs_block = false
115
150
 
116
151
  html = yield
117
152
 
118
- @already_in_an_inputs_block = is_being_wrapped
153
+ self.already_in_an_inputs_block = is_being_wrapped
119
154
  html
120
155
  end
121
156
 
122
157
  # Capture the ADD JS
123
- def js_for_has_many(assoc, form_block, template, new_record, class_string)
124
- assoc_reflection = object.class.reflect_on_association assoc
125
- assoc_name = assoc_reflection.klass.model_name
158
+ def js_for_has_many(class_string, &form_block)
159
+ assoc_name = assoc_klass.model_name
126
160
  placeholder = "NEW_#{assoc_name.to_s.underscore.upcase.gsub(/\//, '_')}_RECORD"
127
161
  opts = {
128
- for: [assoc, assoc_reflection.klass.new],
162
+ for: [assoc, assoc_klass.new],
129
163
  class: class_string,
130
164
  for_options: { child_index: placeholder }
131
165
  }
132
- html = template.capture{ inputs_for_nested_attributes opts, &form_block }
166
+ html = template.capture { __getobj__.send(:inputs_for_nested_attributes, opts, &form_block) }
133
167
  text = new_record.is_a?(String) ? new_record : I18n.t('active_admin.has_many_new', model: assoc_name.human)
134
168
 
135
169
  template.link_to text, '#', class: "button has_many_add", data: {
@@ -137,5 +171,12 @@ module ActiveAdmin
137
171
  }
138
172
  end
139
173
 
174
+ def wrap_div_or_li(html)
175
+ template.content_tag(already_in_an_inputs_block ? :li : :div,
176
+ html,
177
+ class: "has_many_container #{assoc}",
178
+ 'data-sortable' => sortable_column,
179
+ 'data-sortable-start' => sortable_start)
180
+ end
140
181
  end
141
182
  end
@@ -9,8 +9,16 @@ module ActiveAdmin
9
9
  @class_name.constantize.new.attributes.keys
10
10
  end
11
11
 
12
+ def assignable_attributes
13
+ attributes - %w(id created_at updated_at)
14
+ end
15
+
16
+ def permit_params
17
+ assignable_attributes.map { |a| a.to_sym.inspect }.join(', ')
18
+ end
19
+
12
20
  def rows
13
- attributes.map { |a| row(a) }.join("\n")
21
+ attributes.map { |a| row(a) }.join("\n ")
14
22
  end
15
23
 
16
24
  def row(name)
@@ -18,7 +26,7 @@ module ActiveAdmin
18
26
  end
19
27
 
20
28
  def columns
21
- attributes.map { |a| column(a) }.join("\n")
29
+ attributes.map { |a| column(a) }.join("\n ")
22
30
  end
23
31
 
24
32
  def column(name)
@@ -26,7 +34,7 @@ module ActiveAdmin
26
34
  end
27
35
 
28
36
  def filters
29
- attributes.map { |a| filter(a) }.join("\n")
37
+ attributes.map { |a| filter(a) }.join("\n ")
30
38
  end
31
39
 
32
40
  def filter(name)
@@ -34,7 +42,7 @@ module ActiveAdmin
34
42
  end
35
43
 
36
44
  def form_inputs
37
- attributes.reject{|a| %w(id created_at updated_at).include? a}.map{ |a| form_input(a) }.join("\n")
45
+ assignable_attributes.map { |a| form_input(a) }.join("\n ")
38
46
  end
39
47
 
40
48
  def form_input(name)
@@ -4,6 +4,8 @@ module ActiveAdmin
4
4
  # 1. removes `select` and `order` to prevent invalid SQL
5
5
  # 2. correctly handles the Hash returned when `group by` is used
6
6
  def collection_size(c = collection)
7
+ return c.count if c.is_a?(Array)
8
+
7
9
  c = c.except :select, :order
8
10
 
9
11
  c.group_values.present? ? c.count.count : c.count
@@ -1,5 +1,6 @@
1
1
  module ActiveAdmin
2
2
  module ScopeChain
3
+ private
3
4
  # Scope an ActiveRecord::Relation chain
4
5
  #
5
6
  # Example:
@@ -9,12 +9,19 @@ module ActiveAdmin
9
9
  end
10
10
  end
11
11
 
12
+ # Can pass proc to filter label option
13
+ def label_from_options
14
+ res = super
15
+ res = res.call if res.is_a? Proc
16
+ res
17
+ end
18
+
12
19
  private
13
- def datepicker_options
14
- options = self.options.fetch(:datepicker_options, {})
15
- options = Hash[options.map{ |k, v| [k.to_s.camelcase(:lower), v] }]
16
- { datepicker_options: options }
17
- end
20
+ def datepicker_options
21
+ options = self.options.fetch(:datepicker_options, {})
22
+ options = Hash[options.map { |k, v| [k.to_s.camelcase(:lower), v] }]
23
+ { datepicker_options: options }
24
+ end
18
25
  end
19
26
  end
20
27
  end
@@ -57,8 +57,8 @@ module ActiveAdmin
57
57
 
58
58
  def current_filter
59
59
  @current_filter ||= begin
60
- methods = filters.map{ |f| "#{method}_#{f}" }
61
- methods.detect{ |m| @object.public_send m } || methods.first
60
+ methods = filters.map { |f| "#{method}_#{f}" }
61
+ methods.detect { |m| @object.public_send m } || methods.first
62
62
  end
63
63
  end
64
64
 
@@ -7,28 +7,41 @@ module ActiveAdmin
7
7
  def to_html
8
8
  input_wrapping do
9
9
  [ label_html,
10
- builder.text_field(gt_input_name, input_html_options(gt_input_name)),
11
- template.content_tag(:span, "-", class: "seperator"),
12
- builder.text_field(lt_input_name, input_html_options(lt_input_name)),
10
+ builder.text_field(gt_input_name, input_html_options(gt_input_name, gt_input_placeholder)),
11
+ builder.text_field(lt_input_name, input_html_options(lt_input_name, lt_input_placeholder)),
13
12
  ].join("\n").html_safe
14
13
  end
15
14
  end
16
15
 
17
16
  def gt_input_name
18
- "#{method}_gteq_date"
17
+ column && column.type == :date ? "#{method}_gteq" : "#{method}_gteq_datetime"
19
18
  end
20
19
  alias :input_name :gt_input_name
21
20
 
22
21
  def lt_input_name
23
- "#{method}_lteq_date"
22
+ column && column.type == :date ? "#{method}_lteq" : "#{method}_lteq_datetime"
24
23
  end
25
24
 
26
- def input_html_options(input_name = gt_input_name)
27
- current_value = @object.public_send input_name
25
+ def input_html_options(input_name = gt_input_name, placeholder = gt_input_placeholder)
26
+ current_value = begin
27
+ #cast value to date object before rendering input
28
+ @object.public_send(input_name).to_s.to_date
29
+ rescue
30
+ nil
31
+ end
28
32
  { size: 12,
29
33
  class: "datepicker",
30
34
  maxlength: 10,
31
- value: current_value.respond_to?(:strftime) ? current_value.strftime("%Y-%m-%d") : "" }
35
+ placeholder: placeholder,
36
+ value: current_value ? current_value.strftime("%Y-%m-%d") : "" }
37
+ end
38
+
39
+ def gt_input_placeholder
40
+ I18n.t("active_admin.filters.predicates.from")
41
+ end
42
+
43
+ def lt_input_placeholder
44
+ I18n.t("active_admin.filters.predicates.to")
32
45
  end
33
46
  end
34
47
  end
@@ -15,7 +15,7 @@ module ActiveAdmin
15
15
  "#{reflection.through_reflection.name}_#{reflection.foreign_key}"
16
16
  else
17
17
  name = method.to_s
18
- name.concat '_id' if reflection
18
+ name.concat "_#{reflection.association_primary_key}" if reflection_searchable?
19
19
  name
20
20
  end
21
21
  end
@@ -45,8 +45,11 @@ module ActiveAdmin
45
45
  end
46
46
 
47
47
  def pluck_column
48
- distinct = ActiveAdmin::Dependency.rails >= 4 ? :distinct : :uniq
49
- klass.reorder("#{method} asc").public_send(distinct).pluck method
48
+ klass.reorder("#{method} asc").distinct.pluck method
49
+ end
50
+
51
+ def reflection_searchable?
52
+ reflection && !reflection.polymorphic?
50
53
  end
51
54
 
52
55
  end
@@ -0,0 +1,25 @@
1
+ module ActiveAdmin
2
+ module Inputs
3
+ module Filters
4
+ class TextInput < ::Formtastic::Inputs::TextInput
5
+ include Base
6
+ include Base::SearchMethodSelect
7
+
8
+ def input_html_options
9
+ {
10
+ cols: builder.default_text_area_width,
11
+ rows: builder.default_text_area_height
12
+ }.merge(super)
13
+ end
14
+
15
+ def to_html
16
+ input_wrapping do
17
+ label_html <<
18
+ builder.text_area(method, input_html_options)
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
@@ -9,6 +9,7 @@ module ActiveAdmin
9
9
 
10
10
  autoload :Base
11
11
  autoload :StringInput
12
+ autoload :TextInput
12
13
  autoload :DatePickerInput
13
14
  autoload :DateRangeInput
14
15
  autoload :NumericInput
@@ -0,0 +1,35 @@
1
+ module ActiveAdmin
2
+ module Localizers
3
+ class ResourceLocalizer
4
+ class << self
5
+ def from_resource(resource_config)
6
+ new(resource_config.resource_name.i18n_key, resource_config.resource_label)
7
+ end
8
+
9
+ def translate(key, options)
10
+ new(options.delete(:model_name), options.delete(:model)).translate(key, options)
11
+ end
12
+ alias_method :t, :translate
13
+ end
14
+
15
+ def initialize(model_name, model = nil)
16
+ @model_name = model_name
17
+ @model = model || model_name.to_s.titleize
18
+ end
19
+
20
+ def translate(key, options = {})
21
+ scope = options.delete(:scope)
22
+ specific_key = array_to_key('resources', @model_name, scope, key)
23
+ defaults = [array_to_key(scope, key), key.to_s.titleize]
24
+ ::I18n.t specific_key, options.reverse_merge(model: @model, default: defaults, scope: 'active_admin')
25
+ end
26
+ alias_method :t, :translate
27
+
28
+ protected
29
+
30
+ def array_to_key(*arr)
31
+ arr.flatten.compact.join('.').to_sym
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ require 'active_admin/localizers/resource_localizer'
2
+
3
+ module ActiveAdmin
4
+ module Localizers
5
+ class << self
6
+ def resource(active_admin_config)
7
+ ResourceLocalizer.from_resource(active_admin_config)
8
+ end
9
+ end
10
+ end
11
+ end