activeadmin 0.4.4 → 0.5.0.pre

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 (310) hide show
  1. data/.gitignore +3 -0
  2. data/.travis.yml +5 -0
  3. data/CHANGELOG.md +50 -0
  4. data/CONTRIBUTING.md +2 -4
  5. data/Gemfile +10 -4
  6. data/Guardfile +0 -1
  7. data/LICENSE +1 -1
  8. data/README.rdoc +19 -8
  9. data/Rakefile +10 -1
  10. data/activeadmin.gemspec +2 -1
  11. data/app/assets/javascripts/active_admin/application.js +3 -9
  12. data/app/assets/javascripts/active_admin/base.js +1 -0
  13. data/app/assets/javascripts/active_admin/components/jquery.aa.checkbox-toggler.js.coffee +64 -0
  14. data/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.coffee +107 -0
  15. data/app/assets/javascripts/active_admin/components/jquery.aa.popover.js.coffee +100 -0
  16. data/app/assets/javascripts/active_admin/components/jquery.aa.table-checkbox-toggler.js.coffee +27 -0
  17. data/app/assets/javascripts/active_admin/lib/namespace.js.coffee +3 -0
  18. data/app/assets/javascripts/active_admin/pages/application.js.coffee +13 -0
  19. data/app/assets/javascripts/active_admin/pages/batch_actions.js.coffee +26 -0
  20. data/app/assets/stylesheets/active_admin/_base.css.scss +32 -26
  21. data/app/assets/stylesheets/active_admin/_forms.css.scss +12 -5
  22. data/app/assets/stylesheets/active_admin/_header.css.scss +1 -2
  23. data/app/assets/stylesheets/active_admin/_typography.css.scss +1 -1
  24. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
  25. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -2
  26. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
  27. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +3 -3
  28. data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
  29. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +1 -1
  30. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +20 -27
  31. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +1 -0
  32. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +38 -36
  33. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +5 -5
  34. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +7 -3
  35. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +19 -17
  36. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +2 -2
  37. data/app/assets/stylesheets/active_admin/print.css.scss +290 -0
  38. data/app/views/active_admin/dashboard/index.html.arb +1 -1
  39. data/app/views/active_admin/devise/passwords/edit.html.erb +17 -14
  40. data/app/views/active_admin/devise/passwords/new.html.erb +4 -4
  41. data/app/views/active_admin/devise/sessions/new.html.erb +6 -6
  42. data/app/views/active_admin/devise/shared/_links.erb +6 -6
  43. data/app/views/active_admin/page/index.html.arb +1 -1
  44. data/app/views/active_admin/resource/edit.html.arb +1 -1
  45. data/app/views/active_admin/resource/index.csv.erb +1 -1
  46. data/app/views/active_admin/resource/index.html.arb +1 -1
  47. data/app/views/active_admin/resource/new.html.arb +1 -1
  48. data/app/views/active_admin/resource/show.html.arb +1 -1
  49. data/app/views/layouts/active_admin.html.arb +1 -1
  50. data/app/views/layouts/active_admin_logged_out.html.erb +2 -2
  51. data/cucumber.yml +1 -1
  52. data/docs/0-installation.md +10 -1
  53. data/docs/{9-custom-pages.md → 10-custom-pages.md} +0 -0
  54. data/docs/2-resource-customization.md +19 -1
  55. data/docs/3-index-pages.md +31 -0
  56. data/docs/4-csv-format.md +9 -0
  57. data/docs/6-show-screens.md +1 -1
  58. data/docs/9-batch-actions.md +161 -0
  59. data/features/dashboard.feature +31 -8
  60. data/features/development_reloading.feature +1 -1
  61. data/features/edit_page.feature +3 -3
  62. data/features/i18n.feature +35 -0
  63. data/features/index/batch_actions.feature +98 -0
  64. data/features/index/filters.feature +26 -0
  65. data/features/index/format_as_csv.feature +35 -0
  66. data/features/index/index_as_table.feature +30 -2
  67. data/features/index/index_blank_slate.feature +8 -3
  68. data/features/index/index_scopes.feature +130 -24
  69. data/features/index/page_title.feature +12 -0
  70. data/features/new_page.feature +3 -3
  71. data/features/registering_pages.feature +61 -0
  72. data/features/root_to.feature +17 -0
  73. data/features/show/default_content.feature +1 -1
  74. data/features/show/page_title.feature +14 -0
  75. data/features/sidebar_sections.feature +26 -0
  76. data/features/site_title.feature +1 -1
  77. data/features/specifying_actions.feature +7 -6
  78. data/features/step_definitions/action_link_steps.rb +1 -1
  79. data/features/step_definitions/additional_web_steps.rb +7 -1
  80. data/features/step_definitions/batch_action_steps.rb +94 -0
  81. data/features/step_definitions/configuration_steps.rb +30 -8
  82. data/features/step_definitions/factory_steps.rb +12 -0
  83. data/features/step_definitions/format_steps.rb +6 -2
  84. data/features/step_definitions/i18n_steps.rb +3 -0
  85. data/features/step_definitions/table_steps.rb +114 -0
  86. data/features/step_definitions/user_steps.rb +30 -4
  87. data/features/support/env.rb +54 -15
  88. data/features/support/paths.rb +2 -0
  89. data/features/users/logging_in.feature +1 -1
  90. data/features/users/logging_out.feature +2 -1
  91. data/features/users/resetting_password.feature +34 -0
  92. data/lib/active_admin.rb +46 -7
  93. data/lib/active_admin/application.rb +30 -15
  94. data/lib/active_admin/base_controller/menu.rb +3 -3
  95. data/lib/active_admin/batch_actions.rb +17 -0
  96. data/lib/active_admin/batch_actions/controller.rb +25 -0
  97. data/lib/active_admin/batch_actions/resource_extension.rb +126 -0
  98. data/lib/active_admin/batch_actions/views/batch_action_form.rb +35 -0
  99. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
  100. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +63 -0
  101. data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
  102. data/lib/active_admin/comments.rb +5 -2
  103. data/lib/active_admin/comments/comment.rb +4 -3
  104. data/lib/active_admin/comments/views/active_admin_comments.rb +5 -5
  105. data/lib/active_admin/component.rb +1 -18
  106. data/lib/active_admin/csv_builder.rb +8 -3
  107. data/lib/active_admin/dashboards.rb +21 -4
  108. data/lib/active_admin/dashboards/dashboard_controller.rb +1 -5
  109. data/lib/active_admin/dependency_checker.rb +1 -1
  110. data/lib/active_admin/dsl.rb +61 -4
  111. data/lib/active_admin/engine.rb +1 -1
  112. data/lib/active_admin/filters.rb +8 -0
  113. data/lib/active_admin/filters/dsl.rb +12 -0
  114. data/lib/active_admin/filters/forms.rb +93 -0
  115. data/lib/active_admin/filters/resource_extension.rb +92 -0
  116. data/lib/active_admin/form_builder.rb +88 -33
  117. data/lib/active_admin/helpers/collection.rb +23 -0
  118. data/lib/active_admin/helpers/optional_display.rb +1 -1
  119. data/lib/active_admin/inputs/filter_select_input.rb +1 -1
  120. data/lib/active_admin/locales/bg.yml +37 -1
  121. data/lib/active_admin/locales/ca.yml +36 -0
  122. data/lib/active_admin/locales/cs.yml +36 -0
  123. data/lib/active_admin/locales/da.yml +36 -0
  124. data/lib/active_admin/locales/de.yml +42 -0
  125. data/lib/active_admin/locales/en.yml +27 -2
  126. data/lib/active_admin/locales/es.yml +45 -4
  127. data/lib/active_admin/locales/fr.yml +22 -0
  128. data/lib/active_admin/locales/{he_il.yml → he.yml} +37 -2
  129. data/lib/active_admin/locales/hr.yml +49 -5
  130. data/lib/active_admin/locales/hu.yml +21 -0
  131. data/lib/active_admin/locales/it.yml +36 -1
  132. data/lib/active_admin/locales/ja.yml +36 -0
  133. data/lib/active_admin/locales/ko.yml +36 -1
  134. data/lib/active_admin/locales/lv.yml +28 -2
  135. data/lib/active_admin/locales/nl.yml +42 -1
  136. data/lib/active_admin/locales/no-NB.yml +15 -0
  137. data/lib/active_admin/locales/pl.yml +45 -1
  138. data/lib/active_admin/locales/pt-BR.yml +36 -1
  139. data/lib/active_admin/locales/ro.yml +67 -0
  140. data/lib/active_admin/locales/ru.yml +43 -3
  141. data/lib/active_admin/locales/sv-SE.yml +41 -1
  142. data/lib/active_admin/locales/tr.yml +80 -0
  143. data/lib/active_admin/locales/vi.yml +80 -0
  144. data/lib/active_admin/locales/{zh_cn.yml → zh-CN.yml} +42 -2
  145. data/lib/active_admin/locales/zh-TW.yml +36 -1
  146. data/lib/active_admin/menu.rb +55 -30
  147. data/lib/active_admin/menu_builder.rb +65 -0
  148. data/lib/active_admin/menu_item.rb +55 -14
  149. data/lib/active_admin/namespace.rb +25 -55
  150. data/lib/active_admin/page.rb +15 -10
  151. data/lib/active_admin/resource.rb +9 -0
  152. data/lib/active_admin/resource/action_items.rb +4 -4
  153. data/lib/active_admin/resource/controllers.rb +1 -1
  154. data/lib/active_admin/resource/menu.rb +19 -21
  155. data/lib/active_admin/resource/naming.rb +55 -45
  156. data/lib/active_admin/resource/sidebars.rb +0 -13
  157. data/lib/active_admin/resource_collection.rb +10 -10
  158. data/lib/active_admin/resource_controller.rb +5 -5
  159. data/lib/active_admin/resource_controller/actions.rb +2 -0
  160. data/lib/active_admin/resource_controller/collection.rb +13 -4
  161. data/lib/active_admin/resource_dsl.rb +12 -6
  162. data/lib/active_admin/router.rb +27 -8
  163. data/lib/active_admin/scope.rb +1 -0
  164. data/lib/active_admin/sidebar_section.rb +2 -6
  165. data/lib/active_admin/version.rb +1 -1
  166. data/lib/active_admin/view_factory.rb +18 -13
  167. data/lib/active_admin/view_helpers.rb +0 -2
  168. data/lib/active_admin/view_helpers/auto_link_helper.rb +2 -1
  169. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +24 -25
  170. data/lib/active_admin/view_helpers/display_helper.rb +1 -1
  171. data/lib/active_admin/view_helpers/fields_for.rb +44 -0
  172. data/lib/active_admin/view_helpers/form_helper.rb +6 -0
  173. data/lib/active_admin/view_helpers/view_factory_helper.rb +1 -1
  174. data/lib/active_admin/views/components/action_list_popover.rb +29 -0
  175. data/lib/active_admin/views/components/attributes_table.rb +6 -2
  176. data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
  177. data/lib/active_admin/views/components/paginated_collection.rb +13 -14
  178. data/lib/active_admin/views/components/popover.rb +27 -0
  179. data/lib/active_admin/views/components/scopes.rb +8 -13
  180. data/lib/active_admin/views/components/sidebar_section.rb +1 -1
  181. data/lib/active_admin/views/components/site_title.rb +55 -0
  182. data/lib/active_admin/views/components/status_tag.rb +4 -4
  183. data/lib/active_admin/views/components/table_for.rb +18 -18
  184. data/lib/active_admin/views/dashboard_section_renderer.rb +1 -1
  185. data/lib/active_admin/views/footer.rb +18 -0
  186. data/lib/active_admin/views/header.rb +31 -0
  187. data/lib/active_admin/views/index_as_block.rb +3 -0
  188. data/lib/active_admin/views/index_as_blog.rb +4 -0
  189. data/lib/active_admin/views/index_as_grid.rb +2 -0
  190. data/lib/active_admin/views/index_as_table.rb +19 -6
  191. data/lib/active_admin/views/pages/base.rb +14 -48
  192. data/lib/active_admin/views/pages/form.rb +3 -3
  193. data/lib/active_admin/views/pages/index.rb +56 -24
  194. data/lib/active_admin/views/pages/layout.rb +2 -2
  195. data/lib/active_admin/views/pages/page.rb +10 -4
  196. data/lib/active_admin/views/pages/show.rb +11 -8
  197. data/lib/active_admin/views/tabbed_navigation.rb +3 -3
  198. data/lib/active_admin/views/title_bar.rb +50 -0
  199. data/lib/active_admin/views/utility_nav.rb +41 -0
  200. data/lib/generators/active_admin/assets/assets_generator.rb +1 -1
  201. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +1 -0
  202. data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +26 -3
  203. data/lib/generators/active_admin/devise/devise_generator.rb +2 -2
  204. data/lib/generators/active_admin/install/install_generator.rb +10 -10
  205. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +21 -1
  206. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +20 -0
  207. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  208. data/lib/generators/active_admin/resource/templates/admin.rb +1 -1
  209. data/spec/integration/memory_spec.rb +1 -11
  210. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  211. data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
  212. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  213. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
  214. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
  215. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
  216. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  217. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  218. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  219. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
  220. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
  221. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
  222. data/spec/javascripts/support/jasmine.yml +74 -0
  223. data/spec/javascripts/support/jasmine_config.rb +23 -0
  224. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  225. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
  226. data/spec/javascripts/support/jquery.min.js +4 -0
  227. data/spec/spec_helper.rb +13 -13
  228. data/spec/spec_helper_without_rails.rb +2 -3
  229. data/spec/support/detect_rails_version.rb +16 -10
  230. data/spec/support/rails_template.rb +13 -1
  231. data/spec/support/templates/admin/stores.rb +1 -0
  232. data/spec/support/templates/en.yml +6 -0
  233. data/spec/unit/action_builder_spec.rb +38 -0
  234. data/spec/unit/application_spec.rb +12 -16
  235. data/spec/unit/base_controller_shared_examples.rb +3 -6
  236. data/spec/unit/batch_actions/resource_spec.rb +91 -0
  237. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  238. data/spec/unit/breadcrumbs_spec.rb +33 -0
  239. data/spec/unit/comments_spec.rb +6 -0
  240. data/spec/unit/config_shared_examples.rb +17 -64
  241. data/spec/unit/csv_builder_spec.rb +12 -2
  242. data/spec/unit/dashboard_controller_spec.rb +11 -5
  243. data/spec/unit/dsl_include_spec.rb +20 -0
  244. data/spec/unit/{filter_form_builder_spec.rb → filters/filter_form_builder_spec.rb} +10 -7
  245. data/spec/unit/filters/resource_spec.rb +60 -0
  246. data/spec/unit/form_builder_spec.rb +180 -28
  247. data/spec/unit/helpers/collection_spec.rb +65 -0
  248. data/spec/unit/menu_item_spec.rb +48 -53
  249. data/spec/unit/menu_spec.rb +46 -32
  250. data/spec/unit/namespace/register_page_spec.rb +0 -6
  251. data/spec/unit/namespace/register_resource_spec.rb +1 -8
  252. data/spec/unit/namespace_spec.rb +8 -2
  253. data/spec/unit/page_spec.rb +20 -8
  254. data/spec/unit/resource/naming_spec.rb +27 -26
  255. data/spec/unit/resource/sidebars_spec.rb +0 -7
  256. data/spec/unit/resource_collection_spec.rb +11 -11
  257. data/spec/unit/resource_controller/collection_spec.rb +23 -1
  258. data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
  259. data/spec/unit/resource_controller_spec.rb +43 -0
  260. data/spec/unit/resource_registration_spec.rb +2 -13
  261. data/spec/unit/resource_spec.rb +0 -42
  262. data/spec/unit/routing_spec.rb +60 -14
  263. data/spec/unit/scope_spec.rb +7 -0
  264. data/spec/unit/view_factory_spec.rb +9 -6
  265. data/spec/unit/view_helpers/fields_for_spec.rb +41 -0
  266. data/spec/unit/view_helpers/form_helper_spec.rb +18 -0
  267. data/spec/unit/views/components/action_list_popover_spec.rb +30 -0
  268. data/spec/unit/views/components/attributes_table_spec.rb +32 -20
  269. data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
  270. data/spec/unit/views/components/blank_slate_spec.rb +5 -3
  271. data/spec/unit/views/components/columns_spec.rb +32 -22
  272. data/spec/unit/views/components/paginated_collection_spec.rb +54 -12
  273. data/spec/unit/views/components/panel_spec.rb +11 -6
  274. data/spec/unit/views/components/popover_spec.rb +33 -0
  275. data/spec/unit/views/components/sidebar_section_spec.rb +6 -6
  276. data/spec/unit/views/components/site_title_spec.rb +78 -0
  277. data/spec/unit/views/components/status_tag_spec.rb +17 -10
  278. data/spec/unit/views/components/table_for_spec.rb +37 -17
  279. data/spec/unit/views/pages/layout_spec.rb +51 -10
  280. data/spec/unit/views/tabbed_navigation_spec.rb +44 -23
  281. data/tasks/js.rake +32 -0
  282. data/tasks/test.rake +1 -1
  283. metadata +233 -200
  284. data/lib/active_admin/arbre.rb +0 -22
  285. data/lib/active_admin/arbre/builder.rb +0 -125
  286. data/lib/active_admin/arbre/context.rb +0 -45
  287. data/lib/active_admin/arbre/html/attributes.rb +0 -20
  288. data/lib/active_admin/arbre/html/class_list.rb +0 -24
  289. data/lib/active_admin/arbre/html/collection.rb +0 -27
  290. data/lib/active_admin/arbre/html/document.rb +0 -42
  291. data/lib/active_admin/arbre/html/element.rb +0 -161
  292. data/lib/active_admin/arbre/html/html5_elements.rb +0 -47
  293. data/lib/active_admin/arbre/html/tag.rb +0 -145
  294. data/lib/active_admin/arbre/html/text_node.rb +0 -35
  295. data/lib/active_admin/filter_form_builder.rb +0 -53
  296. data/lib/active_admin/renderer.rb +0 -87
  297. data/lib/active_admin/resource_controller/filters.rb +0 -58
  298. data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
  299. data/lib/active_admin/view_helpers/filter_form_helper.rb +0 -36
  300. data/lib/active_admin/view_helpers/renderer_helper.rb +0 -29
  301. data/lib/active_admin/views/header_renderer.rb +0 -82
  302. data/lib/generators/active_admin/assets/templates/dashboards.rb +0 -36
  303. data/lib/generators/active_admin/install/templates/dashboards.rb +0 -44
  304. data/spec/unit/arbre/context_spec.rb +0 -35
  305. data/spec/unit/arbre/html/element_finder_methods_spec.rb +0 -110
  306. data/spec/unit/arbre/html/element_spec.rb +0 -236
  307. data/spec/unit/arbre/html/tag_attributes_spec.rb +0 -61
  308. data/spec/unit/arbre/html/tag_spec.rb +0 -63
  309. data/spec/unit/arbre/html_spec.rb +0 -228
  310. data/spec/unit/renderer_spec.rb +0 -126
