activeadministration 0.0.1

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 (522) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +47 -0
  3. data/.travis.yml +19 -0
  4. data/.yardopts +9 -0
  5. data/CHANGELOG.md +1074 -0
  6. data/CONTRIBUTING.md +139 -0
  7. data/Gemfile +52 -0
  8. data/Guardfile +7 -0
  9. data/LICENSE +25 -0
  10. data/README.md +8 -0
  11. data/Rakefile +33 -0
  12. data/activeadministration.gemspec +34 -0
  13. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  14. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  16. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  17. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  18. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  19. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +10 -0
  20. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +4 -0
  21. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +13 -0
  22. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +3 -0
  23. data/app/assets/images/active_admin/loading.gif +0 -0
  24. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  25. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  26. data/app/assets/images/active_admin/orderable.png +0 -0
  27. data/app/assets/javascripts/active_admin/application.js.coffee +30 -0
  28. data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
  29. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  30. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  31. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  32. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +36 -0
  33. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +85 -0
  34. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +75 -0
  35. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +36 -0
  36. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
  37. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
  38. data/app/assets/stylesheets/active_admin/_base.css.scss +42 -0
  39. data/app/assets/stylesheets/active_admin/_forms.css.scss +329 -0
  40. data/app/assets/stylesheets/active_admin/_header.css.scss +156 -0
  41. data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
  42. data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
  43. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
  44. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
  45. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  46. data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
  47. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  48. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
  49. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +127 -0
  50. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
  51. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
  52. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  53. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  54. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  55. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +31 -0
  56. data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
  57. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  58. data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
  59. data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
  60. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
  61. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +65 -0
  62. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +111 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +36 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
  71. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  72. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
  73. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +34 -0
  74. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  75. data/app/assets/stylesheets/active_admin/print.css.scss +284 -0
  76. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  77. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  78. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +46 -0
  79. data/app/views/active_admin/dashboard/index.html.arb +1 -0
  80. data/app/views/active_admin/devise/confirmations/new.html.erb +14 -0
  81. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  82. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  83. data/app/views/active_admin/devise/passwords/edit.html.erb +19 -0
  84. data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
  85. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  86. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  87. data/app/views/active_admin/devise/shared/_links.erb +27 -0
  88. data/app/views/active_admin/devise/unlocks/new.html.erb +14 -0
  89. data/app/views/active_admin/page/index.html.arb +1 -0
  90. data/app/views/active_admin/resource/edit.html.arb +1 -0
  91. data/app/views/active_admin/resource/index.csv.erb +17 -0
  92. data/app/views/active_admin/resource/index.html.arb +1 -0
  93. data/app/views/active_admin/resource/new.html.arb +1 -0
  94. data/app/views/active_admin/resource/show.html.arb +1 -0
  95. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  96. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  97. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  98. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  99. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  100. data/app/views/kaminari/active_admin/_paginator.html.erb +23 -0
  101. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  102. data/app/views/layouts/active_admin.html.arb +1 -0
  103. data/app/views/layouts/active_admin_logged_out.html.erb +37 -0
  104. data/config/locales/bg.yml +102 -0
  105. data/config/locales/bs.yml +121 -0
  106. data/config/locales/ca.yml +102 -0
  107. data/config/locales/cs.yml +106 -0
  108. data/config/locales/da.yml +103 -0
  109. data/config/locales/de-CH.yml +118 -0
  110. data/config/locales/de.yml +143 -0
  111. data/config/locales/el.yml +111 -0
  112. data/config/locales/en-GB.yml +95 -0
  113. data/config/locales/en.yml +117 -0
  114. data/config/locales/es.yml +127 -0
  115. data/config/locales/es_MX.yml +110 -0
  116. data/config/locales/fi.yml +110 -0
  117. data/config/locales/fr.yml +109 -0
  118. data/config/locales/he.yml +92 -0
  119. data/config/locales/hr.yml +121 -0
  120. data/config/locales/hu.yml +96 -0
  121. data/config/locales/it.yml +114 -0
  122. data/config/locales/ja.yml +114 -0
  123. data/config/locales/ko.yml +85 -0
  124. data/config/locales/lt.yml +118 -0
  125. data/config/locales/lv.yml +90 -0
  126. data/config/locales/nl.yml +94 -0
  127. data/config/locales/no-NB.yml +111 -0
  128. data/config/locales/pl.yml +100 -0
  129. data/config/locales/pt-BR.yml +117 -0
  130. data/config/locales/pt-PT.yml +90 -0
  131. data/config/locales/ro.yml +94 -0
  132. data/config/locales/ru.yml +121 -0
  133. data/config/locales/sv-SE.yml +90 -0
  134. data/config/locales/tr.yml +94 -0
  135. data/config/locales/uk.yml +121 -0
  136. data/config/locales/vi.yml +91 -0
  137. data/config/locales/zh-CN.yml +112 -0
  138. data/config/locales/zh-TW.yml +94 -0
  139. data/cucumber.yml +3 -0
  140. data/docs/0-installation.md +84 -0
  141. data/docs/1-general-configuration.md +138 -0
  142. data/docs/10-custom-pages.md +84 -0
  143. data/docs/11-decorators.md +50 -0
  144. data/docs/12-arbre-components.md +150 -0
  145. data/docs/13-authorization-adapter.md +239 -0
  146. data/docs/2-resource-customization.md +359 -0
  147. data/docs/3-index-pages.md +245 -0
  148. data/docs/3-index-pages/create-an-index.md +31 -0
  149. data/docs/3-index-pages/index-as-block.md +21 -0
  150. data/docs/3-index-pages/index-as-blog.md +71 -0
  151. data/docs/3-index-pages/index-as-grid.md +29 -0
  152. data/docs/3-index-pages/index-as-table.md +163 -0
  153. data/docs/4-csv-format.md +39 -0
  154. data/docs/5-forms.md +118 -0
  155. data/docs/6-show-pages.md +77 -0
  156. data/docs/7-sidebars.md +63 -0
  157. data/docs/8-custom-actions.md +159 -0
  158. data/docs/9-batch-actions.md +233 -0
  159. data/features/action_item.feature +73 -0
  160. data/features/authorization.feature +64 -0
  161. data/features/authorization_cancan.feature +52 -0
  162. data/features/authorization_pundit.feature +37 -0
  163. data/features/belongs_to.feature +66 -0
  164. data/features/breadcrumb.feature +75 -0
  165. data/features/comments/commenting.feature +159 -0
  166. data/features/comments/viewing_index.feature +19 -0
  167. data/features/dashboard.feature +16 -0
  168. data/features/decorators.feature +41 -0
  169. data/features/development_reloading.feature +31 -0
  170. data/features/edit_page.feature +114 -0
  171. data/features/favicon.feature +20 -0
  172. data/features/first_boot.feature +16 -0
  173. data/features/global_navigation.feature +29 -0
  174. data/features/i18n.feature +43 -0
  175. data/features/index/batch_actions.feature +123 -0
  176. data/features/index/filters.feature +138 -0
  177. data/features/index/format_as_csv.feature +117 -0
  178. data/features/index/formats.feature +66 -0
  179. data/features/index/index_as_block.feature +15 -0
  180. data/features/index/index_as_blog.feature +69 -0
  181. data/features/index/index_as_grid.feature +45 -0
  182. data/features/index/index_as_table.feature +208 -0
  183. data/features/index/index_blank_slate.feature +83 -0
  184. data/features/index/index_parameters.feature +75 -0
  185. data/features/index/index_scope_to.feature +56 -0
  186. data/features/index/index_scopes.feature +251 -0
  187. data/features/index/page_title.feature +41 -0
  188. data/features/index/pagination.feature +59 -0
  189. data/features/index/switch_index_view.feature +73 -0
  190. data/features/menu.feature +53 -0
  191. data/features/new_page.feature +106 -0
  192. data/features/registering_assets.feature +35 -0
  193. data/features/registering_pages.feature +148 -0
  194. data/features/registering_resources.feature +33 -0
  195. data/features/root_to.feature +17 -0
  196. data/features/show/default_content.feature +43 -0
  197. data/features/show/page_title.feature +58 -0
  198. data/features/sidebar_sections.feature +210 -0
  199. data/features/site_title.feature +47 -0
  200. data/features/specifying_actions.feature +93 -0
  201. data/features/step_definitions/action_item_steps.rb +7 -0
  202. data/features/step_definitions/action_link_steps.rb +7 -0
  203. data/features/step_definitions/additional_web_steps.rb +82 -0
  204. data/features/step_definitions/asset_steps.rb +15 -0
  205. data/features/step_definitions/attribute_steps.rb +18 -0
  206. data/features/step_definitions/batch_action_steps.rb +55 -0
  207. data/features/step_definitions/breadcrumb_steps.rb +3 -0
  208. data/features/step_definitions/comment_steps.rb +12 -0
  209. data/features/step_definitions/configuration_steps.rb +100 -0
  210. data/features/step_definitions/dashboard_steps.rb +15 -0
  211. data/features/step_definitions/factory_steps.rb +34 -0
  212. data/features/step_definitions/filter_steps.rb +17 -0
  213. data/features/step_definitions/flash_steps.rb +11 -0
  214. data/features/step_definitions/format_steps.rb +45 -0
  215. data/features/step_definitions/i18n_steps.rb +3 -0
  216. data/features/step_definitions/index_scope_steps.rb +21 -0
  217. data/features/step_definitions/index_views_steps.rb +3 -0
  218. data/features/step_definitions/layout_steps.rb +3 -0
  219. data/features/step_definitions/member_link_steps.rb +7 -0
  220. data/features/step_definitions/menu_steps.rb +11 -0
  221. data/features/step_definitions/pagination_steps.rb +8 -0
  222. data/features/step_definitions/sidebar_steps.rb +12 -0
  223. data/features/step_definitions/site_title_steps.rb +15 -0
  224. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  225. data/features/step_definitions/tab_steps.rb +3 -0
  226. data/features/step_definitions/table_steps.rb +119 -0
  227. data/features/step_definitions/user_steps.rb +41 -0
  228. data/features/step_definitions/web_steps.rb +86 -0
  229. data/features/sti_resource.feature +65 -0
  230. data/features/strong_parameters.feature +72 -0
  231. data/features/support/env.rb +119 -0
  232. data/features/support/paths.rb +71 -0
  233. data/features/support/selectors.rb +45 -0
  234. data/features/symbol_leak.feature +35 -0
  235. data/features/users/logging_in.feature +34 -0
  236. data/features/users/logging_out.feature +13 -0
  237. data/features/users/resetting_password.feature +34 -0
  238. data/lib/active_admin.rb +135 -0
  239. data/lib/active_admin/abstract_view_factory.rb +86 -0
  240. data/lib/active_admin/application.rb +250 -0
  241. data/lib/active_admin/asset_registration.rb +29 -0
  242. data/lib/active_admin/authorization_adapter.rb +132 -0
  243. data/lib/active_admin/base_controller.rb +78 -0
  244. data/lib/active_admin/base_controller/authorization.rb +151 -0
  245. data/lib/active_admin/base_controller/menu.rb +34 -0
  246. data/lib/active_admin/batch_actions.rb +17 -0
  247. data/lib/active_admin/batch_actions/controller.rb +29 -0
  248. data/lib/active_admin/batch_actions/resource_extension.rb +154 -0
  249. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  250. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
  251. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +57 -0
  252. data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
  253. data/lib/active_admin/callbacks.rb +84 -0
  254. data/lib/active_admin/cancan_adapter.rb +40 -0
  255. data/lib/active_admin/component.rb +5 -0
  256. data/lib/active_admin/controller_action.rb +12 -0
  257. data/lib/active_admin/csv_builder.rb +70 -0
  258. data/lib/active_admin/dependencies.rb +38 -0
  259. data/lib/active_admin/deprecation.rb +35 -0
  260. data/lib/active_admin/devise.rb +80 -0
  261. data/lib/active_admin/dsl.rb +165 -0
  262. data/lib/active_admin/engine.rb +7 -0
  263. data/lib/active_admin/error.rb +22 -0
  264. data/lib/active_admin/event.rb +33 -0
  265. data/lib/active_admin/filters.rb +9 -0
  266. data/lib/active_admin/filters/dsl.rb +21 -0
  267. data/lib/active_admin/filters/forms.rb +87 -0
  268. data/lib/active_admin/filters/formtastic_addons.rb +73 -0
  269. data/lib/active_admin/filters/resource_extension.rb +135 -0
  270. data/lib/active_admin/form_builder.rb +185 -0
  271. data/lib/active_admin/helpers/collection.rb +23 -0
  272. data/lib/active_admin/helpers/i18n.rb +7 -0
  273. data/lib/active_admin/helpers/optional_display.rb +38 -0
  274. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  275. data/lib/active_admin/helpers/settings.rb +106 -0
  276. data/lib/active_admin/iconic.rb +54 -0
  277. data/lib/active_admin/iconic/icons.rb +142 -0
  278. data/lib/active_admin/inputs.rb +15 -0
  279. data/lib/active_admin/inputs/datepicker_input.rb +20 -0
  280. data/lib/active_admin/inputs/filter_base.rb +40 -0
  281. data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
  282. data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
  283. data/lib/active_admin/inputs/filter_check_boxes_input.rb +48 -0
  284. data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
  285. data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
  286. data/lib/active_admin/inputs/filter_select_input.rb +53 -0
  287. data/lib/active_admin/inputs/filter_string_input.rb +24 -0
  288. data/lib/active_admin/menu.rb +107 -0
  289. data/lib/active_admin/menu_collection.rb +96 -0
  290. data/lib/active_admin/menu_item.rb +97 -0
  291. data/lib/active_admin/namespace.rb +231 -0
  292. data/lib/active_admin/order_clause.rb +26 -0
  293. data/lib/active_admin/orm/active_record.rb +3 -0
  294. data/lib/active_admin/orm/active_record/comments.rb +84 -0
  295. data/lib/active_admin/orm/active_record/comments/comment.rb +49 -0
  296. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  297. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  298. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  299. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  300. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +75 -0
  301. data/lib/active_admin/orm/mongoid.rb +1 -0
  302. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  303. data/lib/active_admin/page.rb +88 -0
  304. data/lib/active_admin/page_controller.rb +29 -0
  305. data/lib/active_admin/page_dsl.rb +28 -0
  306. data/lib/active_admin/page_presenter.rb +32 -0
  307. data/lib/active_admin/pundit_adapter.rb +42 -0
  308. data/lib/active_admin/resource.rb +156 -0
  309. data/lib/active_admin/resource/action_items.rb +91 -0
  310. data/lib/active_admin/resource/belongs_to.rb +36 -0
  311. data/lib/active_admin/resource/controllers.rb +18 -0
  312. data/lib/active_admin/resource/menu.rb +64 -0
  313. data/lib/active_admin/resource/naming.rb +84 -0
  314. data/lib/active_admin/resource/page_presenters.rb +82 -0
  315. data/lib/active_admin/resource/pagination.rb +19 -0
  316. data/lib/active_admin/resource/routes.rb +99 -0
  317. data/lib/active_admin/resource/scope_to.rb +74 -0
  318. data/lib/active_admin/resource/scopes.rb +50 -0
  319. data/lib/active_admin/resource/sidebars.rb +28 -0
  320. data/lib/active_admin/resource_collection.rb +70 -0
  321. data/lib/active_admin/resource_controller.rb +50 -0
  322. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  323. data/lib/active_admin/resource_controller/data_access.rb +284 -0
  324. data/lib/active_admin/resource_controller/decorators.rb +100 -0
  325. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  326. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  327. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  328. data/lib/active_admin/resource_dsl.rb +171 -0
  329. data/lib/active_admin/router.rb +106 -0
  330. data/lib/active_admin/scope.rb +57 -0
  331. data/lib/active_admin/sidebar_section.rb +45 -0
  332. data/lib/active_admin/version.rb +3 -0
  333. data/lib/active_admin/view_factory.rb +27 -0
  334. data/lib/active_admin/view_helpers.rb +21 -0
  335. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  336. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  337. data/lib/active_admin/view_helpers/auto_link_helper.rb +37 -0
  338. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +27 -0
  339. data/lib/active_admin/view_helpers/display_helper.rb +64 -0
  340. data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
  341. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  342. data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
  343. data/lib/active_admin/view_helpers/form_helper.rb +21 -0
  344. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  345. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -0
  346. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  347. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  348. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  349. data/lib/active_admin/views.rb +8 -0
  350. data/lib/active_admin/views/action_items.rb +17 -0
  351. data/lib/active_admin/views/components/action_list_popover.rb +29 -0
  352. data/lib/active_admin/views/components/attributes_table.rb +105 -0
  353. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  354. data/lib/active_admin/views/components/columns.rb +157 -0
  355. data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
  356. data/lib/active_admin/views/components/index_list.rb +68 -0
  357. data/lib/active_admin/views/components/paginated_collection.rb +126 -0
  358. data/lib/active_admin/views/components/panel.rb +34 -0
  359. data/lib/active_admin/views/components/popover.rb +27 -0
  360. data/lib/active_admin/views/components/scopes.rb +66 -0
  361. data/lib/active_admin/views/components/sidebar_section.rb +29 -0
  362. data/lib/active_admin/views/components/site_title.rb +55 -0
  363. data/lib/active_admin/views/components/status_tag.rb +67 -0
  364. data/lib/active_admin/views/components/table_for.rb +212 -0
  365. data/lib/active_admin/views/footer.rb +20 -0
  366. data/lib/active_admin/views/header.rb +32 -0
  367. data/lib/active_admin/views/index_as_block.rb +36 -0
  368. data/lib/active_admin/views/index_as_blog.rb +156 -0
  369. data/lib/active_admin/views/index_as_grid.rb +80 -0
  370. data/lib/active_admin/views/index_as_table.rb +277 -0
  371. data/lib/active_admin/views/pages/base.rb +139 -0
  372. data/lib/active_admin/views/pages/form.rb +51 -0
  373. data/lib/active_admin/views/pages/index.rb +163 -0
  374. data/lib/active_admin/views/pages/layout.rb +26 -0
  375. data/lib/active_admin/views/pages/page.rb +30 -0
  376. data/lib/active_admin/views/pages/show.rb +59 -0
  377. data/lib/active_admin/views/tabbed_navigation.rb +62 -0
  378. data/lib/active_admin/views/title_bar.rb +55 -0
  379. data/lib/activeadmin.rb +1 -0
  380. data/lib/generators/active_admin/assets/assets_generator.rb +16 -0
  381. data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
  382. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  383. data/lib/generators/active_admin/devise/devise_generator.rb +66 -0
  384. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  385. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +243 -0
  386. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
  387. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  388. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
  389. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  390. data/lib/generators/active_admin/resource/templates/admin.rb +17 -0
  391. data/lib/ransack_ext.rb +12 -0
  392. data/script/local +44 -0
  393. data/script/use_rails +53 -0
  394. data/spec/integration/default_namespace_spec.rb +61 -0
  395. data/spec/integration/javascript_spec.rb +20 -0
  396. data/spec/integration/memory_spec.rb +29 -0
  397. data/spec/integration/stylesheets_spec.rb +18 -0
  398. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  399. data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
  400. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  401. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
  402. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
  403. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
  404. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  405. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  406. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  407. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
  408. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
  409. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
  410. data/spec/javascripts/support/jasmine.yml +74 -0
  411. data/spec/javascripts/support/jasmine_config.rb +23 -0
  412. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  413. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
  414. data/spec/javascripts/support/jquery.min.js +4 -0
  415. data/spec/spec_helper.rb +182 -0
  416. data/spec/spec_helper_without_rails.rb +16 -0
  417. data/spec/support/deferred_garbage_collection.rb +19 -0
  418. data/spec/support/detect_rails_version.rb +42 -0
  419. data/spec/support/integration_example_group.rb +31 -0
  420. data/spec/support/jslint.yml +80 -0
  421. data/spec/support/rails_template.rb +117 -0
  422. data/spec/support/rails_template_with_data.rb +59 -0
  423. data/spec/support/templates/admin/stores.rb +11 -0
  424. data/spec/support/templates/cucumber.rb +24 -0
  425. data/spec/support/templates/cucumber_with_reloading.rb +5 -0
  426. data/spec/support/templates/en.yml +8 -0
  427. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  428. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  429. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  430. data/spec/support/templates/policies/application_policy.rb +45 -0
  431. data/spec/support/templates/policies/category_policy.rb +7 -0
  432. data/spec/support/templates/policies/post_policy.rb +15 -0
  433. data/spec/support/templates/policies/store_policy.rb +11 -0
  434. data/spec/support/templates/policies/user_policy.rb +11 -0
  435. data/spec/support/templates/post_decorator.rb +11 -0
  436. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  437. data/spec/unit/action_builder_spec.rb +126 -0
  438. data/spec/unit/active_admin_spec.rb +11 -0
  439. data/spec/unit/application_spec.rb +140 -0
  440. data/spec/unit/asset_registration_spec.rb +52 -0
  441. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  442. data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
  443. data/spec/unit/auto_link_spec.rb +34 -0
  444. data/spec/unit/batch_actions/resource_spec.rb +92 -0
  445. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  446. data/spec/unit/belongs_to_spec.rb +42 -0
  447. data/spec/unit/cancan_adapter_spec.rb +43 -0
  448. data/spec/unit/comments_spec.rb +144 -0
  449. data/spec/unit/component_spec.rb +18 -0
  450. data/spec/unit/config_shared_examples.rb +59 -0
  451. data/spec/unit/controller_filters_spec.rb +37 -0
  452. data/spec/unit/csv_builder_spec.rb +134 -0
  453. data/spec/unit/devise_spec.rb +116 -0
  454. data/spec/unit/dsl_spec.rb +61 -0
  455. data/spec/unit/event_spec.rb +47 -0
  456. data/spec/unit/filters/filter_form_builder_spec.rb +418 -0
  457. data/spec/unit/filters/resource_spec.rb +121 -0
  458. data/spec/unit/form_builder_spec.rb +576 -0
  459. data/spec/unit/generators/install_spec.rb +23 -0
  460. data/spec/unit/helpers/collection_spec.rb +65 -0
  461. data/spec/unit/helpers/scope_chain_spec.rb +36 -0
  462. data/spec/unit/helpers/settings_spec.rb +30 -0
  463. data/spec/unit/menu_collection_spec.rb +62 -0
  464. data/spec/unit/menu_item_spec.rb +143 -0
  465. data/spec/unit/menu_spec.rb +71 -0
  466. data/spec/unit/namespace/authorization_spec.rb +27 -0
  467. data/spec/unit/namespace/register_page_spec.rb +74 -0
  468. data/spec/unit/namespace/register_resource_spec.rb +163 -0
  469. data/spec/unit/namespace_spec.rb +103 -0
  470. data/spec/unit/order_clause_spec.rb +57 -0
  471. data/spec/unit/page_controller_spec.rb +5 -0
  472. data/spec/unit/page_spec.rb +72 -0
  473. data/spec/unit/pretty_format_spec.rb +63 -0
  474. data/spec/unit/pundit_adapter_spec.rb +36 -0
  475. data/spec/unit/resource/action_items_spec.rb +62 -0
  476. data/spec/unit/resource/menu_spec.rb +18 -0
  477. data/spec/unit/resource/naming_spec.rb +122 -0
  478. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  479. data/spec/unit/resource/pagination_spec.rb +38 -0
  480. data/spec/unit/resource/routes_spec.rb +73 -0
  481. data/spec/unit/resource/scopes_spec.rb +50 -0
  482. data/spec/unit/resource/sidebars_spec.rb +43 -0
  483. data/spec/unit/resource_collection_spec.rb +158 -0
  484. data/spec/unit/resource_controller/data_access_spec.rb +73 -0
  485. data/spec/unit/resource_controller/decorators_spec.rb +86 -0
  486. data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
  487. data/spec/unit/resource_controller_spec.rb +265 -0
  488. data/spec/unit/resource_registration_spec.rb +56 -0
  489. data/spec/unit/resource_spec.rb +263 -0
  490. data/spec/unit/routing_spec.rb +172 -0
  491. data/spec/unit/scope_spec.rb +114 -0
  492. data/spec/unit/settings_spec.rb +88 -0
  493. data/spec/unit/view_factory_spec.rb +21 -0
  494. data/spec/unit/view_helpers/breadcrumbs_spec.rb +180 -0
  495. data/spec/unit/view_helpers/display_name_spec.rb +68 -0
  496. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  497. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  498. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  499. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +97 -0
  500. data/spec/unit/views/components/action_list_popover_spec.rb +29 -0
  501. data/spec/unit/views/components/attributes_table_spec.rb +259 -0
  502. data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
  503. data/spec/unit/views/components/blank_slate_spec.rb +17 -0
  504. data/spec/unit/views/components/columns_spec.rb +172 -0
  505. data/spec/unit/views/components/index_list_spec.rb +32 -0
  506. data/spec/unit/views/components/paginated_collection_spec.rb +229 -0
  507. data/spec/unit/views/components/panel_spec.rb +51 -0
  508. data/spec/unit/views/components/popover_spec.rb +33 -0
  509. data/spec/unit/views/components/sidebar_section_spec.rb +47 -0
  510. data/spec/unit/views/components/site_title_spec.rb +78 -0
  511. data/spec/unit/views/components/status_tag_spec.rb +102 -0
  512. data/spec/unit/views/components/table_for_spec.rb +242 -0
  513. data/spec/unit/views/pages/form_spec.rb +35 -0
  514. data/spec/unit/views/pages/layout_spec.rb +63 -0
  515. data/spec/unit/views/pages/show_spec.rb +20 -0
  516. data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
  517. data/tasks/docs.rake +37 -0
  518. data/tasks/js.rake +32 -0
  519. data/tasks/parallel_tests.rake +60 -0
  520. data/tasks/test.rake +79 -0
  521. data/tasks/yard.rake +7 -0
  522. metadata +741 -0
