activeadmin-rails 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +64 -0
  3. data/.github/ISSUE_TEMPLATE.md +20 -0
  4. data/.github/workflows/ci.yaml +64 -0
  5. data/.github/workflows/daily.yaml +64 -0
  6. data/.github/workflows/pages.yml +72 -0
  7. data/.gitignore +23 -0
  8. data/.mdlrc +1 -0
  9. data/.rubocop.yml +84 -0
  10. data/.simplecov +13 -0
  11. data/.yardopts +7 -0
  12. data/CHANGELOG.md +514 -0
  13. data/CODE_OF_CONDUCT.md +22 -0
  14. data/CONTRIBUTING.md +190 -0
  15. data/Gemfile +51 -0
  16. data/LICENSE +20 -0
  17. data/README.md +84 -0
  18. data/Rakefile +56 -0
  19. data/activeadmin-rails.gemspec +39 -0
  20. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  21. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  22. data/app/assets/images/active_admin/orderable.png +0 -0
  23. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  24. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  25. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  26. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  27. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  28. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  29. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  30. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +59 -0
  31. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  32. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  33. data/app/assets/javascripts/active_admin/lib/has_many.es6 +89 -0
  34. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  35. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  36. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  37. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  38. data/app/assets/stylesheets/active_admin/_forms.scss +338 -0
  39. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  40. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  41. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  42. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
  43. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  44. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  45. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  46. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  47. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  48. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  49. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  50. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  51. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  52. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  53. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  54. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  55. data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
  56. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  57. data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
  58. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +17 -0
  59. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  60. data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
  61. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  62. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  71. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  72. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  73. data/app/assets/stylesheets/active_admin/print.scss +287 -0
  74. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  75. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  76. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  77. data/app/views/active_admin/_head.html.erb +14 -0
  78. data/app/views/active_admin/base/_action_items.html.arb +7 -0
  79. data/app/views/active_admin/base/_breadcrumbs.html.arb +8 -0
  80. data/app/views/active_admin/base/_footer.html.arb +11 -0
  81. data/app/views/active_admin/base/_header.html.arb +5 -0
  82. data/app/views/active_admin/base/_sidebar.html.arb +3 -0
  83. data/app/views/active_admin/base/_title_bar.html.arb +9 -0
  84. data/app/views/active_admin/base/_unsupported_browser.html.erb +5 -0
  85. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  86. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  87. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  88. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  89. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  90. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  91. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  92. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  93. data/app/views/active_admin/devise/shared/_links.erb +33 -0
  94. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  95. data/app/views/active_admin/page/_content.html.arb +1 -0
  96. data/app/views/active_admin/page/index.html.arb +8 -0
  97. data/app/views/active_admin/resource/_filters_form.html.erb +1 -0
  98. data/app/views/active_admin/resource/_form.html.arb +11 -0
  99. data/app/views/active_admin/resource/_index_as_table.html.arb +8 -0
  100. data/app/views/active_admin/resource/_show.html.arb +1 -0
  101. data/app/views/active_admin/resource/edit.html.arb +13 -0
  102. data/app/views/active_admin/resource/index.html.arb +101 -0
  103. data/app/views/active_admin/resource/new.html.arb +13 -0
  104. data/app/views/active_admin/resource/show.html.arb +22 -0
  105. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  106. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  107. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  108. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  109. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  110. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  111. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  112. data/app/views/layouts/active_admin.html.erb +33 -0
  113. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  114. data/codecov.yml +25 -0
  115. data/config/i18n-tasks.yml +26 -0
  116. data/config/locales/ar.yml +133 -0
  117. data/config/locales/bg.yml +118 -0
  118. data/config/locales/bs.yml +119 -0
  119. data/config/locales/ca.yml +104 -0
  120. data/config/locales/cs.yml +107 -0
  121. data/config/locales/da.yml +135 -0
  122. data/config/locales/de-CH.yml +99 -0
  123. data/config/locales/de.yml +142 -0
  124. data/config/locales/el.yml +124 -0
  125. data/config/locales/en-CA.yml +137 -0
  126. data/config/locales/en-GB.yml +137 -0
  127. data/config/locales/en.yml +160 -0
  128. data/config/locales/eo.yml +143 -0
  129. data/config/locales/es-MX.yml +94 -0
  130. data/config/locales/es.yml +160 -0
  131. data/config/locales/fa.yml +117 -0
  132. data/config/locales/fi.yml +110 -0
  133. data/config/locales/fr.yml +139 -0
  134. data/config/locales/he.yml +140 -0
  135. data/config/locales/hr.yml +121 -0
  136. data/config/locales/hu.yml +96 -0
  137. data/config/locales/id.yml +133 -0
  138. data/config/locales/it.yml +142 -0
  139. data/config/locales/ja.yml +139 -0
  140. data/config/locales/ko.yml +118 -0
  141. data/config/locales/lt.yml +140 -0
  142. data/config/locales/lv.yml +90 -0
  143. data/config/locales/nb.yml +128 -0
  144. data/config/locales/nl.yml +142 -0
  145. data/config/locales/pl.yml +166 -0
  146. data/config/locales/pt-BR.yml +141 -0
  147. data/config/locales/pt-PT.yml +90 -0
  148. data/config/locales/ro.yml +94 -0
  149. data/config/locales/ru.yml +139 -0
  150. data/config/locales/sk.yml +107 -0
  151. data/config/locales/sv-SE.yml +133 -0
  152. data/config/locales/tr.yml +142 -0
  153. data/config/locales/uk.yml +134 -0
  154. data/config/locales/vi.yml +132 -0
  155. data/config/locales/zh-CN.yml +141 -0
  156. data/config/locales/zh-TW.yml +133 -0
  157. data/config/mdl_style.rb +9 -0
  158. data/cucumber.yml +6 -0
  159. data/docs/0-installation.md +121 -0
  160. data/docs/1-general-configuration.md +207 -0
  161. data/docs/10-custom-pages.md +148 -0
  162. data/docs/11-decorators.md +66 -0
  163. data/docs/12-arbo-components.md +200 -0
  164. data/docs/13-authorization-adapter.md +288 -0
  165. data/docs/14-gotchas.md +141 -0
  166. data/docs/2-resource-customization.md +480 -0
  167. data/docs/3-index-pages/custom-index.md +39 -0
  168. data/docs/3-index-pages/index-as-block.md +23 -0
  169. data/docs/3-index-pages/index-as-blog.md +73 -0
  170. data/docs/3-index-pages/index-as-grid.md +31 -0
  171. data/docs/3-index-pages/index-as-table.md +259 -0
  172. data/docs/3-index-pages.md +349 -0
  173. data/docs/4-csv-format.md +86 -0
  174. data/docs/5-forms.md +233 -0
  175. data/docs/6-show-pages.md +61 -0
  176. data/docs/7-sidebars.md +63 -0
  177. data/docs/8-custom-actions.md +160 -0
  178. data/docs/9-batch-actions.md +248 -0
  179. data/docs/CNAME +1 -0
  180. data/docs/Gemfile +7 -0
  181. data/docs/README.md +24 -0
  182. data/docs/_config.yml +15 -0
  183. data/docs/_includes/nav_footer_custom.html +3 -0
  184. data/docs/documentation.md +61 -0
  185. data/docs/images/activeadmin.png +0 -0
  186. data/docs/images/divider.png +0 -0
  187. data/docs/images/features.png +0 -0
  188. data/docs/index.css +835 -0
  189. data/docs/index.html +105 -0
  190. data/features/action_item.feature +73 -0
  191. data/features/authorization.feature +64 -0
  192. data/features/authorization_cancan.feature +52 -0
  193. data/features/authorization_pundit.feature +37 -0
  194. data/features/belongs_to.feature +124 -0
  195. data/features/breadcrumb.feature +76 -0
  196. data/features/comments/commenting.feature +178 -0
  197. data/features/comments/viewing_index.feature +18 -0
  198. data/features/create_another.feature +55 -0
  199. data/features/dashboard.feature +16 -0
  200. data/features/decorators.feature +43 -0
  201. data/features/development_reloading.feature +28 -0
  202. data/features/edit_page.feature +116 -0
  203. data/features/favicon.feature +20 -0
  204. data/features/filter_attributes.feature +46 -0
  205. data/features/first_boot.feature +16 -0
  206. data/features/footer.feature +29 -0
  207. data/features/global_navigation.feature +29 -0
  208. data/features/i18n.feature +55 -0
  209. data/features/index/batch_actions.feature +218 -0
  210. data/features/index/filters.feature +251 -0
  211. data/features/index/format_as_csv.feature +273 -0
  212. data/features/index/formats.feature +88 -0
  213. data/features/index/index_as_block.feature +15 -0
  214. data/features/index/index_as_blog.feature +69 -0
  215. data/features/index/index_as_grid.feature +45 -0
  216. data/features/index/index_as_table.feature +291 -0
  217. data/features/index/index_blank_slate.feature +83 -0
  218. data/features/index/index_parameters.feature +75 -0
  219. data/features/index/index_scope_to.feature +56 -0
  220. data/features/index/index_scopes.feature +325 -0
  221. data/features/index/page_title.feature +41 -0
  222. data/features/index/pagination.feature +63 -0
  223. data/features/index/switch_index_view.feature +73 -0
  224. data/features/menu.feature +85 -0
  225. data/features/meta_tags.feature +21 -0
  226. data/features/new_page.feature +136 -0
  227. data/features/registering_assets.feature +34 -0
  228. data/features/registering_pages.feature +237 -0
  229. data/features/registering_resources.feature +33 -0
  230. data/features/renamed_resource.feature +29 -0
  231. data/features/root_to.feature +18 -0
  232. data/features/show/attributes_table_title.feature +54 -0
  233. data/features/show/columns.feature +40 -0
  234. data/features/show/default_content.feature +44 -0
  235. data/features/show/page_title.feature +58 -0
  236. data/features/show/tabs.feature +47 -0
  237. data/features/sidebar_sections.feature +210 -0
  238. data/features/site_title.feature +47 -0
  239. data/features/specifying_actions.feature +118 -0
  240. data/features/step_definitions/action_item_steps.rb +7 -0
  241. data/features/step_definitions/action_link_steps.rb +19 -0
  242. data/features/step_definitions/additional_web_steps.rb +81 -0
  243. data/features/step_definitions/asset_steps.rb +15 -0
  244. data/features/step_definitions/attribute_steps.rb +18 -0
  245. data/features/step_definitions/attributes_table_title_steps.rb +11 -0
  246. data/features/step_definitions/batch_action_steps.rb +78 -0
  247. data/features/step_definitions/blog_steps.rb +3 -0
  248. data/features/step_definitions/breadcrumb_steps.rb +13 -0
  249. data/features/step_definitions/column_steps.rb +8 -0
  250. data/features/step_definitions/comment_steps.rb +32 -0
  251. data/features/step_definitions/configuration_steps.rb +102 -0
  252. data/features/step_definitions/dashboard_steps.rb +15 -0
  253. data/features/step_definitions/factory_steps.rb +35 -0
  254. data/features/step_definitions/filter_steps.rb +57 -0
  255. data/features/step_definitions/flash_steps.rb +11 -0
  256. data/features/step_definitions/footer_steps.rb +21 -0
  257. data/features/step_definitions/format_steps.rb +60 -0
  258. data/features/step_definitions/i18n_steps.rb +11 -0
  259. data/features/step_definitions/index_scope_steps.rb +42 -0
  260. data/features/step_definitions/index_views_steps.rb +3 -0
  261. data/features/step_definitions/layout_steps.rb +3 -0
  262. data/features/step_definitions/member_link_steps.rb +7 -0
  263. data/features/step_definitions/menu_steps.rb +11 -0
  264. data/features/step_definitions/meta_tag_steps.rb +3 -0
  265. data/features/step_definitions/pagination_steps.rb +15 -0
  266. data/features/step_definitions/root_steps.rb +9 -0
  267. data/features/step_definitions/sidebar_steps.rb +11 -0
  268. data/features/step_definitions/site_title_steps.rb +31 -0
  269. data/features/step_definitions/tab_steps.rb +17 -0
  270. data/features/step_definitions/table_steps.rb +116 -0
  271. data/features/step_definitions/user_steps.rb +52 -0
  272. data/features/step_definitions/web_steps.rb +86 -0
  273. data/features/sti_resource.feature +65 -0
  274. data/features/strong_parameters.feature +69 -0
  275. data/features/support/env.rb +129 -0
  276. data/features/support/paths.rb +75 -0
  277. data/features/support/regular_env.rb +7 -0
  278. data/features/support/reload_env.rb +7 -0
  279. data/features/support/selectors.rb +45 -0
  280. data/features/users/logging_in.feature +32 -0
  281. data/features/users/logging_out.feature +29 -0
  282. data/features/users/resetting_password.feature +30 -0
  283. data/gemfiles/rails_42.gemfile +12 -0
  284. data/gemfiles/rails_52.gemfile +15 -0
  285. data/gemfiles/rails_60.gemfile +16 -0
  286. data/gemfiles/rails_61.gemfile +15 -0
  287. data/gemfiles/rails_61_turbolinks.gemfile +15 -0
  288. data/gemfiles/rails_70.gemfile +15 -0
  289. data/gemfiles/rails_70_hotwire.gemfile +15 -0
  290. data/gemfiles/rails_71.gemfile +17 -0
  291. data/lib/active_admin/abstract_view_factory.rb +47 -0
  292. data/lib/active_admin/application.rb +255 -0
  293. data/lib/active_admin/application_settings.rb +42 -0
  294. data/lib/active_admin/asset_registration.rb +29 -0
  295. data/lib/active_admin/authorization_adapter.rb +129 -0
  296. data/lib/active_admin/base_controller/authorization.rb +126 -0
  297. data/lib/active_admin/base_controller/menu.rb +34 -0
  298. data/lib/active_admin/base_controller.rb +91 -0
  299. data/lib/active_admin/batch_actions/controller.rb +45 -0
  300. data/lib/active_admin/batch_actions/resource_extension.rb +151 -0
  301. data/lib/active_admin/batch_actions/views/batch_action_form.rb +45 -0
  302. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  303. data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
  304. data/lib/active_admin/batch_actions.rb +16 -0
  305. data/lib/active_admin/callbacks.rb +88 -0
  306. data/lib/active_admin/cancan_adapter.rb +36 -0
  307. data/lib/active_admin/component.rb +5 -0
  308. data/lib/active_admin/controller_action.rb +12 -0
  309. data/lib/active_admin/csv_builder.rb +136 -0
  310. data/lib/active_admin/dependency.rb +96 -0
  311. data/lib/active_admin/deprecation.rb +10 -0
  312. data/lib/active_admin/devise.rb +80 -0
  313. data/lib/active_admin/dsl.rb +193 -0
  314. data/lib/active_admin/dynamic_setting.rb +38 -0
  315. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  316. data/lib/active_admin/engine.rb +22 -0
  317. data/lib/active_admin/error.rb +62 -0
  318. data/lib/active_admin/event.rb +24 -0
  319. data/lib/active_admin/filters/active.rb +29 -0
  320. data/lib/active_admin/filters/active_filter.rb +123 -0
  321. data/lib/active_admin/filters/active_sidebar.rb +50 -0
  322. data/lib/active_admin/filters/dsl.rb +21 -0
  323. data/lib/active_admin/filters/forms.rb +85 -0
  324. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  325. data/lib/active_admin/filters/resource_extension.rb +153 -0
  326. data/lib/active_admin/filters.rb +11 -0
  327. data/lib/active_admin/form_builder.rb +182 -0
  328. data/lib/active_admin/generators/boilerplate.rb +45 -0
  329. data/lib/active_admin/helpers/collection.rb +19 -0
  330. data/lib/active_admin/helpers/i18n.rb +7 -0
  331. data/lib/active_admin/helpers/optional_display.rb +38 -0
  332. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  333. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  334. data/lib/active_admin/inputs/datepicker_input.rb +27 -0
  335. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  336. data/lib/active_admin/inputs/filters/base.rb +44 -0
  337. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  338. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  339. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  340. data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
  341. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  342. data/lib/active_admin/inputs/filters/select_input.rb +58 -0
  343. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  344. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  345. data/lib/active_admin/inputs.rb +21 -0
  346. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  347. data/lib/active_admin/localizers.rb +11 -0
  348. data/lib/active_admin/menu.rb +106 -0
  349. data/lib/active_admin/menu_collection.rb +55 -0
  350. data/lib/active_admin/menu_item.rb +79 -0
  351. data/lib/active_admin/namespace.rb +325 -0
  352. data/lib/active_admin/namespace_settings.rb +107 -0
  353. data/lib/active_admin/order_clause.rb +48 -0
  354. data/lib/active_admin/orm/active_record/comments/comment.rb +35 -0
  355. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  356. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  357. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +95 -0
  358. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  359. data/lib/active_admin/orm/active_record/comments.rb +99 -0
  360. data/lib/active_admin/orm/active_record.rb +5 -0
  361. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  362. data/lib/active_admin/orm/mongoid.rb +1 -0
  363. data/lib/active_admin/page.rb +114 -0
  364. data/lib/active_admin/page_controller.rb +29 -0
  365. data/lib/active_admin/page_dsl.rb +35 -0
  366. data/lib/active_admin/page_presenter.rb +32 -0
  367. data/lib/active_admin/pundit_adapter.rb +68 -0
  368. data/lib/active_admin/resource/action_items.rb +120 -0
  369. data/lib/active_admin/resource/attributes.rb +47 -0
  370. data/lib/active_admin/resource/belongs_to.rb +48 -0
  371. data/lib/active_admin/resource/controllers.rb +19 -0
  372. data/lib/active_admin/resource/includes.rb +12 -0
  373. data/lib/active_admin/resource/menu.rb +65 -0
  374. data/lib/active_admin/resource/naming.rb +62 -0
  375. data/lib/active_admin/resource/ordering.rb +11 -0
  376. data/lib/active_admin/resource/page_presenters.rb +90 -0
  377. data/lib/active_admin/resource/pagination.rb +23 -0
  378. data/lib/active_admin/resource/routes.rb +134 -0
  379. data/lib/active_admin/resource/scope_to.rb +74 -0
  380. data/lib/active_admin/resource/scopes.rb +52 -0
  381. data/lib/active_admin/resource/sidebars.rb +32 -0
  382. data/lib/active_admin/resource.rb +215 -0
  383. data/lib/active_admin/resource_collection.rb +72 -0
  384. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  385. data/lib/active_admin/resource_controller/data_access.rb +341 -0
  386. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  387. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  388. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  389. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  390. data/lib/active_admin/resource_controller/streaming.rb +47 -0
  391. data/lib/active_admin/resource_controller.rb +116 -0
  392. data/lib/active_admin/resource_dsl.rb +221 -0
  393. data/lib/active_admin/router.rb +113 -0
  394. data/lib/active_admin/scope.rb +60 -0
  395. data/lib/active_admin/settings_node.rb +19 -0
  396. data/lib/active_admin/sidebar_section.rb +37 -0
  397. data/lib/active_admin/version.rb +3 -0
  398. data/lib/active_admin/view_factory.rb +10 -0
  399. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  400. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  401. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +52 -0
  402. data/lib/active_admin/view_helpers/display_helper.rb +95 -0
  403. data/lib/active_admin/view_helpers/download_format_links_helper.rb +58 -0
  404. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  405. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  406. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  407. data/lib/active_admin/view_helpers/layout_helper.rb +32 -0
  408. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  409. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  410. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  411. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  412. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  413. data/lib/active_admin/view_helpers.rb +21 -0
  414. data/lib/active_admin/views/components/action_link.rb +13 -0
  415. data/lib/active_admin/views/components/active_admin_form.rb +163 -0
  416. data/lib/active_admin/views/components/attributes_panel.rb +23 -0
  417. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  418. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  419. data/lib/active_admin/views/components/columns.rb +161 -0
  420. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  421. data/lib/active_admin/views/components/index_list.rb +69 -0
  422. data/lib/active_admin/views/components/menu.rb +32 -0
  423. data/lib/active_admin/views/components/menu_item.rb +58 -0
  424. data/lib/active_admin/views/components/paginated_collection.rb +159 -0
  425. data/lib/active_admin/views/components/panel.rb +38 -0
  426. data/lib/active_admin/views/components/scopes.rb +72 -0
  427. data/lib/active_admin/views/components/sidebar_section.rb +34 -0
  428. data/lib/active_admin/views/components/site_title.rb +28 -0
  429. data/lib/active_admin/views/components/status_tag.rb +88 -0
  430. data/lib/active_admin/views/components/table_for.rb +209 -0
  431. data/lib/active_admin/views/components/tabs.rb +40 -0
  432. data/lib/active_admin/views/index_as_block.rb +36 -0
  433. data/lib/active_admin/views/index_as_blog.rb +155 -0
  434. data/lib/active_admin/views/index_as_grid.rb +80 -0
  435. data/lib/active_admin/views/index_as_table.rb +377 -0
  436. data/lib/active_admin/views.rb +8 -0
  437. data/lib/active_admin.rb +132 -0
  438. data/lib/activeadmin-rails.rb +1 -0
  439. data/lib/bug_report_templates/active_admin_main.rb +110 -0
  440. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  441. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  442. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  443. data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
  444. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  445. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +300 -0
  446. data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
  447. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  448. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +16 -0
  449. data/lib/generators/active_admin/page/USAGE +8 -0
  450. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  451. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  452. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  453. data/lib/generators/active_admin/resource/templates/admin.rb.erb +6 -0
  454. data/lib/ransack_ext.rb +20 -0
  455. data/spec/bug_report_templates_spec.rb +28 -0
  456. data/spec/changelog_spec.rb +15 -0
  457. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  458. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  459. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  460. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  461. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  462. data/spec/javascripts/support/jasmine.yml +74 -0
  463. data/spec/javascripts/support/jasmine_runner.rb +19 -0
  464. data/spec/rails_helper.rb +67 -0
  465. data/spec/requests/default_namespace_spec.rb +81 -0
  466. data/spec/requests/memory_spec.rb +25 -0
  467. data/spec/requests/pages/form_spec.rb +73 -0
  468. data/spec/requests/pages/index_spec.rb +96 -0
  469. data/spec/requests/pages/layout_spec.rb +59 -0
  470. data/spec/requests/pages/show_spec.rb +38 -0
  471. data/spec/requests/stylesheets_spec.rb +18 -0
  472. data/spec/spec_helper.rb +1 -0
  473. data/spec/support/active_admin_integration_spec_helper.rb +79 -0
  474. data/spec/support/active_admin_request_helpers.rb +39 -0
  475. data/spec/support/rails_template.rb +224 -0
  476. data/spec/support/rails_template_with_data.rb +328 -0
  477. data/spec/support/templates/admin/stores.rb +7 -0
  478. data/spec/support/templates/en.yml +8 -0
  479. data/spec/support/templates/manifest.js +3 -0
  480. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  481. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  482. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  483. data/spec/support/templates/policies/application_policy.rb +44 -0
  484. data/spec/support/templates/policies/category_policy.rb +7 -0
  485. data/spec/support/templates/policies/post_policy.rb +15 -0
  486. data/spec/support/templates/policies/store_policy.rb +11 -0
  487. data/spec/support/templates/policies/user_policy.rb +11 -0
  488. data/spec/support/templates/post_decorator.rb +24 -0
  489. data/spec/unit/abstract_view_factory_spec.rb +78 -0
  490. data/spec/unit/action_builder_spec.rb +160 -0
  491. data/spec/unit/active_admin_spec.rb +11 -0
  492. data/spec/unit/application_spec.rb +180 -0
  493. data/spec/unit/asset_registration_spec.rb +52 -0
  494. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  495. data/spec/unit/authorization/controller_authorization_spec.rb +43 -0
  496. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  497. data/spec/unit/auto_link_spec.rb +103 -0
  498. data/spec/unit/batch_actions/resource_spec.rb +84 -0
  499. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  500. data/spec/unit/belongs_to_spec.rb +76 -0
  501. data/spec/unit/cancan_adapter_spec.rb +43 -0
  502. data/spec/unit/comments_spec.rb +204 -0
  503. data/spec/unit/component_spec.rb +18 -0
  504. data/spec/unit/config_shared_examples.rb +59 -0
  505. data/spec/unit/controller_filters_spec.rb +41 -0
  506. data/spec/unit/csv_builder_spec.rb +321 -0
  507. data/spec/unit/dependency_spec.rb +135 -0
  508. data/spec/unit/devise_spec.rb +110 -0
  509. data/spec/unit/dsl_spec.rb +120 -0
  510. data/spec/unit/dynamic_settings_spec.rb +28 -0
  511. data/spec/unit/filters/active_filter_spec.rb +222 -0
  512. data/spec/unit/filters/active_spec.rb +24 -0
  513. data/spec/unit/filters/filter_form_builder_spec.rb +524 -0
  514. data/spec/unit/filters/resource_spec.rb +128 -0
  515. data/spec/unit/form_builder_spec.rb +1013 -0
  516. data/spec/unit/generators/install_spec.rb +31 -0
  517. data/spec/unit/helpers/collection_spec.rb +68 -0
  518. data/spec/unit/helpers/scope_chain_spec.rb +35 -0
  519. data/spec/unit/i18n_spec.rb +29 -0
  520. data/spec/unit/localizers/resource_localizer_spec.rb +36 -0
  521. data/spec/unit/menu_collection_spec.rb +40 -0
  522. data/spec/unit/menu_item_spec.rb +82 -0
  523. data/spec/unit/menu_spec.rb +60 -0
  524. data/spec/unit/namespace/authorization_spec.rb +27 -0
  525. data/spec/unit/namespace/register_page_spec.rb +99 -0
  526. data/spec/unit/namespace/register_resource_spec.rb +162 -0
  527. data/spec/unit/namespace_spec.rb +132 -0
  528. data/spec/unit/order_clause_spec.rb +81 -0
  529. data/spec/unit/page_controller_spec.rb +5 -0
  530. data/spec/unit/page_spec.rb +128 -0
  531. data/spec/unit/pretty_format_spec.rb +133 -0
  532. data/spec/unit/pundit_adapter_spec.rb +98 -0
  533. data/spec/unit/resource/action_items_spec.rb +83 -0
  534. data/spec/unit/resource/attributes_spec.rb +56 -0
  535. data/spec/unit/resource/includes_spec.rb +21 -0
  536. data/spec/unit/resource/menu_spec.rb +18 -0
  537. data/spec/unit/resource/naming_spec.rb +120 -0
  538. data/spec/unit/resource/ordering_spec.rb +35 -0
  539. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  540. data/spec/unit/resource/pagination_spec.rb +38 -0
  541. data/spec/unit/resource/routes_spec.rb +125 -0
  542. data/spec/unit/resource/scopes_spec.rb +50 -0
  543. data/spec/unit/resource/sidebars_spec.rb +43 -0
  544. data/spec/unit/resource_collection_spec.rb +175 -0
  545. data/spec/unit/resource_controller/data_access_spec.rb +234 -0
  546. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  547. data/spec/unit/resource_controller/sidebars_spec.rb +37 -0
  548. data/spec/unit/resource_controller_spec.rb +290 -0
  549. data/spec/unit/resource_registration_spec.rb +61 -0
  550. data/spec/unit/resource_spec.rb +320 -0
  551. data/spec/unit/routing_spec.rb +211 -0
  552. data/spec/unit/scope_spec.rb +225 -0
  553. data/spec/unit/settings_node_spec.rb +26 -0
  554. data/spec/unit/view_factory_spec.rb +13 -0
  555. data/spec/unit/view_helpers/breadcrumbs_spec.rb +255 -0
  556. data/spec/unit/view_helpers/display_helper_spec.rb +203 -0
  557. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  558. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  559. data/spec/unit/view_helpers/flash_helper_spec.rb +24 -0
  560. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  561. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +138 -0
  562. data/spec/unit/views/components/attributes_table_spec.rb +271 -0
  563. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  564. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  565. data/spec/unit/views/components/columns_spec.rb +187 -0
  566. data/spec/unit/views/components/index_list_spec.rb +49 -0
  567. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  568. data/spec/unit/views/components/menu_item_spec.rb +29 -0
  569. data/spec/unit/views/components/menu_spec.rb +168 -0
  570. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  571. data/spec/unit/views/components/panel_spec.rb +58 -0
  572. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  573. data/spec/unit/views/components/site_title_spec.rb +82 -0
  574. data/spec/unit/views/components/status_tag_spec.rb +265 -0
  575. data/spec/unit/views/components/table_for_spec.rb +441 -0
  576. data/spec/unit/views/components/tabs_spec.rb +99 -0
  577. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  578. data/tasks/docs.rake +64 -0
  579. data/tasks/lint.rake +21 -0
  580. data/tasks/local.rake +25 -0
  581. data/tasks/parallel_tests.rake +66 -0
  582. data/tasks/test.rake +24 -0
  583. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  584. metadata +1012 -0
