saulolso-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 +32 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.rdoc +76 -0
- data/Gemfile +26 -0
- data/LICENSE +25 -0
- data/README.rdoc +450 -0
- data/Rakefile +100 -0
- data/activeadmin.gemspec +28 -0
- data/cucumber.yml +2 -0
- data/features/comments/commenting.feature +99 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +77 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/format_as_csv.feature +45 -0
- data/features/index/formats.feature +10 -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 +79 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +23 -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 +60 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +67 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +15 -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 +28 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +34 -0
- data/features/step_definitions/index_scope_steps.rb +20 -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 +11 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +20 -0
- data/features/step_definitions/web_steps.rb +219 -0
- data/features/sti_resource.feature +49 -0
- data/features/support/env.rb +92 -0
- data/features/support/paths.rb +48 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +37 -0
- data/lib/active_admin/application.rb +204 -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 +8 -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/arbre.rb +23 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +87 -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/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments.rb +88 -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/dashboard_controller.rb +47 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +215 -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/iconic/icons.rb +142 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/locales/da.yml +26 -0
- data/lib/active_admin/locales/en.yml +34 -0
- data/lib/active_admin/locales/es.yml +34 -0
- data/lib/active_admin/locales/pt.yml +34 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +198 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource.rb +229 -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 +38 -0
- data/lib/active_admin/resource_controller.rb +119 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +43 -0
- data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
- data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
- data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
- data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
- data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
- data/lib/active_admin/stylesheets/active_admin.scss +429 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +21 -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 +185 -0
- data/lib/active_admin/view_helpers/form_helper.rb +12 -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/table_helper.rb +12 -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/view_helpers.rb +23 -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/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 +30 -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 +37 -0
- data/lib/active_admin/views/index_as_block.rb +24 -0
- data/lib/active_admin/views/index_as_blog.rb +89 -0
- data/lib/active_admin/views/index_as_grid.rb +49 -0
- data/lib/active_admin/views/index_as_table.rb +75 -0
- data/lib/active_admin/views/pages/base.rb +144 -0
- data/lib/active_admin/views/pages/dashboard.rb +59 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +66 -0
- data/lib/active_admin/views/pages/new.rb +27 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +58 -0
- data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
- data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
- data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
- data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
- data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +71 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
- data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/orderable.png +0 -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/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/spec_helper.rb +156 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +32 -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/action_items_spec.rb +27 -0
- data/spec/unit/application_spec.rb +67 -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/components/attributes_table_spec.rb +100 -0
- data/spec/unit/components/columns_spec.rb +75 -0
- data/spec/unit/components/panel_spec.rb +31 -0
- data/spec/unit/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/components/status_tag_spec.rb +81 -0
- data/spec/unit/components/table_for_spec.rb +130 -0
- data/spec/unit/controller_filters_spec.rb +27 -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 +179 -0
- data/spec/unit/form_builder_spec.rb +238 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +203 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +147 -0
- data/spec/unit/resource_spec.rb +290 -0
- data/spec/unit/routing_spec.rb +88 -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 +16 -0
- metadata +482 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Views::TableFor do
|
|
4
|
+
describe "creating with the dsl" do
|
|
5
|
+
include Arbre::HTML
|
|
6
|
+
|
|
7
|
+
let(:assigns){ {} }
|
|
8
|
+
let(:helpers){ mock_action_view }
|
|
9
|
+
|
|
10
|
+
let(:collection) do
|
|
11
|
+
[Post.new(:title => "First Post"), Post.new(:title => "Second Post"), Post.new(:title => "Third Post")]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
context "when creating a column with a symbol" do
|
|
15
|
+
let(:table) do
|
|
16
|
+
table_for(collection) do
|
|
17
|
+
column :title
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should create a table header based on the symbol" do
|
|
22
|
+
table.find_by_tag("th").first.content.should == "Title"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should create a table row for each element in the collection" do
|
|
26
|
+
table.find_by_tag("tr").size.should == 4 # 1 for head, 3 for rows
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
["First Post", "Second Post", "Third Post"].each_with_index do |content, index|
|
|
30
|
+
it "should create a cell with #{content}" do
|
|
31
|
+
table.find_by_tag("td")[index].content.should == content
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "when creating many columns with symbols" do
|
|
37
|
+
let(:table) do
|
|
38
|
+
table_for(collection) do
|
|
39
|
+
column :title
|
|
40
|
+
column :created_at
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should create a table header based on the symbol" do
|
|
45
|
+
table.find_by_tag("th").first.content.should == "Title"
|
|
46
|
+
table.find_by_tag("th").last.content.should == "Created At"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should create a table row for each element in the collection" do
|
|
50
|
+
table.find_by_tag("tr").size.should == 4 # 1 for head, 3 for rows
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should create a cell for each column" do
|
|
54
|
+
table.find_by_tag("td").size.should == 6
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "when creating a column with block content" do
|
|
59
|
+
let(:table) do
|
|
60
|
+
table_for(collection) do
|
|
61
|
+
column :title do |post|
|
|
62
|
+
span(post.title)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
[ "<span>First Post</span>",
|
|
68
|
+
"<span>Second Post</span>",
|
|
69
|
+
"<span>Third Post</span>" ].each_with_index do |content, index|
|
|
70
|
+
it "should create a cell with #{content}" do
|
|
71
|
+
table.find_by_tag("td")[index].content.strip.should == content
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context "when creating a column with multiple block content" do
|
|
77
|
+
let(:table) do
|
|
78
|
+
table_for(collection) do
|
|
79
|
+
column :title do |post|
|
|
80
|
+
span(post.title)
|
|
81
|
+
span(post.title)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
3.times do |index|
|
|
87
|
+
it "should create a cell with multiple elements in row #{index}" do
|
|
88
|
+
table.find_by_tag("td")[index].find_by_tag("span").size.should == 2
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
describe "column sorting" do
|
|
95
|
+
|
|
96
|
+
def build_column(*args, &block)
|
|
97
|
+
ActiveAdmin::Views::TableFor::Column.new(*args, &block)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
subject { table_column }
|
|
101
|
+
|
|
102
|
+
context "when default" do
|
|
103
|
+
let(:table_column){ build_column(:username) }
|
|
104
|
+
it { should be_sortable }
|
|
105
|
+
its(:sort_key){ should == "username" }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "when a block given with no sort key" do
|
|
109
|
+
let(:table_column){ build_column("Username"){ } }
|
|
110
|
+
it { should_not be_sortable }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context "when a block given with a sort key" do
|
|
114
|
+
let(:table_column){ build_column("Username", :sortable => :username){ } }
|
|
115
|
+
it { should be_sortable }
|
|
116
|
+
its(:sort_key){ should == "username" }
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context "when :sortable => false with a symbol" do
|
|
120
|
+
let(:table_column){ build_column(:username, :sortable => false) }
|
|
121
|
+
it { should_not be_sortable }
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context "when :sortable => false with a symbol and string" do
|
|
125
|
+
let(:table_column){ build_column("Username", :username, :sortable => false) }
|
|
126
|
+
it { should_not be_sortable }
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin, "filters" do
|
|
4
|
+
let(:application){ ActiveAdmin::Application.new }
|
|
5
|
+
|
|
6
|
+
describe "before filters" do
|
|
7
|
+
it "should add a new before filter to ActiveAdmin::ResourceController" do
|
|
8
|
+
ActiveAdmin::ResourceController.should_receive(:before_filter).and_return(true)
|
|
9
|
+
application.before_filter :my_filter, :only => :show
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "after filters" do
|
|
14
|
+
it "should add a new after filter to ActiveAdmin::ResourceController" do
|
|
15
|
+
ActiveAdmin::ResourceController.should_receive(:after_filter).and_return(true)
|
|
16
|
+
application.after_filter :my_filter, :only => :show
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "around filters" do
|
|
21
|
+
it "should add a new around filter to ActiveAdmin::ResourceController" do
|
|
22
|
+
ActiveAdmin::ResourceController.should_receive(:around_filter).and_return(true)
|
|
23
|
+
application.around_filter :my_filter, :only => :show
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::CSVBuilder do
|
|
4
|
+
|
|
5
|
+
describe '.default_for_resource using Post' do
|
|
6
|
+
let(:csv_builder) { ActiveAdmin::CSVBuilder.default_for_resource(Post) }
|
|
7
|
+
|
|
8
|
+
it "should return a default csv_builder for Post" do
|
|
9
|
+
csv_builder.should be_a(ActiveAdmin::CSVBuilder)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
specify "the first column should be Id" do
|
|
13
|
+
csv_builder.columns.first.name.should == 'Id'
|
|
14
|
+
csv_builder.columns.first.data.should == :id
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
specify "the following columns should be content_column" do
|
|
18
|
+
csv_builder.columns[1..-1].each_with_index do |column, index|
|
|
19
|
+
column.name.should == Post.content_columns[index].name.titleize
|
|
20
|
+
column.data.should == Post.content_columns[index].name.to_sym
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context 'when empty' do
|
|
26
|
+
let(:builder){ ActiveAdmin::CSVBuilder.new }
|
|
27
|
+
|
|
28
|
+
it "should have no columns" do
|
|
29
|
+
builder.columns.should == []
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "with a symbol column (:title)" do
|
|
34
|
+
let(:builder) do
|
|
35
|
+
ActiveAdmin::CSVBuilder.new do
|
|
36
|
+
column :title
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should have one colum" do
|
|
41
|
+
builder.columns.size.should == 1
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe "the column" do
|
|
45
|
+
let(:column){ builder.columns.first }
|
|
46
|
+
|
|
47
|
+
it "should have a name of 'Title'" do
|
|
48
|
+
column.name.should == "Title"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should have the data :title" do
|
|
52
|
+
column.data.should == :title
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context "with a block and title" do
|
|
58
|
+
let(:builder) do
|
|
59
|
+
ActiveAdmin::CSVBuilder.new do
|
|
60
|
+
column "My title" do
|
|
61
|
+
# nothing
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should have one colum" do
|
|
67
|
+
builder.columns.size.should == 1
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe "the column" do
|
|
71
|
+
let(:column){ builder.columns.first }
|
|
72
|
+
|
|
73
|
+
it "should have a name of 'My title'" do
|
|
74
|
+
column.name.should == "My title"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should have the data :title" do
|
|
78
|
+
column.data.should be_an_instance_of(Proc)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module Admin
|
|
5
|
+
class DashboardController < ActiveAdmin::Dashboards::DashboardController
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
class DashboardController < ActiveAdmin::Dashboards::DashboardController; end
|
|
9
|
+
|
|
10
|
+
describe ActiveAdmin::Dashboards::DashboardController do
|
|
11
|
+
|
|
12
|
+
describe "getting the namespace name" do
|
|
13
|
+
subject{ controller.send :namespace }
|
|
14
|
+
|
|
15
|
+
context "when admin namespace" do
|
|
16
|
+
let(:controller){ Admin::DashboardController.new }
|
|
17
|
+
it { should == :admin }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "when root namespace" do
|
|
21
|
+
let(:controller){ DashboardController.new }
|
|
22
|
+
it { should == :root }
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Dashboards::Section do
|
|
4
|
+
|
|
5
|
+
def section(options = {})
|
|
6
|
+
name = options.delete(:name) || "Recent Posts"
|
|
7
|
+
ActiveAdmin::Dashboards::Section.new(:admin, name, options){ }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe "accessors" do
|
|
11
|
+
it "should have a namespace" do
|
|
12
|
+
section.namespace.should == :admin
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should have a block" do
|
|
16
|
+
section.block.class.should == Proc
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should have a name" do
|
|
20
|
+
section.name.should == 'Recent Posts'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "priority" do
|
|
25
|
+
context "when not set" do
|
|
26
|
+
subject{ section.priority }
|
|
27
|
+
it { should == ActiveAdmin::Dashboards::Section::DEFAULT_PRIORITY }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "when set" do
|
|
31
|
+
subject{ section(:priority => 1).priority }
|
|
32
|
+
it { should == 1 }
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "icon" do
|
|
37
|
+
it "should set the icon" do
|
|
38
|
+
s = section(:icon => :my_icon)
|
|
39
|
+
s.icon.should == :my_icon
|
|
40
|
+
end
|
|
41
|
+
it "should be nil by default" do
|
|
42
|
+
section.icon.should be_nil
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "sorting sections" do
|
|
47
|
+
it "should sort by priority then alpha" do
|
|
48
|
+
s1 = section :name => "Woot"
|
|
49
|
+
s2 = section :name => :Alpha
|
|
50
|
+
s3 = section :name => "Zulu", :priority => 1
|
|
51
|
+
s4 = section :name => "Beta", :priority => 100
|
|
52
|
+
[s1,s2,s3,s4].sort.should == [s3, s2, s1, s4]
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Dashboards do
|
|
4
|
+
|
|
5
|
+
after(:each) do
|
|
6
|
+
ActiveAdmin::Dashboards.clear_all_sections!
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "adding sections" do
|
|
10
|
+
before do
|
|
11
|
+
ActiveAdmin::Dashboards.clear_all_sections!
|
|
12
|
+
ActiveAdmin::Dashboards.add_section('Recent Posts')
|
|
13
|
+
end
|
|
14
|
+
it "should add a new section namespaced" do
|
|
15
|
+
ActiveAdmin::Dashboards.sections[:admin].first.should be_an_instance_of(ActiveAdmin::Dashboards::Section)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "adding sections using the build syntax" do
|
|
20
|
+
before do
|
|
21
|
+
ActiveAdmin::Dashboards.clear_all_sections!
|
|
22
|
+
ActiveAdmin::Dashboards.build do
|
|
23
|
+
section "Recent Posts" do
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should add a new section" do
|
|
29
|
+
ActiveAdmin::Dashboards.sections[:admin].first.should be_an_instance_of(ActiveAdmin::Dashboards::Section)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe "clearing all sections" do
|
|
34
|
+
before do
|
|
35
|
+
ActiveAdmin::Dashboards.add_section('Recent Posts')
|
|
36
|
+
end
|
|
37
|
+
it "should clear all sections" do
|
|
38
|
+
ActiveAdmin::Dashboards.clear_all_sections!
|
|
39
|
+
ActiveAdmin::Dashboards.sections.keys.should be_empty
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "finding namespaced sections" do
|
|
44
|
+
context "when the namespace exists" do
|
|
45
|
+
before do
|
|
46
|
+
ActiveAdmin::Dashboards.add_section('Recent Posts')
|
|
47
|
+
end
|
|
48
|
+
it "should return an array of sections" do
|
|
49
|
+
ActiveAdmin::Dashboards.sections_for_namespace(:admin).should_not be_empty
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "when the namespace does not exists" do
|
|
54
|
+
it "should return an empty array" do
|
|
55
|
+
ActiveAdmin::Dashboards.sections_for_namespace(:not_a_namespace).should be_empty
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -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,179 @@
|
|
|
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' })
|
|
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 date less than" do
|
|
80
|
+
body.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
describe "integer attribute" do
|
|
85
|
+
let(:body) { filter :id }
|
|
86
|
+
|
|
87
|
+
it "should generate a select option for equal to" do
|
|
88
|
+
body.should have_tag("option", "Equal To", :attributes => { :value => 'id_eq' })
|
|
89
|
+
end
|
|
90
|
+
it "should generate a select option for greater than" do
|
|
91
|
+
body.should have_tag("option", "Greater Than")
|
|
92
|
+
end
|
|
93
|
+
it "should generate a select option for less than" do
|
|
94
|
+
body.should have_tag("option", "Less Than")
|
|
95
|
+
end
|
|
96
|
+
it "should generate a text field for input" do
|
|
97
|
+
body.should have_tag("input", :attributes => {
|
|
98
|
+
:name => /q\[(id_eq|id_equals)\]/ })
|
|
99
|
+
end
|
|
100
|
+
it "should select the option which is currently being filtered"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
describe "belong to" do
|
|
104
|
+
before do
|
|
105
|
+
@john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
|
|
106
|
+
@jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
context "when given as the _id attribute name" do
|
|
110
|
+
let(:body) { filter :author_id }
|
|
111
|
+
|
|
112
|
+
it "should not render as an integer" do
|
|
113
|
+
body.should_not have_tag("input", :attributes => {
|
|
114
|
+
:name => "q[author_id_eq]"})
|
|
115
|
+
end
|
|
116
|
+
it "should render as belongs to select" do
|
|
117
|
+
body.should have_tag("select", :attributes => {
|
|
118
|
+
:name => "q[author_id_eq]"})
|
|
119
|
+
body.should have_tag("option", "jane_doe", :attributes => {
|
|
120
|
+
:value => @jane.id })
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context "when given as the name of the relationship" do
|
|
125
|
+
let(:body) { filter :author }
|
|
126
|
+
|
|
127
|
+
it "should generate a select" do
|
|
128
|
+
body.should have_tag("select", :attributes => {
|
|
129
|
+
:name => "q[author_id_eq]"})
|
|
130
|
+
end
|
|
131
|
+
it "should set the default text to 'Any'" do
|
|
132
|
+
body.should have_tag("option", "Any", :attributes => {
|
|
133
|
+
:value => "" })
|
|
134
|
+
end
|
|
135
|
+
it "should create an option for each related object" do
|
|
136
|
+
body.should have_tag("option", "john_doe", :attributes => {
|
|
137
|
+
:value => @john.id })
|
|
138
|
+
body.should have_tag("option", "jane_doe", :attributes => {
|
|
139
|
+
:value => @jane.id })
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
context "with a proc" do
|
|
143
|
+
let :body do
|
|
144
|
+
filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "should use call the proc as the collection" do
|
|
148
|
+
body.should have_tag("option", "Title One")
|
|
149
|
+
body.should have_tag("option", "Title Two")
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
context "as check boxes" do
|
|
155
|
+
let(:body) { filter :author, :as => :check_boxes }
|
|
156
|
+
|
|
157
|
+
it "should create a check box for each related object" do
|
|
158
|
+
body.should have_tag("input", :attributes => {
|
|
159
|
+
:name => "q[author_id_in][]",
|
|
160
|
+
:type => "checkbox",
|
|
161
|
+
:value => @john.id })
|
|
162
|
+
body.should have_tag("input", :attributes => {
|
|
163
|
+
:name => "q[author_id_in][]",
|
|
164
|
+
:type => "checkbox",
|
|
165
|
+
:value => @jane.id })
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
context "when polymorphic relationship" do
|
|
170
|
+
let(:body) do
|
|
171
|
+
search = ActiveAdmin::Comment.search
|
|
172
|
+
active_admin_filters_form_for(search, [{ :attribute => :resource}])
|
|
173
|
+
end
|
|
174
|
+
it "should not generate any field" do
|
|
175
|
+
body.should have_tag("form", :attributes => { :method => 'get' })
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end # belongs to
|
|
179
|
+
end
|