activeadmin-rb 1.4.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 (614) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +64 -0
  3. data/.github/ISSUE_TEMPLATE.md +20 -0
  4. data/.gitignore +21 -0
  5. data/.mdlrc +1 -0
  6. data/.rubocop.yml +84 -0
  7. data/.simplecov +13 -0
  8. data/.travis.yml +49 -0
  9. data/.yardopts +7 -0
  10. data/CHANGELOG.md +389 -0
  11. data/CODE_OF_CONDUCT.md +22 -0
  12. data/CONTRIBUTING.md +184 -0
  13. data/Gemfile +58 -0
  14. data/LICENSE +20 -0
  15. data/README.md +75 -0
  16. data/Rakefile +54 -0
  17. data/activeadmin-rb.gemspec +32 -0
  18. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  19. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  20. data/app/assets/images/active_admin/orderable.png +0 -0
  21. data/app/assets/javascripts/active_admin/base.js.coffee +13 -0
  22. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  23. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  24. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +11 -0
  25. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +14 -0
  26. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +26 -0
  27. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +7 -0
  28. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +42 -0
  29. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +46 -0
  30. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +104 -0
  31. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  32. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  33. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +45 -0
  34. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +46 -0
  35. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +22 -0
  36. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  37. data/app/assets/stylesheets/active_admin/_forms.scss +338 -0
  38. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  39. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  40. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  41. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
  42. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  43. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  44. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  45. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  46. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  47. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  48. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  49. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  50. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  51. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  52. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  53. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  54. data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
  55. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  56. data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
  57. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +17 -0
  58. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  59. data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
  60. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  61. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  62. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  71. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  72. data/app/assets/stylesheets/active_admin/print.scss +287 -0
  73. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  74. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  75. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  76. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  77. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  78. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  79. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  80. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  81. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  82. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  83. data/app/views/active_admin/devise/shared/_links.erb +33 -0
  84. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  85. data/app/views/active_admin/page/index.html.arb +1 -0
  86. data/app/views/active_admin/resource/edit.html.arb +1 -0
  87. data/app/views/active_admin/resource/index.html.arb +1 -0
  88. data/app/views/active_admin/resource/new.html.arb +1 -0
  89. data/app/views/active_admin/resource/show.html.arb +1 -0
  90. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  91. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  92. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  93. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  94. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  95. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  96. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  97. data/app/views/layouts/active_admin.html.arb +1 -0
  98. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  99. data/codecov.yml +25 -0
  100. data/config/i18n-tasks.yml +26 -0
  101. data/config/locales/ar.yml +134 -0
  102. data/config/locales/bg.yml +119 -0
  103. data/config/locales/bs.yml +120 -0
  104. data/config/locales/ca.yml +105 -0
  105. data/config/locales/cs.yml +108 -0
  106. data/config/locales/da.yml +136 -0
  107. data/config/locales/de-CH.yml +100 -0
  108. data/config/locales/de.yml +143 -0
  109. data/config/locales/el.yml +125 -0
  110. data/config/locales/en-CA.yml +138 -0
  111. data/config/locales/en-GB.yml +138 -0
  112. data/config/locales/en.yml +161 -0
  113. data/config/locales/eo.yml +144 -0
  114. data/config/locales/es-MX.yml +95 -0
  115. data/config/locales/es.yml +161 -0
  116. data/config/locales/fa.yml +118 -0
  117. data/config/locales/fi.yml +111 -0
  118. data/config/locales/fr.yml +140 -0
  119. data/config/locales/he.yml +141 -0
  120. data/config/locales/hr.yml +122 -0
  121. data/config/locales/hu.yml +97 -0
  122. data/config/locales/id.yml +134 -0
  123. data/config/locales/it.yml +143 -0
  124. data/config/locales/ja.yml +140 -0
  125. data/config/locales/ko.yml +119 -0
  126. data/config/locales/lt.yml +141 -0
  127. data/config/locales/lv.yml +91 -0
  128. data/config/locales/nb.yml +129 -0
  129. data/config/locales/nl.yml +143 -0
  130. data/config/locales/pl.yml +167 -0
  131. data/config/locales/pt-BR.yml +142 -0
  132. data/config/locales/pt-PT.yml +91 -0
  133. data/config/locales/ro.yml +95 -0
  134. data/config/locales/ru.yml +140 -0
  135. data/config/locales/sk.yml +108 -0
  136. data/config/locales/sv-SE.yml +134 -0
  137. data/config/locales/tr.yml +143 -0
  138. data/config/locales/uk.yml +135 -0
  139. data/config/locales/vi.yml +133 -0
  140. data/config/locales/zh-CN.yml +142 -0
  141. data/config/locales/zh-TW.yml +134 -0
  142. data/config/mdl_style.rb +9 -0
  143. data/cucumber.yml +6 -0
  144. data/docs/0-installation.md +118 -0
  145. data/docs/1-general-configuration.md +204 -0
  146. data/docs/10-custom-pages.md +150 -0
  147. data/docs/11-decorators.md +59 -0
  148. data/docs/12-arbre-components.md +203 -0
  149. data/docs/13-authorization-adapter.md +285 -0
  150. data/docs/14-gotchas.md +138 -0
  151. data/docs/2-resource-customization.md +466 -0
  152. data/docs/3-index-pages.md +328 -0
  153. data/docs/3-index-pages/custom-index.md +35 -0
  154. data/docs/3-index-pages/index-as-block.md +19 -0
  155. data/docs/3-index-pages/index-as-blog.md +69 -0
  156. data/docs/3-index-pages/index-as-grid.md +27 -0
  157. data/docs/3-index-pages/index-as-table.md +225 -0
  158. data/docs/4-csv-format.md +74 -0
  159. data/docs/5-forms.md +231 -0
  160. data/docs/6-show-pages.md +81 -0
  161. data/docs/7-sidebars.md +75 -0
  162. data/docs/8-custom-actions.md +177 -0
  163. data/docs/9-batch-actions.md +237 -0
  164. data/docs/CNAME +1 -0
  165. data/docs/Gemfile +2 -0
  166. data/docs/README.md +24 -0
  167. data/docs/_config.yml +2 -0
  168. data/docs/_includes/footer.html +8 -0
  169. data/docs/_includes/google-analytics.html +16 -0
  170. data/docs/_includes/head.html +7 -0
  171. data/docs/_includes/toc.html +98 -0
  172. data/docs/_includes/top-menu.html +9 -0
  173. data/docs/_layouts/default.html +21 -0
  174. data/docs/documentation.md +60 -0
  175. data/docs/images/activeadmin.png +0 -0
  176. data/docs/images/code-header.png +0 -0
  177. data/docs/images/divider.png +0 -0
  178. data/docs/images/features.png +0 -0
  179. data/docs/index.html +125 -0
  180. data/docs/stylesheets/main.css +1152 -0
  181. data/features/action_item.feature +73 -0
  182. data/features/authorization.feature +64 -0
  183. data/features/authorization_cancan.feature +52 -0
  184. data/features/authorization_pundit.feature +37 -0
  185. data/features/belongs_to.feature +124 -0
  186. data/features/breadcrumb.feature +76 -0
  187. data/features/comments/commenting.feature +178 -0
  188. data/features/comments/viewing_index.feature +19 -0
  189. data/features/create_another.feature +55 -0
  190. data/features/dashboard.feature +16 -0
  191. data/features/decorators.feature +43 -0
  192. data/features/development_reloading.feature +28 -0
  193. data/features/edit_page.feature +116 -0
  194. data/features/favicon.feature +20 -0
  195. data/features/first_boot.feature +16 -0
  196. data/features/footer.feature +29 -0
  197. data/features/global_navigation.feature +29 -0
  198. data/features/i18n.feature +55 -0
  199. data/features/index/batch_actions.feature +218 -0
  200. data/features/index/filters.feature +251 -0
  201. data/features/index/format_as_csv.feature +227 -0
  202. data/features/index/formats.feature +88 -0
  203. data/features/index/index_as_block.feature +15 -0
  204. data/features/index/index_as_blog.feature +69 -0
  205. data/features/index/index_as_grid.feature +45 -0
  206. data/features/index/index_as_table.feature +291 -0
  207. data/features/index/index_blank_slate.feature +83 -0
  208. data/features/index/index_parameters.feature +75 -0
  209. data/features/index/index_scope_to.feature +56 -0
  210. data/features/index/index_scopes.feature +325 -0
  211. data/features/index/page_title.feature +41 -0
  212. data/features/index/pagination.feature +63 -0
  213. data/features/index/switch_index_view.feature +73 -0
  214. data/features/menu.feature +85 -0
  215. data/features/meta_tags.feature +21 -0
  216. data/features/new_page.feature +136 -0
  217. data/features/registering_assets.feature +38 -0
  218. data/features/registering_pages.feature +237 -0
  219. data/features/registering_resources.feature +33 -0
  220. data/features/renamed_resource.feature +30 -0
  221. data/features/root_to.feature +18 -0
  222. data/features/show/attributes_table_title.feature +54 -0
  223. data/features/show/columns.feature +40 -0
  224. data/features/show/default_content.feature +44 -0
  225. data/features/show/page_title.feature +58 -0
  226. data/features/show/tabs.feature +33 -0
  227. data/features/sidebar_sections.feature +210 -0
  228. data/features/site_title.feature +47 -0
  229. data/features/specifying_actions.feature +118 -0
  230. data/features/step_definitions/action_item_steps.rb +7 -0
  231. data/features/step_definitions/action_link_steps.rb +19 -0
  232. data/features/step_definitions/additional_web_steps.rb +81 -0
  233. data/features/step_definitions/asset_steps.rb +15 -0
  234. data/features/step_definitions/attribute_steps.rb +18 -0
  235. data/features/step_definitions/attributes_table_title_steps.rb +11 -0
  236. data/features/step_definitions/batch_action_steps.rb +81 -0
  237. data/features/step_definitions/blog_steps.rb +3 -0
  238. data/features/step_definitions/breadcrumb_steps.rb +13 -0
  239. data/features/step_definitions/column_steps.rb +8 -0
  240. data/features/step_definitions/comment_steps.rb +32 -0
  241. data/features/step_definitions/configuration_steps.rb +100 -0
  242. data/features/step_definitions/dashboard_steps.rb +15 -0
  243. data/features/step_definitions/factory_steps.rb +35 -0
  244. data/features/step_definitions/filter_steps.rb +57 -0
  245. data/features/step_definitions/flash_steps.rb +11 -0
  246. data/features/step_definitions/footer_steps.rb +21 -0
  247. data/features/step_definitions/format_steps.rb +58 -0
  248. data/features/step_definitions/i18n_steps.rb +11 -0
  249. data/features/step_definitions/index_scope_steps.rb +42 -0
  250. data/features/step_definitions/index_views_steps.rb +3 -0
  251. data/features/step_definitions/layout_steps.rb +3 -0
  252. data/features/step_definitions/member_link_steps.rb +7 -0
  253. data/features/step_definitions/menu_steps.rb +11 -0
  254. data/features/step_definitions/meta_tag_steps.rb +3 -0
  255. data/features/step_definitions/pagination_steps.rb +15 -0
  256. data/features/step_definitions/root_steps.rb +9 -0
  257. data/features/step_definitions/sidebar_steps.rb +11 -0
  258. data/features/step_definitions/site_title_steps.rb +31 -0
  259. data/features/step_definitions/tab_steps.rb +8 -0
  260. data/features/step_definitions/table_steps.rb +116 -0
  261. data/features/step_definitions/user_steps.rb +52 -0
  262. data/features/step_definitions/web_steps.rb +86 -0
  263. data/features/sti_resource.feature +65 -0
  264. data/features/strong_parameters.feature +69 -0
  265. data/features/support/env.rb +121 -0
  266. data/features/support/paths.rb +73 -0
  267. data/features/support/regular_env.rb +7 -0
  268. data/features/support/reload_env.rb +7 -0
  269. data/features/support/selectors.rb +45 -0
  270. data/features/users/logging_in.feature +32 -0
  271. data/features/users/logging_out.feature +29 -0
  272. data/features/users/resetting_password.feature +30 -0
  273. data/gemfiles/rails_42.gemfile +11 -0
  274. data/gemfiles/rails_50.gemfile +11 -0
  275. data/gemfiles/rails_51.gemfile +11 -0
  276. data/gemfiles/rails_52.gemfile +12 -0
  277. data/lib/active_admin.rb +128 -0
  278. data/lib/active_admin/abstract_view_factory.rb +47 -0
  279. data/lib/active_admin/application.rb +241 -0
  280. data/lib/active_admin/application_settings.rb +39 -0
  281. data/lib/active_admin/asset_registration.rb +37 -0
  282. data/lib/active_admin/authorization_adapter.rb +129 -0
  283. data/lib/active_admin/base_controller.rb +81 -0
  284. data/lib/active_admin/base_controller/authorization.rb +128 -0
  285. data/lib/active_admin/base_controller/menu.rb +34 -0
  286. data/lib/active_admin/batch_actions.rb +16 -0
  287. data/lib/active_admin/batch_actions/controller.rb +40 -0
  288. data/lib/active_admin/batch_actions/resource_extension.rb +151 -0
  289. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  290. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  291. data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
  292. data/lib/active_admin/callbacks.rb +88 -0
  293. data/lib/active_admin/cancan_adapter.rb +36 -0
  294. data/lib/active_admin/component.rb +5 -0
  295. data/lib/active_admin/controller_action.rb +12 -0
  296. data/lib/active_admin/csv_builder.rb +131 -0
  297. data/lib/active_admin/dependency.rb +172 -0
  298. data/lib/active_admin/deprecation.rb +10 -0
  299. data/lib/active_admin/devise.rb +80 -0
  300. data/lib/active_admin/dsl.rb +167 -0
  301. data/lib/active_admin/dynamic_setting.rb +38 -0
  302. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  303. data/lib/active_admin/engine.rb +21 -0
  304. data/lib/active_admin/error.rb +62 -0
  305. data/lib/active_admin/event.rb +24 -0
  306. data/lib/active_admin/filters.rb +11 -0
  307. data/lib/active_admin/filters/active.rb +29 -0
  308. data/lib/active_admin/filters/active_filter.rb +123 -0
  309. data/lib/active_admin/filters/active_sidebar.rb +50 -0
  310. data/lib/active_admin/filters/dsl.rb +21 -0
  311. data/lib/active_admin/filters/forms.rb +85 -0
  312. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  313. data/lib/active_admin/filters/resource_extension.rb +155 -0
  314. data/lib/active_admin/form_builder.rb +182 -0
  315. data/lib/active_admin/generators/boilerplate.rb +45 -0
  316. data/lib/active_admin/helpers/collection.rb +19 -0
  317. data/lib/active_admin/helpers/i18n.rb +7 -0
  318. data/lib/active_admin/helpers/optional_display.rb +38 -0
  319. data/lib/active_admin/helpers/output_safety_helper.rb +35 -0
  320. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  321. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  322. data/lib/active_admin/inputs.rb +21 -0
  323. data/lib/active_admin/inputs/datepicker_input.rb +27 -0
  324. data/lib/active_admin/inputs/filters/base.rb +44 -0
  325. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  326. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  327. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  328. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  329. data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
  330. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  331. data/lib/active_admin/inputs/filters/select_input.rb +58 -0
  332. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  333. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  334. data/lib/active_admin/localizers.rb +11 -0
  335. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  336. data/lib/active_admin/menu.rb +102 -0
  337. data/lib/active_admin/menu_collection.rb +91 -0
  338. data/lib/active_admin/menu_item.rb +69 -0
  339. data/lib/active_admin/namespace.rb +266 -0
  340. data/lib/active_admin/namespace_settings.rb +107 -0
  341. data/lib/active_admin/order_clause.rb +48 -0
  342. data/lib/active_admin/orm/active_record.rb +5 -0
  343. data/lib/active_admin/orm/active_record/comments.rb +101 -0
  344. data/lib/active_admin/orm/active_record/comments/comment.rb +31 -0
  345. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  346. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  347. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  348. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  349. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +95 -0
  350. data/lib/active_admin/orm/mongoid.rb +1 -0
  351. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  352. data/lib/active_admin/page.rb +111 -0
  353. data/lib/active_admin/page_controller.rb +29 -0
  354. data/lib/active_admin/page_dsl.rb +32 -0
  355. data/lib/active_admin/page_presenter.rb +32 -0
  356. data/lib/active_admin/pundit_adapter.rb +68 -0
  357. data/lib/active_admin/reloader.rb +25 -0
  358. data/lib/active_admin/resource.rb +206 -0
  359. data/lib/active_admin/resource/action_items.rb +120 -0
  360. data/lib/active_admin/resource/attributes.rb +44 -0
  361. data/lib/active_admin/resource/belongs_to.rb +48 -0
  362. data/lib/active_admin/resource/controllers.rb +19 -0
  363. data/lib/active_admin/resource/includes.rb +12 -0
  364. data/lib/active_admin/resource/menu.rb +67 -0
  365. data/lib/active_admin/resource/naming.rb +62 -0
  366. data/lib/active_admin/resource/ordering.rb +11 -0
  367. data/lib/active_admin/resource/page_presenters.rb +82 -0
  368. data/lib/active_admin/resource/pagination.rb +23 -0
  369. data/lib/active_admin/resource/routes.rb +134 -0
  370. data/lib/active_admin/resource/scope_to.rb +74 -0
  371. data/lib/active_admin/resource/scopes.rb +52 -0
  372. data/lib/active_admin/resource/sidebars.rb +28 -0
  373. data/lib/active_admin/resource_collection.rb +72 -0
  374. data/lib/active_admin/resource_controller.rb +64 -0
  375. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  376. data/lib/active_admin/resource_controller/data_access.rb +322 -0
  377. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  378. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  379. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  380. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  381. data/lib/active_admin/resource_controller/streaming.rb +43 -0
  382. data/lib/active_admin/resource_dsl.rb +222 -0
  383. data/lib/active_admin/router.rb +113 -0
  384. data/lib/active_admin/scope.rb +60 -0
  385. data/lib/active_admin/settings_node.rb +19 -0
  386. data/lib/active_admin/sidebar_section.rb +37 -0
  387. data/lib/active_admin/version.rb +3 -0
  388. data/lib/active_admin/view_factory.rb +27 -0
  389. data/lib/active_admin/view_helpers.rb +20 -0
  390. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  391. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  392. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
  393. data/lib/active_admin/view_helpers/display_helper.rb +95 -0
  394. data/lib/active_admin/view_helpers/download_format_links_helper.rb +58 -0
  395. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  396. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  397. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  398. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  399. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  400. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  401. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  402. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  403. data/lib/active_admin/views.rb +8 -0
  404. data/lib/active_admin/views/action_items.rb +17 -0
  405. data/lib/active_admin/views/components/active_admin_form.rb +149 -0
  406. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  407. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  408. data/lib/active_admin/views/components/columns.rb +161 -0
  409. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  410. data/lib/active_admin/views/components/index_list.rb +69 -0
  411. data/lib/active_admin/views/components/menu.rb +32 -0
  412. data/lib/active_admin/views/components/menu_item.rb +58 -0
  413. data/lib/active_admin/views/components/paginated_collection.rb +159 -0
  414. data/lib/active_admin/views/components/panel.rb +38 -0
  415. data/lib/active_admin/views/components/scopes.rb +72 -0
  416. data/lib/active_admin/views/components/sidebar.rb +13 -0
  417. data/lib/active_admin/views/components/sidebar_section.rb +37 -0
  418. data/lib/active_admin/views/components/site_title.rb +54 -0
  419. data/lib/active_admin/views/components/status_tag.rb +88 -0
  420. data/lib/active_admin/views/components/table_for.rb +209 -0
  421. data/lib/active_admin/views/components/tabs.rb +31 -0
  422. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  423. data/lib/active_admin/views/footer.rb +30 -0
  424. data/lib/active_admin/views/header.rb +19 -0
  425. data/lib/active_admin/views/index_as_block.rb +36 -0
  426. data/lib/active_admin/views/index_as_blog.rb +155 -0
  427. data/lib/active_admin/views/index_as_grid.rb +80 -0
  428. data/lib/active_admin/views/index_as_table.rb +389 -0
  429. data/lib/active_admin/views/pages/base.rb +123 -0
  430. data/lib/active_admin/views/pages/form.rb +64 -0
  431. data/lib/active_admin/views/pages/index.rb +163 -0
  432. data/lib/active_admin/views/pages/layout.rb +26 -0
  433. data/lib/active_admin/views/pages/page.rb +30 -0
  434. data/lib/active_admin/views/pages/show.rb +65 -0
  435. data/lib/active_admin/views/tabbed_navigation.rb +11 -0
  436. data/lib/active_admin/views/title_bar.rb +55 -0
  437. data/lib/activeadmin-rb.rb +1 -0
  438. data/lib/bug_report_templates/active_admin_master.rb +112 -0
  439. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  440. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  441. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  442. data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
  443. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  444. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +293 -0
  445. data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
  446. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  447. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +30 -0
  448. data/lib/generators/active_admin/page/USAGE +8 -0
  449. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  450. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  451. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  452. data/lib/generators/active_admin/resource/templates/admin.rb.erb +43 -0
  453. data/lib/ransack_ext.rb +20 -0
  454. data/spec/bug_report_templates_spec.rb +26 -0
  455. data/spec/changelog_spec.rb +15 -0
  456. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  457. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -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/flashes.html +2 -0
  461. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  462. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  463. data/spec/javascripts/support/jasmine.yml +74 -0
  464. data/spec/javascripts/support/jasmine_runner.rb +19 -0
  465. data/spec/rails_helper.rb +60 -0
  466. data/spec/requests/default_namespace_spec.rb +81 -0
  467. data/spec/requests/memory_spec.rb +25 -0
  468. data/spec/requests/stylesheets_spec.rb +18 -0
  469. data/spec/spec_helper.rb +1 -0
  470. data/spec/support/active_admin_integration_spec_helper.rb +73 -0
  471. data/spec/support/active_admin_request_helpers.rb +39 -0
  472. data/spec/support/rails_template.rb +156 -0
  473. data/spec/support/rails_template_with_data.rb +327 -0
  474. data/spec/support/templates/admin/stores.rb +7 -0
  475. data/spec/support/templates/en.yml +8 -0
  476. data/spec/support/templates/manifest.js +3 -0
  477. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  478. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  479. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  480. data/spec/support/templates/policies/application_policy.rb +44 -0
  481. data/spec/support/templates/policies/category_policy.rb +7 -0
  482. data/spec/support/templates/policies/post_policy.rb +15 -0
  483. data/spec/support/templates/policies/store_policy.rb +11 -0
  484. data/spec/support/templates/policies/user_policy.rb +11 -0
  485. data/spec/support/templates/post_decorator.rb +24 -0
  486. data/spec/unit/abstract_view_factory_spec.rb +78 -0
  487. data/spec/unit/action_builder_spec.rb +158 -0
  488. data/spec/unit/active_admin_spec.rb +11 -0
  489. data/spec/unit/application_spec.rb +180 -0
  490. data/spec/unit/asset_registration_spec.rb +81 -0
  491. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  492. data/spec/unit/authorization/controller_authorization_spec.rb +43 -0
  493. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  494. data/spec/unit/auto_link_spec.rb +93 -0
  495. data/spec/unit/batch_actions/resource_spec.rb +84 -0
  496. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  497. data/spec/unit/belongs_to_spec.rb +76 -0
  498. data/spec/unit/cancan_adapter_spec.rb +43 -0
  499. data/spec/unit/comments_spec.rb +189 -0
  500. data/spec/unit/component_spec.rb +18 -0
  501. data/spec/unit/config_shared_examples.rb +59 -0
  502. data/spec/unit/controller_filters_spec.rb +41 -0
  503. data/spec/unit/csv_builder_spec.rb +313 -0
  504. data/spec/unit/dependency_spec.rb +135 -0
  505. data/spec/unit/devise_spec.rb +110 -0
  506. data/spec/unit/dsl_spec.rb +120 -0
  507. data/spec/unit/dynamic_settings_spec.rb +28 -0
  508. data/spec/unit/filters/active_filter_spec.rb +218 -0
  509. data/spec/unit/filters/active_spec.rb +24 -0
  510. data/spec/unit/filters/filter_form_builder_spec.rb +524 -0
  511. data/spec/unit/filters/resource_spec.rb +128 -0
  512. data/spec/unit/form_builder_spec.rb +1012 -0
  513. data/spec/unit/generators/install_spec.rb +31 -0
  514. data/spec/unit/helpers/collection_spec.rb +68 -0
  515. data/spec/unit/helpers/output_safety_helper_spec.rb +79 -0
  516. data/spec/unit/helpers/scope_chain_spec.rb +35 -0
  517. data/spec/unit/i18n_spec.rb +29 -0
  518. data/spec/unit/localizers/resource_localizer_spec.rb +36 -0
  519. data/spec/unit/menu_collection_spec.rb +62 -0
  520. data/spec/unit/menu_item_spec.rb +82 -0
  521. data/spec/unit/menu_spec.rb +60 -0
  522. data/spec/unit/namespace/authorization_spec.rb +27 -0
  523. data/spec/unit/namespace/register_page_spec.rb +99 -0
  524. data/spec/unit/namespace/register_resource_spec.rb +162 -0
  525. data/spec/unit/namespace_spec.rb +126 -0
  526. data/spec/unit/order_clause_spec.rb +81 -0
  527. data/spec/unit/page_controller_spec.rb +5 -0
  528. data/spec/unit/page_spec.rb +128 -0
  529. data/spec/unit/pretty_format_spec.rb +82 -0
  530. data/spec/unit/pundit_adapter_spec.rb +98 -0
  531. data/spec/unit/resource/action_items_spec.rb +83 -0
  532. data/spec/unit/resource/attributes_spec.rb +49 -0
  533. data/spec/unit/resource/includes_spec.rb +21 -0
  534. data/spec/unit/resource/menu_spec.rb +18 -0
  535. data/spec/unit/resource/naming_spec.rb +120 -0
  536. data/spec/unit/resource/ordering_spec.rb +35 -0
  537. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  538. data/spec/unit/resource/pagination_spec.rb +38 -0
  539. data/spec/unit/resource/routes_spec.rb +125 -0
  540. data/spec/unit/resource/scopes_spec.rb +50 -0
  541. data/spec/unit/resource/sidebars_spec.rb +43 -0
  542. data/spec/unit/resource_collection_spec.rb +175 -0
  543. data/spec/unit/resource_controller/data_access_spec.rb +234 -0
  544. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  545. data/spec/unit/resource_controller/sidebars_spec.rb +37 -0
  546. data/spec/unit/resource_controller_spec.rb +273 -0
  547. data/spec/unit/resource_registration_spec.rb +61 -0
  548. data/spec/unit/resource_spec.rb +320 -0
  549. data/spec/unit/routing_spec.rb +211 -0
  550. data/spec/unit/scope_spec.rb +225 -0
  551. data/spec/unit/settings_node_spec.rb +26 -0
  552. data/spec/unit/view_factory_spec.rb +19 -0
  553. data/spec/unit/view_helpers/breadcrumbs_spec.rb +253 -0
  554. data/spec/unit/view_helpers/display_helper_spec.rb +203 -0
  555. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  556. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  557. data/spec/unit/view_helpers/flash_helper_spec.rb +24 -0
  558. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  559. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +138 -0
  560. data/spec/unit/views/components/attributes_table_spec.rb +271 -0
  561. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  562. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  563. data/spec/unit/views/components/columns_spec.rb +187 -0
  564. data/spec/unit/views/components/index_list_spec.rb +49 -0
  565. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  566. data/spec/unit/views/components/menu_item_spec.rb +29 -0
  567. data/spec/unit/views/components/menu_spec.rb +168 -0
  568. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  569. data/spec/unit/views/components/panel_spec.rb +58 -0
  570. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  571. data/spec/unit/views/components/sidebar_spec.rb +24 -0
  572. data/spec/unit/views/components/site_title_spec.rb +82 -0
  573. data/spec/unit/views/components/status_tag_spec.rb +265 -0
  574. data/spec/unit/views/components/table_for_spec.rb +441 -0
  575. data/spec/unit/views/components/tabs_spec.rb +71 -0
  576. data/spec/unit/views/components/unsupported_browser_spec.rb +39 -0
  577. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  578. data/spec/unit/views/pages/base_spec.rb +14 -0
  579. data/spec/unit/views/pages/form_spec.rb +54 -0
  580. data/spec/unit/views/pages/index_spec.rb +60 -0
  581. data/spec/unit/views/pages/layout_spec.rb +59 -0
  582. data/spec/unit/views/pages/show_spec.rb +32 -0
  583. data/tasks/docs.rake +64 -0
  584. data/tasks/lint.rake +21 -0
  585. data/tasks/local.rake +25 -0
  586. data/tasks/parallel_tests.rake +66 -0
  587. data/tasks/test.rake +24 -0
  588. data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
  589. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
  590. data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
  591. data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
  592. data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
  593. data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
  594. data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
  595. data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
  596. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
  597. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
  598. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
  599. data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
  600. data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
  601. data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
  602. data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
  603. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
  604. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +300 -0
  605. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
  606. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
  607. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
  608. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
  609. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
  610. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
  611. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
  612. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  613. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  614. metadata +1037 -0
