activeadmin 1.3.0 → 2.0.0.rc1

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

Potentially problematic release.


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

Files changed (423) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +307 -123
  3. data/CODE_OF_CONDUCT.md +64 -12
  4. data/CONTRIBUTING.md +90 -46
  5. data/README.md +66 -19
  6. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  7. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  8. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  9. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  10. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  11. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  12. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  13. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +55 -0
  14. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  15. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  16. data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
  17. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  18. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  19. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  20. data/app/assets/stylesheets/active_admin/_forms.scss +3 -15
  21. data/app/assets/stylesheets/active_admin/components/_scopes.scss +3 -0
  22. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -5
  23. data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
  24. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
  25. data/app/views/active_admin/devise/confirmations/new.html.erb +2 -2
  26. data/app/views/active_admin/devise/passwords/edit.html.erb +2 -2
  27. data/app/views/active_admin/devise/passwords/new.html.erb +2 -2
  28. data/app/views/active_admin/devise/registrations/new.html.erb +2 -3
  29. data/app/views/active_admin/devise/sessions/new.html.erb +1 -1
  30. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  31. data/app/views/active_admin/devise/unlocks/new.html.erb +2 -2
  32. data/app/views/layouts/active_admin_logged_out.html.erb +2 -2
  33. data/config/locales/bg.yml +0 -1
  34. data/config/locales/de.yml +10 -0
  35. data/config/locales/en.yml +19 -1
  36. data/config/locales/es.yml +20 -1
  37. data/config/locales/fi.yml +1 -1
  38. data/config/locales/he.yml +0 -1
  39. data/config/locales/hu.yml +4 -0
  40. data/config/locales/it.yml +4 -0
  41. data/config/locales/lt.yml +2 -2
  42. data/config/locales/nb.yml +15 -5
  43. data/config/locales/nl.yml +11 -0
  44. data/config/locales/pl.yml +71 -3
  45. data/config/locales/ru.yml +2 -0
  46. data/config/locales/tr.yml +9 -0
  47. data/config/locales/uk.yml +2 -0
  48. data/config/locales/zh-CN.yml +33 -5
  49. data/docs/.gitignore +1 -0
  50. data/docs/0-installation.md +2 -2
  51. data/docs/1-general-configuration.md +16 -1
  52. data/docs/10-custom-pages.md +14 -0
  53. data/docs/12-arbre-components.md +28 -1
  54. data/docs/13-authorization-adapter.md +40 -21
  55. data/docs/2-resource-customization.md +8 -3
  56. data/docs/3-index-pages/custom-index.md +1 -1
  57. data/docs/3-index-pages/index-as-blog.md +1 -1
  58. data/docs/3-index-pages/index-as-table.md +5 -5
  59. data/docs/3-index-pages.md +17 -0
  60. data/docs/5-forms.md +16 -2
  61. data/docs/8-custom-actions.md +11 -0
  62. data/docs/CNAME +1 -1
  63. data/docs/Gemfile +2 -0
  64. data/docs/Gemfile.lock +249 -0
  65. data/docs/_config.yml +1 -1
  66. data/docs/_includes/toc.html +1 -1
  67. data/docs/_includes/top-menu.html +9 -1
  68. data/docs/documentation.md +1 -1
  69. data/docs/images/tidelift.svg +14 -0
  70. data/docs/index.html +2 -2
  71. data/docs/stylesheets/main.css +26 -2
  72. data/lib/active_admin/abstract_view_factory.rb +13 -51
  73. data/lib/active_admin/application.rb +49 -155
  74. data/lib/active_admin/application_settings.rb +42 -0
  75. data/lib/active_admin/asset_registration.rb +0 -8
  76. data/lib/active_admin/base_controller/authorization.rb +3 -6
  77. data/lib/active_admin/base_controller.rb +6 -6
  78. data/lib/active_admin/batch_actions/controller.rb +2 -2
  79. data/lib/active_admin/batch_actions/resource_extension.rb +4 -4
  80. data/lib/active_admin/callbacks.rb +1 -1
  81. data/lib/active_admin/csv_builder.rb +1 -1
  82. data/lib/active_admin/dependency.rb +1 -69
  83. data/lib/active_admin/deprecation.rb +0 -25
  84. data/lib/active_admin/dsl.rb +1 -8
  85. data/lib/active_admin/dynamic_setting.rb +38 -0
  86. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  87. data/lib/active_admin/engine.rb +5 -0
  88. data/lib/active_admin/error.rb +1 -1
  89. data/lib/active_admin/filters/active_filter.rb +4 -2
  90. data/lib/active_admin/filters/active_sidebar.rb +5 -1
  91. data/lib/active_admin/filters/forms.rb +7 -4
  92. data/lib/active_admin/filters/formtastic_addons.rb +1 -1
  93. data/lib/active_admin/filters/resource_extension.rb +4 -4
  94. data/lib/active_admin/form_builder.rb +97 -62
  95. data/lib/active_admin/generators/boilerplate.rb +1 -1
  96. data/lib/active_admin/helpers/scope_chain.rb +1 -0
  97. data/lib/active_admin/inputs/datepicker_input.rb +8 -1
  98. data/lib/active_admin/inputs/filters/base/search_method_select.rb +2 -2
  99. data/lib/active_admin/menu.rb +2 -8
  100. data/lib/active_admin/menu_item.rb +4 -32
  101. data/lib/active_admin/namespace.rb +20 -8
  102. data/lib/active_admin/namespace_settings.rb +110 -0
  103. data/lib/active_admin/orm/active_record/comments/comment.rb +2 -2
  104. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +10 -5
  105. data/lib/active_admin/orm/active_record/comments.rb +15 -4
  106. data/lib/active_admin/page_dsl.rb +1 -1
  107. data/lib/active_admin/pundit_adapter.rb +13 -4
  108. data/lib/active_admin/resource/action_items.rb +7 -2
  109. data/lib/active_admin/resource/attributes.rb +7 -4
  110. data/lib/active_admin/resource/menu.rb +3 -3
  111. data/lib/active_admin/resource/naming.rb +3 -3
  112. data/lib/active_admin/resource/routes.rb +9 -4
  113. data/lib/active_admin/resource/scopes.rb +3 -3
  114. data/lib/active_admin/resource/sidebars.rb +1 -1
  115. data/lib/active_admin/resource.rb +2 -2
  116. data/lib/active_admin/resource_collection.rb +2 -2
  117. data/lib/active_admin/resource_controller/action_builder.rb +10 -0
  118. data/lib/active_admin/resource_controller/decorators.rb +3 -3
  119. data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
  120. data/lib/active_admin/resource_controller/scoping.rb +1 -1
  121. data/lib/active_admin/resource_dsl.rb +5 -3
  122. data/lib/active_admin/router.rb +89 -84
  123. data/lib/active_admin/scope.rb +9 -5
  124. data/lib/active_admin/settings_node.rb +19 -0
  125. data/lib/active_admin/version.rb +1 -1
  126. data/lib/active_admin/view_helpers/display_helper.rb +10 -2
  127. data/lib/active_admin/view_helpers/download_format_links_helper.rb +1 -0
  128. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +3 -0
  129. data/lib/active_admin/view_helpers.rb +1 -1
  130. data/lib/active_admin/views/components/active_admin_form.rb +9 -4
  131. data/lib/active_admin/views/components/attributes_table.rb +3 -3
  132. data/lib/active_admin/views/components/menu.rb +32 -0
  133. data/lib/active_admin/views/components/menu_item.rb +58 -0
  134. data/lib/active_admin/views/components/paginated_collection.rb +1 -1
  135. data/lib/active_admin/views/components/scopes.rb +11 -4
  136. data/lib/active_admin/views/components/sidebar.rb +13 -0
  137. data/lib/active_admin/views/components/sidebar_section.rb +0 -3
  138. data/lib/active_admin/views/components/site_title.rb +5 -6
  139. data/lib/active_admin/views/components/status_tag.rb +1 -18
  140. data/lib/active_admin/views/components/table_for.rb +3 -12
  141. data/lib/active_admin/views/components/tabs.rb +15 -3
  142. data/lib/active_admin/views/footer.rb +3 -7
  143. data/lib/active_admin/views/header.rb +3 -15
  144. data/lib/active_admin/views/index_as_blog.rb +1 -1
  145. data/lib/active_admin/views/index_as_grid.rb +25 -25
  146. data/lib/active_admin/views/index_as_table.rb +11 -10
  147. data/lib/active_admin/views/pages/base.rb +30 -53
  148. data/lib/active_admin/views/tabbed_navigation.rb +4 -59
  149. data/lib/active_admin/views.rb +1 -1
  150. data/lib/active_admin.rb +9 -4
  151. data/lib/generators/active_admin/assets/assets_generator.rb +2 -2
  152. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  153. data/lib/generators/active_admin/install/install_generator.rb +6 -2
  154. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -1
  155. data/lib/generators/active_admin/install/templates/dashboard.rb +2 -3
  156. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +1 -15
  157. data/lib/generators/active_admin/page/page_generator.rb +1 -1
  158. data/lib/generators/active_admin/resource/resource_generator.rb +1 -1
  159. data/lib/ransack_ext.rb +3 -3
  160. data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
  161. data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
  162. data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
  163. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +274 -283
  164. metadata +120 -523
  165. data/.github/ISSUE_TEMPLATE.md +0 -20
  166. data/.gitignore +0 -49
  167. data/.mdlrc +0 -1
  168. data/.rubocop.yml +0 -76
  169. data/.simplecov +0 -13
  170. data/.travis.yml +0 -51
  171. data/.yardopts +0 -7
  172. data/Gemfile +0 -58
  173. data/Rakefile +0 -54
  174. data/activeadmin.gemspec +0 -32
  175. data/app/assets/javascripts/active_admin/base.js.coffee +0 -13
  176. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +0 -6
  177. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +0 -7
  178. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +0 -11
  179. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +0 -14
  180. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +0 -26
  181. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +0 -7
  182. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +0 -42
  183. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +0 -46
  184. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +0 -104
  185. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +0 -19
  186. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +0 -79
  187. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +0 -45
  188. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +0 -46
  189. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +0 -22
  190. data/codecov.yml +0 -25
  191. data/config/i18n-tasks.yml +0 -26
  192. data/config/mdl_style.rb +0 -9
  193. data/cucumber.yml +0 -3
  194. data/features/action_item.feature +0 -73
  195. data/features/authorization.feature +0 -64
  196. data/features/authorization_cancan.feature +0 -52
  197. data/features/authorization_pundit.feature +0 -37
  198. data/features/belongs_to.feature +0 -124
  199. data/features/breadcrumb.feature +0 -75
  200. data/features/comments/commenting.feature +0 -178
  201. data/features/comments/viewing_index.feature +0 -19
  202. data/features/create_another.feature +0 -55
  203. data/features/dashboard.feature +0 -16
  204. data/features/decorators.feature +0 -43
  205. data/features/development_reloading.feature +0 -28
  206. data/features/edit_page.feature +0 -116
  207. data/features/favicon.feature +0 -20
  208. data/features/first_boot.feature +0 -16
  209. data/features/footer.feature +0 -28
  210. data/features/global_navigation.feature +0 -29
  211. data/features/i18n.feature +0 -55
  212. data/features/index/batch_actions.feature +0 -218
  213. data/features/index/filters.feature +0 -250
  214. data/features/index/format_as_csv.feature +0 -220
  215. data/features/index/formats.feature +0 -88
  216. data/features/index/index_as_block.feature +0 -15
  217. data/features/index/index_as_blog.feature +0 -69
  218. data/features/index/index_as_grid.feature +0 -45
  219. data/features/index/index_as_table.feature +0 -291
  220. data/features/index/index_blank_slate.feature +0 -83
  221. data/features/index/index_parameters.feature +0 -75
  222. data/features/index/index_scope_to.feature +0 -56
  223. data/features/index/index_scopes.feature +0 -285
  224. data/features/index/page_title.feature +0 -41
  225. data/features/index/pagination.feature +0 -63
  226. data/features/index/switch_index_view.feature +0 -73
  227. data/features/menu.feature +0 -72
  228. data/features/meta_tags.feature +0 -21
  229. data/features/new_page.feature +0 -136
  230. data/features/registering_assets.feature +0 -38
  231. data/features/registering_pages.feature +0 -237
  232. data/features/registering_resources.feature +0 -33
  233. data/features/renamed_resource.feature +0 -30
  234. data/features/root_to.feature +0 -17
  235. data/features/show/attributes_table_title.feature +0 -54
  236. data/features/show/columns.feature +0 -40
  237. data/features/show/default_content.feature +0 -44
  238. data/features/show/page_title.feature +0 -58
  239. data/features/show/tabs.feature +0 -33
  240. data/features/sidebar_sections.feature +0 -210
  241. data/features/site_title.feature +0 -47
  242. data/features/specifying_actions.feature +0 -118
  243. data/features/step_definitions/action_item_steps.rb +0 -7
  244. data/features/step_definitions/action_link_steps.rb +0 -19
  245. data/features/step_definitions/additional_web_steps.rb +0 -81
  246. data/features/step_definitions/asset_steps.rb +0 -15
  247. data/features/step_definitions/attribute_steps.rb +0 -18
  248. data/features/step_definitions/attributes_table_title_steps.rb +0 -11
  249. data/features/step_definitions/batch_action_steps.rb +0 -81
  250. data/features/step_definitions/blog_steps.rb +0 -3
  251. data/features/step_definitions/breadcrumb_steps.rb +0 -3
  252. data/features/step_definitions/column_steps.rb +0 -8
  253. data/features/step_definitions/comment_steps.rb +0 -32
  254. data/features/step_definitions/configuration_steps.rb +0 -100
  255. data/features/step_definitions/dashboard_steps.rb +0 -15
  256. data/features/step_definitions/factory_steps.rb +0 -35
  257. data/features/step_definitions/filter_steps.rb +0 -47
  258. data/features/step_definitions/flash_steps.rb +0 -11
  259. data/features/step_definitions/footer_steps.rb +0 -11
  260. data/features/step_definitions/format_steps.rb +0 -56
  261. data/features/step_definitions/i18n_steps.rb +0 -11
  262. data/features/step_definitions/index_scope_steps.rb +0 -29
  263. data/features/step_definitions/index_views_steps.rb +0 -3
  264. data/features/step_definitions/layout_steps.rb +0 -3
  265. data/features/step_definitions/member_link_steps.rb +0 -7
  266. data/features/step_definitions/menu_steps.rb +0 -11
  267. data/features/step_definitions/meta_tag_steps.rb +0 -3
  268. data/features/step_definitions/pagination_steps.rb +0 -15
  269. data/features/step_definitions/sidebar_steps.rb +0 -11
  270. data/features/step_definitions/site_title_steps.rb +0 -17
  271. data/features/step_definitions/tab_steps.rb +0 -8
  272. data/features/step_definitions/table_steps.rb +0 -116
  273. data/features/step_definitions/user_steps.rb +0 -52
  274. data/features/step_definitions/web_steps.rb +0 -86
  275. data/features/sti_resource.feature +0 -65
  276. data/features/strong_parameters.feature +0 -69
  277. data/features/support/env.rb +0 -122
  278. data/features/support/paths.rb +0 -73
  279. data/features/support/regular_env.rb +0 -7
  280. data/features/support/reload_env.rb +0 -7
  281. data/features/support/selectors.rb +0 -45
  282. data/features/users/logging_in.feature +0 -36
  283. data/features/users/logging_out.feature +0 -13
  284. data/features/users/resetting_password.feature +0 -34
  285. data/gemfiles/rails_42.gemfile +0 -10
  286. data/gemfiles/rails_50.gemfile +0 -10
  287. data/gemfiles/rails_51.gemfile +0 -10
  288. data/gemfiles/rails_52.gemfile +0 -11
  289. data/lib/active_admin/event.rb +0 -24
  290. data/lib/active_admin/helpers/output_safety_helper.rb +0 -35
  291. data/lib/active_admin/helpers/settings.rb +0 -114
  292. data/lib/bug_report_templates/active_admin_master.rb +0 -112
  293. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +0 -1
  294. data/spec/bug_report_templates_spec.rb +0 -26
  295. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +0 -50
  296. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +0 -25
  297. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +0 -34
  298. data/spec/javascripts/fixtures/checkboxes.html +0 -9
  299. data/spec/javascripts/fixtures/flashes.html +0 -2
  300. data/spec/javascripts/fixtures/table_checkboxes.html +0 -17
  301. data/spec/javascripts/helpers/SpecHelper.js +0 -3
  302. data/spec/javascripts/support/jasmine.yml +0 -74
  303. data/spec/javascripts/support/jasmine_runner.rb +0 -19
  304. data/spec/rails_helper.rb +0 -59
  305. data/spec/requests/default_namespace_spec.rb +0 -81
  306. data/spec/requests/memory_spec.rb +0 -25
  307. data/spec/requests/stylesheets_spec.rb +0 -18
  308. data/spec/spec_helper.rb +0 -1
  309. data/spec/support/active_admin_integration_spec_helper.rb +0 -73
  310. data/spec/support/active_admin_request_helpers.rb +0 -39
  311. data/spec/support/rails_template.rb +0 -153
  312. data/spec/support/rails_template_with_data.rb +0 -327
  313. data/spec/support/templates/admin/stores.rb +0 -7
  314. data/spec/support/templates/en.yml +0 -8
  315. data/spec/support/templates/manifest.js +0 -3
  316. data/spec/support/templates/policies/active_admin/comment_policy.rb +0 -9
  317. data/spec/support/templates/policies/active_admin/page_policy.rb +0 -18
  318. data/spec/support/templates/policies/admin_user_policy.rb +0 -11
  319. data/spec/support/templates/policies/application_policy.rb +0 -44
  320. data/spec/support/templates/policies/category_policy.rb +0 -7
  321. data/spec/support/templates/policies/post_policy.rb +0 -15
  322. data/spec/support/templates/policies/store_policy.rb +0 -11
  323. data/spec/support/templates/policies/user_policy.rb +0 -11
  324. data/spec/support/templates/post_decorator.rb +0 -24
  325. data/spec/unit/abstract_view_factory_spec.rb +0 -78
  326. data/spec/unit/action_builder_spec.rb +0 -158
  327. data/spec/unit/active_admin_spec.rb +0 -11
  328. data/spec/unit/application_spec.rb +0 -184
  329. data/spec/unit/asset_registration_spec.rb +0 -81
  330. data/spec/unit/authorization/authorization_adapter_spec.rb +0 -61
  331. data/spec/unit/authorization/controller_authorization_spec.rb +0 -43
  332. data/spec/unit/authorization/index_overriding_spec.rb +0 -23
  333. data/spec/unit/auto_link_spec.rb +0 -93
  334. data/spec/unit/batch_actions/resource_spec.rb +0 -84
  335. data/spec/unit/batch_actions/settings_spec.rb +0 -61
  336. data/spec/unit/belongs_to_spec.rb +0 -76
  337. data/spec/unit/cancan_adapter_spec.rb +0 -43
  338. data/spec/unit/comments_spec.rb +0 -176
  339. data/spec/unit/component_spec.rb +0 -18
  340. data/spec/unit/config_shared_examples.rb +0 -59
  341. data/spec/unit/controller_filters_spec.rb +0 -41
  342. data/spec/unit/csv_builder_spec.rb +0 -313
  343. data/spec/unit/dependency_spec.rb +0 -135
  344. data/spec/unit/devise_spec.rb +0 -110
  345. data/spec/unit/dsl_spec.rb +0 -120
  346. data/spec/unit/filters/active_filter_spec.rb +0 -189
  347. data/spec/unit/filters/active_spec.rb +0 -24
  348. data/spec/unit/filters/filter_form_builder_spec.rb +0 -524
  349. data/spec/unit/filters/resource_spec.rb +0 -128
  350. data/spec/unit/form_builder_spec.rb +0 -990
  351. data/spec/unit/generators/install_spec.rb +0 -31
  352. data/spec/unit/helpers/collection_spec.rb +0 -68
  353. data/spec/unit/helpers/output_safety_helper_spec.rb +0 -79
  354. data/spec/unit/helpers/scope_chain_spec.rb +0 -35
  355. data/spec/unit/helpers/settings_spec.rb +0 -30
  356. data/spec/unit/i18n_spec.rb +0 -29
  357. data/spec/unit/localizers/resource_localizer_spec.rb +0 -36
  358. data/spec/unit/menu_collection_spec.rb +0 -62
  359. data/spec/unit/menu_item_spec.rb +0 -141
  360. data/spec/unit/menu_spec.rb +0 -71
  361. data/spec/unit/namespace/authorization_spec.rb +0 -27
  362. data/spec/unit/namespace/register_page_spec.rb +0 -99
  363. data/spec/unit/namespace/register_resource_spec.rb +0 -162
  364. data/spec/unit/namespace_spec.rb +0 -124
  365. data/spec/unit/order_clause_spec.rb +0 -81
  366. data/spec/unit/page_controller_spec.rb +0 -5
  367. data/spec/unit/page_spec.rb +0 -128
  368. data/spec/unit/pretty_format_spec.rb +0 -82
  369. data/spec/unit/pundit_adapter_spec.rb +0 -98
  370. data/spec/unit/resource/action_items_spec.rb +0 -69
  371. data/spec/unit/resource/attributes_spec.rb +0 -49
  372. data/spec/unit/resource/includes_spec.rb +0 -21
  373. data/spec/unit/resource/menu_spec.rb +0 -18
  374. data/spec/unit/resource/naming_spec.rb +0 -122
  375. data/spec/unit/resource/ordering_spec.rb +0 -35
  376. data/spec/unit/resource/page_presenters_spec.rb +0 -44
  377. data/spec/unit/resource/pagination_spec.rb +0 -38
  378. data/spec/unit/resource/routes_spec.rb +0 -125
  379. data/spec/unit/resource/scopes_spec.rb +0 -50
  380. data/spec/unit/resource/sidebars_spec.rb +0 -43
  381. data/spec/unit/resource_collection_spec.rb +0 -175
  382. data/spec/unit/resource_controller/data_access_spec.rb +0 -234
  383. data/spec/unit/resource_controller/decorators_spec.rb +0 -94
  384. data/spec/unit/resource_controller/sidebars_spec.rb +0 -37
  385. data/spec/unit/resource_controller_spec.rb +0 -273
  386. data/spec/unit/resource_registration_spec.rb +0 -61
  387. data/spec/unit/resource_spec.rb +0 -320
  388. data/spec/unit/routing_spec.rb +0 -211
  389. data/spec/unit/scope_spec.rb +0 -209
  390. data/spec/unit/settings_spec.rb +0 -117
  391. data/spec/unit/view_factory_spec.rb +0 -19
  392. data/spec/unit/view_helpers/breadcrumbs_spec.rb +0 -253
  393. data/spec/unit/view_helpers/display_helper_spec.rb +0 -203
  394. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +0 -39
  395. data/spec/unit/view_helpers/fields_for_spec.rb +0 -50
  396. data/spec/unit/view_helpers/flash_helper_spec.rb +0 -24
  397. data/spec/unit/view_helpers/form_helper_spec.rb +0 -42
  398. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +0 -138
  399. data/spec/unit/views/components/attributes_table_spec.rb +0 -271
  400. data/spec/unit/views/components/batch_action_selector_spec.rb +0 -43
  401. data/spec/unit/views/components/blank_slate_spec.rb +0 -27
  402. data/spec/unit/views/components/columns_spec.rb +0 -187
  403. data/spec/unit/views/components/index_list_spec.rb +0 -49
  404. data/spec/unit/views/components/index_table_for_spec.rb +0 -127
  405. data/spec/unit/views/components/paginated_collection_spec.rb +0 -249
  406. data/spec/unit/views/components/panel_spec.rb +0 -58
  407. data/spec/unit/views/components/sidebar_section_spec.rb +0 -68
  408. data/spec/unit/views/components/site_title_spec.rb +0 -76
  409. data/spec/unit/views/components/status_tag_spec.rb +0 -265
  410. data/spec/unit/views/components/table_for_spec.rb +0 -436
  411. data/spec/unit/views/components/tabs_spec.rb +0 -67
  412. data/spec/unit/views/components/unsupported_browser_spec.rb +0 -41
  413. data/spec/unit/views/index_as_blog_spec.rb +0 -76
  414. data/spec/unit/views/pages/form_spec.rb +0 -54
  415. data/spec/unit/views/pages/index_spec.rb +0 -60
  416. data/spec/unit/views/pages/layout_spec.rb +0 -59
  417. data/spec/unit/views/pages/show_spec.rb +0 -32
  418. data/spec/unit/views/tabbed_navigation_spec.rb +0 -158
  419. data/tasks/docs.rake +0 -64
  420. data/tasks/lint.rake +0 -21
  421. data/tasks/local.rake +0 -25
  422. data/tasks/parallel_tests.rake +0 -66
  423. data/tasks/test.rake +0 -29