@@ -20,7 +20,7 @@ module ActiveAdmin
20
20
  template '3.1/active_admin.js', 'app/assets/javascripts/active_admin.js'
21
21
  template '3.1/active_admin.css.scss', 'app/assets/stylesheets/active_admin.css.scss'
22
22
  else
23
- template '../../../../../app/assets/javascripts/active_admin/application.js', 'public/javascripts/active_admin.js'
23
+ template '3.0/active_admin.js', 'public/javascripts/active_admin.js'
24
24
  directory '../../../../../app/assets/images/active_admin', 'public/images/active_admin'
25
25
  generate "jquery:install --ui" if options.jquery?
26
26
  install_bourbon if options.bourbon?
@@ -0,0 +1 @@
1
+ (function(){window.AA={}}).call(this),function(){window.AA.CheckboxToggler=AA.CheckboxToggler=function(){function a(a,b){var c;this.options=a,this.container=b,c={},this.options=$.extend({},c,a),this._init(),this._bind()}return a.name="CheckboxToggler",a.prototype._init=function(){if(!this.container)throw new Error("Container element not found");this.$container=$(this.container);if(!this.$container.find(".toggle_all").length)throw new Error("'toggle all' checkbox not found");return this.toggle_all_checkbox=this.$container.find(".toggle_all"),this.checkboxes=this.$container.find(":checkbox").not(this.toggle_all_checkbox)},a.prototype._bind=function(){var a=this;return this.checkboxes.bind("change",function(b){return a._didChangeCheckbox(b.target)}),this.toggle_all_checkbox.bind("change",function(b){return a._didChangeToggleAllCheckbox()})},a.prototype._didChangeCheckbox=function(a){if(this.checkboxes.filter(":checked").length===this.checkboxes.length-1)return this._uncheckToggleAllCheckbox();if(this.checkboxes.filter(":checked").length===this.checkboxes.length)return this._checkToggleAllCheckbox()},a.prototype._didChangeToggleAllCheckbox=function(){return this.toggle_all_checkbox.attr("checked")==="checked"?this._checkAllCheckboxes():this._uncheckAllCheckboxes()},a.prototype._uncheckToggleAllCheckbox=function(){return this.toggle_all_checkbox.removeAttr("checked")},a.prototype._checkToggleAllCheckbox=function(){return this.toggle_all_checkbox.attr("checked","checked")},a.prototype._uncheckAllCheckboxes=function(){var a=this;return this.checkboxes.each(function(b,c){return $(c).removeAttr("checked"),a._didChangeCheckbox(c)})},a.prototype._checkAllCheckboxes=function(){var a=this;return this.checkboxes.each(function(b,c){return $(c).attr("checked","checked"),a._didChangeCheckbox(c)})},a}(),function(a){return a.widget.bridge("checkboxToggler",AA.CheckboxToggler)}(jQuery)}.call(this),function(){window.AA.DropdownMenu=AA.DropdownMenu=function(){function a(a,b){var c;return this.options=a,this.element=b,this.$element=$(this.element),c={fadeInDuration:20,fadeOutDuration:100,onClickActionItemCallback:null},this.options=$.extend({},c,a),this.$menuButton=this.$element.find(".dropdown_menu_button"),this.$menuList=this.$element.find(".dropdown_menu_list_wrapper"),this.isOpen=!1,this._buildMenuList(),this._bind(),this}return a.name="DropdownMenu",a.prototype.open=function(){return this.isOpen=!0,this.$menuList.fadeIn(this.options.fadeInDuration),this._positionMenuList(),this._positionNipple(),this},a.prototype.close=function(){return this.isOpen=!1,this.$menuList.fadeOut(this.options.fadeOutDuration),this},a.prototype.destroy=function(){return this.$element.unbind(),this.$element=null,this},a.prototype.isDisabled=function(){return this.$menuButton.hasClass("disabled")},a.prototype.disable=function(){return this.$menuButton.addClass("disabled")},a.prototype.enable=function(){return this.$menuButton.removeClass("disabled")},a.prototype.option=function(a,b){return $.isPlainObject(a)?this.options=$.extend(!0,this.options,a):a!=null?this.options[a]:this.options[a]=b},a.prototype._buildMenuList=function(){return this.$menuList.prepend('<div class="dropdown_menu_nipple"></div>'),this.$menuList.hide()},a.prototype._bind=function(){var a=this;return $("body").bind("click",function(){if(a.isOpen===!0)return a.close()}),this.$menuButton.bind("click",function(){return a.isDisabled()||(a.isOpen===!0?a.close():a.open()),!1})},a.prototype._positionMenuList=function(){var a,b,c;return a=this.$menuButton.offset().left+this.$menuButton.outerWidth()/2,b=this.$menuList.outerWidth()/2,c=a-b,this.$menuList.css("left",c)},a.prototype._positionNipple=function(){var a,b,c,d,e;return c=this.$menuList.outerWidth()/2,b=this.$menuButton.offset().top+this.$menuButton.outerHeight()+10,this.$menuList.css("top",b),a=this.$menuList.find(".dropdown_menu_nipple"),d=a.outerWidth()/2,e=c-d,a.css("left",e)},a}(),function(a){return a.widget.bridge("aaDropdownMenu",AA.DropdownMenu),a(function(){return a(".dropdown_menu").aaDropdownMenu()})}(jQuery)}.call(this),function(){window.AA.Popover=AA.Popover=function(){function a(a,b){var c;return this.options=a,this.element=b,this.$element=$(this.element),c={fadeInDuration:20,fadeOutDuration:100,autoOpen:!0,pageWrapperElement:"#wrapper",onClickActionItemCallback:null},this.options=$.extend({},c,a),this.$popover=null,this.isOpen=!1,$(this.$element.attr("href")).length>0?this.$popover=$(this.$element.attr("href")):this.$popover=this.$element.next(".popover"),this._buildPopover(),this._bind(),this}return a.name="Popover",a.prototype.open=function(){return this.isOpen=!0,this.$popover.fadeIn(this.options.fadeInDuration),this._positionPopover(),this._positionNipple(),this},a.prototype.close=function(){return this.isOpen=!1,this.$popover.fadeOut(this.options.fadeOutDuration),this},a.prototype.destroy=function(){return this.$element.removeData("popover"),this.$element.unbind(),this.$element=null,this},a.prototype.option=function(){},a.prototype._buildPopover=function(){return this.$popover.prepend('<div class="popover_nipple"></div>'),this.$popover.hide(),this.$popover.addClass("popover")},a.prototype._bind=function(){var a=this;$(this.options.pageWrapperElement).bind("click",function(b){if(a.isOpen===!0)return a.close()});if(this.options.autoOpen===!0)return this.$element.bind("click",function(){return a.isOpen===!0?a.close():a.open(),!1})},a.prototype._positionPopover=function(){var a,b,c;return a=this.$element.offset().left+this.$element.outerWidth()/2,b=this.$popover.outerWidth()/2,c=a-b,this.$popover.css("left",c)},a.prototype._positionNipple=function(){var a,b,c,d,e;return c=this.$popover.outerWidth()/2,b=this.$element.offset().top+this.$element.outerHeight()+10,this.$popover.css("top",b),a=this.$popover.find(".popover_nipple"),d=a.outerWidth()/2,e=c-d,a.css("left",e)},a}(),function(a){return a.widget.bridge("popover",AA.Popover)}(jQuery)}.call(this),function(){var a={}.hasOwnProperty,b=function(b,c){function e(){this.constructor=b}for(var d in c)a.call(c,d)&&(b[d]=c[d]);return e.prototype=c.prototype,b.prototype=new e,b.__super__=c.prototype,b};window.AA.TableCheckboxToggler=AA.TableCheckboxToggler=function(a){function c(){return c.__super__.constructor.apply(this,arguments)}return b(c,a),c.name="TableCheckboxToggler",c.prototype._init=function(){return c.__super__._init.apply(this,arguments)},c.prototype._bind=function(){var a=this;return c.__super__._bind.apply(this,arguments),this.$container.find("tbody").find("td").bind("click",function(b){if(b.target.type!=="checkbox")return a._didClickCell(b.target)})},c.prototype._didChangeCheckbox=function(a){var b;return c.__super__._didChangeCheckbox.apply(this,arguments),b=$(a).parents("tr"),a.checked?b.addClass("selected"):b.removeClass("selected")},c.prototype._didClickCell=function(a){return $(a).parent("tr").find(":checkbox").click()},c}(AA.CheckboxToggler),function(a){return a.widget.bridge("tableCheckboxToggler",AA.TableCheckboxToggler)}(jQuery)}.call(this),function(){$(function(){return $(".datepicker").datepicker({dateFormat:"yy-mm-dd"}),$(".clear_filters_btn").click(function(){return window.location.search="",!1}),$(".dropdown_button").popover()})}.call(this),function(){jQuery(function(a){a(document).delegate("#batch_actions_selector li a","click.rails",function(){return a("#batch_action").val(a(this).attr("data-action")),a("#collection_selection").submit()});if(a("#batch_actions_selector").length&&a(":checkbox.toggle_all").length)return a(".paginated_collection").find("table.index_table").length?a(".paginated_collection table").tableCheckboxToggler():a(".paginated_collection").checkboxToggler(),a(".paginated_collection").find(":checkbox").bind("change",function(){return a(".paginated_collection").find(":checkbox").filter(":checked").length>0?a("#batch_actions_selector").aaDropdownMenu("enable"):a("#batch_actions_selector").aaDropdownMenu("disable")})})}.call(this);
@@ -1,6 +1,29 @@
1
- // Active Admin CSS Styles
1
+ // SASS variable overrides must be declared before loading up Active Admin's styles.
2
+ //
3
+ // To view the variables that Active Admin provides, take a look at
4
+ // `app/assets/stylesheets/active_admin/mixins/_variables.css.scss` in the
5
+ // Active Admin source.
6
+ //
7
+ // For example, to change the sidebar width:
8
+ // $sidebar-width: 242px;
9
+
10
+ // Active Admin's got SASS!
2
11
  @import "active_admin/mixins";
