yousty-activeadmin 1.0.4.pre → 1.0.5.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +261 -211
  3. data/CONTRIBUTING.md +73 -39
  4. data/Gemfile +38 -20
  5. data/Guardfile +1 -0
  6. data/LICENSE +1 -1
  7. data/README.md +48 -24
  8. data/Rakefile +12 -4
  9. data/activeadmin.gemspec +21 -26
  10. data/app/assets/javascripts/active_admin/application.js.coffee +34 -5
  11. data/app/assets/javascripts/active_admin/base.js.coffee +11 -2
  12. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  13. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  14. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  15. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +3 -4
  16. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +51 -55
  17. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  18. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  19. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
  20. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
  21. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +29 -58
  22. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +2 -3
  23. data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
  24. data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +51 -15
  25. data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
  26. data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
  27. data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
  28. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  29. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
  30. data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
  31. data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -12
  32. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +3 -1
  33. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  34. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  35. data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
  36. data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +0 -0
  37. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
  38. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  39. data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +1 -0
  40. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  41. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  42. data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
  43. data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -0
  44. data/app/assets/stylesheets/active_admin/mixins/{_gradients.css.scss → _gradients.scss} +1 -1
  45. data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
  46. data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
  47. data/app/assets/stylesheets/active_admin/mixins/{_rounded.css.scss → _rounded.scss} +0 -0
  48. data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +7 -1
  49. data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -0
  50. data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
  51. data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
  52. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +10 -7
  53. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  54. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
  55. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +1 -1
  56. data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
  57. data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
  58. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  59. data/app/views/active_admin/devise/sessions/new.html.erb +8 -8
  60. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  61. data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
  62. data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
  63. data/config/locales/ar.yml +120 -0
  64. data/config/locales/bg.yml +26 -6
  65. data/config/locales/bs.yml +122 -0
  66. data/config/locales/ca.yml +10 -1
  67. data/config/locales/cs.yml +7 -2
  68. data/config/locales/da.yml +7 -3
  69. data/config/locales/de-CH.yml +14 -31
  70. data/config/locales/de.yml +33 -33
  71. data/config/locales/el.yml +127 -0
  72. data/config/locales/en-GB.yml +11 -4
  73. data/config/locales/en.yml +21 -4
  74. data/config/locales/{es_MX.yml → es-MX.yml} +14 -24
  75. data/config/locales/es.yml +32 -25
  76. data/config/locales/fa.yml +120 -0
  77. data/config/locales/fi.yml +9 -5
  78. data/config/locales/fr.yml +28 -12
  79. data/config/locales/he.yml +7 -3
  80. data/config/locales/hr.yml +42 -11
  81. data/config/locales/hu.yml +10 -3
  82. data/config/locales/it.yml +31 -3
  83. data/config/locales/ja.yml +17 -4
  84. data/config/locales/ko.yml +7 -1
  85. data/config/locales/lt.yml +42 -11
  86. data/config/locales/lv.yml +7 -3
  87. data/config/locales/{no-NB.yml → nb.yml} +46 -15
  88. data/config/locales/nl.yml +36 -5
  89. data/config/locales/pl.yml +13 -8
  90. data/config/locales/pt-BR.yml +36 -5
  91. data/config/locales/pt-PT.yml +8 -4
  92. data/config/locales/ro.yml +7 -3
  93. data/config/locales/ru.yml +26 -5
  94. data/config/locales/sv-SE.yml +9 -5
  95. data/config/locales/tr.yml +10 -3
  96. data/config/locales/uk.yml +36 -12
  97. data/config/locales/vi.yml +7 -3
  98. data/config/locales/zh-CN.yml +26 -10
  99. data/config/locales/zh-TW.yml +19 -13
  100. data/docs/0-installation.md +14 -6
  101. data/docs/1-general-configuration.md +8 -5
  102. data/docs/10-custom-pages.md +68 -70
  103. data/docs/11-decorators.md +48 -59
  104. data/docs/12-arbre-components.md +79 -73
  105. data/docs/13-authorization-adapter.md +128 -107
  106. data/docs/14-gotchas.md +90 -0
  107. data/docs/2-resource-customization.md +82 -15
  108. data/docs/3-index-pages.md +71 -12
  109. data/docs/3-index-pages/custom-index.md +31 -0
  110. data/docs/3-index-pages/index-as-table.md +45 -2
  111. data/docs/4-csv-format.md +1 -1
  112. data/docs/5-forms.md +78 -29
  113. data/docs/6-show-pages.md +31 -3
  114. data/docs/7-sidebars.md +46 -25
  115. data/docs/8-custom-actions.md +98 -77
  116. data/docs/9-batch-actions.md +211 -133
  117. data/docs/README.md +24 -0
  118. data/features/action_item.feature +3 -3
  119. data/features/authorization_pundit.feature +37 -0
  120. data/features/belongs_to.feature +3 -0
  121. data/features/breadcrumb.feature +48 -0
  122. data/features/comments/commenting.feature +44 -13
  123. data/features/development_reloading.feature +3 -4
  124. data/features/edit_page.feature +9 -19
  125. data/features/favicon.feature +3 -3
  126. data/features/i18n.feature +5 -0
  127. data/features/index/batch_actions.feature +41 -0
  128. data/features/index/filters.feature +23 -0
  129. data/features/index/format_as_csv.feature +90 -4
  130. data/features/index/index_as_blog.feature +4 -4
  131. data/features/index/index_as_table.feature +102 -6
  132. data/features/index/index_blank_slate.feature +22 -0
  133. data/features/index/index_scope_to.feature +16 -16
  134. data/features/index/page_title.feature +11 -0
  135. data/features/index/pagination.feature +1 -1
  136. data/features/index/switch_index_view.feature +14 -14
  137. data/features/new_page.feature +10 -20
  138. data/features/registering_pages.feature +1 -1
  139. data/features/renamed_resource.feature +32 -0
  140. data/features/show/page_title.feature +11 -0
  141. data/features/show/tabs.feature +27 -0
  142. data/features/sidebar_sections.feature +12 -0
  143. data/features/specifying_actions.feature +3 -3
  144. data/features/step_definitions/action_item_steps.rb +2 -2
  145. data/features/step_definitions/action_link_steps.rb +14 -1
  146. data/features/step_definitions/additional_web_steps.rb +17 -18
  147. data/features/step_definitions/asset_steps.rb +3 -3
  148. data/features/step_definitions/attribute_steps.rb +8 -3
  149. data/features/step_definitions/batch_action_steps.rb +26 -9
  150. data/features/step_definitions/blog_steps.rb +3 -0
  151. data/features/step_definitions/breadcrumb_steps.rb +1 -1
  152. data/features/step_definitions/comment_steps.rb +1 -1
  153. data/features/step_definitions/configuration_steps.rb +1 -1
  154. data/features/step_definitions/dashboard_steps.rb +2 -2
  155. data/features/step_definitions/factory_steps.rb +6 -6
  156. data/features/step_definitions/filter_steps.rb +25 -3
  157. data/features/step_definitions/flash_steps.rb +3 -3
  158. data/features/step_definitions/format_steps.rb +17 -10
  159. data/features/step_definitions/index_scope_steps.rb +5 -5
  160. data/features/step_definitions/layout_steps.rb +1 -1
  161. data/features/step_definitions/member_link_steps.rb +2 -2
  162. data/features/step_definitions/menu_steps.rb +3 -3
  163. data/features/step_definitions/pagination_steps.rb +2 -3
  164. data/features/step_definitions/sidebar_steps.rb +8 -3
  165. data/features/step_definitions/site_title_steps.rb +6 -4
  166. data/features/step_definitions/symbol_leak_steps.rb +1 -1
  167. data/features/step_definitions/tab_steps.rb +5 -0
  168. data/features/step_definitions/table_steps.rb +4 -4
  169. data/features/step_definitions/user_steps.rb +15 -9
  170. data/features/step_definitions/web_steps.rb +10 -11
  171. data/features/sti_resource.feature +2 -10
  172. data/features/strong_parameters.feature +73 -0
  173. data/features/support/env.rb +35 -2
  174. data/features/support/paths.rb +2 -2
  175. data/features/support/selectors.rb +1 -1
  176. data/features/users/resetting_password.feature +7 -7
  177. data/lib/active_admin.rb +18 -13
  178. data/lib/active_admin/abstract_view_factory.rb +7 -17
  179. data/lib/active_admin/application.rb +50 -25
  180. data/lib/active_admin/asset_registration.rb +2 -2
  181. data/lib/active_admin/authorization_adapter.rb +2 -2
  182. data/lib/active_admin/base_controller.rb +2 -3
  183. data/lib/active_admin/base_controller/authorization.rb +13 -31
  184. data/lib/active_admin/batch_actions.rb +1 -1
  185. data/lib/active_admin/batch_actions/controller.rb +13 -7
  186. data/lib/active_admin/batch_actions/resource_extension.rb +43 -17
  187. data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
  188. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
  189. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
  190. data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
  191. data/lib/active_admin/callbacks.rb +25 -24
  192. data/lib/active_admin/cancan_adapter.rb +7 -11
  193. data/lib/active_admin/csv_builder.rb +92 -15
  194. data/lib/active_admin/dependency.rb +93 -0
  195. data/lib/active_admin/deprecation.rb +6 -7
  196. data/lib/active_admin/devise.rb +26 -14
  197. data/lib/active_admin/dsl.rb +18 -11
  198. data/lib/active_admin/engine.rb +7 -2
  199. data/lib/active_admin/error.rb +59 -0
  200. data/lib/active_admin/filters/dsl.rb +2 -2
  201. data/lib/active_admin/filters/forms.rb +19 -30
  202. data/lib/active_admin/filters/formtastic_addons.rb +20 -11
  203. data/lib/active_admin/filters/resource_extension.rb +16 -9
  204. data/lib/active_admin/form_builder.rb +94 -105
  205. data/lib/active_admin/helpers/collection.rb +7 -13
  206. data/lib/active_admin/helpers/i18n.rb +7 -0
  207. data/lib/active_admin/helpers/optional_display.rb +5 -5
  208. data/lib/active_admin/helpers/scope_chain.rb +1 -1
  209. data/lib/active_admin/helpers/settings.rb +16 -9
  210. data/lib/active_admin/iconic.rb +17 -15
  211. data/lib/active_admin/iconic/icons.rb +136 -136
  212. data/lib/active_admin/inputs.rb +11 -7
  213. data/lib/active_admin/inputs/datepicker_input.rb +1 -1
  214. data/lib/active_admin/inputs/filters/base.rb +42 -0
  215. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  216. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  217. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  218. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  219. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  220. data/lib/active_admin/inputs/filters/select_input.rb +54 -0
  221. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  222. data/lib/active_admin/menu.rb +3 -3
  223. data/lib/active_admin/menu_collection.rb +1 -4
  224. data/lib/active_admin/namespace.rb +52 -29
  225. data/lib/active_admin/order_clause.rb +26 -0
  226. data/lib/active_admin/orm/active_record.rb +2 -0
  227. data/lib/active_admin/orm/active_record/comments.rb +48 -51
  228. data/lib/active_admin/orm/active_record/comments/comment.rb +16 -10
  229. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -1
  230. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -1
  231. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +15 -13
  232. data/lib/active_admin/page.rb +5 -1
  233. data/lib/active_admin/page_dsl.rb +1 -1
  234. data/lib/active_admin/page_presenter.rb +2 -2
  235. data/lib/active_admin/pundit_adapter.rb +68 -0
  236. data/lib/active_admin/resource.rb +12 -3
  237. data/lib/active_admin/resource/action_items.rb +15 -8
  238. data/lib/active_admin/resource/belongs_to.rb +7 -3
  239. data/lib/active_admin/resource/controllers.rb +1 -0
  240. data/lib/active_admin/resource/includes.rb +12 -0
  241. data/lib/active_admin/resource/menu.rb +5 -5
  242. data/lib/active_admin/resource/naming.rb +25 -47
  243. data/lib/active_admin/resource/page_presenters.rb +1 -1
  244. data/lib/active_admin/resource/routes.rb +26 -10
  245. data/lib/active_admin/resource/scope_to.rb +7 -7
  246. data/lib/active_admin/resource/sidebars.rb +1 -0
  247. data/lib/active_admin/resource_collection.rb +44 -16
  248. data/lib/active_admin/resource_controller.rb +6 -5
  249. data/lib/active_admin/resource_controller/data_access.rb +87 -82
  250. data/lib/active_admin/resource_controller/decorators.rb +91 -9
  251. data/lib/active_admin/resource_controller/streaming.rb +37 -0
  252. data/lib/active_admin/resource_dsl.rb +54 -10
  253. data/lib/active_admin/router.rb +7 -7
  254. data/lib/active_admin/scope.rb +6 -6
  255. data/lib/active_admin/sidebar_section.rb +10 -2
  256. data/lib/active_admin/version.rb +1 -1
  257. data/lib/active_admin/view_factory.rb +17 -16
  258. data/lib/active_admin/view_helpers.rb +0 -1
  259. data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
  260. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +13 -6
  261. data/lib/active_admin/view_helpers/display_helper.rb +30 -17
  262. data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -24
  263. data/lib/active_admin/view_helpers/fields_for.rb +2 -2
  264. data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
  265. data/lib/active_admin/view_helpers/form_helper.rb +5 -9
  266. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
  267. data/lib/active_admin/views/action_items.rb +2 -2
  268. data/lib/active_admin/views/components/action_list_popover.rb +1 -1
  269. data/lib/active_admin/views/components/active_admin_form.rb +123 -0
  270. data/lib/active_admin/views/components/attributes_table.rb +22 -13
  271. data/lib/active_admin/views/components/blank_slate.rb +1 -1
  272. data/lib/active_admin/views/components/columns.rb +13 -7
  273. data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
  274. data/lib/active_admin/views/components/index_list.rb +7 -7
  275. data/lib/active_admin/views/components/paginated_collection.rb +33 -17
  276. data/lib/active_admin/views/components/panel.rb +8 -2
  277. data/lib/active_admin/views/components/popover.rb +1 -1
  278. data/lib/active_admin/views/components/scopes.rb +1 -1
  279. data/lib/active_admin/views/components/sidebar_section.rb +3 -2
  280. data/lib/active_admin/views/components/site_title.rb +2 -2
  281. data/lib/active_admin/views/components/status_tag.rb +34 -11
  282. data/lib/active_admin/views/components/table_for.rb +67 -22
  283. data/lib/active_admin/views/components/tabs.rb +28 -0
  284. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  285. data/lib/active_admin/views/footer.rb +3 -3
  286. data/lib/active_admin/views/header.rb +3 -3
  287. data/lib/active_admin/views/index_as_blog.rb +6 -6
  288. data/lib/active_admin/views/index_as_grid.rb +2 -2
  289. data/lib/active_admin/views/index_as_table.rb +127 -40
  290. data/lib/active_admin/views/pages/base.rb +22 -18
  291. data/lib/active_admin/views/pages/form.rb +16 -6
  292. data/lib/active_admin/views/pages/index.rb +36 -20
  293. data/lib/active_admin/views/pages/layout.rb +1 -1
  294. data/lib/active_admin/views/pages/show.rb +4 -4
  295. data/lib/active_admin/views/tabbed_navigation.rb +7 -3
  296. data/lib/active_admin/views/title_bar.rb +10 -8
  297. data/lib/generators/active_admin/assets/assets_generator.rb +1 -3
  298. data/lib/generators/active_admin/devise/devise_generator.rb +20 -28
  299. data/lib/generators/active_admin/install/install_generator.rb +8 -9
  300. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -22
  301. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -9
  302. data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
  303. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
  304. data/lib/generators/active_admin/page/USAGE +8 -0
  305. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  306. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  307. data/lib/generators/active_admin/resource/resource_generator.rb +2 -4
  308. data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
  309. data/lib/ransack_ext.rb +4 -4
  310. data/script/local +2 -2
  311. data/script/travis_cache +107 -0
  312. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  313. data/spec/javascripts/fixtures/flashes.html +2 -0
  314. data/spec/rails_helper.rb +154 -0
  315. data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
  316. data/spec/{integration → requests}/javascript_spec.rb +5 -5
  317. data/spec/requests/memory_spec.rb +23 -0
  318. data/spec/requests/stylesheets_spec.rb +18 -0
  319. data/spec/spec_helper.rb +12 -170
  320. data/spec/support/detect_rails_version.rb +31 -39
  321. data/spec/support/rails_template.rb +61 -34
  322. data/spec/support/rails_template_with_data.rb +14 -14
  323. data/spec/support/templates/admin/stores.rb +3 -5
  324. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  325. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  326. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  327. data/spec/support/templates/policies/application_policy.rb +45 -0
  328. data/spec/support/templates/policies/category_policy.rb +7 -0
  329. data/spec/support/templates/policies/post_policy.rb +15 -0
  330. data/spec/support/templates/policies/store_policy.rb +11 -0
  331. data/spec/support/templates/policies/user_policy.rb +11 -0
  332. data/spec/support/templates/post_decorator.rb +4 -46
  333. data/spec/unit/abstract_view_factory_spec.rb +11 -11
  334. data/spec/unit/action_builder_spec.rb +24 -18
  335. data/spec/unit/active_admin_spec.rb +2 -2
  336. data/spec/unit/application_spec.rb +30 -31
  337. data/spec/unit/asset_registration_spec.rb +11 -11
  338. data/spec/unit/authorization/authorization_adapter_spec.rb +7 -7
  339. data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
  340. data/spec/unit/authorization/index_overriding_spec.rb +22 -0
  341. data/spec/unit/auto_link_spec.rb +42 -5
  342. data/spec/unit/batch_actions/resource_spec.rb +15 -14
  343. data/spec/unit/batch_actions/settings_spec.rb +18 -18
  344. data/spec/unit/belongs_to_spec.rb +26 -17
  345. data/spec/unit/cancan_adapter_spec.rb +4 -4
  346. data/spec/unit/comments_spec.rb +99 -39
  347. data/spec/unit/component_spec.rb +3 -3
  348. data/spec/unit/config_shared_examples.rb +8 -8
  349. data/spec/unit/controller_filters_spec.rb +26 -14
  350. data/spec/unit/csv_builder_spec.rb +152 -24
  351. data/spec/unit/dependency_spec.rb +135 -0
  352. data/spec/unit/devise_spec.rb +17 -37
  353. data/spec/unit/dsl_spec.rb +70 -9
  354. data/spec/unit/event_spec.rb +9 -9
  355. data/spec/unit/filters/filter_form_builder_spec.rb +167 -157
  356. data/spec/unit/filters/resource_spec.rb +35 -33
  357. data/spec/unit/form_builder_spec.rb +383 -145
  358. data/spec/unit/generators/install_spec.rb +5 -5
  359. data/spec/unit/helpers/collection_spec.rb +18 -18
  360. data/spec/unit/helpers/scope_chain_spec.rb +5 -5
  361. data/spec/unit/helpers/settings_spec.rb +4 -4
  362. data/spec/unit/i18n_spec.rb +12 -0
  363. data/spec/unit/menu_collection_spec.rb +14 -14
  364. data/spec/unit/menu_item_spec.rb +42 -42
  365. data/spec/unit/menu_spec.rb +20 -20
  366. data/spec/unit/namespace/authorization_spec.rb +5 -5
  367. data/spec/unit/namespace/register_page_spec.rb +9 -9
  368. data/spec/unit/namespace/register_resource_spec.rb +26 -28
  369. data/spec/unit/namespace_spec.rb +20 -20
  370. data/spec/unit/order_clause_spec.rb +81 -0
  371. data/spec/unit/page_controller_spec.rb +1 -1
  372. data/spec/unit/page_spec.rb +18 -12
  373. data/spec/unit/pretty_format_spec.rb +42 -14
  374. data/spec/unit/pundit_adapter_spec.rb +98 -0
  375. data/spec/unit/resource/action_items_spec.rb +13 -10
  376. data/spec/unit/resource/includes_spec.rb +21 -0
  377. data/spec/unit/resource/menu_spec.rb +1 -1
  378. data/spec/unit/resource/naming_spec.rb +23 -23
  379. data/spec/unit/resource/page_presenters_spec.rb +8 -8
  380. data/spec/unit/resource/pagination_spec.rb +6 -6
  381. data/spec/unit/resource/routes_spec.rb +10 -10
  382. data/spec/unit/resource/scopes_spec.rb +14 -7
  383. data/spec/unit/resource/sidebars_spec.rb +6 -6
  384. data/spec/unit/resource_collection_spec.rb +66 -68
  385. data/spec/unit/resource_controller/data_access_spec.rb +39 -21
  386. data/spec/unit/resource_controller/decorators_spec.rb +83 -0
  387. data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
  388. data/spec/unit/resource_controller_spec.rb +66 -62
  389. data/spec/unit/resource_registration_spec.rb +12 -12
  390. data/spec/unit/resource_spec.rb +75 -40
  391. data/spec/unit/routing_spec.rb +39 -31
  392. data/spec/unit/scope_spec.rb +112 -30
  393. data/spec/unit/settings_spec.rb +51 -21
  394. data/spec/unit/view_factory_spec.rb +2 -2
  395. data/spec/unit/view_helpers/breadcrumbs_spec.rb +137 -69
  396. data/spec/unit/view_helpers/display_name_spec.rb +49 -21
  397. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
  398. data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
  399. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  400. data/spec/unit/view_helpers/form_helper_spec.rb +9 -22
  401. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +59 -21
  402. data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
  403. data/spec/unit/views/components/attributes_table_spec.rb +94 -52
  404. data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
  405. data/spec/unit/views/components/blank_slate_spec.rb +14 -4
  406. data/spec/unit/views/components/columns_spec.rb +52 -22
  407. data/spec/unit/views/components/index_list_spec.rb +11 -8
  408. data/spec/unit/views/components/index_table_for_spec.rb +46 -0
  409. data/spec/unit/views/components/paginated_collection_spec.rb +68 -59
  410. data/spec/unit/views/components/panel_spec.rb +32 -21
  411. data/spec/unit/views/components/popover_spec.rb +7 -7
  412. data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
  413. data/spec/unit/views/components/site_title_spec.rb +8 -8
  414. data/spec/unit/views/components/status_tag_spec.rb +178 -38
  415. data/spec/unit/views/components/table_for_spec.rb +227 -44
  416. data/spec/unit/views/components/tabs_spec.rb +39 -0
  417. data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
  418. data/spec/unit/views/pages/form_spec.rb +17 -10
  419. data/spec/unit/views/pages/index_spec.rb +60 -0
  420. data/spec/unit/views/pages/layout_spec.rb +17 -21
  421. data/spec/unit/views/pages/show_spec.rb +16 -3
  422. data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
  423. data/tasks/docs.rake +1 -1
  424. data/tasks/parallel_tests.rake +8 -2
  425. data/tasks/test.rake +8 -4
  426. data/tasks/yard.rake +7 -5
  427. metadata +180 -101
  428. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  429. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  430. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  431. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  432. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  433. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +0 -10
  434. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
  435. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
  436. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
  437. data/app/assets/images/active_admin/loading.gif +0 -0
  438. data/app/assets/javascripts/active_admin/components/application.js.coffee +0 -23
  439. data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +0 -26
  440. data/app/assets/javascripts/active_admin/components/has_many.js.coffee +0 -41
  441. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
  442. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -39
  443. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
  444. data/app/views/active_admin/dashboard/index.html.arb +0 -1
  445. data/app/views/active_admin/resource/index.csv.erb +0 -17
  446. data/docs/3-index-pages/create-an-index.md +0 -29
  447. data/lib/active_admin/inputs/filter_base.rb +0 -33
  448. data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
  449. data/lib/active_admin/inputs/filter_boolean_input.rb +0 -32
  450. data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -51
  451. data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
  452. data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
  453. data/lib/active_admin/inputs/filter_select_input.rb +0 -61
  454. data/lib/active_admin/inputs/filter_string_input.rb +0 -24
  455. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
  456. data/spec/integration/memory_spec.rb +0 -29
  457. data/spec/integration/stylesheets_spec.rb +0 -41
  458. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
  459. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
  460. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
  461. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
  462. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
  463. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
  464. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
  465. data/spec/javascripts/support/jquery.min.js +0 -4
  466. data/spec/spec_helper_without_rails.rb +0 -16
  467. data/tasks/js.rake +0 -32
