nsm-activeadmin 0.2.2
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.
- data/.document +5 -0
- data/.gitignore +34 -0
- data/.travis.yml +4 -0
- data/.yardopts +8 -0
- data/CHANGELOG.rdoc +76 -0
- data/Gemfile +39 -0
- data/LICENSE +25 -0
- data/README.rdoc +487 -0
- data/Rakefile +27 -0
- data/activeadmin.gemspec +28 -0
- data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
- data/app/assets/images/active_admin/loading.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/base.js +12 -0
- data/app/assets/javascripts/active_admin/vendor.js +382 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +400 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +256 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +110 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +40 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +38 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +8 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +27 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +29 -0
- data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +34 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +21 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +21 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +16 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +18 -0
- data/app/views/active_admin/devise/shared/_links.erb +20 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +12 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.csv.erb +20 -0
- data/app/views/active_admin/resource/index.html.arb +1 -0
- data/app/views/active_admin/resource/new.html.arb +1 -0
- data/app/views/active_admin/resource/show.html.arb +1 -0
- data/app/views/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +35 -0
- data/cucumber.yml +2 -0
- data/docs/1-general-configuration.md +52 -0
- data/docs/2-resource-customization.md +35 -0
- data/docs/3-index-pages.md +55 -0
- data/docs/3-index-pages/index-as-block.md +16 -0
- data/docs/3-index-pages/index-as-blog.md +61 -0
- data/docs/3-index-pages/index-as-grid.md +21 -0
- data/docs/3-index-pages/index-as-table.md +74 -0
- data/docs/4-csv-format.md +14 -0
- data/docs/5-forms.md +39 -0
- data/docs/6-show-screens.md +22 -0
- data/docs/7-sidebars.md +35 -0
- data/docs/8-custom-actions.md +123 -0
- data/features/comments/commenting.feature +112 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +106 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/format_as_csv.feature +46 -0
- data/features/index/formats.feature +12 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +50 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +81 -0
- data/features/index/index_blank_slate.feature +55 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +17 -0
- data/features/menu.feature +26 -0
- data/features/new_page.feature +75 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_resources.feature +33 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +33 -0
- data/features/sidebar_sections.feature +127 -0
- data/features/specifying_actions.feature +87 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +77 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +13 -0
- data/features/step_definitions/comment_steps.rb +8 -0
- data/features/step_definitions/configuration_steps.rb +31 -0
- data/features/step_definitions/dashboard_steps.rb +11 -0
- data/features/step_definitions/factory_steps.rb +29 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +35 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/layout_steps.rb +3 -0
- data/features/step_definitions/menu_steps.rb +7 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +7 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +26 -0
- data/features/step_definitions/web_steps.rb +211 -0
- data/features/sti_resource.feature +61 -0
- data/features/support/env.rb +90 -0
- data/features/support/paths.rb +50 -0
- data/features/support/selectors.rb +45 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin.rb +74 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/application.rb +228 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/arbre/attributes.rb +20 -0
- data/lib/active_admin/arbre/class_list.rb +28 -0
- data/lib/active_admin/arbre/collection.rb +27 -0
- data/lib/active_admin/arbre/context.rb +14 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/document.rb +42 -0
- data/lib/active_admin/arbre/element.rb +151 -0
- data/lib/active_admin/arbre/html.rb +84 -0
- data/lib/active_admin/arbre/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/tag.rb +137 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +89 -0
- data/lib/active_admin/comments.rb +88 -0
- data/lib/active_admin/comments/comment.rb +21 -0
- data/lib/active_admin/comments/configuration.rb +18 -0
- data/lib/active_admin/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/comments/resource_helper.rb +17 -0
- data/lib/active_admin/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/component.rb +22 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +45 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/dashboards/dashboard_controller.rb +38 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/deprecation.rb +36 -0
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +224 -0
- data/lib/active_admin/engine.rb +4 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +109 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/helpers/settings.rb +63 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/locales/da.yml +28 -0
- data/lib/active_admin/locales/en.yml +40 -0
- data/lib/active_admin/locales/es.yml +39 -0
- data/lib/active_admin/locales/it.yml +39 -0
- data/lib/active_admin/locales/pt-BR.yml +36 -0
- data/lib/active_admin/locales/ru.yml +40 -0
- data/lib/active_admin/locales/zh_cn.yml +40 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +206 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/reloader.rb +30 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource.rb +151 -0
- data/lib/active_admin/resource/action_items.rb +88 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource/menu.rb +45 -0
- data/lib/active_admin/resource/naming.rb +36 -0
- data/lib/active_admin/resource/scopes.rb +33 -0
- data/lib/active_admin/resource/sidebars.rb +36 -0
- data/lib/active_admin/resource_controller.rb +103 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +79 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +144 -0
- data/lib/active_admin/resource_controller/filters.rb +58 -0
- data/lib/active_admin/resource_controller/form.rb +42 -0
- data/lib/active_admin/resource_controller/menu.rb +29 -0
- data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
- data/lib/active_admin/resource_controller/scoping.rb +36 -0
- data/lib/active_admin/resource_controller/sidebars.rb +18 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/sass/active_admin.scss +3 -0
- data/lib/active_admin/sass/css_loader.rb +16 -0
- data/lib/active_admin/sass/helpers.rb +40 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar_section.rb +41 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +23 -0
- data/lib/active_admin/view_helpers.rb +22 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
- data/lib/active_admin/view_helpers/display_helper.rb +38 -0
- data/lib/active_admin/view_helpers/filter_form_helper.rb +186 -0
- data/lib/active_admin/view_helpers/form_helper.rb +13 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
- data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/attributes_table.rb +66 -0
- data/lib/active_admin/views/components/blank_slate.rb +33 -0
- data/lib/active_admin/views/components/columns.rb +47 -0
- data/lib/active_admin/views/components/paginated_collection.rb +92 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +70 -0
- data/lib/active_admin/views/components/sidebar_section.rb +28 -0
- data/lib/active_admin/views/components/status_tag.rb +55 -0
- data/lib/active_admin/views/components/table_for.rb +193 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
- data/lib/active_admin/views/header_renderer.rb +53 -0
- data/lib/active_admin/views/index_as_block.rb +29 -0
- data/lib/active_admin/views/index_as_blog.rb +129 -0
- data/lib/active_admin/views/index_as_grid.rb +70 -0
- data/lib/active_admin/views/index_as_table.rb +148 -0
- data/lib/active_admin/views/pages/base.rb +155 -0
- data/lib/active_admin/views/pages/dashboard.rb +62 -0
- data/lib/active_admin/views/pages/edit.rb +28 -0
- data/lib/active_admin/views/pages/index.rb +74 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/new.rb +28 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +58 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +21 -0
- data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +427 -0
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +6 -0
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +1 -0
- data/lib/generators/active_admin/assets/templates/dashboards.rb +36 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +44 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +93 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
- data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/script/local +44 -0
- data/script/use_rails +45 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/integration/default_namespace.rb +77 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/stylesheets_spec.rb +41 -0
- data/spec/spec_helper.rb +157 -0
- data/spec/support/detect_rails_version.rb +11 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +33 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +88 -0
- data/spec/unit/application_spec.rb +78 -0
- data/spec/unit/arbre/html/context_spec.rb +22 -0
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +224 -0
- data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
- data/spec/unit/arbre/html/tag_spec.rb +63 -0
- data/spec/unit/arbre/html_spec.rb +210 -0
- data/spec/unit/asset_registration_spec.rb +37 -0
- data/spec/unit/auto_link_spec.rb +39 -0
- data/spec/unit/belongs_to_spec.rb +45 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +57 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/controller_filters_spec.rb +34 -0
- data/spec/unit/csv_builder_spec.rb +83 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +56 -0
- data/spec/unit/dashboards_spec.rb +59 -0
- data/spec/unit/display_name_spec.rb +29 -0
- data/spec/unit/event_spec.rb +41 -0
- data/spec/unit/filter_form_builder_spec.rb +182 -0
- data/spec/unit/form_builder_spec.rb +239 -0
- data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +214 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/rails_spec.rb +43 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/reloader_spec.rb +28 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource/action_items_spec.rb +62 -0
- data/spec/unit/resource/menu_spec.rb +80 -0
- data/spec/unit/resource/naming_spec.rb +56 -0
- data/spec/unit/resource/scopes_spec.rb +30 -0
- data/spec/unit/resource/sidebars_spec.rb +50 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +152 -0
- data/spec/unit/resource_spec.rb +260 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/sass/helpers_spec.rb +47 -0
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +85 -0
- data/spec/unit/view_factory_spec.rb +19 -0
- data/spec/unit/views/components/attributes_table_spec.rb +100 -0
- data/spec/unit/views/components/blank_slate_spec.rb +31 -0
- data/spec/unit/views/components/columns_spec.rb +75 -0
- data/spec/unit/views/components/panel_spec.rb +31 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/views/components/status_tag_spec.rb +81 -0
- data/spec/unit/views/components/table_for_spec.rb +130 -0
- data/spec/unit/views/pages/layout_spec.rb +22 -0
- data/tasks/docs.rake +39 -0
- data/tasks/test.rake +49 -0
- data/tasks/yard.rake +6 -0
- metadata +510 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "display names" do
|
|
4
|
+
|
|
5
|
+
include ActiveAdmin::ViewHelpers
|
|
6
|
+
|
|
7
|
+
[:display_name, :full_name, :name, :username, :login, :title, :email, :to_s].each do |m|
|
|
8
|
+
it "should return #{m} if defined" do
|
|
9
|
+
r = Class.new do
|
|
10
|
+
define_method m do
|
|
11
|
+
m.to_s
|
|
12
|
+
end
|
|
13
|
+
end.new
|
|
14
|
+
display_name(r).should == m.to_s
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should memeoize the result for the class" do
|
|
19
|
+
c = Class.new do
|
|
20
|
+
def name
|
|
21
|
+
"My Name"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
display_name(c.new).should == "My Name"
|
|
25
|
+
ActiveAdmin.application.should_not_receive(:display_name_methods)
|
|
26
|
+
display_name(c.new).should == "My Name"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'active_admin/event'
|
|
3
|
+
|
|
4
|
+
describe ActiveAdmin::EventDispatcher do
|
|
5
|
+
|
|
6
|
+
let(:test_event){ 'active_admin.test_event' }
|
|
7
|
+
let(:dispatcher){ ActiveAdmin::EventDispatcher.new }
|
|
8
|
+
|
|
9
|
+
it "should add a subscriber for an event" do
|
|
10
|
+
dispatcher.subscribers(test_event).size.should == 0
|
|
11
|
+
dispatcher.subscribe(test_event){ true }
|
|
12
|
+
dispatcher.subscribers(test_event).size.should == 1
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should call the dispatch block with no arguments" do
|
|
16
|
+
dispatcher.subscribe(test_event){ raise StandardError, "From Event Handler" }
|
|
17
|
+
lambda {
|
|
18
|
+
dispatcher.dispatch(test_event)
|
|
19
|
+
}.should raise_error(StandardError, "From Event Handler")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should call the dispatch block with one argument" do
|
|
23
|
+
arg = nil
|
|
24
|
+
dispatcher.subscribe(test_event){|passed_in| arg = passed_in }
|
|
25
|
+
dispatcher.dispatch(test_event, "My Arg")
|
|
26
|
+
arg.should == "My Arg"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should clear all subscribers" do
|
|
30
|
+
dispatcher.subscribe(test_event){ false }
|
|
31
|
+
dispatcher.subscribe(test_event + "_2"){ false }
|
|
32
|
+
dispatcher.clear_all_subscribers!
|
|
33
|
+
dispatcher.subscribers(test_event).size.should == 0
|
|
34
|
+
dispatcher.subscribers(test_event + "_2").size.should == 0
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should have a dispatcher available from ActiveAdmin::Event" do
|
|
38
|
+
ActiveAdmin::Event.should be_an_instance_of(ActiveAdmin::EventDispatcher)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
describe ActiveAdmin::ViewHelpers::FilterFormHelper do
|
|
5
|
+
include Arbre::HTML
|
|
6
|
+
let(:assigns){ {} }
|
|
7
|
+
|
|
8
|
+
# Setup an ActionView::Base object which can be used for
|
|
9
|
+
# generating the form for.
|
|
10
|
+
let(:helpers) do
|
|
11
|
+
view = action_view
|
|
12
|
+
def view.collection_path
|
|
13
|
+
"/posts"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def view.protect_against_forgery?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
view
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def filter(name, options = {})
|
|
24
|
+
search = Post.search
|
|
25
|
+
active_admin_filters_form_for(search, [options.merge(:attribute => name)])
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "the form in general" do
|
|
29
|
+
let(:body) { filter :title }
|
|
30
|
+
|
|
31
|
+
it "should generate a form which submits via get" do
|
|
32
|
+
body.should have_tag("form", :attributes => { :method => 'get', :class => 'filter_form' })
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should generate a filter button" do
|
|
36
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
|
37
|
+
:value => "Filter" })
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should only generate the form once" do
|
|
41
|
+
body.scan(/q\[title_contains\]/).size.should == 1
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should generate a clear filters link" do
|
|
45
|
+
body.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "string attribute" do
|
|
50
|
+
let(:body) { filter :title }
|
|
51
|
+
|
|
52
|
+
it "should generate a search field for a string attribute" do
|
|
53
|
+
body.should have_tag("input", :attributes => { :name => "q[title_contains]"})
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should label a text field with search" do
|
|
57
|
+
body.should have_tag('label', 'Search Title')
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe "text attribute" do
|
|
62
|
+
let(:body) { filter :body }
|
|
63
|
+
|
|
64
|
+
it "should generate a search field for a text attribute" do
|
|
65
|
+
body.should have_tag("input", :attributes => { :name => "q[body_contains]"})
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "should label a text field with search" do
|
|
69
|
+
body.should have_tag('label', 'Search Body')
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe "datetime attribute" do
|
|
74
|
+
let(:body) { filter :created_at }
|
|
75
|
+
|
|
76
|
+
it "should generate a date greater than" do
|
|
77
|
+
body.should have_tag("input", :attributes => { :name => "q[created_at_gte]", :class => "datepicker"})
|
|
78
|
+
end
|
|
79
|
+
it "should generate a seperator" do
|
|
80
|
+
body.should have_tag("span", :attributes => { :class => "seperator"})
|
|
81
|
+
end
|
|
82
|
+
it "should generate a date less than" do
|
|
83
|
+
body.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "integer attribute" do
|
|
88
|
+
let(:body) { filter :id }
|
|
89
|
+
|
|
90
|
+
it "should generate a select option for equal to" do
|
|
91
|
+
body.should have_tag("option", "Equal To", :attributes => { :value => 'id_eq' })
|
|
92
|
+
end
|
|
93
|
+
it "should generate a select option for greater than" do
|
|
94
|
+
body.should have_tag("option", "Greater Than")
|
|
95
|
+
end
|
|
96
|
+
it "should generate a select option for less than" do
|
|
97
|
+
body.should have_tag("option", "Less Than")
|
|
98
|
+
end
|
|
99
|
+
it "should generate a text field for input" do
|
|
100
|
+
body.should have_tag("input", :attributes => {
|
|
101
|
+
:name => /q\[(id_eq|id_equals)\]/ })
|
|
102
|
+
end
|
|
103
|
+
it "should select the option which is currently being filtered"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
describe "belong to" do
|
|
107
|
+
before do
|
|
108
|
+
@john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
|
|
109
|
+
@jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context "when given as the _id attribute name" do
|
|
113
|
+
let(:body) { filter :author_id }
|
|
114
|
+
|
|
115
|
+
it "should not render as an integer" do
|
|
116
|
+
body.should_not have_tag("input", :attributes => {
|
|
117
|
+
:name => "q[author_id_eq]"})
|
|
118
|
+
end
|
|
119
|
+
it "should render as belongs to select" do
|
|
120
|
+
body.should have_tag("select", :attributes => {
|
|
121
|
+
:name => "q[author_id_eq]"})
|
|
122
|
+
body.should have_tag("option", "jane_doe", :attributes => {
|
|
123
|
+
:value => @jane.id })
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context "when given as the name of the relationship" do
|
|
128
|
+
let(:body) { filter :author }
|
|
129
|
+
|
|
130
|
+
it "should generate a select" do
|
|
131
|
+
body.should have_tag("select", :attributes => {
|
|
132
|
+
:name => "q[author_id_eq]"})
|
|
133
|
+
end
|
|
134
|
+
it "should set the default text to 'Any'" do
|
|
135
|
+
body.should have_tag("option", "Any", :attributes => {
|
|
136
|
+
:value => "" })
|
|
137
|
+
end
|
|
138
|
+
it "should create an option for each related object" do
|
|
139
|
+
body.should have_tag("option", "john_doe", :attributes => {
|
|
140
|
+
:value => @john.id })
|
|
141
|
+
body.should have_tag("option", "jane_doe", :attributes => {
|
|
142
|
+
:value => @jane.id })
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
context "with a proc" do
|
|
146
|
+
let :body do
|
|
147
|
+
filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it "should use call the proc as the collection" do
|
|
151
|
+
body.should have_tag("option", "Title One")
|
|
152
|
+
body.should have_tag("option", "Title Two")
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
context "as check boxes" do
|
|
158
|
+
let(:body) { filter :author, :as => :check_boxes }
|
|
159
|
+
|
|
160
|
+
it "should create a check box for each related object" do
|
|
161
|
+
body.should have_tag("input", :attributes => {
|
|
162
|
+
:name => "q[author_id_in][]",
|
|
163
|
+
:type => "checkbox",
|
|
164
|
+
:value => @john.id })
|
|
165
|
+
body.should have_tag("input", :attributes => {
|
|
166
|
+
:name => "q[author_id_in][]",
|
|
167
|
+
:type => "checkbox",
|
|
168
|
+
:value => @jane.id })
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
context "when polymorphic relationship" do
|
|
173
|
+
let(:body) do
|
|
174
|
+
search = ActiveAdmin::Comment.search
|
|
175
|
+
active_admin_filters_form_for(search, [{ :attribute => :resource}])
|
|
176
|
+
end
|
|
177
|
+
it "should not generate any field" do
|
|
178
|
+
body.should have_tag("form", :attributes => { :method => 'get' })
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end # belongs to
|
|
182
|
+
end
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::FormBuilder do
|
|
4
|
+
include Arbre::HTML
|
|
5
|
+
let(:assigns){ {} }
|
|
6
|
+
|
|
7
|
+
# Setup an ActionView::Base object which can be used for
|
|
8
|
+
# generating the form for.
|
|
9
|
+
let(:helpers) do
|
|
10
|
+
view = action_view
|
|
11
|
+
def view.posts_path
|
|
12
|
+
"/posts"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def view.protect_against_forgery?
|
|
16
|
+
false
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def view.url_for(*args)
|
|
20
|
+
if args.first == {:action => "index"}
|
|
21
|
+
posts_path
|
|
22
|
+
else
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
view
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def build_form(options = {}, &block)
|
|
31
|
+
options.merge!({:url => posts_path})
|
|
32
|
+
active_admin_form_for Post.new, options, &block
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "in general" do
|
|
36
|
+
let :body do
|
|
37
|
+
build_form do |f|
|
|
38
|
+
f.inputs do
|
|
39
|
+
f.input :title
|
|
40
|
+
f.input :body
|
|
41
|
+
end
|
|
42
|
+
f.buttons do
|
|
43
|
+
f.commit_button "Submit Me"
|
|
44
|
+
f.commit_button "Another Button"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should generate a text input" do
|
|
50
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
51
|
+
:name => "post[title]" })
|
|
52
|
+
end
|
|
53
|
+
it "should generate a textarea" do
|
|
54
|
+
body.should have_tag("textarea", :attributes => { :name => "post[body]" })
|
|
55
|
+
end
|
|
56
|
+
it "should only generate the form once" do
|
|
57
|
+
body.scan(/Title/).size.should == 1
|
|
58
|
+
end
|
|
59
|
+
it "should generate buttons" do
|
|
60
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
|
61
|
+
:value => "Submit Me" })
|
|
62
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
|
63
|
+
:value => "Another Button" })
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe "passing in options" do
|
|
68
|
+
let :body do
|
|
69
|
+
build_form :html => { :multipart => true } do |f|
|
|
70
|
+
f.inputs :title
|
|
71
|
+
f.buttons
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
it "should pass the options on to the form" do
|
|
75
|
+
body.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
context "with buttons" do
|
|
80
|
+
it "should generate the form once" do
|
|
81
|
+
body = build_form do |f|
|
|
82
|
+
f.inputs do
|
|
83
|
+
f.input :title
|
|
84
|
+
end
|
|
85
|
+
f.buttons
|
|
86
|
+
end
|
|
87
|
+
body.scan(/id=\"post_title\"/).size.should == 1
|
|
88
|
+
end
|
|
89
|
+
it "should generate one button and a cancel link" do
|
|
90
|
+
body = build_form do |f|
|
|
91
|
+
f.buttons
|
|
92
|
+
end
|
|
93
|
+
body.scan(/type=\"submit\"/).size.should == 1
|
|
94
|
+
body.scan(/class=\"cancel\"/).size.should == 1
|
|
95
|
+
end
|
|
96
|
+
it "should generate multiple buttons" do
|
|
97
|
+
body = build_form do |f|
|
|
98
|
+
f.buttons do
|
|
99
|
+
f.commit_button "Create & Continue"
|
|
100
|
+
f.commit_button "Create & Edit"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
body.scan(/type=\"submit\"/).size.should == 2
|
|
104
|
+
body.scan(/class=\"cancel\"/).size.should == 0
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
context "without passing a block to inputs" do
|
|
110
|
+
let :body do
|
|
111
|
+
build_form do |f|
|
|
112
|
+
f.inputs :title, :body
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
it "should have a title input" do
|
|
116
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
117
|
+
:name => "post[title]" })
|
|
118
|
+
end
|
|
119
|
+
it "should have a body textarea" do
|
|
120
|
+
body.should have_tag("textarea", :attributes => { :name => "post[body]" })
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context "with semantic fields for" do
|
|
125
|
+
let :body do
|
|
126
|
+
build_form do |f|
|
|
127
|
+
f.inputs do
|
|
128
|
+
f.input :title
|
|
129
|
+
f.input :body
|
|
130
|
+
end
|
|
131
|
+
f.instance_eval do
|
|
132
|
+
@object.author = User.new
|
|
133
|
+
end
|
|
134
|
+
f.semantic_fields_for :author do |author|
|
|
135
|
+
author.inputs :first_name, :last_name
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
it "should generate a nested text input once" do
|
|
140
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
context "with collection inputs" do
|
|
145
|
+
before do
|
|
146
|
+
User.create :first_name => "John", :last_name => "Doe"
|
|
147
|
+
User.create :first_name => "Jane", :last_name => "Doe"
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
describe "as select" do
|
|
151
|
+
let :body do
|
|
152
|
+
build_form do |f|
|
|
153
|
+
f.input :author
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
it "should create 2 options" do
|
|
157
|
+
body.scan(/\<option/).size.should == 3
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
describe "as radio buttons" do
|
|
162
|
+
let :body do
|
|
163
|
+
build_form do |f|
|
|
164
|
+
f.input :author, :as => :radio
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
it "should create 2 radio buttons" do
|
|
168
|
+
body.scan(/type=\"radio\"/).size.should == 2
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
context "with inputs 'for'" do
|
|
174
|
+
let :body do
|
|
175
|
+
build_form do |f|
|
|
176
|
+
f.inputs do
|
|
177
|
+
f.input :title
|
|
178
|
+
f.input :body
|
|
179
|
+
end
|
|
180
|
+
f.instance_eval do
|
|
181
|
+
@object.author = User.new
|
|
182
|
+
end
|
|
183
|
+
f.inputs :name => 'Author', :for => :author do |author|
|
|
184
|
+
author.inputs :first_name, :last_name
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
it "should generate a nested text input once" do
|
|
189
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
|
190
|
+
end
|
|
191
|
+
it "should add an author first name field" do
|
|
192
|
+
body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
context "with wrapper html" do
|
|
197
|
+
it "should set a class" do
|
|
198
|
+
body = build_form do |f|
|
|
199
|
+
f.input :title, :wrapper_html => { :class => "important" }
|
|
200
|
+
end
|
|
201
|
+
body.should have_tag("li", :attributes => {:class => "string optional important"})
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
{
|
|
207
|
+
"input :title, :as => :string" => /id\=\"post_title\"/,
|
|
208
|
+
"input :title, :as => :text" => /id\=\"post_title\"/,
|
|
209
|
+
"input :created_at, :as => :time" => /id\=\"post_created_at_2i\"/,
|
|
210
|
+
"input :created_at, :as => :datetime" => /id\=\"post_created_at_2i\"/,
|
|
211
|
+
"input :created_at, :as => :date" => /id\=\"post_created_at_2i\"/,
|
|
212
|
+
}.each do |source, regex|
|
|
213
|
+
it "should properly buffer #{source}" do
|
|
214
|
+
body = build_form do |f|
|
|
215
|
+
f.inputs do
|
|
216
|
+
f.instance_eval(source)
|
|
217
|
+
f.instance_eval(source)
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
body.scan(regex).size.should == 2
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
describe "datepicker input" do
|
|
225
|
+
let :body do
|
|
226
|
+
build_form do |f|
|
|
227
|
+
f.inputs do
|
|
228
|
+
f.input :created_at, :as => :datepicker
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
it "should generate a text input with the class of datepicker" do
|
|
233
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
234
|
+
:class => "datepicker",
|
|
235
|
+
:name => "post[created_at]" })
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
end
|