3
12
  @import "active_admin/base";
4
13
 
5
- // To customize the Active Admin interfaces, add your
6
- // styles here:
14
+ // Overriding any non-variable SASS must be done after the fact.
15
+ // For example, to change the default status-tag color:
16
+ //
17
+ // body.active_admin {
18
+ // .status_tag { background: #6090DB; }
19
+ // }
20
+ //
21
+ // Notice that Active Admin CSS rules are nested within a
22
+ // 'body.active_admin' selector to prevent conflicts with
23
+ // other pages in the app. It is best to wrap your changes in a
24
+ // namespace so they are properly recognized. You have options
25
+ // if you e.g. want different styles for different namespaces:
26
+ //
27
+ // .active_admin applies to any Active Admin namespace
28
+ // .admin_namespace applies to the admin namespace (eg: /admin)
29
+ // .other_namespace applies to a custom namespace named other (eg: /other)
@@ -38,8 +38,8 @@ module ActiveAdmin
38
38
  devise_migrations = Dir["db/migrate/*_devise_create_#{table_name}.rb"]
39
39
  if devise_migrations.size > 0
40
40
  inject_into_file Dir["db/migrate/*_devise_create_#{table_name}.rb"].first,
41
- "# Create a default user\n #{class_name}.create!(:email => 'admin@example.com', :password => 'password', :password_confirmation => 'password')\n\n ",
42
- :before => "add_index :#{table_name}, :email"
41
+ "def migrate(direction)\n super\n # Create a default user\n AdminUser.create!(:email => 'admin@example.com', :password => 'password', :password_confirmation => 'password') if direction == :up\n end\n\n ",
42
+ :before => "def change"
43
43
  end