@@ -9,7 +9,7 @@ module ActiveAdmin
9
9
  end
10
10
 
11
11
  def build(content)
12
- super(span(content.html_safe, :class => "blank_slate"))
12
+ super(span(content.html_safe, class: "blank_slate"))
13
13
  end
14
14
 
15
15
  end
@@ -12,7 +12,7 @@ module ActiveAdmin
12
12
  # To display columns, use the #columns method. Within the block, call the
13
13
  # #column method to create a new column.
14
14
  #
15
- # To createa a two column layout:
15
+ # To create a two column layout:
16
16
  #
17
17
  # colums do
18
18
  # column do
@@ -29,7 +29,7 @@ module ActiveAdmin
29
29
  # To make a column span multiple, pass the :span option to the column method:
30
30
  #
31
31
  # colums do
32
- # column :span => 2 do
32
+ # column span: 2 do
33
33
  # span "Column # 1
34
34
  # end
35
35
  # column do
@@ -50,7 +50,7 @@ module ActiveAdmin
50
50
  # To overcome this, columns include a :max_width and :min_width option.
51
51
  #
52
52
  # colums do
53
- # column :max_width => "200px", :min_width => "100px" do
53
+ # column max_width: "200px", min_width: "100px" do
54
54
  # span "Column # 1