@@ -1,990 +0,0 @@
1
- require 'rails_helper'
2
- require "rspec/mocks/standalone"
3
-
4
- RSpec.describe ActiveAdmin::FormBuilder do
5
- # Setup an ActionView::Base object which can be used for
6
- # generating the form for.
7
- let(:helpers) do
8
- view = action_view
9
- def view.posts_path
10
- "/posts"
11
- end
12
-
13
- def view.protect_against_forgery?
14
- false
15
- end
16
-
17
- def view.url_for(*args)
18
- if args.first == {action: "index"}
19
- posts_path
20
- else
21
- super
22
- end
23
- end
24
-
25
- def view.a_helper_method
26
- "A Helper Method"
27
- end
28
-
29
- def view.fa_icon(*args)
30
- args.inspect
31
- end
32
-
33
- def view.action_name
34
- 'edit'
35
- end
36
-
37
- view
38
- end
39
-
40
- def build_form(options = {}, form_object = Post.new, &block)
41
- options = {url: helpers.posts_path}.merge(options)
42
-
43
- form = render_arbre_component({form_object: form_object, form_options: options, form_block: block}, helpers) do
44
- active_admin_form_for(assigns[:form_object], assigns[:form_options], &assigns[:form_block])
45
- end.to_s
46
-
47
- Capybara.string(form)
48
- end
49
-
50
- context "in general" do
51
- context "it without custom settings" do
52
- let :body do
53
- build_form do |f|
54
- f.inputs do
55
- f.input :title
56
- f.input :body
57
- end
58
- end
59
- end
60
-
61
- it "should generate a fieldset with a inputs class" do
62
- expect(body).to have_selector("fieldset.inputs")
63
- end
64
- end
65
-
66
- context "it with custom settings" do
67
- let :body do
68
- build_form do |f|
69
- f.inputs class: "custom_class", name: 'custom_name', custom_attr: 'custom_attr' do
70
- f.input :title
71
- f.input :body
72
- end
73
- end
74
- end
75
-
76
- it "should generate a fieldset with a inputs and custom class" do
77
- expect(body).to have_selector("fieldset.custom_class")
78
- end
79
-
80
- it "should generate a fieldset with a custom legend" do
81
- expect(body).to have_css("legend", text: 'custom_name')
82
- end
83
-
84
- it "should generate a fieldset with a custom attributes" do
85
- expect(body).to have_selector("fieldset[custom_attr='custom_attr']")
86
- end
87
- end
88
- end
89
-
90
- context "in general with actions" do
91
- let :body do
92
- build_form do |f|
93
- f.inputs do
94
- f.input :title
95
- f.input :body
96
- end
97
- f.actions do
98
- f.action :submit, label: "Submit Me"
99
- f.action :submit, label: "Another Button"
100
- end
101
- end
102
- end
103
-
104
- it "should generate a text input" do
105
- expect(body).to have_selector("input[type=text][name='post[title]']")
106
- end
107
- it "should generate a textarea" do
108
- expect(body).to have_selector("textarea[name='post[body]']")
109
- end
110
- it "should only generate the form once" do
111
- expect(body).to have_selector("form", count: 1)
112
- end
113
- it "should generate actions" do
114
- expect(body).to have_selector("input[type=submit][value='Submit Me']")
115
- expect(body).to have_selector("input[type=submit][value='Another Button']")
116
- end
117
- end
118
-
119
- context "when polymorphic relationship" do
120
- it "should raise error" do
121
- expect {
122
- comment = ActiveAdmin::Comment.new
123
- build_form({url: "admins/comments"}, comment) do |f|
124
- f.inputs :resource
125
- end
126
- }.to raise_error(Formtastic::PolymorphicInputWithoutCollectionError)
127
- end
128
- end
129
-
130
- describe "passing in options with actions" do
131
- let :body do
132
- build_form html: { multipart: true } do |f|
133
- f.inputs :title
134
- f.actions
135
- end
136
- end
137
- it "should pass the options on to the form" do
138
- expect(body).to have_selector("form[enctype='multipart/form-data']")
139
- end
140
- end
141
-
142
- context "file input present" do
143
- let :body do
144
- build_form do |f|
145
- f.input :body, as: :file
146
- end
147
- end
148
-
149
- it "adds multipart attribute automatically" do
150
- expect(body).to have_selector("form[enctype='multipart/form-data']")
151
- end
152
- end
153
-
154
- context "with actions" do
155
- it "should generate the form once" do
156
- body = build_form do |f|
157
- f.inputs do
158
- f.input :title
159
- end
160
- f.actions
161
- end
162
- expect(body).to have_selector("[id=post_title]", count: 1)
163
- end
164
-
165
- context "create another checkbox" do
166
- subject do
167
- build_form do |f|
168
- f.actions
169
- end
170
- end
171
-
172
- %w(new create).each do |action_name|
173
- it "generates create another checkbox on #{action_name} page" do
174
- expect(helpers).to receive(:action_name) { action_name }
175
- allow(helpers).to receive(:active_admin_config) { instance_double(ActiveAdmin::Resource, create_another: true) }
176
-
177
- is_expected.to have_selector("[type=checkbox]", count: 1)
178
- .and have_selector("[name=create_another]", count: 1)
179
- end
180
- end
181
-
182
- %w(show edit update).each do |action_name|
183
- it "doesn't generate create another checkbox on #{action_name} page" do
184
- is_expected.not_to have_selector("[name=create_another]", count: 1)
185
- end
186
- end
187
- end
188
-
189
- it "should generate one button create another checkbox and a cancel link" do
190
- body = build_form do |f|
191
- f.actions
192
- end
193
- expect(body).to have_selector("[type=submit]", count: 1)
194
- expect(body).to have_selector("[class=cancel]", count: 1)
195
- end
196
-
197
- it "should generate multiple actions" do
198
- body = build_form do |f|
199
- f.actions do
200
- f.action :submit, label: "Create & Continue"
201
- f.action :submit, label: "Create & Edit"
202
- end
203
- end
204
- expect(body).to have_selector("[type=submit]", count: 2)
205
- expect(body).to have_selector("[class=cancel]", count: 0)
206
- end
207
-
208
- end
209
-
210
- context "with Arbre inside" do
211
- it "should render the Arbre in the expected place" do
212
- body = build_form do |f|
213
- div do
214
- h1 'Heading'
215
- end
216
- f.inputs do
217
- span 'Top note'
218
- f.input :title
219
- span 'Bottom note'
220
- end
221
- h3 'Footer'
222
- f.actions
223
- end
224
-
225
- expect(body).to have_selector("div > h1")
226
- expect(body).to have_selector("h1", count: 1)
227
- expect(body).to have_selector(".inputs > ol > span")
228
- expect(body).to have_selector("span", count: 2)
229
- end
230
- it "should allow a simplified syntax" do
231
- body = build_form do |f|
232
- div do
233
- h1 'Heading'
234
- end
235
- inputs do
236
- span 'Top note'
237
- input :title
238
- span 'Bottom note'
239
- end
240
- h3 'Footer'
241
- actions
242
- end
243
-
244
- expect(body).to have_selector("div > h1")
245
- expect(body).to have_selector("h1", count: 1)
246
- expect(body).to have_selector(".inputs > ol > span")
247
- expect(body).to have_selector("span", count: 2)
248
- end
249
- end
250
-
251
- context "without passing a block to inputs" do
252
- let :body do
253
- build_form do |f|
254
- f.inputs :title, :body
255
- end
256
- end
257
- it "should have a title input" do
258
- expect(body).to have_selector("input[type=text][name='post[title]']")
259
- end
260
- it "should have a body textarea" do
261
- expect(body).to have_selector("textarea[name='post[body]']")
262
- end
263
- end
264
-
265
- context "with semantic fields for" do
266
- let :body do
267
- build_form do |f|
268
- f.inputs do
269
- f.input :title
270
- f.input :body
271
- end
272
- f.form_builder.instance_eval do
273
- @object.author = User.new
274
- end
275
- f.semantic_fields_for :author do |author|
276
- author.inputs :first_name, :last_name
277
- end
278
- end
279
- end
280
- it "should generate a nested text input once" do
281
- expect(body).to have_selector("[id=post_author_attributes_first_name_input]", count: 1)
282
- end
283
- end
284
-
285
- context "with collection inputs" do
286
- before do
287
- User.create first_name: "John", last_name: "Doe"
288
- User.create first_name: "Jane", last_name: "Doe"
289
- end
290
-
291
- describe "as select" do
292
- let :body do
293
- build_form do |f|
294
- f.input :author, include_blank: false
295
- end
296
- end
297
- it "should create 2 options" do
298
- expect(body).to have_selector("option", count: 2)
299
- end
300
- end
301
-
302
- describe "as radio buttons" do
303
- let :body do
304
- build_form do |f|
305
- f.input :author, as: :radio
306
- end
307
- end
308
- it "should create 2 radio buttons" do
309
- expect(body).to have_selector("[type=radio]", count: 2)
310
- end
311
- end
312
-
313
- end
314
-
315
- context "with inputs component inside has_many" do
316
-
317
- def user
318
- u = User.new
319
- u.profile = Profile.new(bio: 'bio')
320
- u
321
- end
322
-
323
- let :body do
324
- author = user()
325
- build_form do |f|
326
- f.form_builder.instance_eval do
327
- @object.author = author
328
- end
329
- f.inputs name: 'Author', for: :author do |author|
330
- author.has_many :profile, allow_destroy: true do |profile|
331
- profile.inputs "inputs for profile #{profile.object.bio}" do
332
- profile.input :bio
333
- end
334
- end
335
- end
336
- end
337
- end
338
-
339
- it "should see the profile fields for an existing profile" do
340
- expect(body).to have_selector("[id='post_author_attributes_profile_attributes_bio']", count: 1)
341
- expect(body).to have_selector("textarea[name='post[author_attributes][profile_attributes][bio]']")
342
- end
343
- end
344
-
345
- context "with a has_one relation on an author's profile" do
346
- let :body do
347
- author = user()
348
- build_form do |f|
349
- f.inputs do
350
- f.input :title
351
- f.input :body
352
- end
353
- f.form_builder.instance_eval do
354
- @object.author = author
355
- end
356
- f.inputs name: 'Author', for: :author do |author|
357
- author.has_many :profile, allow_destroy: true do |profile|
358
- profile.input :bio
359
- end
360
- end
361
- end
362
- end
363
-
364
- it "should see the button to add profile" do
365
- def user
366
- User.new
367
- end
368
- expect(body).to have_selector("a[contains(data-html,'post[author_attributes][profile_attributes][bio]')]")
369
- end
370
-
371
- it "should see the profile fields for an existing profile" do
372
- def user
373
- u = User.new
374
- u.profile = Profile.new
375
- u
376
- end
377
- expect(body).to have_selector("[id='post_author_attributes_profile_attributes_bio']", count: 1)
378
- expect(body).to have_selector("textarea[name='post[author_attributes][profile_attributes][bio]']")
379
- end
380
- end
381
-
382
- shared_examples :inputs_with_for_expectation do
383
- it "should generate a nested text input once" do
384
- expect(body).to have_selector("[id=post_author_attributes_first_name_input]", count: 1)
385
- expect(body).to have_selector("[id=post_author_attributes_last_name_input]", count: 1)
386
- end
387
- it "should add author first and last name fields" do
388
- expect(body).to have_selector("input[name='post[author_attributes][first_name]']")
389
- expect(body).to have_selector("input[name='post[author_attributes][last_name]']")
390
- end
391
- end
392
-
393
- context "with inputs 'for'" do
394
- let :body do
395
- build_form do |f|
396
- f.inputs do
397
- f.input :title
398
- f.input :body
399
- end
400
- f.form_builder.instance_eval do
401
- @object.author = User.new
402
- end
403
- f.inputs name: 'Author', for: :author do |author|
404
- author.inputs :first_name, :last_name
405
- end
406
- end
407
- end
408
-
409
- include_examples :inputs_with_for_expectation
410
- end
411
-
412
- context "with two input fields 'for' at the end of block" do
413
- let :body do
414
- build_form do |f|
415
- f.inputs do
416
- f.input :title
417
- f.input :body
418
- end
419
- f.form_builder.instance_eval do
420
- @object.author = User.new
421
- end
422
- f.inputs name: 'Author', for: :author do |author|
423
- author.input :first_name
424
- author.input :last_name
425
- end
426
- end
427
- end
428
-
429
- include_examples :inputs_with_for_expectation
430
- end
431
-
432
- context "with two input fields 'for' at the beginning of block" do
433
- let :body do
434
- build_form do |f|
435
- f.form_builder.instance_eval do
436
- @object.author = User.new
437
- end
438
- f.inputs name: 'Author', for: :author do |author|
439
- author.input :first_name
440
- author.input :last_name
441
- end
442
- f.inputs do
443
- f.input :title
444
- f.input :body
445
- end
446
- end
447
- end
448
-
449
- include_examples :inputs_with_for_expectation
450
- end
451
-
452
- context "with wrapper html" do
453
- it "should set a class" do
454
- body = build_form do |f|
455
- f.input :title, wrapper_html: { class: "important" }
456
- end
457
- expect(body).to have_selector("li[class='important string input optional stringish']")
458
- end
459
- end
460
-
461
- context "with inputs twice" do
462
- let :body do
463
- build_form do |f|
464
- f.inputs do
465
- f.input :title
466
- f.input :body
467
- end
468
- f.inputs do
469
- f.input :author
470
- f.input :created_at
471
- end
472
- end
473
- end
474
- it "should render four inputs" do
475
- expect(body).to have_selector("input[name='post[title]']", count: 1)
476
- expect(body).to have_selector("textarea[name='post[body]']", count: 1)
477
- expect(body).to have_selector("select[name='post[author_id]']", count: 1)
478
- expect(body).to have_selector("select[name='post[created_at(1i)]']", count: 1)
479
- expect(body).to have_selector("select[name='post[created_at(2i)]']", count: 1)
480
- expect(body).to have_selector("select[name='post[created_at(3i)]']", count: 1)
481
- expect(body).to have_selector("select[name='post[created_at(4i)]']", count: 1)
482
- end
483
- end
484
-
485
- context "with has many inputs" do
486
- describe "with simple block" do
487
- let :body do
488
- build_form({url: '/categories'}, Category.new) do |f|
489
- f.object.posts.build
490
- f.has_many :posts do |p|
491
- p.input :title
492
- p.input :body
493
- end
494
- f.inputs
495
- end
496
- end
497
-
498
- let(:valid_html_id) { /^[A-Za-z]+[\w\-\:\.]*$/ }
499
-
500
- it "should translate the association name in header" do
501
- with_translation activerecord: {models: {post: {one: 'Blog Post', other: 'Blog Posts'}}} do
502
- expect(body).to have_selector("h3", text: "Blog Posts")
503
- end
504
- end
505
-
506
- it "should use model name when there is no translation for given model in header" do
507
- expect(body).to have_selector("h3", text: "Post")
508
- end
509
-
510
- it "should translate the association name in has many new button" do
511
- with_translation activerecord: {models: {post: {one: 'Blog Post', other: 'Blog Posts'}}} do
512
- expect(body).to have_selector("a", text: "Add New Blog Post")
513
- end
514
- end
515
-
516
- it "should translate the attribute name" do
517
- with_translation activerecord: {attributes: {post: {title: 'A very nice title'}}} do
518
- expect(body).to have_selector("label", text: "A very nice title")
519
- end
520
- end
521
-
522
- it "should use model name when there is no translation for given model in has many new button" do
523
- expect(body).to have_selector("a", text: "Add New Post")
524
- end
525
-
526
- it "should render the nested form" do
527
- expect(body).to have_selector("input[name='category[posts_attributes][0][title]']")
528
- expect(body).to have_selector("textarea[name='category[posts_attributes][0][body]']")
529
- end
530
-
531
- it "should add a link to remove new nested records" do
532
- expect(body).to have_selector(".has_many_container > fieldset > ol > li > a.button.has_many_remove[href='#']", text: "Remove")
533
- end
534
-
535
- it "should add a link to add new nested records" do
536
- expect(body).to have_selector(".has_many_container > a.button.has_many_add[href='#']", text: "Add New Post")
537
- end
538
-
539
- it "should set an HTML-id valid placeholder" do
540
- link = body.find('.has_many_container > a.button.has_many_add')
541
- expect(link[:'data-placeholder']).to match valid_html_id
542
- end
543
-
544
- describe "with namespaced model" do
545
- it "should set an HTML-id valid placeholder" do
546
- allow(Post).to receive(:name).and_return "ActiveAdmin::Post"
547
- link = body.find('.has_many_container > a.button.has_many_add')
548
- expect(link[:'data-placeholder']).to match valid_html_id
549
- end
550
- end
551
- end
552
-
553
- describe "with complex block" do
554
- let :body do
555
- build_form({url: '/categories'}, Category.new) do |f|
556
- f.object.posts.build
557
- f.has_many :posts do |p, i|
558
- p.input :title, label: "Title #{i}"
559
- end
560
- end
561
- end
562
-
563
- it "should accept a block with a second argument" do
564
- expect(body).to have_selector("label", text: "Title 1")
565
- end
566
-
567
- it "should add a custom header" do
568
- expect(body).to have_selector("h3", text: "Post")
569
- end
570
- end
571
-
572
- describe "without heading and new record link" do
573
- let :body do
574
- build_form({url: '/categories'}, Category.new) do |f|
575
- f.object.posts.build
576
- f.has_many :posts, heading: false, new_record: false do |p|
577
- p.input :title
578
- end
579
- end
580
- end
581
-
582
- it "should not add a header" do
583
- expect(body).not_to have_selector("h3", text: "Post")
584
- end
585
-
586
- it "should not add link to new nested records" do
587
- expect(body).not_to have_selector("a", text: "Add New Post")
588
- end
589
-
590
- it "should render the nested form" do
591
- expect(body).to have_selector("input[name='category[posts_attributes][0][title]']")
592
- end
593
- end
594
-
595
- describe "with custom heading" do
596
- let :body do
597
- build_form({url: '/categories'}, Category.new) do |f|
598
- f.object.posts.build
599
- f.has_many :posts, heading: "Test heading" do |p|
600
- p.input :title
601
- end
602
- end
603
- end
604
-
605
- it "should add a custom header" do
606
- expect(body).to have_selector("h3", text: "Test heading")
607
- end
608
- end
609
-
610
- describe "with custom new record link" do
611
- let :body do
612
- build_form({url: '/categories'}, Category.new) do |f|
613
- f.object.posts.build
614
- f.has_many :posts, new_record: 'My Custom New Post' do |p|
615
- p.input :title
616
- end
617
- end
618
- end
619
-
620
- it "should add a custom new record link" do
621
- expect(body).to have_selector("a", text: "My Custom New Post")
622
- end
623
- end
624
-
625
- describe "with allow destroy" do
626
- shared_examples_for "has many with allow_destroy = true" do |child_num|
627
- it "should render the nested form" do
628
- expect(body).to have_selector("input[name='category[posts_attributes][#{child_num}][title]']")
629
- end
630
-
631
- it "should include a boolean field for _destroy" do
632
- expect(body).to have_selector("input[name='category[posts_attributes][#{child_num}][_destroy]']")
633
- end
634
-
635
- it "should have a check box with 'Remove' as its label" do
636
- expect(body).to have_selector("label[for=category_posts_attributes_#{child_num}__destroy]", text: "Delete")
637
- end
638
-
639
- it "should wrap the destroy field in an li with class 'has_many_delete'" do
640
- expect(body).to have_selector(".has_many_container > fieldset > ol > li.has_many_delete > input", count: 1, visible: false)
641
- end
642
- end
643
-
644
- shared_examples_for "has many with allow_destroy = false" do |child_num|
645
- it "should render the nested form" do
646
- expect(body).to have_selector("input[name='category[posts_attributes][#{child_num}][title]']")
647
- end
648
-
649
- it "should not have a boolean field for _destroy" do
650
- expect(body).not_to have_selector("input[name='category[posts_attributes][#{child_num}][_destroy]']", visible: :all)
651
- end
652
-
653
- it "should not have a check box with 'Remove' as its label" do
654
- expect(body).not_to have_selector("label[for=category_posts_attributes_#{child_num}__destroy]", text: "Remove")
655
- end
656
- end
657
-
658
- shared_examples_for "has many with allow_destroy as String, Symbol or Proc" do |allow_destroy_option|
659
- let :body do
660
- s = self
661
- build_form({url: '/categories'}, Category.new) do |f|
662
- s.instance_exec do
663
- allow(f.object.posts.build).to receive(:foo?).and_return(true)
664
- allow(f.object.posts.build).to receive(:foo?).and_return(false)
665
-
666
- f.object.posts.each do |post|
667
- allow(post).to receive(:new_record?).and_return(false)
668
- end
669
- end
670
- f.has_many :posts, allow_destroy: allow_destroy_option do |p|
671
- p.input :title
672
- end
673
- end
674
- end
675
-
676
- context 'for the child that responds with true' do
677
- it_behaves_like "has many with allow_destroy = true", 0
678
- end
679
-
680
- context 'for the child that responds with false' do
681
- it_behaves_like "has many with allow_destroy = false", 1
682
- end
683
- end
684
-
685
- context "with an existing post" do
686
- context "with allow_destroy = true" do
687
- let :body do
688
- s = self
689
- build_form({url: '/categories'}, Category.new) do |f|
690
- s.instance_exec do
691
- allow(f.object.posts.build).to receive(:new_record?).and_return(false)
692
- end
693
- f.has_many :posts, allow_destroy: true do |p|
694
- p.input :title
695
- end
696
- end
697
- end
698
-
699
- it_behaves_like "has many with allow_destroy = true", 0
700
- end
701
-
702
- context "with allow_destroy = false" do
703
- let :body do
704
- s = self
705
- build_form({url: '/categories'}, Category.new) do |f|
706
- s.instance_exec do
707
- allow(f.object.posts.build).to receive(:new_record?).and_return(false)
708
- end
709
- f.has_many :posts, allow_destroy: false do |p|
710
- p.input :title
711
- end
712
- end
713
- end
714
-
715
- it_behaves_like "has many with allow_destroy = false", 0
716
- end
717
-
718
- context "with allow_destroy = nil" do
719
- let :body do
720
- s = self
721
- build_form({url: '/categories'}, Category.new) do |f|
722
- s.instance_exec do
723
- allow(f.object.posts.build).to receive(:new_record?).and_return(false)
724
- end
725
- f.has_many :posts, allow_destroy: nil do |p|
726
- p.input :title
727
- end
728
- end
729
- end
730
-
731
- it_behaves_like "has many with allow_destroy = false", 0
732
- end
733
-
734
- context "with allow_destroy as Symbol" do
735
- it_behaves_like("has many with allow_destroy as String, Symbol or Proc", :foo?)
736
- end
737
-
738
- context "with allow_destroy as String" do
739
- it_behaves_like("has many with allow_destroy as String, Symbol or Proc", "foo?")
740
- end
741
-
742
- context "with allow_destroy as proc" do
743
- it_behaves_like("has many with allow_destroy as String, Symbol or Proc",
744
- Proc.new { |child| child.foo? })
745
- end
746
-
747
- context "with allow_destroy as lambda" do
748
- it_behaves_like("has many with allow_destroy as String, Symbol or Proc",
749
- lambda { |child| child.foo? })
750
- end
751
-
752
- context "with allow_destroy as any other expression that evaluates to true" do
753
- let :body do
754
- s = self
755
- build_form({url: '/categories'}, Category.new) do |f|
756
- s.instance_exec do
757
- allow(f.object.posts.build).to receive(:new_record?).and_return(false)
758
- end
759
- f.has_many :posts, allow_destroy: Object.new do |p|
760
- p.input :title
761
- end
762
- end
763
- end
764
-
765
- it_behaves_like "has many with allow_destroy = true", 0
766
- end
767
- end
768
-
769
- context "with a new post" do
770
- context "with allow_destroy = true" do
771
- let :body do
772
- build_form({url: '/categories'}, Category.new) do |f|
773
- f.object.posts.build
774
- f.has_many :posts, allow_destroy: true do |p|
775
- p.input :title
776
- end
777
- end
778
- end
779
-
780
- it_behaves_like "has many with allow_destroy = false", 0
781
- end
782
- end
783
- end
784
-
785
- describe "sortable" do
786
- # TODO: it doesn't make any sense to use your foreign key as something that's sortable (and therefore editable)
787
- context "with a new post" do
788
- let :body do
789
- build_form({url: '/categories'}, Category.new) do |f|
790
- f.object.posts.build
791
- f.has_many :posts, sortable: :position do |p|
792
- p.input :title
793
- end
794
- end
795
- end
796
-
797
- it "shows the nested fields for unsaved records" do
798
- expect(body).to have_selector("fieldset.inputs.has_many_fields")
799
- end
800
-
801
- end
802
-
803
- context "with post returning nil for the sortable attribute" do
804
- let :body do
805
- build_form({url: '/categories'}, Category.new) do |f|
806
- f.object.posts.build position: 3
807
- f.object.posts.build
808
- f.has_many :posts, sortable: :position do |p|
809
- p.input :title
810
- end
811
- end
812
- end
813
-
814
- it "shows the nested fields for unsaved records" do
815
- expect(body).to have_selector("fieldset.inputs.has_many_fields")
816
- end
817
-
818
- end
819
-
820
- context "with existing and new posts" do
821
- let! :category do
822
- Category.create name: 'Name'
823
- end
824
- let! :post do
825
- category.posts.create
826
- end
827
- let :body do
828
- build_form({url: '/categories'}, category) do |f|
829
- f.object.posts.build
830
- f.has_many :posts, sortable: :position do |p|
831
- p.input :title
832
- end
833
- end
834
- end
835
-
836
- it "shows the nested fields for saved and unsaved records" do
837
- expect(body).to have_selector("fieldset.inputs.has_many_fields")
838
- end
839
- end
840
-
841
- context "without sortable_start set" do
842
- let :body do
843
- build_form({url: '/categories'}, Category.new) do |f|
844
- f.object.posts.build
845
- f.has_many :posts, sortable: :position do |p|
846
- p.input :title
847
- end
848
- end
849
- end
850
-
851
- it "defaults to 0" do
852
- expect(body).to have_selector("div.has_many_container[data-sortable-start='0']")
853
- end
854
- end
855
-
856
- context "with sortable_start set" do
857
- let :body do
858
- build_form({url: '/categories'}, Category.new) do |f|
859
- f.object.posts.build
860
- f.has_many :posts, sortable: :position, sortable_start: 15 do |p|
861
- p.input :title
862
- end
863
- end
864
- end
865
-
866
- it "sets the data attribute" do
867
- expect(body).to have_selector("div.has_many_container[data-sortable-start='15']")
868
- end
869
- end
870
- end
871
-
872
- describe "with nesting" do
873
- context "in an inputs block" do
874
- let :body do
875
- build_form({url: '/categories'}, Category.new) do |f|
876
- f.inputs "Field Wrapper" do
877
- f.object.posts.build
878
- f.has_many :posts do |p|
879
- p.input :title
880
- end
881
- end
882
- end
883
- end
884
-
885
- it "should wrap the has_many fieldset in an li" do
886
- expect(body).to have_selector("ol > li.has_many_container")
887
- end
888
-
889
- it "should have a direct fieldset child" do
890
- expect(body).to have_selector("li.has_many_container > fieldset")
891
- end
892
-
893
- it "should not contain invalid li children" do
894
- expect(body).not_to have_selector("div.has_many_container > li")
895
- end
896
- end
897
-
898
- context "in another has_many block" do
899
- let :body do
900
- build_form({url: '/categories'}, Category.new) do |f|
901
- f.object.posts.build
902
- f.has_many :posts do |p|
903
- p.object.taggings.build
904
- p.has_many :taggings do |t|
905
- t.input :tag
906
- end
907
- end
908
- end
909
- end
910
-
911
- it "should wrap the inner has_many fieldset in an ol > li" do
912
- expect(body).to have_selector(".has_many_container ol > li.has_many_container > fieldset")
913
- end
914
-
915
- it "should not contain invalid li children" do
916
- expect(body).not_to have_selector(".has_many_container div.has_many_container > li")
917
- end
918
- end
919
- end
920
-
921
- it "should render the block if it returns nil" do
922
- body = build_form({url: '/categories'}, Category.new) do |f|
923
- f.object.posts.build
924
- f.has_many :posts do |p|
925
- p.input :title
926
- nil
927
- end
928
- end
929
-
930
- expect(body).to have_selector("input[name='category[posts_attributes][0][title]']")
931
- end
932
- end
933
-
934
- { # Testing that the same input can be used multiple times
935
- "f.input :title, as: :string" => "post_title",
936
- "f.input :title, as: :text" => "post_title",
937
- "f.input :created_at, as: :time_select" => "post_created_at_2i",
938
- "f.input :created_at, as: :datetime_select" => "post_created_at_2i",
939
- "f.input :created_at, as: :date_select" => "post_created_at_2i",
940
- # Testing that return values don't screw up the form
941
- "f.input :title; nil" => "post_title",
942
- "f.input :title; []" => "post_title",
943
- "[:title].each{ |r| f.input r }" => "post_title",
944
- "[:title].map { |r| f.input r }" => "post_title",
945
- }.each do |source, selector|
946
- it "should properly buffer `#{source}`" do
947
- body = build_form do |f|
948
- f.inputs do
949
- eval source
950
- eval source
951
- end
952
- end
953
- expect(body).to have_selector("[id=#{selector}]", count: 2, visible: :all)
954
- end
955
- end
956
-
957
- describe "datepicker input" do
958
- context 'with default options' do
959
- let :body do
960
- build_form do |f|
961
- f.inputs do
962
- f.input :created_at, as: :datepicker
963
- end
964
- end
965
- end
966
- it "should generate a text input with the class of datepicker" do
967
- expect(body).to have_selector("input.datepicker[type=text][name='post[created_at]']")
968
- end
969
- end
970
-
971
- context 'with date range options' do
972
- let :body do
973
- build_form do |f|
974
- f.inputs do
975
- f.input :created_at, as: :datepicker,
976
- datepicker_options: {
977
- min_date: Date.new(2013, 10, 18),
978
- max_date: "2013-12-31" }
979
- end
980
- end
981
- end
982
-
983
- it 'should generate a datepicker text input with data min and max dates' do
984
- selector = "input.datepicker[type=text][name='post[created_at]']"
985
- expect(body).to have_selector(selector)
986
- expect(body.find(selector)["data-datepicker-options"]).to eq({ minDate: '2013-10-18', maxDate: '2013-12-31' }.to_json)
987
- end
988
- end
989
- end
990
- end