44
44
  end
45
45
 
@@ -1,29 +1,29 @@
1
+ require 'rails/generators/active_record'
2
+
1
3
  module ActiveAdmin
2
4
  module Generators
3
- class InstallGenerator < Rails::Generators::NamedBase
4
- desc "Installs Active Admin and generats the necessary migrations"
5
+ class InstallGenerator < ActiveRecord::Generators::Base
6
+ desc "Installs Active Admin and generates the necessary migrations"
5
7
  argument :name, :type => :string, :default => "AdminUser"
6
8
 
7
9
  hook_for :users, :default => "devise", :desc => "Admin user generator to run. Skip with --skip-users"
8
10
 
9
- include Rails::Generators::Migration
10
-
11
11
  def self.source_root
12
12
  @_active_admin_source_root ||= File.expand_path("../templates", __FILE__)
13
- end
14
-
15
- def self.next_migration_number(dirname)
16
- Time.now.strftime("%Y%m%d%H%M%S")
17
13
  end
18
14
 
19
- def copy_initializer
15
+ def copy_initializer
20
16
  @underscored_user_name = name.underscore
21
17
  template 'active_admin.rb.erb', 'config/initializers/active_admin.rb'
22
18
  end
23
19
 
24
20
  def setup_directory
25
21
  empty_directory "app/admin"