55
55
  # end
56
56
  # column do
@@ -63,7 +63,6 @@ module ActiveAdmin
63
63
  class Columns < ActiveAdmin::Component
64
64
  builder_method :columns
65
65
 
66
-
67
66
  # For documentation, please take a look at Column#build
68
67
  def column(*args, &block)
69
68
  insert_tag Column, *args, &block
@@ -115,7 +114,7 @@ module ActiveAdmin
115
114
 
116
115
  # @param [Hash] options An options hash for the column
117
116
  #
118
- # @options options [Integer] :span The columns this column should span
117
+ # @option options [Integer] :span The columns this column should span
119
118
  def build(options = {})
120
119
  options = options.dup
121
120
  @span_size = options.delete(:span) || 1
@@ -133,11 +132,11 @@ module ActiveAdmin
133
132
  styles << "width: #{column_with_span_width}%;"
134
133
 
135
134
  if max_width
136
- styles << "max-width: #{max_width};"
135
+ styles << "max-width: #{safe_width(max_width)};"
137
136
  end
138
137
 
139
138
  if min_width
140
- styles << "min-width: #{min_width};"
139
+ styles << "min-width: #{safe_width(min_width)};"
141
140
  end
142
141
 
143
142
  styles << "margin-right: #{margin_width}%;" unless is_last_column