@@ -0,0 +1,576 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::FormBuilder do
4
+
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
+ view
30
+ end
31
+
32
+ def build_form(options = {}, form_object = Post.new, &block)
33
+ options = {url: helpers.posts_path}.merge(options)
34
+
35
+ render_arbre_component({form_object: form_object, form_options: options, form_block: block}, helpers)do
36
+ text_node active_admin_form_for(assigns[:form_object], assigns[:form_options], &assigns[:form_block])
37
+ end.to_s
38
+ end
39
+
40
+ context "in general with actions" do
41
+ let :body do
42
+ build_form do |f|
43
+ f.inputs do
44
+ f.input :title
45
+ f.input :body
46
+ end
47
+ f.actions do
48
+ f.action :submit, label: "Submit Me"
49
+ f.action :submit, label: "Another Button"
50
+ end
51
+ end
52
+ end
53
+
54
+ it "should generate a text input" do
55
+ body.should have_tag("input", attributes: { type: "text",
56
+ name: "post[title]" })
57
+ end
58
+ it "should generate a textarea" do
59
+ body.should have_tag("textarea", attributes: { name: "post[body]" })
60
+ end
61
+ it "should only generate the form once" do
62
+ body.scan(/Title/).size.should == 1
63
+ end
64
+ it "should generate actions" do
65
+ body.should have_tag("input", attributes: { type: "submit",
66
+ value: "Submit Me" })
67
+ body.should have_tag("input", attributes: { type: "submit",
68
+ value: "Another Button" })
69
+ end
70
+ end
71
+
72
+ context "when polymorphic relationship" do
73
+ it "should raise error" do
74
+ expect {
75
+ comment = ActiveAdmin::Comment.new
76
+ build_form({url: "admins/comments"}, comment) do |f|
77
+ f.inputs :resource
78
+ end
79
+ }.to raise_error(Formtastic::PolymorphicInputWithoutCollectionError)
80
+ end
81
+ end
82
+
83
+ describe "passing in options with actions" do
84
+ let :body do
85
+ build_form html: { multipart: true } do |f|
86
+ f.inputs :title
87
+ f.actions
88
+ end
89
+ end
90
+ it "should pass the options on to the form" do
91
+ body.should have_tag("form", attributes: { enctype: "multipart/form-data" })
92
+ end
93
+ end
94
+
95
+ describe "passing in options with actions" do
96
+ let :body do
97
+ build_form html: { multipart: true } do |f|
98
+ f.inputs :title
99
+ f.actions
100
+ end
101
+ end
102
+ it "should pass the options on to the form" do
103
+ body.should have_tag("form", attributes: { enctype: "multipart/form-data" })
104
+ end
105
+ end
106
+
107
+
108
+ context "with actions" do
109
+ it "should generate the form once" do
110
+ body = build_form do |f|
111
+ f.inputs do
112
+ f.input :title
113
+ end
114
+ f.actions
115
+ end
116
+ body.scan(/id="post_title"/).size.should == 1
117
+ end
118
+ it "should generate one button and a cancel link" do
119
+ body = build_form do |f|
120
+ f.actions
121
+ end
122
+ body.scan(/type="submit"/).size.should == 1
123
+ body.scan(/class="cancel"/).size.should == 1
124
+ end
125
+ it "should generate multiple actions" do
126
+ body = build_form do |f|
127
+ f.actions do
128
+ f.action :submit, label: "Create & Continue"
129
+ f.action :submit, label: "Create & Edit"
130
+ end
131
+ end
132
+ body.scan(/type="submit"/).size.should == 2
133
+ body.scan(/class="cancel"/).size.should == 0
134
+ end
135
+
136
+ end
137
+
138
+ context "with actions" do
139
+ it "should generate the form once" do
140
+ body = build_form do |f|
141
+ f.inputs do
142
+ f.input :title
143
+ end
144
+ f.actions
145
+ end
146
+ body.scan(/id="post_title"/).size.should == 1
147
+ end
148
+ it "should generate one button and a cancel link" do
149
+ body = build_form do |f|
150
+ f.actions
151
+ end
152
+ body.scan(/type="submit"/).size.should == 1
153
+ body.scan(/class="cancel"/).size.should == 1
154
+ end
155
+ it "should generate multiple actions" do
156
+ body = build_form do |f|
157
+ f.actions do
158
+ f.action :submit, label: "Create & Continue"
159
+ f.action :submit, label: "Create & Edit"
160
+ end
161
+ end
162
+ body.scan(/type="submit"/).size.should == 2
163
+ body.scan(/class="cancel"/).size.should == 0
164
+ end
165
+ end
166
+
167
+ context "without passing a block to inputs" do
168
+ let :body do
169
+ build_form do |f|
170
+ f.inputs :title, :body
171
+ end
172
+ end
173
+ it "should have a title input" do
174
+ body.should have_tag("input", attributes: { type: "text",
175
+ name: "post[title]" })
176
+ end
177
+ it "should have a body textarea" do
178
+ body.should have_tag("textarea", attributes: { name: "post[body]" })
179
+ end
180
+ end
181
+
182
+ context "with semantic fields for" do
183
+ let :body do
184
+ build_form do |f|
185
+ f.inputs do
186
+ f.input :title
187
+ f.input :body
188
+ end
189
+ f.instance_eval do
190
+ @object.author = User.new
191
+ end
192
+ f.semantic_fields_for :author do |author|
193
+ author.inputs :first_name, :last_name
194
+ end
195
+ end
196
+ end
197
+ it "should generate a nested text input once" do
198
+ body.scan("post_author_attributes_first_name_input").size.should == 1
199
+ end
200
+ end
201
+
202
+ context "with collection inputs" do
203
+ before do
204
+ User.create first_name: "John", last_name: "Doe"
205
+ User.create first_name: "Jane", last_name: "Doe"
206
+ end
207
+
208
+ describe "as select" do
209
+ let :body do
210
+ build_form do |f|
211
+ f.input :author
212
+ end
213
+ end
214
+ it "should create 2 options" do
215
+ body.scan(/<option/).size.should == 3
216
+ end
217
+ end
218
+
219
+ describe "as radio buttons" do
220
+ let :body do
221
+ build_form do |f|
222
+ f.input :author, as: :radio
223
+ end
224
+ end
225
+ it "should create 2 radio buttons" do
226
+ body.scan(/type="radio"/).size.should == 2
227
+ end
228
+ end
229
+
230
+ end
231
+
232
+ context "with inputs 'for'" do
233
+ let :body do
234
+ build_form do |f|
235
+ f.inputs do
236
+ f.input :title
237
+ f.input :body
238
+ end
239
+ f.instance_eval do
240
+ @object.author = User.new
241
+ end
242
+ f.inputs name: 'Author', for: :author do |author|
243
+ author.inputs :first_name, :last_name
244
+ end
245
+ end
246
+ end
247
+ it "should generate a nested text input once" do
248
+ body.scan("post_author_attributes_first_name_input").size.should == 1
249
+ end
250
+ it "should add an author first name field" do
251
+ body.should have_tag("input", attributes: { name: "post[author_attributes][first_name]"})
252
+ end
253
+ end
254
+
255
+ context "with wrapper html" do
256
+ it "should set a class" do
257
+ body = build_form do |f|
258
+ f.input :title, wrapper_html: { class: "important" }
259
+ end
260
+ body.should have_tag("li", attributes: {class: "important string input optional stringish"})
261
+ end
262
+ end
263
+
264
+ context "with has many inputs" do
265
+ describe "with simple block" do
266
+ let :body do
267
+ build_form({url: '/categories'}, Category.new) do |f|
268
+ f.object.posts.build
269
+ f.has_many :posts do |p|
270
+ p.input :title
271
+ end
272
+ end
273
+ end
274
+
275
+ it "should translate the association name in header" do
276
+ with_translation activerecord: {models: {post: {one: 'Blog Post', other: 'Blog Posts'}}} do
277
+ body.should have_tag('h3', 'Blog Posts')
278
+ end
279
+ end
280
+
281
+ it "should use model name when there is no translation for given model in header" do
282
+ body.should have_tag('h3', 'Post')
283
+ end
284
+
285
+ it "should translate the association name in has many new button" do
286
+ with_translation activerecord: {models: {post: {one: 'Blog Post', other: 'Blog Posts'}}} do
287
+ body.should have_tag('a', 'Add New Blog Post')
288
+ end
289
+ end
290
+
291
+ it "should translate the attribute name" do
292
+ with_translation activerecord: {attributes: {post: {title: 'A very nice title'}}} do
293
+ body.should have_tag 'label', 'A very nice title'
294
+ end
295
+ end
296
+
297
+ it "should use model name when there is no translation for given model in has many new button" do
298
+ body.should have_tag('a', 'Add New Post')
299
+ end
300
+
301
+ it "should render the nested form" do
302
+ body.should have_tag("input", attributes: {name: "category[posts_attributes][0][title]"})
303
+ end
304
+
305
+ it "should add a link to remove new nested records" do
306
+ Capybara.string(body).should have_css '.has_many_container > fieldset > ol > li > a', href: '#',
307
+ content: 'Remove', class: 'button has_many_remove', data: {placeholder: 'NEW_POST_RECORD'}
308
+ end
309
+
310
+ it "should add a link to add new nested records" do
311
+ Capybara.string(body).should have_css(".has_many_container > fieldset > ol > li > a", class: "button", href: "#", content: "Add New Post")
312
+ end
313
+ end
314
+
315
+ describe "with complex block" do
316
+ let :body do
317
+ build_form({url: '/categories'}, Category.new) do |f|
318
+ f.object.posts.build
319
+ f.has_many :posts do |p,i|
320
+ p.input :title, label: "Title #{i}"
321
+ end
322
+ end
323
+ end
324
+
325
+ it "should accept a block with a second argument" do
326
+ body.should have_tag("label", "Title 1")
327
+ end
328
+
329
+ it "should add a custom header" do
330
+ body.should have_tag('h3', 'Post')
331
+ end
332
+
333
+ end
334
+
335
+ describe "without heading and new record link" do
336
+ let :body do
337
+ build_form({url: '/categories'}, Category.new) do |f|
338
+ f.object.posts.build
339
+ f.has_many :posts, heading: false, new_record: false do |p|
340
+ p.input :title
341
+ end
342
+ end
343
+ end
344
+
345
+ it "should not add a header" do
346
+ body.should_not have_tag('h3', 'Post')
347
+ end
348
+
349
+ it "should not add link to new nested records" do
350
+ body.should_not have_tag('a', 'Add New Post')
351
+ end
352
+
353
+ it "should render the nested form" do
354
+ body.should have_tag("input", attributes: {name: "category[posts_attributes][0][title]"})
355
+ end
356
+ end
357
+
358
+ describe "with custom heading" do
359
+ let :body do
360
+ build_form({url: '/categories'}, Category.new) do |f|
361
+ f.object.posts.build
362
+ f.has_many :posts, heading: "Test heading" do |p|
363
+ p.input :title
364
+ end
365
+ end
366
+ end
367
+
368
+ it "should add a custom header" do
369
+ body.should have_tag('h3', 'Test heading')
370
+ end
371
+
372
+ end
373
+
374
+ describe "with custom new record link" do
375
+ let :body do
376
+ build_form({url: '/categories'}, Category.new) do |f|
377
+ f.object.posts.build
378
+ f.has_many :posts, new_record: 'My Custom New Post' do |p|
379
+ p.input :title
380
+ end
381
+ end
382
+ end
383
+
384
+ it "should add a custom new record link" do
385
+ body.should have_tag('a', 'My Custom New Post')
386
+ end
387
+
388
+ end
389
+
390
+ describe "with allow destroy" do
391
+ context "with an existing post" do
392
+ let :body do
393
+ build_form({url: '/categories'}, Category.new) do |f|
394
+ f.object.posts.build.stub(:new_record? => false)
395
+ f.has_many :posts, allow_destroy: true do |p|
396
+ p.input :title
397
+ end
398
+ end
399
+ end
400
+
401
+ it "should include a boolean field for _destroy" do
402
+ body.should have_tag("input", attributes: {name: "category[posts_attributes][0][_destroy]"})
403
+ end
404
+
405
+ it "should have a check box with 'Remove' as its label" do
406
+ body.should have_tag("label", attributes: {for: "category_posts_attributes_0__destroy"}, content: "Delete")
407
+ end
408
+
409
+ it "should wrap the destroy field in an li with class 'has_many_delete'" do
410
+ Capybara.string(body).should have_css(".has_many_container > fieldset > ol > li.has_many_delete > input")
411
+ end
412
+ end
413
+
414
+ context "with a new post" do
415
+ let :body do
416
+ build_form({url: '/categories'}, Category.new) do |f|
417
+ f.object.posts.build
418
+ f.has_many :posts, allow_destroy: true do |p|
419
+ p.input :title
420
+ end
421
+ end
422
+ end
423
+
424
+ it "should not have a boolean field for _destroy" do
425
+ body.should_not have_tag("input", attributes: {name: "category[posts_attributes][0][_destroy]"})
426
+ end
427
+
428
+ it "should not have a check box with 'Remove' as its label" do
429
+ body.should_not have_tag("label", attributes: {for: "category_posts_attributes_0__destroy"}, content: "Remove")
430
+ end
431
+ end
432
+ end
433
+
434
+ describe "sortable" do
435
+ # TODO: it doesn't make any sense to use your foreign key as something that's sortable (and therefore editable)
436
+ context "with a new post" do
437
+ let :body do
438
+ build_form({url: '/categories'}, Category.new) do |f|
439
+ f.object.posts.build
440
+ f.has_many :posts, sortable: :custom_category_id do |p|
441
+ p.input :title
442
+ end
443
+ end
444
+ end
445
+
446
+ it "shows the nested fields for unsaved records" do
447
+ body.should have_tag("fieldset", attributes: {class: "inputs has_many_fields"})
448
+ end
449
+
450
+ end
451
+ end
452
+
453
+ describe "with nesting" do
454
+ context "in an inputs block" do
455
+ let :body do
456
+ build_form({url: '/categories'}, Category.new) do |f|
457
+ f.inputs "Field Wrapper" do
458
+ f.object.posts.build
459
+ f.has_many :posts do |p|
460
+ p.input :title
461
+ end
462
+ end
463
+ end
464
+ end
465
+
466
+ it "should wrap the has_many fieldset in an li" do
467
+ Capybara.string(body).should have_css("ol > li.has_many_container")
468
+ end
469
+
470
+ it "should have a direct fieldset child" do
471
+ Capybara.string(body).should have_css("li.has_many_container > fieldset")
472
+ end
473
+
474
+ it "should not contain invalid li children" do
475
+ Capybara.string(body).should_not have_css("div.has_many_container > li")
476
+ end
477
+ end
478
+
479
+ context "in another has_many block" do
480
+ let :body do
481
+ build_form({url: '/categories'}, Category.new) do |f|
482
+ f.object.posts.build
483
+ f.has_many :posts do |p|
484
+ p.object.taggings.build
485
+ p.has_many :taggings do |t|
486
+ t.input :tag
487
+ end
488
+ end
489
+ end
490
+ end
491
+
492
+ it "should wrap the inner has_many fieldset in an ol > li" do
493
+ Capybara.string(body).should have_css(".has_many_container ol > li.has_many_container > fieldset")
494
+ end
495
+
496
+ it "should not contain invalid li children" do
497
+ Capybara.string(body).should_not have_css(".has_many_container div.has_many_container > li")
498
+ end
499
+ end
500
+ end
501
+
502
+ pending "should render the block if it returns nil" do
503
+ body = build_form({url: '/categories'}, Category.new) do |f|
504
+ f.object.posts.build
505
+ f.has_many :posts do |p|
506
+ p.input :title
507
+ nil
508
+ end
509
+ end
510
+
511
+ body.should have_tag("input", attributes: {name: "category[posts_attributes][0][title]"})
512
+ end
513
+ end
514
+
515
+ { # Testing that the same input can be used multiple times
516
+ "f.input :title, as: :string" => /id="post_title"/,
517
+ "f.input :title, as: :text" => /id="post_title"/,
518
+ "f.input :created_at, as: :time_select" => /id="post_created_at_2i"/,
519
+ "f.input :created_at, as: :datetime_select" => /id="post_created_at_2i"/,
520
+ "f.input :created_at, as: :date_select" => /id="post_created_at_2i"/,
521
+ # Testing that return values don't screw up the form
522
+ "f.input :title; nil" => /id="post_title"/,
523
+ "f.input :title; []" => /id="post_title"/,
524
+ "[:title].each{ |r| f.input r }" => /id="post_title"/,
525
+ "[:title].map { |r| f.input r }" => /id="post_title"/,
526
+ }.each do |source, regex|
527
+ it "should properly buffer `#{source}`" do
528
+ body = build_form do |f|
529
+ f.inputs do
530
+ eval source
531
+ eval source
532
+ end
533
+ end
534
+ body.scan(regex).size.should == 2
535
+ end
536
+ end
537
+
538
+ describe "datepicker input" do
539
+ context 'with default options' do
540
+ let :body do
541
+ build_form do |f|
542
+ f.inputs do
543
+ f.input :created_at, as: :datepicker
544
+ end
545
+ end
546
+ end
547
+ it "should generate a text input with the class of datepicker" do
548
+ body.should have_tag("input", attributes: { type: "text",
549
+ class: "datepicker",
550
+ name: "post[created_at]" })
551
+ end
552
+ end
553
+
554
+ context 'with date range options' do
555
+ let :body do
556
+ build_form do |f|
557
+ f.inputs do
558
+ f.input :created_at, as: :datepicker,
559
+ datepicker_options: {
560
+ min_date: Date.new(2013, 10, 18),
561
+ max_date: "2013-12-31" }
562
+ end
563
+ end
564
+ it 'should generate a datepicker text input with data min and max dates' do
565
+ body.should have_tag("input", attributes: { type: "text",
566
+ class: "datepicker",
567
+ name: "post[created_at]",
568
+ data: { datepicker_options: {
569
+ minDate: "2013-10-18",
570
+ maxDate: "2013-12-31" }.to_json }})
571
+ end
572
+ end
573
+ end
574
+ end
575
+
576
+ end