26
- template 'dashboards.rb', 'app/admin/dashboards.rb'
22
+ template 'dashboard.rb', 'app/admin/dashboard.rb'
23
+ if options[:users].present?
24
+ @user_class = name
25
+ template 'admin_user.rb.erb', "app/admin/#{name.underscore}.rb"
26
+ end
27
27
  end
28
28
 
29
29
  def setup_routes
@@ -86,6 +86,13 @@ ActiveAdmin.setup do |config|
86
86
  # Default:
87
87
  # config.logout_link_method = :get
88
88
 
89
+ # == Root
90
+ #
91
+ # Set the action to call for the root path. You can set different
92
+ # roots for each namespace.
93
+ #
94
+ # Default:
95
+ # config.root_to = 'dashboard#index'
89
96
 
90
97
  # == Admin Comments
91
98
  #
@@ -104,6 +111,13 @@ ActiveAdmin.setup do |config|
104
111
  # end
105
112
 
106
113
 
114
+ # == Batch Actions
115
+ #
116
+ # Enable and disable Batch Actions
117
+ #
118
+ config.batch_actions = true
119
+
120
+
107
121
  # == Controller Filters
108
122
  #
109
123
  # You can add before, after and around filters to all of your
@@ -120,10 +134,16 @@ ActiveAdmin.setup do |config|
120
134
  #