@@ -145,6 +144,13 @@ module ActiveAdmin
145
144
  set_attribute :style, styles.join(" ")
146
145
  end
147
146
 
147
+ private
148
+
149
+ # Converts values without a '%' or 'px' suffix to a pixel value
150
+ def safe_width(width)
151
+ width.to_s.gsub(/\A(\d+)\z/, '\1px')
152
+ end
153
+
148
154
  end
149
155
  end
150
156
  end
@@ -46,21 +46,21 @@ module ActiveAdmin
46
46
  private
47
47
 
48
48
  def build_button(name, button_options)
49
- button_options[:class] ||= ""
50
- button_options[:class] << " dropdown_menu_button"
49
+ button_options[:class] ||= ''
50
+ button_options[:class] << ' dropdown_menu_button'
51
51
 
52
- button_options[:href] = "#"
52
+ button_options[:href] = '#'
53
53
 
54
54
  a name, button_options
55
55
  end
56
56
 
57
57
  def build_menu(options)
58
- options[:class] ||= ""
59
- options[:class] << " dropdown_menu_list"
58
+ options[:class] ||= ''
59
+ options[:class] << ' dropdown_menu_list'
60
60
 
61
61
  menu_list = nil
62
62
 
63
- div :class => "dropdown_menu_list_wrapper", :style => "display:none;" do
63
+ div :class => 'dropdown_menu_list_wrapper' do
64
64
  menu_list = ul(options)
