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,79 @@
1
+ module ActiveAdminIntegrationSpecHelper
2
+ extend self
3
+
4
+ def load_defaults!
5
+ ActiveAdmin.unload!
6
+ ActiveAdmin.load!
7
+ ActiveAdmin.register(Category)
8
+ ActiveAdmin.register(User)
9
+ ActiveAdmin.register(Post){ belongs_to :user, optional: true }
10
+ end
11
+
12
+ # Sometimes we need to reload the routes within
13
+ # the application to test them out
14
+ def reload_routes!
15
+ Rails.application.reload_routes!
16
+ end
17
+
18
+ # Helper method to load resources and ensure that Active Admin is
19
+ # setup with the new configurations.
20
+ #
21
+ # Eg:
22
+ # load_resources do
23
+ # ActiveAdmin.register(Post)
24
+ # end
25
+ #
26
+ def load_resources
27
+ ActiveAdmin.unload!
28
+ yield
29
+ reload_routes!
30
+ end
31
+
32
+ def arbo(assigns = {}, helpers = mock_action_view, &block)
33
+ Arbo::Context.new(assigns, helpers, &block)
34
+ end
35
+
36
+ def render_component(assigns = {}, helpers = mock_action_view, &block)
37
+ arbo(assigns, helpers, &block).children.first
38
+ end
39
+
40
+ # A mock action view to test view helpers
41
+ class MockActionView < ::ActionView::Base
42
+ include ActiveAdmin::ViewHelpers
43
+ include Rails.application.routes.url_helpers
44
+
45
+ def compiled_method_container
46
+ self.class
47
+ end
48
+ end
49
+
50
+ # Returns a fake action view instance to use with our renderers
51
+ def mock_action_view(base = MockActionView)
52
+ controller = ActionView::TestCase::TestController.new
53
+ #this line needed because of rails bug https://github.com/rails/rails/commit/d8e98897b5703ac49bf0764da71a06d64ecda9b0
54
+ controller.params = ActionController::Parameters.new
55
+
56
+ base.new(view_paths, {}, controller)
57
+ end
58
+
59
+ def view_paths
60
+ paths = ActionController::Base.view_paths
61
+ # the constructor for ActionView::Base changed from Rails 6
62
+ # and now expects an instance of ActionView::LookupContext
63
+ return paths unless Rails::VERSION::MAJOR >= 6
64
+ ActionView::LookupContext.new(paths)
65
+ end
66
+
67
+ def with_translation(translation)
68
+ # If no translations have been loaded, any later calls to `I18n.t` will
69
+ # cause the full translation hash to be loaded, possibly overwritting what
70
+ # we've loaded via `store_translations`. We use this hack to prevent that.
71
+ # TODO: Might not be necessary anymore once
72
+ # https://github.com/svenfuchs/i18n/pull/353 lands.
73
+ I18n.backend.send(:init_translations)
74
+ I18n.backend.store_translations I18n.locale, translation
75
+ yield
76
+ ensure
77
+ I18n.backend.reload!
78
+ end
79
+ end
@@ -0,0 +1,39 @@
1
+ require "action_dispatch"
2
+ require "capybara/rails"
3
+ require "capybara/dsl"
4
+
5
+ module ActiveAdminRequestHelpers
6
+ extend ActiveSupport::Concern
7
+
8
+ include ActionDispatch::Integration::Runner
9
+ include RSpec::Rails::TestUnitAssertionAdapter
10
+ include ActionDispatch::Assertions
11
+ include Capybara::DSL
12
+ include RSpec::Matchers
13
+
14
+ def app
15
+ ::Rails.application
16
+ end
17
+
18
+ def last_response
19
+ page
20
+ end
21
+
22
+ included do
23
+ before do
24
+ @router = ::Rails.application.routes
25
+ end
26
+ end
27
+
28
+ def with_temp_application(application)
29
+ original_application = ActiveAdmin.application
30
+ ActiveAdmin.application = application
31
+ load_defaults!
32
+ reload_routes!
33
+
34
+ yield
35
+
36
+ ensure
37
+ ActiveAdmin.application = original_application
38
+ end
39
+ end
@@ -0,0 +1,224 @@
1
+ # Rails template to build the sample app for specs
2
+
3
+ copy_file File.expand_path('../templates/manifest.js', __FILE__), 'app/assets/config/manifest.js', force: true
4
+
5
+ create_file 'app/assets/stylesheets/some-random-css.css'
6
+ create_file 'app/assets/javascripts/some-random-js.js'
7
+ create_file 'app/assets/images/a/favicon.ico'
8
+
9
+ generate :model, 'post title:string body:text published_date:date author_id:integer ' +
10
+ 'position:integer custom_category_id:integer starred:boolean foo_id:integer'
11
+
12
+ create_file 'app/models/post.rb', <<-RUBY.strip_heredoc, force: true
13
+ class Post < ActiveRecord::Base
14
+ belongs_to :category, foreign_key: :custom_category_id, optional: true
15
+ belongs_to :author, class_name: 'User', optional: true
16
+ has_many :taggings
17
+ accepts_nested_attributes_for :author
18
+ accepts_nested_attributes_for :taggings, allow_destroy: true
19
+
20
+ ransacker :custom_title_searcher do |parent|
21
+ parent.table[:title]
22
+ end
23
+
24
+ ransacker :custom_created_at_searcher do |parent|
25
+ parent.table[:created_at]
26
+ end
27
+
28
+ ransacker :custom_searcher_numeric, type: :numeric do
29
+ # nothing to see here
30
+ end
31
+
32
+ def self.ransackable_attributes(auth_object = nil)
33
+ ["author_id", "body", "created_at", "custom_category_id",
34
+ "custom_created_at_searcher", "custom_searcher_numeric",
35
+ "custom_title_searcher", "foo_id", "id", "position",
36
+ "published_date", "starred", "title", "updated_at"]
37
+ end
38
+
39
+ def self.ransackable_associations(auth_object = nil)
40
+ ["author", "category", "taggings", "kategory"]
41
+ end
42
+ end
43
+ RUBY
44
+ copy_file File.expand_path('../templates/post_decorator.rb', __FILE__), 'app/models/post_decorator.rb'
45
+
46
+ generate :model, 'blog/post title:string body:text published_date:date author_id:integer ' +
47
+ 'position:integer custom_category_id:integer starred:boolean foo_id:integer'
48
+ create_file 'app/models/blog/post.rb', <<-RUBY.strip_heredoc, force: true
49
+ class Blog::Post < ActiveRecord::Base
50
+ belongs_to :category, foreign_key: :custom_category_id
51
+ belongs_to :author, class_name: 'User'
52
+ has_many :taggings
53
+ accepts_nested_attributes_for :author
54
+ accepts_nested_attributes_for :taggings, allow_destroy: true
55
+
56
+ def self.ransackable_attributes(auth_object = nil)
57
+ ["author_id", "body", "created_at",
58
+ "custom_category_id", "foo_id", "id",
59
+ "position", "published_date", "starred", "title", "updated_at"]
60
+ end
61
+
62
+ def self.ransackable_associations(auth_object = nil)
63
+ ["author", "category", "taggings"]
64
+ end
65
+ end
66
+ RUBY
67
+
68
+ generate :model, 'profile user_id:integer bio:text'
69
+
70
+ generate :model, 'user type:string first_name:string last_name:string username:string age:integer encrypted_password:string'
71
+ create_file 'app/models/user.rb', <<-RUBY.strip_heredoc, force: true
72
+ class User < ActiveRecord::Base
73
+ class VIP < self
74
+ end
75
+ has_many :posts, foreign_key: 'author_id'
76
+ has_one :profile
77
+ accepts_nested_attributes_for :profile, allow_destroy: true
78
+ accepts_nested_attributes_for :posts, allow_destroy: true
79
+
80
+ ransacker :age_in_five_years, type: :numeric, formatter: proc { |v| v.to_i - 5 } do |parent|
81
+ parent.table[:age]
82
+ end
83
+
84
+ def self.ransackable_attributes(auth_object = nil)
85
+ ["age", "age_in_five_years", "created_at",
86
+ "first_name", "id", "last_name", "type", "updated_at", "username"]
87
+ end
88
+
89
+ def self.ransackable_associations(auth_object = nil)
90
+ ["posts", "profile"]
91
+ end
92
+
93
+ def display_name
94
+ "\#{first_name} \#{last_name}"
95
+ end
96
+ end
97
+ RUBY
98
+
99
+ create_file 'app/models/profile.rb', <<-RUBY.strip_heredoc, force: true
100
+ class Profile < ActiveRecord::Base
101
+ belongs_to :user
102
+
103
+ def self.ransackable_attributes(auth_object = nil)
104
+ ["bio", "created_at", "id", "updated_at", "user_id"]
105
+ end
106
+ end
107
+ RUBY
108
+
109
+ generate :model, 'publisher --migration=false --parent=User'
110
+
111
+ generate :model, 'category name:string description:text'
112
+ create_file 'app/models/category.rb', <<-RUBY.strip_heredoc, force: true
113
+ class Category < ActiveRecord::Base
114
+ has_many :posts, foreign_key: :custom_category_id
115
+ has_many :authors, through: :posts
116
+ accepts_nested_attributes_for :posts
117
+
118
+ def self.ransackable_attributes(auth_object = nil)
119
+ ["created_at", "description", "id", "name", "updated_at"]
120
+ end
121
+
122
+ def self.ransackable_associations(auth_object = nil)
123
+ ["authors", "posts"]
124
+ end
125
+ end
126
+ RUBY
127
+
128
+ generate :model, 'store name:string user_id:integer'
129
+ create_file 'app/models/store.rb', <<-RUBY.strip_heredoc, force: true
130
+ class Store < ActiveRecord::Base
131
+ def self.ransackable_attributes(auth_object = nil)
132
+ ["created_at", "id", "name", "updated_at", "user_id"]
133
+ end
134
+ end
135
+ RUBY
136
+
137
+ generate :model, 'tag name:string'
138
+ create_file 'app/models/tag.rb', <<-RUBY.strip_heredoc, force: true
139
+ class Tag < ActiveRecord::Base
140
+ end
141
+ RUBY
142
+
143
+ generate :model, 'tagging post_id:integer tag_id:integer position:integer'
144
+ create_file 'app/models/tagging.rb', <<-RUBY.strip_heredoc, force: true
145
+ class Tagging < ActiveRecord::Base
146
+ belongs_to :post, optional: true
147
+ belongs_to :tag, optional: true
148
+
149
+ delegate :name, to: :tag, prefix: true
150
+
151
+ def self.ransackable_attributes(auth_object = nil)
152
+ ["created_at", "id", "position", "post_id", "tag_id", "updated_at"]
153
+ end
154
+ end
155
+ RUBY
156
+
157
+ gsub_file 'config/environments/test.rb', / config.(cache_classes|enable_reloading) = .*$/, <<-RUBY
158
+
159
+ config.cache_classes = !ENV['CLASS_RELOADING']
160
+ config.action_mailer.default_url_options = {host: 'example.com'}
161
+ config.assets.precompile += %w( some-random-css.css some-random-js.js a/favicon.ico )
162
+
163
+ config.active_record.maintain_test_schema = false
164
+
165
+ if Rails::VERSION::MAJOR >= 6
166
+ config.hosts = [
167
+ IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
168
+ IPAddr.new("::/0"), # All IPv6 addresses.
169
+ "www.example.com",
170
+ "localhost" # The localhost reserved domain.
171
+ ]
172
+ end
173
+ RUBY
174
+
175
+ # TODO: remove this line after the STI pre-loading is fixed
176
+ # The test commenting.feature/Commenting on a STI subclass fails with zeitwerk autoloader
177
+ inject_into_file 'config/environments/test.rb', "\n config.autoloader = :classic\n", after: 'Rails.application.configure do' if Rails::VERSION::MAJOR == 6
178
+
179
+ # Override and revert rails/rails#46699 for now
180
+ gsub_file "config/database.yml", /storage\/(.+)\.sqlite3$/, 'db/\1.sqlite3'
181
+
182
+ # Add our local Active Admin to the application
183
+ gem 'activeadmin-rails', path: '../..'
184
+ gem 'devise', '~> 4.6'
185
+
186
+ run 'bundle install'
187
+
188
+ # Setup Active Admin
189
+ generate 'active_admin:install'
190
+
191
+ # Force strong parameters to raise exceptions
192
+ inject_into_file 'config/application.rb', after: 'class Application < Rails::Application' do
193
+ "\n config.action_controller.action_on_unpermitted_parameters = :raise\n"
194
+ end
195
+
196
+ inject_into_file 'app/models/admin_user.rb', '
197
+
198
+ def self.ransackable_attributes(auth_object = nil)
199
+ ["created_at", "email", "id",
200
+ "remember_created_at", "reset_password_sent_at",
201
+ "updated_at"]
202
+ end
203
+ ', after: 'class AdminUser < ApplicationRecord'
204
+
205
+ # Add some translations
206
+ append_file 'config/locales/en.yml', File.read(File.expand_path('../templates/en.yml', __FILE__))
207
+
208
+ # Add predefined admin resources
209
+ directory File.expand_path('../templates/admin', __FILE__), 'app/admin'
210
+
211
+ # Add predefined policies
212
+ directory File.expand_path('../templates/policies', __FILE__), 'app/policies'
213
+
214
+ if ENV['RAILS_ENV'] != 'test'
215
+ inject_into_file 'config/routes.rb', "\n root to: redirect('admin')", after: /.*routes.draw do/
216
+ end
217
+
218
+ # Rails 7.1 doesn't write test.sqlite3 files if we run db:drop, db:create and db:migrate in a single command.
219
+ rails_command "db:drop db:create", env: ENV["RAILS_ENV"]
220
+ rails_command "db:migrate", env: ENV["RAILS_ENV"]
221
+
222
+ if ENV['INSTALL_PARALLEL']
223
+ inject_into_file 'config/database.yml', "<%= ENV['TEST_ENV_NUMBER'] %>", after: 'test.sqlite3'
224
+ end
@@ -0,0 +1,328 @@
1
+ apply File.expand_path("../rails_template.rb", __FILE__)
2
+
3
+ inject_into_file 'config/initializers/active_admin.rb', <<-RUBY, after: "ActiveAdmin.setup do |config|\n"
4
+
5
+ config.comments_menu = { parent: 'Administrative' }
6
+ RUBY
7
+
8
+ inject_into_file 'app/admin/admin_users.rb', <<-RUBY, after: "ActiveAdmin.register AdminUser do\n"
9
+
10
+ menu parent: "Administrative", priority: 1
11
+ RUBY
12
+
13
+ generate :'active_admin:page', 'KitchenSink'
14
+
15
+ gsub_file 'app/admin/kitchen_sink.rb', /^ *content.*?end/m, <<-RUBY
16
+
17
+ sidebar "Sample Sidebar" do
18
+ para "Sidebars can also be used on custom pages."
19
+ para do
20
+ a "Active Admin", href: "https://github.com/activeadmin/activeadmin"
21
+ text_node "is a Ruby on Rails framework for"
22
+ em "creating elegant backends"
23
+ text_node "for"
24
+ strong "website administration."
25
+ end
26
+ para do
27
+ abbr "HTML", title: "HyperText Markup Language"
28
+ text_node "is the most basic building block of the Web."
29
+ end
30
+ end
31
+
32
+ content do
33
+ columns do
34
+ column do
35
+ panel "Panel title" do
36
+ h1 "This is an h1"
37
+ h2 "This is an h2"
38
+ h3 "This is an h3"
39
+ end
40
+ end
41
+ column do
42
+ table_for User.all do
43
+ column :id
44
+ column :display_name
45
+ column :username
46
+ column :age
47
+ column :updated_at
48
+ end
49
+ end
50
+ end
51
+
52
+ tabs do
53
+ tab :first do
54
+ ul do
55
+ li "List item"
56
+ li "Another list item"
57
+ li "Last item"
58
+ end
59
+ ol do
60
+ li "First list item"
61
+ li "Second list item"
62
+ li "Third list item"
63
+ end
64
+ end
65
+ tab :second do
66
+ para "A popular quote."
67
+ blockquote do
68
+ text_node "&ldqou;Be yourself; everyone else is already taken.&rdqou;".html_safe
69
+ cite "― Oscar Wilde"
70
+ end
71
+ end
72
+ tab :third do
73
+ para "Third tab content."
74
+ end
75
+ end
76
+ end
77
+ RUBY
78
+
79
+ %w{Post User Category Tag}.each do |type|
80
+ generate :'active_admin:resource', type
81
+ end
82
+
83
+ inject_into_file 'app/admin/categories.rb', <<-RUBY, after: "ActiveAdmin.register Category do\n"
84
+
85
+ config.create_another = true
86
+
87
+ permit_params [:name, :description]
88
+ RUBY
89
+
90
+ inject_into_file 'app/admin/users.rb', <<-RUBY, after: "ActiveAdmin.register User do\n"
91
+
92
+ config.create_another = true
93
+
94
+ permit_params [:first_name, :last_name, :username, :age]
95
+
96
+ index as: :grid do |user|
97
+ div for: user do
98
+ resource_selection_cell user
99
+ h2 link_to(user.display_name, admin_user_path(user)), style: 'margin-bottom: 0'
100
+ para do
101
+ strong user.username, style: 'text-transform: uppercase; font-size: 10px;'
102
+ br
103
+ em user.age
104
+ text_node 'years old'
105
+ end
106
+ end
107
+ end
108
+
109
+ show do
110
+ attributes_table do
111
+ row :id
112
+ row :first_name
113
+ row :last_name
114
+ row :username
115
+ row :age
116
+ row :created_at
117
+ row :updated_at
118
+ end
119
+
120
+ panel 'Posts' do
121
+ table_for(user.posts.includes(:category).order(:updated_at).limit(10)) do
122
+ column :id do |post|
123
+ link_to post.id, admin_post_path(post)
124
+ end
125
+ column :title
126
+ column :published_date
127
+ column :category
128
+ column :created_at
129
+ column :updated_at
130
+ end
131
+ para do
132
+ link_to "View all posts", admin_posts_path('q[author_id_eq]' => user.id)
133
+ end
134
+ end
135
+ end
136
+ RUBY
137
+
138
+ inject_into_file 'app/admin/posts.rb', <<-'RUBY', after: "ActiveAdmin.register Post do\n"
139
+
140
+ permit_params :custom_category_id, :author_id, :title, :body, :published_date, :position, :starred, taggings_attributes: [ :id, :tag_id, :name, :position, :_destroy ]
141
+
142
+ includes :author, :category, :taggings
143
+
144
+ scope :all, default: true
145
+
146
+ scope :drafts, group: :status do |posts|
147
+ posts.where(["published_date IS NULL"])
148
+ end
149
+
150
+ scope :scheduled, group: :status do |posts|
151
+ posts.where(["posts.published_date IS NOT NULL AND posts.published_date > ?", Time.now.utc])
152
+ end
153
+
154
+ scope :published, group: :status do |posts|
155
+ posts.where(["posts.published_date IS NOT NULL AND posts.published_date < ?", Time.now.utc])
156
+ end
157
+
158
+ scope :my_posts, group: :author do |posts|
159
+ posts.where(author_id: current_admin_user.id)
160
+ end
161
+
162
+ batch_action :set_starred, form: { starred: :checkbox } do |ids, inputs|
163
+ Post.where(id: ids).update_all(starred: inputs['starred'].present?)
164
+ redirect_to collection_path, notice: "The posts have been updated."
165
+ end
166
+
167
+ index do
168
+ selectable_column
169
+ id_column
170
+ column :title
171
+ column :published_date
172
+ column :author
173
+ column :category
174
+ column :starred
175
+ column :position
176
+ column :created_at
177
+ column :updated_at
178
+ end
179
+
180
+ sidebar :author, only: :show do
181
+ attributes_table_for post.author do
182
+ row :id do |author|
183
+ link_to author.id, admin_user_path(author)
184
+ end
185
+ row :first_name
186
+ row :last_name
187
+ row :username
188
+ row :age
189
+ end
190
+ end
191
+
192
+ member_action :toggle_starred, method: :put do
193
+ resource.update(starred: !resource.starred)
194
+ redirect_to resource_path, notice: "Post updated."
195
+ end
196
+
197
+ action_item :toggle_starred, only: :show do
198
+ link_to 'Toggle Starred', toggle_starred_admin_post_path(post), method: :put
199
+ end
200
+
201
+ show do |post|
202
+ attributes_table do
203
+ row :id
204
+ row :title
205
+ row :published_date
206
+ row :author
207
+ row :body
208
+ row :category
209
+ row :starred
210
+ row :position
211
+ row :created_at
212
+ row :updated_at
213
+ end
214
+
215
+ columns do
216
+ column do
217
+ panel 'Tags' do
218
+ table_for(post.taggings.order(:position)) do
219
+ column :id do |tagging|
220
+ link_to tagging.tag_id, admin_tag_path(tagging.tag)
221
+ end
222
+ column :tag, &:tag_name
223
+ column :position
224
+ column :updated_at
225
+ end
226
+ end
227
+ end
228
+ column do
229
+ panel 'Category' do
230
+ attributes_table_for post.category do
231
+ row :id do |category|
232
+ link_to category.id, admin_category_path(category)
233
+ end
234
+ row :description
235
+ end
236
+ end
237
+ end
238
+ end
239
+ end
240
+
241
+ form do |f|
242
+ columns do
243
+ column do
244
+ f.inputs 'Details' do
245
+ f.input :title
246
+ f.input :author
247
+ f.input :published_date,
248
+ hint: f.object.persisted? && "Created at #{f.object.created_at}"
249
+ f.input :custom_category_id
250
+ f.input :category
251
+ f.input :position
252
+ f.input :starred
253
+ end
254
+ end
255
+ column do
256
+ f.inputs 'Content' do
257
+ f.input :body
258
+ end
259
+ end
260
+ end
261
+ f.inputs "Tags" do
262
+ f.has_many :taggings, sortable: :position do |t|
263
+ t.input :tag
264
+ t.input :_destroy, as: :boolean
265
+ end
266
+ end
267
+ para "Press cancel to return to the list without saving."
268
+ f.actions
269
+ end
270
+ RUBY
271
+
272
+ inject_into_file 'app/admin/tags.rb', <<-RUBY, after: "ActiveAdmin.register Tag do\n"
273
+
274
+ config.create_another = true
275
+
276
+ permit_params [:name]
277
+
278
+ index do
279
+ selectable_column
280
+ id_column
281
+ column :name
282
+ column :created_at
283
+ actions dropdown: true do |tag|
284
+ item "Preview", admin_tag_path(tag)
285
+ end
286
+ end
287
+
288
+ RUBY
289
+
290
+ append_file "db/seeds.rb", "\n\n" + <<-RUBY.strip_heredoc
291
+ users = ["Jimi Hendrix", "Jimmy Page", "Yngwie Malmsteen", "Eric Clapton", "Kirk Hammett"].collect do |name|
292
+ first, last = name.split(" ")
293
+ User.create! first_name: first,
294
+ last_name: last,
295
+ username: [first,last].join('-').downcase,
296
+ age: rand(80),
297
+ encrypted_password: SecureRandom.hex
298
+ end
299
+
300
+ categories = ["Rock", "Pop Rock", "Alt-Country", "Blues", "Dub-Step"].collect do |name|
301
+ Category.create! name: name
302
+ end
303
+
304
+ published_at_values = [Time.now.utc - 5.days, Time.now.utc - 1.day, nil, Time.now.utc + 3.days]
305
+
306
+ 1_000.times do |i|
307
+ user = users[i % users.size]
308
+ cat = categories[i % categories.size]
309
+ published = published_at_values[i % published_at_values.size]
310
+ Post.create title: "Blog Post \#{i}",
311
+ body: "Blog post \#{i} is written by \#{user.username} about \#{cat.name}",
312
+ category: cat,
313
+ published_date: published,
314
+ author: user,
315
+ starred: true
316
+ end
317
+
318
+ 800.times do |i|
319
+ ActiveAdmin::Comment.create!(
320
+ namespace: :admin,
321
+ author: AdminUser.first,
322
+ body: "Test comment \#{i}",
323
+ resource: categories.sample
324
+ )
325
+ end
326
+ RUBY
327
+
328
+ rake 'db:seed'
@@ -0,0 +1,7 @@
1
+ ActiveAdmin.register Store do
2
+
3
+ permit_params :name
4
+
5
+ index pagination_total: false
6
+
7
+ end
@@ -0,0 +1,8 @@
1
+ # Sample translations used to test ActiveAdmin's I18n integration.
2
+ activerecord:
3
+ models:
4
+ store:
5
+ one: Bookstore
6
+ other: Bookstores
7
+ active_admin:
8
+ download: "Download this:"
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../javascripts .js
3
+ //= link_directory ../stylesheets .css
@@ -0,0 +1,9 @@
1
+ module ActiveAdmin
2
+ class CommentPolicy < ApplicationPolicy
3
+ class Scope < Struct.new(:user, :scope)
4
+ def resolve
5
+ scope
6
+ end
7
+ end
8
+ end
9
+ end