121
135
  # To load a stylesheet:
122
136
  # config.register_stylesheet 'my_stylesheet.css'
123
- #
137
+
124
138
  # You can provide an options hash for more control, which is passed along to stylesheet_link_tag():
125
139
  # config.register_stylesheet 'my_print_stylesheet.css', :media => :print
126
140
  #
127
141
  # To load a javascript file:
128
142
  # config.register_javascript 'my_javascript.js'
143
+
144
+
145
+ # == CSV options
146
+ #
147
+ # Set the CSV builder separator (default is ",")
148
+ # config.csv_column_separator = ','
129
149
  end
@@ -0,0 +1,20 @@
1
+ ActiveAdmin.register <%= @user_class %> do
2
+ index do
3
+ column :email
4
+ column :current_sign_in_at
5
+ column :last_sign_in_at
6
+ column :sign_in_count
7
+ default_actions
8
+ end
9
+
10
+ filter :email
11
+
12
+ form do |f|
13
+ f.inputs "Admin Details" do
14
+ f.input :email
15
+ f.input :password
16
+ f.input :password_confirmation
17
+ end
18
+ f.buttons
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ ActiveAdmin.register_page "Dashboard" do
2
+
3
+ menu :priority => 1, :label => proc{ I18n.t("active_admin.dashboard") }
4
+
5
+ content :title => proc{ I18n.t("active_admin.dashboard") } do
6
+ div :class => "blank_slate_container", :id => "dashboard_default_message" do
7
+ span :class => "blank_slate" do
8
+ span "Welcome to Active Admin. This is the default dashboard page."
9
+ small "To add dashboard sections, checkout 'app/admin/dashboards.rb'"
10
+ end
11
+ end
12
+
13
+ # Here is an example of a simple dashboard with columns and panels.
14
+ #
15
+ # columns do
16
+ # column do
17
+ # panel "Recent Posts" do
18
+ # ul do
19
+ # Post.recent(5).map do |post|
20
+ # li link_to(post.title, admin_post_path(post))
21
+ # end
22
+ # end
23
+ # end
24
+ # end
25
+
26
+ # column do
27
+ # panel "Info" do
28
+ # para "Welcome to ActiveAdmin."
29
+ # end
30
+ # end
31
+ # end
32
+ end # content
33
+ end
@@ -1,3 +1,3 @@
1
- ActiveAdmin.register <%= class_name.singularize %> do
1
+ ActiveAdmin.register <%= class_name %> do
2
2
 