65
65
  end
66
66
 
@@ -1,11 +1,11 @@
1
1
  require 'active_admin/helpers/collection'
2
2
 
3
3
  module ActiveAdmin
4
- module Views
4
+ module Views
5
5
 
6
6
  # Renders a collection of index views available to the resource
7
7
  # as a list with a separator
8
- class IndexList < ActiveAdmin::Component
8
+ class IndexList < ActiveAdmin::Component
9
9
  builder_method :index_list_renderer
10
10
 
11
11
  include ::ActiveAdmin::Helpers::Collection
@@ -35,10 +35,10 @@ module ActiveAdmin
35
35
  #
36
36
  # @param [Class] index_class The class on which to build the link and html classes
37
37
  def build_index_list(index_class)
38
- li :class => classes_for_index(index_class) do
39
- a :href => url_for(params.merge(:as => index_class.index_name.to_sym)), :class => "table_tools_button" do
38
+ li class: classes_for_index(index_class) do
39
+ a href: url_for(params.merge(as: index_class.index_name.to_sym)), class: "table_tools_button" do
40
40
  name = index_class.index_name
41
- I18n.t("active_admin.index_list.#{name}", :default => name.to_s.titleize)
41
+ I18n.t("active_admin.index_list.#{name}", default: name.to_s.titleize)
42
42
  end