@@ -0,0 +1,441 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Views::TableFor do
4
+ describe "creating with the dsl" do
5
+
6
+ let(:collection) do
7
+ [
8
+ Post.new(title: "First Post", starred: true),
9
+ Post.new(title: "Second Post"),
10
+ Post.new(title: "Third Post", starred: false)
11
+ ]
12
+ end
13
+
14
+ let(:assigns){ { collection: collection } }
15
+ let(:helpers){ mock_action_view }
16
+
17
+ context "when creating a column using symbol argument" do
18
+ let(:table) do
19
+ render_component assigns, helpers do
20
+ table_for(collection, :title)
21
+ end
22
+ end
23
+
24
+ it "should create a table header based on the symbol" do
25
+ expect(table.find_by_tag("th").first.content).to eq "Title"
26
+ end
27
+
28
+ it "should create a table row for each element in the collection" do
29
+ expect(table.find_by_tag("tr").size).to eq 4 # 1 for head, 3 for rows
30
+ end
31
+
32
+ ["First Post", "Second Post", "Third Post"].each_with_index do |content, index|
33
+ it "should create a cell with #{content}" do
34
+ expect(table.find_by_tag("td")[index].content).to eq content
35
+ end
36
+ end
37
+ end
38
+
39
+ context "when creating many columns using symbol arguments" do
40
+ let(:table) do
41
+ render_component assigns, helpers do
42
+ table_for(collection, :title, :created_at)
43
+ end
44
+ end
45
+
46
+ it "should create a table header based on the symbol" do
47
+ expect(table.find_by_tag("th").first.content).to eq "Title"
48
+ expect(table.find_by_tag("th").last.content).to eq "Created At"
49
+ end
50
+
51
+ it "should add a class to each table header based on the col name" do
52
+ expect(table.find_by_tag("th").first.class_list.to_a.join(' ')).to eq "col col-title"
53
+ expect(table.find_by_tag("th").last.class_list.to_a.join(' ')).to eq "col col-created_at"
54
+ end
55
+
56
+ it "should create a table row for each element in the collection" do
57
+ expect(table.find_by_tag("tr").size).to eq 4 # 1 for head, 3 for rows
58
+ end
59
+
60
+ it "should create a cell for each column" do
61
+ expect(table.find_by_tag("td").size).to eq 6
62
+ end
63
+
64
+ it "should add a class for each cell based on the col name" do
65
+ expect(table.find_by_tag("td").first.class_list.to_a.join(' ')).to eq "col col-title"
66
+ expect(table.find_by_tag("td").last.class_list.to_a.join(' ')).to eq "col col-created_at"
67
+ end
68
+ end
69
+
70
+ context "when creating a column using symbol arguments and another using block" do
71
+ let(:table) do
72
+ render_component assigns, helpers do
73
+ table_for(collection, :title) do
74
+ column :created_at
75
+ end
76
+ end
77
+ end
78
+
79
+ it "should create a table header based on the symbol" do
80
+ expect(table.find_by_tag("th").first.content).to eq "Title"
81
+ expect(table.find_by_tag("th").last.content).to eq "Created At"
82
+ end
83
+
84
+ it "should add a class to each table header based on the col name" do
85
+ expect(table.find_by_tag("th").first.class_list.to_a.join(' ')).to eq "col col-title"
86
+ expect(table.find_by_tag("th").last.class_list.to_a.join(' ')).to eq "col col-created_at"
87
+ end
88
+
89
+ it "should create a table row for each element in the collection" do
90
+ expect(table.find_by_tag("tr").size).to eq 4 # 1 for head, 3 for rows
91
+ end
92
+
93
+ it "should create a cell for each column" do
94
+ expect(table.find_by_tag("td").size).to eq 6
95
+ end
96
+
97
+ it "should add a class for each cell based on the col name" do
98
+ expect(table.find_by_tag("td").first.class_list.to_a.join(' ')).to eq "col col-title"
99
+ expect(table.find_by_tag("td").last.class_list.to_a.join(' ')).to eq "col col-created_at"
100
+ end
101
+ end
102
+
103
+ context "when creating a column with a symbol" do
104
+ let(:table) do
105
+ render_component assigns, helpers do
106
+ table_for(collection) do
107
+ column :title
108
+ end
109
+ end
110
+ end
111
+
112
+ it "should create a table header based on the symbol" do
113
+ expect(table.find_by_tag("th").first.content).to eq "Title"
114
+ end
115
+
116
+ it "should create a table row for each element in the collection" do
117
+ expect(table.find_by_tag("tr").size).to eq 4 # 1 for head, 3 for rows
118
+ end
119
+
120
+ ["First Post", "Second Post", "Third Post"].each_with_index do |content, index|
121
+ it "should create a cell with #{content}" do
122
+ expect(table.find_by_tag("td")[index].content).to eq content
123
+ end
124
+ end
125
+ end
126
+
127
+ context "when creating many columns with symbols" do
128
+ let(:table) do
129
+ render_component assigns, helpers do
130
+ table_for(collection) do
131
+ column :title
132
+ column :created_at
133
+ end
134
+ end
135
+ end
136
+
137
+ it "should create a table header based on the symbol" do
138
+ expect(table.find_by_tag("th").first.content).to eq "Title"
139
+ expect(table.find_by_tag("th").last.content).to eq "Created At"
140
+ end
141
+
142
+ it "should add a class to each table header based on the col name" do
143
+ expect(table.find_by_tag("th").first.class_list.to_a.join(' ')).to eq "col col-title"
144
+ expect(table.find_by_tag("th").last.class_list.to_a.join(' ')).to eq "col col-created_at"
145
+ end
146
+
147
+ it "should create a table row for each element in the collection" do
148
+ expect(table.find_by_tag("tr").size).to eq 4 # 1 for head, 3 for rows
149
+ end
150
+
151
+ it "should create a cell for each column" do
152
+ expect(table.find_by_tag("td").size).to eq 6
153
+ end
154
+
155
+ it "should add a class for each cell based on the col name" do
156
+ expect(table.find_by_tag("td").first.class_list.to_a.join(' ')).to eq "col col-title"
157
+ expect(table.find_by_tag("td").last.class_list.to_a.join(' ')).to eq "col col-created_at"
158
+ end
159
+ end
160
+
161
+ context "when creating a column with block content" do
162
+ let(:table) do
163
+ render_component assigns, helpers do
164
+ table_for(collection) do
165
+ column :title do |post|
166
+ span(post.title)
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ it "should add a class to each table header based on the col name" do
173
+ expect(table.find_by_tag("th").first.class_list).to include("col-title")
174
+ end
175
+
176
+ [ "<span>First Post</span>",
177
+ "<span>Second Post</span>",
178
+ "<span>Third Post</span>"
179
+ ].each_with_index do |content, index|
180
+ it "should create a cell with #{content}" do
181
+ expect(table.find_by_tag("td")[index].content.strip).to eq content
182
+ end
183
+ end
184
+ end
185
+
186
+ context "when creating a column with multiple block content" do
187
+ let(:table) do
188
+ render_component assigns, helpers do
189
+ table_for(collection) do
190
+ column :title do |post|
191
+ span(post.title)
192
+ span(post.title)
193
+ end
194
+ end
195
+ end
196
+ end
197
+
198
+ 3.times do |index|
199
+ it "should create a cell with multiple elements in row #{index}" do
200
+ expect(table.find_by_tag("td")[index].find_by_tag("span").size).to eq 2
201
+ end
202
+ end
203
+ end
204
+
205
+ context "when creating many columns with symbols, blocks and strings" do
206
+ let(:table) do
207
+ render_component assigns, helpers do
208
+ table_for(collection) do
209
+ column "My Custom Title", :title
210
+ column :created_at, class: "datetime"
211
+ end
212
+ end
213
+ end
214
+
215
+ it "should add a class to each header based on class option or the col name" do
216
+ expect(table.find_by_tag("th").first.class_list.to_a.join(' ')).to eq "col col-my_custom_title"
217
+ expect(table.find_by_tag("th").last.class_list.to_a.join(' ')).to eq "col datetime"
218
+ end
219
+
220
+ it "should add a class to each cell based on class option or the col name" do
221
+ expect(table.find_by_tag("td").first.class_list.to_a.join(' ')).to eq "col col-my_custom_title"
222
+ expect(table.find_by_tag("td").last.class_list.to_a.join(' ')).to eq "col datetime"
223
+ end
224
+ end
225
+
226
+ context "when using a single record instead of a collection" do
227
+ let(:table) do
228
+ render_component nil, helpers do
229
+ table_for Post.new do
230
+ column :title
231
+ end
232
+ end
233
+ end
234
+
235
+ it "should render" do
236
+ expect(table.find_by_tag("th").first.content).to eq "Title"
237
+ end
238
+ end
239
+
240
+ context "when using a single Hash" do
241
+ let(:table) do
242
+ render_component nil, helpers do
243
+ table_for foo: 1, bar: 2 do
244
+ column :foo
245
+ column :bar
246
+ end
247
+ end
248
+ end
249
+
250
+ it "should render" do
251
+ expect(table.find_by_tag("th")[0].content).to eq "Foo"
252
+ expect(table.find_by_tag("th")[1].content).to eq "Bar"
253
+ expect(table.find_by_tag("td")[0].content).to eq "1"
254
+ expect(table.find_by_tag("td")[1].content).to eq "2"
255
+ end
256
+ end
257
+
258
+ context "when using an Array of Hashes" do
259
+ let(:table) do
260
+ render_component nil, helpers do
261
+ table_for [{foo: 1}, {foo: 2}] do
262
+ column :foo
263
+ end
264
+ end
265
+ end
266
+
267
+ it "should render" do
268
+ expect(table.find_by_tag("th")[0].content).to eq "Foo"
269
+ expect(table.find_by_tag("td")[0].content).to eq "1"
270
+ expect(table.find_by_tag("td")[1].content).to eq "2"
271
+ end
272
+ end
273
+
274
+ context "when record attribute is boolean" do
275
+ let(:table) do
276
+ render_component assigns, helpers do
277
+ table_for(collection) do
278
+ column :starred
279
+ end
280
+ end
281
+ end
282
+
283
+ it "should render boolean attribute within status tag" do
284
+ expect(table.find_by_tag("span").first.class_list.to_a.join(' ')).to eq "status_tag yes"
285
+ expect(table.find_by_tag("span").first.content).to eq "Yes"
286
+ expect(table.find_by_tag("span").last.class_list.to_a.join(' ')).to eq "status_tag no"
287
+ expect(table.find_by_tag("span").last.content).to eq "No"
288
+ end
289
+ end
290
+
291
+ context 'when row_class' do
292
+ let(:table) do
293
+ render_component assigns, helpers do
294
+ table_for(collection, row_class: -> e { 'starred' if e.starred }) do
295
+ column :starred
296
+ end
297
+ end
298
+ end
299
+
300
+ it 'should render boolean attribute within status tag' do
301
+ trs = table.find_by_tag('tr')
302
+ expect(trs.size).to eq 4
303
+ expect(trs.first.class_list.to_a.join(' ')).to eq ''
304
+ expect(trs.second.class_list.to_a.join(' ')).to eq 'odd starred'
305
+ expect(trs.third.class_list.to_a.join(' ')).to eq 'even'
306
+ expect(trs.fourth.class_list.to_a.join(' ')).to eq 'odd'
307
+ end
308
+ end
309
+
310
+ context "when i18n option is specified" do
311
+ around do |example|
312
+ with_translation(activerecord: { attributes: { post: { title: "Name" } } }) do
313
+ example.call
314
+ end
315
+ end
316
+
317
+ let(:table) do
318
+ render_component assigns, helpers do
319
+ table_for(collection, i18n: Post) do
320
+ column :title
321
+ end
322
+ end
323
+ end
324
+
325
+ it "should use localized column key" do
326
+ expect(table.find_by_tag("th").first.content).to eq "Name"
327
+ end
328
+ end
329
+
330
+ context "when i18n option is not specified" do
331
+ around do |example|
332
+ with_translation(activerecord: { attributes: { post: { title: "Name" } } }) do
333
+ example.call
334
+ end
335
+ end
336
+
337
+ let(:collection) do
338
+ Post.create([
339
+ { title: "First Post", starred: true },
340
+ { title: "Second Post" },
341
+ ])
342
+ Post.where(starred: true)
343
+ end
344
+
345
+ let(:table) do
346
+ render_component assigns, helpers do
347
+ table_for(collection) do
348
+ column :title
349
+ end
350
+ end
351
+ end
352
+
353
+ it "should predict localized key based on AR collection klass" do
354
+ expect(table.find_by_tag("th").first.content).to eq "Name"
355
+ end
356
+ end
357
+ end
358
+
359
+ describe "column sorting" do
360
+ def build_column(*args, &block)
361
+ ActiveAdmin::Views::TableFor::Column.new(*args, &block)
362
+ end
363
+
364
+ subject { table_column }
365
+
366
+ context "when default" do
367
+ let(:table_column){ build_column(:username) }
368
+ it { is_expected.to be_sortable }
369
+
370
+ describe '#sort_key' do
371
+ subject { super().sort_key }
372
+ it{ is_expected.to eq("username") }
373
+ end
374
+ end
375
+
376
+ context "when a block given with no sort key" do
377
+ let(:table_column){ build_column("Username"){ } }
378
+ it { is_expected.to be_sortable }
379
+
380
+ describe '#sort_key' do
381
+ subject { super().sort_key }
382
+ it { is_expected.to eq("Username") }
383
+ end
384
+ end
385
+
386
+ context "when a block given with a sort key" do
387
+ let(:table_column){ build_column("Username", sortable: :username){ } }
388
+ it { is_expected.to be_sortable }
389
+
390
+ describe '#sort_key' do
391
+ subject { super().sort_key }
392
+ it{ is_expected.to eq("username") }
393
+ end
394
+ end
395
+
396
+ context 'when a block given with virtual attribute and no sort key' do
397
+ let(:table_column) { build_column(:virtual, nil, Post) { } }
398
+ it { is_expected.not_to be_sortable }
399
+ end
400
+
401
+ context 'when symbol given as a data column should be sortable' do
402
+ let(:table_column){ build_column('Username column', :username) }
403
+ it { is_expected.to be_sortable }
404
+
405
+ describe '#sort_key' do
406
+ subject { super().sort_key }
407
+ it { is_expected.to eq 'username' }
408
+ end
409
+ end
410
+
411
+ context 'when sortable: true with a symbol and string' do
412
+ let(:table_column){ build_column('Username column', :username, sortable: true) }
413
+ it { is_expected.to be_sortable }
414
+
415
+ describe '#sort_key' do
416
+ subject { super().sort_key }
417
+ it { is_expected.to eq 'username' }
418
+ end
419
+ end
420
+
421
+ context "when sortable: false with a symbol" do
422
+ let(:table_column){ build_column(:username, sortable: false) }
423
+ it { is_expected.not_to be_sortable }
424
+ end
425
+
426
+ context "when sortable: false with a symbol and string" do
427
+ let(:table_column){ build_column("Username", :username, sortable: false) }
428
+ it { is_expected.not_to be_sortable }
429
+ end
430
+
431
+ context "when :sortable column is an association" do
432
+ let(:table_column){ build_column("Category", :category, Post) }
433
+ it { is_expected.not_to be_sortable }
434
+ end
435
+
436
+ context 'when :sortable column is an association and block given' do
437
+ let(:table_column){ build_column('Category', :category, Post) { } }
438
+ it { is_expected.not_to be_sortable }
439
+ end
440
+ end
441
+ end
@@ -0,0 +1,99 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Views::Tabs do
4
+ describe "creating with the dsl" do
5
+ context "when creating tabs with a symbol" do
6
+ before do
7
+ allow(I18n).to receive(:t).with("i18n.transliterate.rule".to_sym, anything).and_call_original
8
+ expect(I18n).to receive(:t).at_least(:once).with(:tab_key).and_return "テスト"
9
+ end
10
+
11
+ let(:tabs) do
12
+ render_component do
13
+ tabs do
14
+ tab :overview
15
+ tab I18n.t(:tab_key), id: :something_unique, html_options: { class: :some_css_class }
16
+ end
17
+ end
18
+ end
19
+
20
+ let(:subject) { Capybara.string(tabs.to_s) }
21
+
22
+ it "should create a tab navigation bar based on the symbol" do
23
+ expect(subject).to have_content('Overview')
24
+ end
25
+
26
+ it "should have tab with id based on symbol" do
27
+ expect(subject).to have_selector('div#overview')
28
+ end
29
+
30
+ it "should have link with fragment based on symbol" do
31
+ expect(subject).to have_selector('a[href="#overview"]')
32
+ end
33
+
34
+ it "should handle translation" do
35
+ expect(subject).to have_content('テスト')
36
+ end
37
+
38
+ it "should have tab with id based on options" do
39
+ expect(subject).to have_selector('div#something_unique')
40
+ end
41
+
42
+ it "should have link with fragment based on options" do
43
+ expect(subject).to have_selector('a[href="#something_unique"]')
44
+ end
45
+
46
+ it "should have li with specific css class" do
47
+ expect(subject).to have_selector('li.some_css_class')
48
+ end
49
+
50
+ end
51
+
52
+ context "when creating a tab with a block" do
53
+ let(:tabs) do
54
+ render_component do
55
+ tabs do
56
+ tab :overview do
57
+ span 'tab 1'
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ it "should create a tab navigation bar based on the symbol" do
64
+ expect(tabs.find_by_tag('li').first.content).to include("Overview")
65
+ end
66
+
67
+ it "should create a tab with a span inside of it" do
68
+ expect(tabs.find_by_tag('span').first.content).to eq('tab 1')
69
+ end
70
+ end
71
+
72
+ context "when creating a tab with non-transliteratable string" do
73
+ let(:tabs) do
74
+ render_component do
75
+ tabs do
76
+ tab '🤗' do
77
+ 'content'
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ let(:subject) { Capybara.string(tabs.to_s) }
84
+
85
+ it "should create a tab navigation bar based on the string" do
86
+ expect(subject).to have_content('🤗')
87
+ end
88
+
89
+ it "should have tab with id based on URL-encoded string" do
90
+ tab_content = subject.find('.tabs .tab-content div', text: 'content')
91
+ expect(tab_content['id']).to eq(CGI.escape('🤗'))
92
+ end
93
+
94
+ it "should have link with fragment based on URL-encoded string" do
95
+ expect(subject).to have_link('🤗', href: "##{CGI.escape('🤗')}")
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,76 @@
1
+ require 'rails_helper'
2
+
3
+ include ActiveAdmin
4
+ RSpec.describe ActiveAdmin::Views::IndexAsBlog do
5
+ subject { described_class.new }
6
+
7
+ describe '#build' do
8
+ let(:page_presenter) { double('page_presenter', block: nil) }
9
+ let(:collection) { double('collection') }
10
+
11
+ before do
12
+ expect(subject).to receive('build_posts')
13
+ expect(subject).to receive('add_class').with('index')
14
+ end
15
+
16
+ context 'when page_presenter has no block' do
17
+ before do
18
+ subject.build(page_presenter, collection)
19
+ end
20
+
21
+ it do
22
+ expect(subject.instance_variable_get(:@page_presenter))
23
+ .to eq(page_presenter)
24
+ expect(subject.instance_variable_get(:@collection)).to eq(collection)
25
+ end
26
+ end
27
+
28
+ context 'when page_presenter has block' do
29
+ let(:block) { Proc.new { double('proc_method') } }
30
+
31
+ before do
32
+ allow(page_presenter).to receive(:block).and_return(block)
33
+ allow(subject).to receive('instance_exec')
34
+ subject.build(page_presenter, collection)
35
+ end
36
+
37
+ it do
38
+ expect(subject).to have_received('instance_exec')
39
+ end
40
+ end
41
+ end
42
+
43
+ %w(title body).each do |method|
44
+ describe "#{method}" do
45
+ context 'when block given' do
46
+ let(:block_result) { double('block_result') }
47
+
48
+ it "should use the block to set the #{method}" do
49
+ expect(
50
+ subject.public_send("#{method}") do
51
+ block_result
52
+ end.yield
53
+ ).to eq(block_result)
54
+ end
55
+ end
56
+
57
+ context 'when no block and method given' do
58
+ let(:method) { double('method') }
59
+
60
+ it "should use method to set the #{method}" do
61
+ expect(subject.public_send("#{method}", method)).to eq(method)
62
+ end
63
+ end
64
+
65
+ context 'when no block and no method given' do
66
+ it 'should be nil' do
67
+ expect(subject.public_send("#{method}")).to eq(nil)
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '.index_name' do
74
+ it { expect(described_class.index_name).to eq('blog') }
75
+ end
76
+ end
data/tasks/docs.rake ADDED
@@ -0,0 +1,64 @@
1
+ require 'yard'
2
+ require 'yard/rake/yardoc_task'
3
+
4
+ namespace :docs do
5
+
6
+ YARD::Rake::YardocTask.new do |t|
7
+ t.files = ['lib/**/*.rb']
8
+ t.options = ['--no-output']
9
+ end
10
+
11
+ def jekyll_redirect_string(filename)
12
+ <<-EOD.strip_heredoc
13
+ ---
14
+ redirect_from: /docs/3-index-pages/#{filename}
15
+ ---
16
+
17
+ EOD
18
+ end
19
+
20
+ def filename_from_module(mod)
21
+ mod.name.to_s.underscore.tr('_', '-')
22
+ end
23
+
24
+ def write_docstrings_to(path, mods)
25
+ mods.each do |mod|
26
+ filename = filename_from_module(mod)
27
+
28
+ File.open("#{path}/#{filename}.md", 'w+') do |f|
29
+ f << jekyll_redirect_string("#{filename}.html") + mod.docstring + "\n"
30
+ end
31
+ end
32
+ end
33
+
34
+ def docs_syncronized?
35
+ # Do not print diff and yield whether exit code was zero
36
+ sh('git diff --quiet docs/3-index-pages') do |outcome, _|
37
+ return if outcome
38
+
39
+ # Output diff before raising error
40
+ sh('git diff docs/3-index-pages')
41
+
42
+ raise <<-MSG.strip_heredoc
43
+ The docs/3-index-pages directory is out of sync.
44
+ Run rake generate_cops_documentation and commit the results.
45
+ MSG
46
+ end
47
+ end
48
+
49
+ desc "Update docs in the docs folder"
50
+ task build: :yard do
51
+ require 'yard'
52
+ require 'active_support/all'
53
+
54
+ YARD::Registry.load!
55
+ views = YARD::Registry.at("ActiveAdmin::Views")
56
+
57
+ # Index Types
58
+ index_types = views.children.select{|obj| obj.name.to_s =~ /^IndexAs/ }
59
+ write_docstrings_to "docs/3-index-pages", index_types
60
+
61
+ docs_syncronized? if ENV["CI"]
62
+ end
63
+
64
+ end
data/tasks/lint.rake ADDED
@@ -0,0 +1,21 @@
1
+ desc "Lints ActiveAdmin code base"
2
+ task lint: ["lint:rubocop", "lint:mdl"]
3
+
4
+ namespace :lint do
5
+ require "rubocop/rake_task"
6
+ desc "Checks ruby code style with RuboCop"
7
+ RuboCop::RakeTask.new
8
+
9
+ desc "Checks markdown code style with Markdownlint"
10
+ task :mdl do
11
+ puts "Running mdl..."
12
+
13
+ targets = [
14
+ *Dir.glob("docs/**/*.md"),
15
+ "CONTRIBUTING.md",
16
+ ".github/ISSUE_TEMPLATE.md"
17
+ ]
18
+
19
+ abort unless system("mdl", *targets)
20
+ end
21
+ end