@@ -0,0 +1,76 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Resource::BelongsTo do
4
+ before do
5
+ load_resources do
6
+ ActiveAdmin.register User
7
+ ActiveAdmin.register Post do belongs_to :user end
8
+ end
9
+ end
10
+
11
+ let(:namespace) { ActiveAdmin.application.namespace(:admin) }
12
+ let(:user_config){ ActiveAdmin.register User }
13
+ let(:post_config){ ActiveAdmin.register Post do belongs_to :user end }
14
+ let(:belongs_to){ post_config.belongs_to_config }
15
+
16
+ it "should have an owner" do
17
+ expect(belongs_to.owner).to eq post_config
18
+ end
19
+
20
+ describe "finding the target" do
21
+ context "when the resource has been registered" do
22
+ it "should return the target resource" do
23
+ expect(belongs_to.target).to eq user_config
24
+ end
25
+ end
26
+
27
+ context "when the resource has not been registered" do
28
+ let(:belongs_to){ ActiveAdmin::Resource::BelongsTo.new post_config, :missing }
29
+
30
+ it "should raise a ActiveAdmin::BelongsTo::TargetNotFound" do
31
+ expect {
32
+ belongs_to.target
33
+ }.to raise_error(ActiveAdmin::Resource::BelongsTo::TargetNotFound)
34
+ end
35
+ end
36
+
37
+ context "when the resource is on a namespace" do
38
+ let(:blog_post_config){ ActiveAdmin.register Blog::Post do; end }
39
+ let(:belongs_to) { ActiveAdmin::Resource::BelongsTo.new blog_post_config, :blog_author, class_name: "Blog::Author" }
40
+ before do
41
+ class Blog::Author
42
+ include ActiveModel::Naming
43
+ end
44
+ @blog_author_config = ActiveAdmin.register Blog::Author do; end
45
+ end
46
+ it "should return the target resource" do
47
+ expect(belongs_to.target).to eq @blog_author_config
48
+ end
49
+ end
50
+ end
51
+
52
+ it "should be optional" do
53
+ belongs_to = ActiveAdmin::Resource::BelongsTo.new post_config, :user, optional: true
54
+ expect(belongs_to).to be_optional
55
+ end
56
+
57
+ describe "controller" do
58
+ let(:controller) { post_config.controller.new }
59
+ let(:http_params) { {user_id: user.id} }
60
+ let(:user) { User.create! }
61
+
62
+ before do
63
+ request = double 'Request', format: 'application/json'
64
+ allow(controller).to receive(:params) { ActionController::Parameters.new(http_params) }
65
+ allow(controller).to receive(:request){ request }
66
+ end
67
+
68
+ it 'should be able to access the collection' do
69
+ expect(controller.send :collection).to be_a ActiveRecord::Relation
70
+
71
+ end
72
+ it 'should be able to build a new resource' do
73
+ expect(controller.send :build_resource).to be_a Post
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,43 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::CanCanAdapter do
4
+
5
+ describe "full integration" do
6
+
7
+ let(:application){ ActiveAdmin::Application.new }
8
+ let(:namespace){ ActiveAdmin::Namespace.new(application, "Admin") }
9
+ let(:resource){ namespace.register(Post) }
10
+
11
+ let :ability_class do
12
+ Class.new do
13
+ include CanCan::Ability
14
+
15
+ def initialize(user)
16
+ can :read, Post
17
+ cannot :update, Post
18
+ end
19
+
20
+ end
21
+ end
22
+
23
+ let(:auth) { namespace.authorization_adapter.new(resource, double) }
24
+
25
+ before do
26
+ namespace.authorization_adapter = ActiveAdmin::CanCanAdapter
27
+ namespace.cancan_ability_class = ability_class
28
+ end
29
+
30
+ it "should initialize the ability stored in the namespace configuration" do
31
+ expect(auth.authorized?(:read, Post)).to eq true
32
+ expect(auth.authorized?(:update, Post)).to eq false
33
+ end
34
+
35
+ it "should scope the collection with accessible_by" do
36
+ collection = double
37
+ expect(collection).to receive(:accessible_by).with(auth.cancan_ability, :edit)
38
+ auth.scope_collection(collection, :edit)
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,189 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe "Comments" do
4
+ let(:application) { ActiveAdmin::Application.new }
5
+
6
+ describe ActiveAdmin::Comment do
7
+ let(:comment){ ActiveAdmin::Comment.new }
8
+
9
+ let(:user) { User.create!(first_name: "John", last_name: "Doe") }
10
+
11
+ it "has valid Associations and Validations" do
12
+ expect(comment).to belong_to :resource
13
+ expect(comment).to belong_to :author
14
+ expect(comment).to validate_presence_of :resource
15
+ expect(comment).to validate_presence_of :body
16
+ expect(comment).to validate_presence_of :namespace
17
+ end
18
+
19
+ it "needs a resource" do
20
+ expect(comment).to_not be_valid
21
+ expect(comment.errors[:resource]).to eq(["can't be blank"])
22
+ end
23
+
24
+ describe ".find_for_resource_in_namespace" do
25
+ let(:post) { Post.create!(title: "Hello World") }
26
+ let(:namespace_name) { "admin" }
27
+
28
+ before do
29
+ @comment = ActiveAdmin::Comment.create! author: user,
30
+ resource: post,
31
+ body: "A Comment",
32
+ namespace: namespace_name
33
+ end
34
+
35
+ it "should return a comment for the resource in the same namespace" do
36
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(post, namespace_name)).to eq [@comment]
37
+ end
38
+
39
+ it "should not return a comment for the same resource in a different namespace" do
40
+ ActiveAdmin.application.namespaces[:public] = ActiveAdmin.application.namespaces[:admin]
41
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(post, 'public')).to eq []
42
+ ActiveAdmin.application.namespaces.instance_variable_get(:@namespaces).delete(:public)
43
+ end
44
+
45
+ it "should not return a comment for a different resource" do
46
+ another_post = Post.create! title: "Another Hello World"
47
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(another_post, namespace_name)).to eq []
48
+ end
49
+
50
+ it "should return the most recent comment first by default" do
51
+ another_comment = ActiveAdmin::Comment.create! author: user,
52
+ resource: post,
53
+ body: "Another Comment",
54
+ namespace: namespace_name,
55
+ created_at: @comment.created_at + 20.minutes
56
+
57
+ yet_another_comment = ActiveAdmin::Comment.create! author: user,
58
+ resource: post,
59
+ body: "Yet Another Comment",
60
+ namespace: namespace_name,
61
+ created_at: @comment.created_at + 10.minutes
62
+
63
+ comments = ActiveAdmin::Comment.find_for_resource_in_namespace(post, namespace_name)
64
+ expect(comments.size).to eq 3
65
+ expect(comments.first).to eq(@comment)
66
+ expect(comments.second).to eq(yet_another_comment)
67
+ expect(comments.last).to eq(another_comment)
68
+ end
69
+
70
+ context "when custom ordering configured" do
71
+ around do |example|
72
+ previous_order = ActiveAdmin.application.comments_order
73
+ ActiveAdmin.application.comments_order = "created_at DESC"
74
+
75
+ example.call
76
+
77
+ ActiveAdmin.application.comments_order = previous_order
78
+ end
79
+
80
+ it "should return the correctly ordered comments" do
81
+ another_comment = ActiveAdmin::Comment.create!(
82
+ author: user,
83
+ resource: post,
84
+ body: "Another Comment",
85
+ namespace: namespace_name,
86
+ created_at: @comment.created_at + 20.minutes
87
+ )
88
+
89
+ comments = ActiveAdmin::Comment.find_for_resource_in_namespace(
90
+ post, namespace_name
91
+ )
92
+ expect(comments.size).to eq 2
93
+ expect(comments.first).to eq(another_comment)
94
+ expect(comments.last).to eq(@comment)
95
+ end
96
+ end
97
+ end
98
+
99
+ describe ".resource_type" do
100
+ let(:post) { Post.create!(title: "Testing.") }
101
+ let(:post_decorator) { double 'PostDecorator' }
102
+
103
+ before do
104
+ allow(post_decorator).to receive(:model).and_return(post)
105
+ allow(post_decorator).to receive(:decorated?).and_return(true)
106
+ end
107
+
108
+ context "when a decorated object is passed" do
109
+ let(:resource) { post_decorator }
110
+
111
+ it "returns undeorated object class string" do
112
+ expect(ActiveAdmin::Comment.resource_type resource).to eql 'Post'
113
+ end
114
+ end
115
+
116
+ context "when an undecorated object is passed" do
117
+ let(:resource) { post }
118
+
119
+ it "returns object class string" do
120
+ expect(ActiveAdmin::Comment.resource_type resource).to eql 'Post'
121
+ end
122
+ end
123
+ end
124
+
125
+ describe "Commenting on resource with string id" do
126
+ let(:tag) { Tag.create!(name: "cooltags") }
127
+ let(:namespace_name) { "admin" }
128
+
129
+ it "should allow commenting" do
130
+ comment = ActiveAdmin::Comment.create!(
131
+ author: user,
132
+ resource: tag,
133
+ body: "Another Comment",
134
+ namespace: namespace_name)
135
+
136
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(tag, namespace_name)).to eq [comment]
137
+ end
138
+ end
139
+
140
+ describe "commenting on child of STI resource" do
141
+ let(:publisher) { Publisher.create!(username: "tenderlove") }
142
+ let(:namespace_name) { "admin" }
143
+
144
+ it "should assign child class as commented resource" do
145
+ comment = ActiveAdmin::Comment.create!(
146
+ author: user,
147
+ resource: publisher,
148
+ body: "Lorem Ipsum",
149
+ namespace: namespace_name)
150
+
151
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(publisher, namespace_name).last.resource_type).
152
+ to eq("User")
153
+ end
154
+ end
155
+ end
156
+
157
+ describe ActiveAdmin::Comments::NamespaceHelper do
158
+ describe "#comments?" do
159
+
160
+ it "should have comments when the namespace allows comments" do
161
+ ns = ActiveAdmin::Namespace.new(application, :admin)
162
+ ns.comments = true
163
+ expect(ns.comments?).to eq true
164
+ end
165
+
166
+ it "should not have comments when the namespace does not allow comments" do
167
+ ns = ActiveAdmin::Namespace.new(application, :admin)
168
+ ns.comments = false
169
+ expect(ns.comments?).to eq false
170
+ end
171
+ end
172
+ end
173
+
174
+ describe ActiveAdmin::Comments::ResourceHelper do
175
+ it "should add an attr_accessor :comments to ActiveAdmin::Resource" do
176
+ ns = ActiveAdmin::Namespace.new(application, :admin)
177
+ resource = ActiveAdmin::Resource.new(ns, Post)
178
+ expect(resource.comments).to eq nil
179
+ resource.comments = true
180
+ expect(resource.comments).to eq true
181
+ end
182
+ it "should disable comments if set to false" do
183
+ ns = ActiveAdmin::Namespace.new(application, :admin)
184
+ resource = ActiveAdmin::Resource.new(ns, Post)
185
+ resource.comments = false
186
+ expect(resource.comments?).to eq false
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails_helper'
2
+
3
+ class MockComponentClass < ActiveAdmin::Component; end
4
+
5
+ RSpec.describe ActiveAdmin::Component do
6
+
7
+ let(:component_class){ MockComponentClass }
8
+ let(:component){ component_class.new }
9
+
10
+ it "should be a subclass of an html div" do
11
+ expect(ActiveAdmin::Component.ancestors).to include(Arbre::HTML::Div)
12
+ end
13
+
14
+ it "should render to a div, even as a subclass" do
15
+ expect(component.tag_name).to eq 'div'
16
+ end
17
+
18
+ end
@@ -0,0 +1,59 @@
1
+ RSpec.shared_examples_for "ActiveAdmin::Resource" do
2
+ describe "namespace" do
3
+ it "should return the namespace" do
4
+ expect(config.namespace).to eq(namespace)
5
+ end
6
+ end
7
+
8
+ describe "page_presenters" do
9
+ it "should return an empty hash by default" do
10
+ expect(config.page_presenters).to eq({})
11
+ end
12
+ end
13
+
14
+ it { respond_to :controller_name }
15
+ it { respond_to :controller }
16
+ it { respond_to :route_prefix }
17
+ it { respond_to :route_collection_path }
18
+ it { respond_to :comments? }
19
+ it { respond_to :belongs_to? }
20
+ it { respond_to :action_items? }
21
+ it { respond_to :sidebar_sections? }
22
+
23
+ describe "Naming" do
24
+ it "implements #resource_label" do
25
+ expect { config.resource_label }.to_not raise_error
26
+ end
27
+
28
+ it "implements #plural_resource_label" do
29
+ expect { config.plural_resource_label }.to_not raise_error
30
+ end
31
+ end
32
+
33
+ describe "Menu" do
34
+ describe "#menu_item_options" do
35
+
36
+ it "initializes a new menu item with defaults" do
37
+ expect(config.menu_item_options[:label].call).to eq(config.plural_resource_label)
38
+ end
39
+
40
+ it "initialize a new menu item with custom options" do
41
+ config.menu_item_options = { label: "Hello" }
42
+ expect(config.menu_item_options[:label]).to eq("Hello")
43
+ end
44
+
45
+ end
46
+
47
+ describe "#include_in_menu?" do
48
+ it "should be included in menu by default" do
49
+ expect(config.include_in_menu?).to eq(true)
50
+ end
51
+
52
+ it "should not be included in menu when menu set to false" do
53
+ config.menu_item_options = false
54
+ expect(config.include_in_menu?).to eq(false)
55
+ end
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,41 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Application do
4
+ let(:application){ ActiveAdmin::Application.new }
5
+ let(:controllers){ application.controllers_for_filters }
6
+
7
+ it 'controllers_for_filters' do
8
+ expect(application.controllers_for_filters).to eq [
9
+ ActiveAdmin::BaseController, ActiveAdmin::Devise::SessionsController,
10
+ ActiveAdmin::Devise::PasswordsController, ActiveAdmin::Devise::UnlocksController,
11
+ ActiveAdmin::Devise::RegistrationsController, ActiveAdmin::Devise::ConfirmationsController
12
+ ]
13
+ end
14
+
15
+ expected_actions = (
16
+ prefixes = %w(skip append prepend) << nil
17
+ positions = %w(before around after)
18
+ suffixes = %w(action)
19
+ base = %w()
20
+ if ActiveAdmin::Dependency.rails? '< 5.1.x'
21
+ suffixes += %w(filter)
22
+ base += %w(skip_filter skip_action_callback)
23
+ end
24
+
25
+ prefixes.each_with_object(base) do |prefix, stack|
26
+ positions.each do |position|
27
+ suffixes.each do |suffix|
28
+ stack << [prefix, position, suffix].compact.join("_").to_sym
29
+ end
30
+ end
31
+ end
32
+ )
33
+
34
+ expected_actions.each do |action|
35
+ it action do
36
+ args = [:my_filter, { only: :show }]
37
+ controllers.each { |c| expect(c).to receive(action).with(args) }
38
+ application.public_send action, args
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,313 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::CSVBuilder do
4
+
5
+ describe '.default_for_resource using Post' do
6
+ let(:application){ ActiveAdmin::Application.new }
7
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
8
+ let(:resource){ ActiveAdmin::Resource.new(namespace, Post, {}) }
9
+ let(:csv_builder) { ActiveAdmin::CSVBuilder.default_for_resource(resource).tap(&:exec_columns) }
10
+
11
+ it 'returns a default csv_builder for Post' do
12
+ expect(csv_builder).to be_a(ActiveAdmin::CSVBuilder)
13
+ end
14
+
15
+ it 'defines Id as the first column' do
16
+ expect(csv_builder.columns.first.name).to eq 'Id'
17
+ expect(csv_builder.columns.first.data).to eq :id
18
+ end
19
+
20
+ it "has Post's content_columns" do
21
+ csv_builder.columns[1..-1].each_with_index do |column, index|
22
+ expect(column.name).to eq resource.content_columns[index].to_s.humanize
23
+ expect(column.data).to eq resource.content_columns[index]
24
+ end
25
+ end
26
+
27
+ context 'when column has a localized name' do
28
+ let(:localized_name) { 'Titulo' }
29
+
30
+ before do
31
+ allow(Post).to receive(:human_attribute_name).and_call_original
32
+ allow(Post).to receive(:human_attribute_name).with(:title){ localized_name }
33
+ end
34
+
35
+ it 'gets name from I18n' do
36
+ title_index = resource.content_columns.index(:title) + 1 # First col is always id
37
+ expect(csv_builder.columns[title_index].name).to eq localized_name
38
+ end
39
+ end
40
+ end
41
+
42
+ context 'when empty' do
43
+ let(:builder){ ActiveAdmin::CSVBuilder.new.tap(&:exec_columns) }
44
+
45
+ it "should have no columns" do
46
+ expect(builder.columns).to eq []
47
+ end
48
+ end
49
+
50
+ context "with a symbol column (:title)" do
51
+ let(:builder) do
52
+ ActiveAdmin::CSVBuilder.new do
53
+ column :title
54
+ end.tap(&:exec_columns)
55
+ end
56
+
57
+ it "should have one column" do
58
+ expect(builder.columns.size).to eq 1
59
+ end
60
+
61
+ describe "the column" do
62
+ let(:column){ builder.columns.first }
63
+
64
+ it "should have a name of 'Title'" do
65
+ expect(column.name).to eq "Title"
66
+ end
67
+
68
+ it "should have the data :title" do
69
+ expect(column.data).to eq :title
70
+ end
71
+ end
72
+ end
73
+
74
+ context "with a block and title" do
75
+ let(:builder) do
76
+ ActiveAdmin::CSVBuilder.new do
77
+ column "My title" do
78
+ # nothing
79
+ end
80
+ end.tap(&:exec_columns)
81
+ end
82
+
83
+ it "should have one column" do
84
+ expect(builder.columns.size).to eq 1
85
+ end
86
+
87
+ describe "the column" do
88
+ let(:column){ builder.columns.first }
89
+
90
+ it "should have a name of 'My title'" do
91
+ expect(column.name).to eq "My title"
92
+ end
93
+
94
+ it "should have the data :title" do
95
+ expect(column.data).to be_an_instance_of(Proc)
96
+ end
97
+ end
98
+ end
99
+
100
+ context "with a humanize_name column option" do
101
+ context "with symbol column name" do
102
+ let(:builder) do
103
+ ActiveAdmin::CSVBuilder.new do
104
+ column :my_title, humanize_name: false
105
+ end.tap(&:exec_columns)
106
+ end
107
+
108
+ describe "the column" do
109
+ let(:column){ builder.columns.first }
110
+
111
+ it "should have a name of 'my_title'" do
112
+ expect(column.name).to eq "my_title"
113
+ end
114
+ end
115
+ end
116
+
117
+ context "with string column name" do
118
+ let(:builder) do
119
+ ActiveAdmin::CSVBuilder.new do
120
+ column "my_title", humanize_name: false
121
+ end.tap(&:exec_columns)
122
+ end
123
+
124
+ describe "the column" do
125
+ let(:column){ builder.columns.first }
126
+
127
+ it "should have a name of 'my_title'" do
128
+ expect(column.name).to eq "my_title"
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ context "with a separator" do
135
+ let(:builder) do
136
+ ActiveAdmin::CSVBuilder.new(col_sep: ";").tap(&:exec_columns)
137
+ end
138
+
139
+ it "should have proper separator" do
140
+ expect(builder.options).to eq({col_sep: ";"})
141
+ end
142
+ end
143
+
144
+ context "with humanize_name option" do
145
+ let(:builder) do
146
+ ActiveAdmin::CSVBuilder.new(humanize_name: false) do
147
+ column :my_title
148
+ end.tap(&:exec_columns)
149
+ end
150
+
151
+ describe "the column" do
152
+ let(:column){ builder.columns.first }
153
+
154
+ it "should have humanize_name option set" do
155
+ expect(column.options).to eq humanize_name: false
156
+ end
157
+
158
+ it "should have a name of 'my_title'" do
159
+ expect(column.name).to eq "my_title"
160
+ end
161
+ end
162
+ end
163
+
164
+ context "with csv_options" do
165
+ let(:builder) do
166
+ ActiveAdmin::CSVBuilder.new(force_quotes: true).tap(&:exec_columns)
167
+ end
168
+
169
+ it "should have proper separator" do
170
+ expect(builder.options).to eq({force_quotes: true})
171
+ end
172
+ end
173
+
174
+ context "with access to the controller" do
175
+ let(:dummy_view_context) { double(controller: dummy_controller) }
176
+ let(:dummy_controller) { double(names: %w(title summary updated_at created_at))}
177
+ let(:builder) do
178
+ ActiveAdmin::CSVBuilder.new do
179
+ column "id"
180
+ controller.names.each do |name|
181
+ column(name)
182
+ end
183
+ end.tap{ |b| b.exec_columns(dummy_view_context) }
184
+ end
185
+
186
+ it "should build columns provided by the controller" do
187
+ expect(builder.columns.map(&:data)).to match_array([:id, :title, :summary, :updated_at, :created_at])
188
+ end
189
+ end
190
+
191
+ context "build csv using the supplied order" do
192
+ before do
193
+ @post1 = Post.create!(title: "Hello1", published_date: Date.today - 2.day)
194
+ @post2 = Post.create!(title: "Hello2", published_date: Date.today - 1.day)
195
+ end
196
+ let(:dummy_controller) {
197
+ class DummyController
198
+ def find_collection(*)
199
+ collection
200
+ end
201
+
202
+ def collection
203
+ Post.order('published_date DESC')
204
+ end
205
+
206
+ def apply_decorator(resource)
207
+ resource
208
+ end
209
+
210
+ def view_context
211
+ end
212
+ end
213
+ DummyController.new
214
+ }
215
+ let(:builder) do
216
+ ActiveAdmin::CSVBuilder.new do
217
+ column "id"
218
+ column "title"
219
+ column "published_date"
220
+ end
221
+ end
222
+
223
+ it "should generate data with the supplied order" do
224
+ expect(builder).to receive(:build_row).and_return([]).once.ordered { |post| expect(post.id).to eq @post2.id }
225
+ expect(builder).to receive(:build_row).and_return([]).once.ordered { |post| expect(post.id).to eq @post1.id }
226
+ builder.build dummy_controller, []
227
+ end
228
+
229
+ it "should generate data ignoring pagination" do
230
+ expect(dummy_controller).to receive(:find_collection).
231
+ with(except: :pagination).once.
232
+ and_call_original
233
+ expect(builder).to receive(:build_row).and_return([]).twice
234
+ builder.build dummy_controller, []
235
+ end
236
+
237
+ it "should disable the ActiveRecord query cache" do
238
+ expect(builder).to receive(:build_row).twice do
239
+ expect(ActiveRecord::Base.connection.query_cache_enabled).to be_falsy
240
+ []
241
+ end
242
+ ActiveRecord::Base.cache do
243
+ builder.build dummy_controller, []
244
+ end
245
+ end
246
+ end
247
+
248
+ context "build csv using specified encoding and encoding_options" do
249
+ let(:dummy_controller) do
250
+ class DummyController
251
+ def find_collection(*)
252
+ collection
253
+ end
254
+
255
+ def collection
256
+ Post
257
+ end
258
+
259
+ def apply_decorator(resource)
260
+ resource
261
+ end
262
+
263
+ def view_context
264
+ end
265
+ end
266
+ DummyController.new
267
+ end
268
+ let(:encoding) { Encoding::ASCII }
269
+ let(:opts) { {} }
270
+ let(:builder) do
271
+ ActiveAdmin::CSVBuilder.new(encoding: encoding, encoding_options: opts) do
272
+ column "おはようございます"
273
+ column "title"
274
+ end
275
+ end
276
+
277
+ context "Shift-JIS with options" do
278
+ let(:encoding) { Encoding::Shift_JIS }
279
+ let(:opts) { { invalid: :replace, undef: :replace, replace: "?" } }
280
+
281
+ it "encodes the CSV" do
282
+ receiver = []
283
+ builder.build dummy_controller, receiver
284
+ line = receiver.last
285
+ expect(line.encoding).to eq(encoding)
286
+ end
287
+ end
288
+
289
+ context "ASCII with options" do
290
+ let(:encoding) { Encoding::ASCII }
291
+ let(:opts) do
292
+ { invalid: :replace, undef: :replace, replace: "__REPLACED__" }
293
+ end
294
+
295
+ it "encodes the CSV without errors" do
296
+ receiver = []
297
+ builder.build dummy_controller, receiver
298
+ line = receiver.last
299
+ expect(line.encoding).to eq(encoding)
300
+ expect(line).to include("__REPLACED__")
301
+ end
302
+ end
303
+ end
304
+
305
+ skip '#exec_columns'
306
+
307
+ skip '#build_row' do
308
+ it 'renders non-strings'
309
+ it 'encodes values correctly'
310
+ it 'passes custom encoding options to String#encode!'
311
+ end
312
+
313
+ end