43
43
  end
44
44
  end
@@ -61,8 +61,8 @@ module ActiveAdmin
61
61
  params.include?(:q) && collection_is_empty?
62
62
  end
63
63
 
64
- end
65
- end
64
+ end
65
+ end
66
66
  end
67
67
 
68
68
 
@@ -7,7 +7,7 @@ module ActiveAdmin
7
7
  #
8
8
  # *Example:*
9
9
  #
10
- # paginated_collection collection, :entry_name => "Post" do
10
+ # paginated_collection collection, entry_name: "Post" do
11
11
  # div do
12
12
  # h2 "Inside the
13
13
  # end
@@ -40,12 +40,13 @@ module ActiveAdmin
40
40
  @param_name = options.delete(:param_name)
41
41
  @download_links = options.delete(:download_links)
42
42
  @display_total = options.delete(:pagination_total) { true }
43
+ @per_page = options.delete(:per_page)
43
44
 
44
45
  unless collection.respond_to?(:num_pages)
45
46
  raise(StandardError, "Collection is not a paginated scope. Set collection.page(params[:page]).per(10) before calling :paginated_collection.")
46
47
  end
47
48
 
48
- @contents = div(:class => "paginated_collection_contents")
49
+ @contents = div(class: "paginated_collection_contents")
49
50
  build_pagination_with_formats(options)
50
51
  @built = true
51
52
  end
@@ -62,9 +63,10 @@ module ActiveAdmin
62
63
  protected
63
64
 
64
65
  def build_pagination_with_formats(options)
65
- div :id => "index_footer" do
66
+ div id: "index_footer" do
67
+ build_per_page_select if @per_page.is_a?(Array)
66
68
  build_pagination
67
- div(page_entries_info(options).html_safe, :class => "pagination_information")
69
+ div(page_entries_info(options).html_safe, class: "pagination_information")
68
70
 
69
71
  download_links = @download_links.is_a?(Proc) ? instance_exec(&@download_links) : @download_links
70
72
 
@@ -73,15 +75,29 @@ module ActiveAdmin
73
75
  else
74
76
  build_download_format_links unless download_links == false
75
77
  end
78
+ end
79
+ end
76
80
 
81
+ def build_per_page_select
82
+ div class: "pagination_per_page" do
83
+ text_node "Per page:"
84
+ select do
85
+ @per_page.each do |per_page|
86
+ option(
87
+ per_page,
88
+ value: per_page,
89
+ selected: collection.limit_value == per_page ? "selected" : nil
90
+ )
91
+ end
92
+ end
77
93
  end
78
94
  end
79
95
 
80
96
  def build_pagination
81
- options = request.path_parameters
97
+ options = {}
82
98
  options[:param_name] = @param_name if @param_name
83
99
 
84
- text_node paginate(collection, options.symbolize_keys)
100
+ text_node paginate collection, options
85
101
  end
86
102
 
87
103
  include ::ActiveAdmin::Helpers::Collection
@@ -93,29 +109,29 @@ module ActiveAdmin
93
109
  entry_name = options[:entry_name]
94
110
  entries_name = options[:entries_name] || entry_name.pluralize
95
111
  elsif collection_is_empty?
96
- entry_name = I18n.t "active_admin.pagination.entry", :count => 1, :default => 'entry'
97
- entries_name = I18n.t "active_admin.pagination.entry", :count => 2, :default => 'entries'
112
+ entry_name = I18n.t "active_admin.pagination.entry", count: 1, default: 'entry'
113
+ entries_name = I18n.t "active_admin.pagination.entry", count: 2, default: 'entries'
98
114
  else
99
115
  key = "activerecord.models." + collection.first.class.model_name.i18n_key.to_s
100
- entry_name = I18n.translate key, :count => 1, :default => collection.first.class.name.underscore.sub('_', ' ')
101
- entries_name = I18n.translate key, :count => collection.size, :default => entry_name.pluralize
116
+ entry_name = I18n.translate key, count: 1, default: collection.first.class.name.underscore.sub('_', ' ')
117
+ entries_name = I18n.translate key, count: collection.size, default: entry_name.pluralize
102
118
  end
103
119
 
104
120
  if collection.num_pages < 2
105
121
  case collection_size
106
- when 0; I18n.t('active_admin.pagination.empty', :model => entries_name)
107
- when 1; I18n.t('active_admin.pagination.one', :model => entry_name)
108
- else; I18n.t('active_admin.pagination.one_page', :model => entries_name, :n => collection.total_count)
122
+ when 0; I18n.t('active_admin.pagination.empty', model: entries_name)
123
+ when 1; I18n.t('active_admin.pagination.one', model: entry_name)
124
+ else; I18n.t('active_admin.pagination.one_page', model: entries_name, n: collection.total_count)
109
125
  end
110
126
  else
111
127
  offset = (collection.current_page - 1) * collection.limit_value
112
128
  if @display_total
113
129
  total = collection.total_count
114
- I18n.t 'active_admin.pagination.multiple', :model => entries_name, :total => total,
115
- :from => offset + 1, :to => offset + collection_size
130
+ I18n.t 'active_admin.pagination.multiple', model: entries_name, total: total,
131
+ from: offset + 1, to: offset + collection_size
116
132
  else