3
3
  end
@@ -6,21 +6,11 @@ require 'spec_helper'
6
6
  describe "Memory Leak" do
7
7
 
8
8
  def count_instances_of(klass)
9
- count = 0
10
-
11
- ObjectSpace.each_object do |o|
12
- if o.class == klass
13
- count += 1
14
- end
15
- end
16
-
17
- count
9
+ ObjectSpace.each_object(klass) { }
18
10
  end
19
11
 
20
12
  def self.it_should_not_leak(klass)
21
13
  it "should not leak #{klass}" do
22
- pending
23
-
24
14
  GC.start
25
15
 
26
16
  count = count_instances_of(klass)
@@ -0,0 +1,50 @@
1
+ describe "AA.CheckboxToggler", ->
2
+
3
+ beforeEach ->
4
+ loadFixtures('checkboxes.html')
5
+
6
+ @collection = $("#collection")
7
+ @toggle_all = @collection.find(".toggle_all")
8
+
9
+ @checkboxes = @collection.find(":checkbox").not(@toggle_all)
10
+
11
+
12
+ new AA.CheckboxToggler({}, @collection)
13
+
14
+ describe "on init", ->
15
+ it "should raise an error if container not found", ->
16
+ expect( => new AA.CheckboxToggler({}) ).toThrow("Container element not found")
17
+
18
+ it "should raise an error if 'toggle all' checkbox not found", ->
19
+ @toggle_all.remove()
20
+ expect( => new AA.CheckboxToggler({}, @collection); ).toThrow("'toggle all' checkbox not found")
21
+
22
+ describe "'toggle all' checkbox", ->
23
+ it "should check all checkboxes when checked", ->
24
+ @toggle_all.trigger("click")
25
+ expect(@checkboxes).toHaveAttr("checked")
26
+
27
+ it "should uncheck all checkboxes when unchecked", ->
28
+ @toggle_all.trigger("click")
29
+ @toggle_all.trigger("click")
30
+ expect(@checkboxes).not.toHaveAttr("checked")
31
+
32
+ describe "individual checkboxes", ->
33
+
34
+ describe "when all checkboxes are selected and one is unchecked", ->
35
+ beforeEach ->
36
+ @collection.find(":checkbox").attr("checked", "checked")
37
+ @collection.find("#item_1").trigger("click")
38
+
39
+ it "should uncheck the 'toggle all' checkbox", ->
40
+ expect(@toggle_all).not.toHaveAttr("checked")
41
+
42
+ describe "when the last checkbox is checked", ->
43
+ beforeEach ->
44
+ @checkboxes.attr("checked", "checked")
45
+ @collection.find("#item_1").removeAttr("checked")
46
+ @collection.find("#item_1").trigger("click")
47
+
48
+ it "should check the 'toggle all' checkbox", ->
49
+ expect(@toggle_all).toHaveAttr("checked")
50
+
@@ -0,0 +1,82 @@
1
+ describe "AA.Popover", ->
2
+ $wrapper = undefined
3
+ $button = undefined
4
+ $popover = undefined
5
+ popover = undefined
6
+ beforeEach ->
7
+ $wrapper = $(inject(id: "wrapper"))
8
+ $button = $(inject(
9
+ el: "a"
10
+ id: "my_popover_button"
11
+ attrs:
12
+ href: "#my_popover"
13
+ ))
14
+ $popover = $(inject(id: "my_popover"))
15
+ $button.popover
16
+ fadeInDuration: 0
17
+ fadeOutDuration: 0
18
+
19
+ popover = $button.data("popover")
20
+
21
+ describe "opening button / link is pressed", ->
22
+ it "should open the popover", ->
23
+ $button.trigger "click"
24
+ expect($("#my_popover")).toBeVisible()
25
+
26
+ describe "when initiated", ->
27
+ it "should be hidden", ->
28
+ expect($popover).toBeHidden()
29
+
30
+ it "should be have class popover", ->
31
+ expect($popover).toHaveClass "popover"
32
+
33
+ describe "nipple", ->
34
+ it "should exist", ->
35
+ expect($popover).toContain ".popover_nipple"
36
+
37
+ describe "when open is called", ->
38
+ beforeEach ->
39
+ expect($popover).toBeHidden()
40
+ $button.popover "open"
41
+
42
+ it "should be open", ->
43
+ expect($popover).toBeVisible()
44
+
45
+ describe "when destroy is called", ->
46
+ beforeEach ->
47
+ $button.popover "destroy"
48
+
49
+ it "should not have popover stored as a data attr", ->
50
+ expect($button.data("popover")).toEqual `undefined`
51
+
52
+ it "should not be bound to any event listeners", ->
53
+ expect($button.data("events")).toEqual `undefined`
54
+
55
+ describe "when it's already open", ->
56
+ beforeEach ->
57
+ $button.popover "open"
58
+
59
+ describe "when close is called", ->
60
+ beforeEach ->
61
+ $button.popover "close"
62
+
63
+ it "should close", ->
64
+ expect($popover).toBeHidden()
65
+
66
+ describe "when user clicks outside", ->
67
+ beforeEach ->
68
+ $button.popover "open"
69
+ $("#wrapper").trigger "click"
70
+
71
+ it "should close", ->
72
+ expect($popover).toBeHidden()
73
+
74
+ describe "options", ->
75
+ describe "autoOpen set to false", ->
76
+ beforeEach ->
77
+ $button.popover "destroy"
78
+ $button.popover autoOpen: false
79
+
80
+ it "should not open when the link is clicked", ->
81
+ $button.trigger "click"
82
+ expect($("#my_popover")).toBeHidden()
@@ -0,0 +1,34 @@
1
+ describe "AA.TableCheckboxToggler", ->
2
+
3
+ beforeEach ->
4
+ loadFixtures('table_checkboxes.html');
5
+
6
+ @collection = $("#collection")
7
+ @toggle_all = @collection.find(".toggle_all")
8
+
9
+ @checkboxes = @collection.find(":checkbox").not(@toggle_all)
10
+
11
+ new AA.TableCheckboxToggler({}, @collection)
12
+
13
+ describe "'selected' class for table row", ->
14
+ it "should add the class 'selected' to rows when their checkbox is checked ", ->
15
+ checkbox = $("#item_1")
16
+ checkbox.attr("checked", "checked")
17
+ checkbox.trigger("change")
18
+
19
+ expect(checkbox.parents("tr")).toHaveAttr("class", "selected")
20
+
21
+ it "should remove the class 'selected' from rows when their checkbox is unchecked ", ->
22
+ checkbox = $("#item_1")
23
+ checkbox.trigger("change")
24
+
25
+ expect(checkbox.parents("tr")).not.toHaveAttr("class", "selected")
26
+
27
+ describe "clicking a cell", ->
28
+ it "should toggle the checkbox when a cell is clicked", ->
29
+ checkbox = $("#item_1")
30
+ row = checkbox.parents("td")
31
+ $(row).trigger("click")
32
+
33
+ expect(checkbox).toHaveAttr("checked", "checked")
34
+
@@ -0,0 +1,60 @@
1
+ (function() {
2
+
3
+ describe("AA.CheckboxToggler", function() {
4
+ beforeEach(function() {
5
+ loadFixtures('checkboxes.html');
6
+ this.collection = $("#collection");
7
+ this.toggle_all = this.collection.find(".toggle_all");
8
+ this.checkboxes = this.collection.find(":checkbox").not(this.toggle_all);
9
+ return new AA.CheckboxToggler({}, this.collection);
10
+ });
11
+ describe("on init", function() {
12
+ it("should raise an error if container not found", function() {
13
+ var _this = this;
14
+ return expect(function() {
15
+ return new AA.CheckboxToggler({});
16
+ }).toThrow("Container element not found");
17
+ });
18
+ return it("should raise an error if 'toggle all' checkbox not found", function() {
19
+ var _this = this;
20
+ this.toggle_all.remove();
21
+ return expect(function() {
22
+ return new AA.CheckboxToggler({}, _this.collection);
23
+ }).toThrow("'toggle all' checkbox not found");
24
+ });
25
+ });
26
+ describe("'toggle all' checkbox", function() {
27
+ it("should check all checkboxes when checked", function() {
28
+ this.toggle_all.trigger("click");
29
+ return expect(this.checkboxes).toHaveAttr("checked");
30
+ });
31
+ return it("should uncheck all checkboxes when unchecked", function() {
32
+ this.toggle_all.trigger("click");
33
+ this.toggle_all.trigger("click");
34
+ return expect(this.checkboxes).not.toHaveAttr("checked");
35
+ });
36
+ });
37
+ return describe("individual checkboxes", function() {
38
+ describe("when all checkboxes are selected and one is unchecked", function() {
39
+ beforeEach(function() {
40
+ this.collection.find(":checkbox").attr("checked", "checked");
41
+ return this.collection.find("#item_1").trigger("click");
42
+ });
43
+ return it("should uncheck the 'toggle all' checkbox", function() {
44
+ return expect(this.toggle_all).not.toHaveAttr("checked");
45
+ });
46
+ });
47
+ return describe("when the last checkbox is checked", function() {
48
+ beforeEach(function() {
49
+ this.checkboxes.attr("checked", "checked");
50
+ this.collection.find("#item_1").removeAttr("checked");
51
+ return this.collection.find("#item_1").trigger("click");
52
+ });
53
+ return it("should check the 'toggle all' checkbox", function() {
54
+ return expect(this.toggle_all).toHaveAttr("checked");
55
+ });
56
+ });
57
+ });
58
+ });
59
+
60
+ }).call(this);