117
- I18n.t 'active_admin.pagination.multiple_without_total', :model => entries_name,
118
- :from => offset + 1, :to => offset + collection_size
133
+ I18n.t 'active_admin.pagination.multiple_without_total', model: entries_name,
134
+ from: offset + 1, to: offset + collection_size
119
135
  end
120
136
  end
121
137
  end
@@ -10,7 +10,7 @@ module ActiveAdmin
10
10
  super(attributes)
11
11
  add_class "panel"
12
12
  @title = h3(icn + title.to_s)
13
- @contents = div(:class => "panel_contents")
13
+ @contents = div(class: "panel_contents")
14
14
  end
15
15
 
16
16
  def add_child(child)
@@ -28,7 +28,13 @@ module ActiveAdmin
28
28
  @contents.children?
29
29
  end
30
30
 
31
- end
31
+ def header_action(*args)
32
+ action = args[0]
32
33
 
34
+ @title << div(class: 'header_action') do
35
+ action
36
+ end
37
+ end
38
+ end
33
39
  end
34
40
  end
@@ -11,7 +11,7 @@ module ActiveAdmin
11
11
 
12
12
  super(options)
13
13
 
14
- @contents_root = send(contents_root_tag, :class => "popover_contents")
14
+ @contents_root = send(contents_root_tag, class: "popover_contents")
15
15
  end
16
16
 
17
17
  def add_child(child)
@@ -30,7 +30,7 @@ module ActiveAdmin
30
30
  protected
31
31
 
32
32
  def build_scope(scope, options)
33
- li :class => classes_for_scope(scope) do
33
+ li class: classes_for_scope(scope) do
34
34
  scope_name = I18n.t "active_admin.scopes.#{scope.id}", default: scope.name
35
35
  params = request.query_parameters.except :page, :scope, :commit, :format
36
36
 
@@ -7,7 +7,8 @@ module ActiveAdmin
7
7
  # Takes a ActiveAdmin::SidebarSection instance
8
8
  def build(section)
9
9
  @section = section
10
- super(@section.title, :icon => @section.icon)
10
+ super(@section.title, icon: @section.icon)
11
+ add_class @section.custom_class if @section.custom_class
11
12
  self.id = @section.id
12
13
  build_sidebar_content
13
14
  end
@@ -16,7 +17,7 @@ module ActiveAdmin
16
17
 
17
18
  def build_sidebar_content
18
19
  if @section.block
19
- rvalue = instance_eval(&@section.block)
20
+ rvalue = instance_exec(&@section.block)
20
21
  self << rvalue if rvalue.is_a?(String)
21
22
  else
22
23
  render(@section.partial_name)
@@ -8,7 +8,7 @@ module ActiveAdmin
8
8
  end
9
9
 
10
10
  def build(namespace)
11
- super(:id => "site_title")
11
+ super(id: "site_title")
12
12
  @namespace = namespace
13
13
 
14
14
  if site_title_link?
@@ -46,7 +46,7 @@ module ActiveAdmin
46
46
 
47
47
  def title_image
48
48
  path = helpers.render_or_call_method_or_proc_on(self, @namespace.site_title_image)
49
- helpers.image_tag(path, :id => "site_title_image", :alt => @namespace.site_title)
49
+ helpers.image_tag(path, id: "site_title_image", alt: @namespace.site_title)
50
50
  end
51
51
 
52
52
  end
@@ -12,22 +12,25 @@ module ActiveAdmin
12
12
  'status_tag'
13
13
  end
14
14
 
15
- # @method status_tag(status, type = nil, options = {})
15
+ # @overload status_tag(status, type = nil, options = {})
16
+ # @param [String] status the status to display. One of the span classes will be an underscored version of the status.
17
+ # @param [Symbol] type type of status. Will become a class of the span. ActiveAdmin provide style for :ok, :warning and :error.
18
+ # @param [Hash] options
19
+ # @option options [String] :class to override the default class
20
+ # @option options [String] :id to override the default id
21
+ # @option options [String] :label to override the default label
22
+ # @return [ActiveAdmin::Views::StatusTag]
16
23
  #
17
- # @param [String] status the status to display. One of the span classes will be an underscored version of the status.
18
- # @param [Symbol] type type of status. Will become a class of the span. ActiveAdmin provide style for :ok, :warning and :error.
19
- # @param [Hash] options such as :class, :id and :label to override the default label
20
- #
21
- # @return [ActiveAdmin::Views::StatusTag]
22
- #
23
- # Examples:
24
+ # @example
24
25
  # status_tag('In Progress')
25
26
  # # => <span class='status_tag in_progress'>In Progress</span>
26
27
  #
28
+ # @example
27
29
  # status_tag('active', :ok)
28
30
  # # => <span class='status_tag active ok'>Active</span>
29
31
  #
30
- # status_tag('active', :ok, :class => 'important', :id => 'status_123', :label => 'on')
32
+ # @example
33
+ # status_tag('active', :ok, class: 'important', id: 'status_123', label: 'on')
31
34
  # # => <span class='status_tag active ok important' id='status_123'>on</span>
32
35
  #
33
36
  def build(*args)
@@ -36,8 +39,13 @@ module ActiveAdmin
36
39
  type = args[1]
37
40
  label = options.delete(:label)
38
41
  classes = options.delete(:class)
42
+ status = convert_to_boolean_status(status)
39
43
 
40
- content = label || status.titleize if status
44
+ if status
45
+ content = label || if s = status.to_s and s.present?
46
+ I18n.t "active_admin.status_tag.#{s.downcase}", default: s.titleize
47
+ end
48
+ end
41
49
 
42
50
  super(content, options)
43
51
 
@@ -48,8 +56,23 @@ module ActiveAdmin
48
56
 
49
57
  protected
50
58
 
59
+ def convert_to_boolean_status(status)
60
+ if status == 'true'
61
+ 'Yes'
62
+ elsif ['false', nil].include?(status)
63
+ 'No'
64
+ else
65
+ status
66
+ end
67
+ end
68
+
51
69
  def status_to_class(status)
52
- status.titleize.gsub(/\s/, '').underscore
70
+ case status
71
+ when String, Symbol
72
+ status.to_s.titleize.gsub(/\s/, '').underscore
73
+ else
74
+ ''
75
+ end
53
76
  end
54
77
  end
55
78
  end
@@ -7,13 +7,21 @@ module ActiveAdmin
7
7
  'table'
8
8
  end
9
9
 
10
- def build(record_or_collection, options = {})
10
+ def build(obj, *attrs)
11
+ options = attrs.extract_options!
11
12
  @sortable = options.delete(:sortable)
12
13
  @resource_class = options.delete(:i18n)
13
- @collection = Array(record_or_collection)
14
- @columns = []
14
+ @collection = obj.respond_to?(:each) && !obj.is_a?(Hash) ? obj : [obj]
15
+ @columns = []
16
+ @row_class = options.delete(:row_class)
17
+
15
18
  build_table
16
19
  super(options)
20
+ columns(*attrs)
21
+ end
22
+
23
+ def columns(*attrs)
24
+ attrs.each {|attr| column(attr) }
17
25
  end
18
26
 
19
27
  def column(*args, &block)
@@ -75,15 +83,42 @@ module ActiveAdmin
75
83
  def build_table_body
76
84
  @tbody = tbody do
77
85
  # Build enough rows for our collection
78
- @collection.each{|elem| tr(:class => cycle('odd', 'even'), :id => dom_id(elem)) }
86
+ @collection.each do |elem|
87
+ classes = [cycle('odd', 'even')]
88
+
89
+ if @row_class
90
+ classes << @row_class.call(elem)
91
+ end
92
+
93
+ tr(class: classes.flatten.join(' '), id: dom_id_for(elem))
94
+ end
79
95
  end
80
96
  end
81
97
 
82
98
  def build_table_cell(col, item)
83
99
  td class: col.html_class do
84
- value = call_method_or_proc_on item, col.data, exec: false
85
- value = pretty_format(value) if col.data.is_a?(Symbol)
86
- value
100
+ render_data col.data, item
101
+ end
102
+ end
103
+
104
+ def render_data(data, item)
105
+ value = if data.is_a? Proc
106
+ data.call item
107
+ elsif item.respond_to? data
108
+ item.public_send data
109
+ elsif item.respond_to? :[]
110
+ item[data]
111
+ end
112
+ value = pretty_format(value) if data.is_a?(Symbol)
113
+ value = status_tag value if is_boolean? data, item
114
+ value
115
+ end
116
+
117
+ def is_boolean?(data, item)
118
+ if item.respond_to? :has_attribute?
119
+ item.has_attribute?(data) &&
120
+ item.column_for_attribute(data) &&
121
+ item.column_for_attribute(data).type == :boolean
87
122
  end
88
123
  end
89
124
 
@@ -91,10 +126,14 @@ module ActiveAdmin
91
126
  # current_sort[0] #=> sort_key
92
127
  # current_sort[1] #=> asc | desc
93
128
  def current_sort
94
- @current_sort ||= if params[:order] =~ /^([\w\_\.]+)_(desc|asc)$/
95
- [$1,$2]
96
- else
97
- []
129
+ @current_sort ||= begin
130
+ order_clause = OrderClause.new params[:order]
131
+
132
+ if order_clause.valid?
133
+ [order_clause.field, order_clause.order]
134
+ else
135
+ []
136
+ end
98
137
  end
99
138
  end
100
139
 
@@ -110,7 +149,7 @@ module ActiveAdmin
110
149
 
111
150
  def default_options
112
151
  {
113
- :i18n => @resource_class
152
+ i18n: @resource_class
114
153
  }
115
154
  end
116
155
 
@@ -135,14 +174,12 @@ module ActiveAdmin
135
174
  end
136
175
 
137
176
  def sortable?
138
- if @data.is_a?(Proc)
139
- [String, Symbol].include?(@options[:sortable].class)
140
- elsif @options.has_key?(:sortable)
141
- @options[:sortable]
142
- elsif @data.respond_to?(:to_sym) && @resource_class
143
- !@resource_class.reflect_on_association(@data.to_sym)
177
+ if @options.has_key?(:sortable)
178
+ !!@options[:sortable]
179
+ elsif @resource_class
180
+ @resource_class.column_names.include?(sort_column_name)
144
181
  else
145
- true
182
+ @title.present?
146
183
  end
147
184
  end
148
185
 
@@ -155,19 +192,21 @@ module ActiveAdmin
155
192
  #
156
193
  # You can set the sort key by passing a string or symbol
157
194
  # to the sortable option:
158
- # column :username, :sortable => 'other_column_to_sort_on'
195
+ # column :username, sortable: 'other_column_to_sort_on'
159
196
  #
160
197
  # If you pass a block to be rendered for this column, the column
161
198
  # will not be sortable unless you pass a string to sortable to
162
199
  # sort the column on:
163
200
  #
164
- # column('Username', :sortable => 'login'){ @user.pretty_name }
201
+ # column('Username', sortable: 'login'){ @user.pretty_name }
165
202
  # # => Sort key will be 'login'
166
203
  #
167
204
  def sort_key
168
205
  # If boolean or nil, use the default sort key.
169
- if @options[:sortable] == true || @options[:sortable] == false || @options[:sortable].nil?
206
+ if @options[:sortable] == true || @options[:sortable] == false
170
207
  @data.to_s
208
+ elsif @options[:sortable].nil?
209
+ sort_column_name
171
210
  else
172
211
  @options[:sortable].to_s
173
212
  end
@@ -185,6 +224,12 @@ module ActiveAdmin
185
224
  @title
186
225
  end
187
226
  end
227
+
228
+ private
229
+
230
+ def sort_column_name
231
+ @data.is_a?(Symbol) ? @data.to_s : @title.to_s
232
+ end
188
233
  end
189
234
  end
190
235
  end