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,47 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Views
|
|
3
|
+
|
|
4
|
+
class Columns < ActiveAdmin::Component
|
|
5
|
+
builder_method :columns
|
|
6
|
+
|
|
7
|
+
def column(*args, &block)
|
|
8
|
+
insert_tag Column, *args, &block
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Override add child to set widths
|
|
12
|
+
def add_child(*)
|
|
13
|
+
super
|
|
14
|
+
calculate_columns!
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
|
|
19
|
+
def margin_size
|
|
20
|
+
2
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def calculate_columns!
|
|
24
|
+
# Calculate our columns sizes and margins
|
|
25
|
+
count = children.size
|
|
26
|
+
margins_width = margin_size * (count - 1)
|
|
27
|
+
column_width = (100.00 - margins_width) / count
|
|
28
|
+
|
|
29
|
+
# Convert to an integer if its not a float
|
|
30
|
+
column_width = column_width.to_i == column_width ? column_width.to_i : column_width
|
|
31
|
+
|
|
32
|
+
children.each_with_index do |col, i|
|
|
33
|
+
col.set_attribute :style, "width: #{column_width}%;"
|
|
34
|
+
col.attr(:style) << " margin-right: #{margin_size}%;" unless i == (count - 1)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def to_html
|
|
39
|
+
super.to_s + "<div style=\"clear:both;\"></div>".html_safe
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class Column < ActiveAdmin::Component
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Views
|
|
3
|
+
|
|
4
|
+
# Wraps the content with pagination and available formats.
|
|
5
|
+
#
|
|
6
|
+
# *Example:*
|
|
7
|
+
#
|
|
8
|
+
# paginated_collection collection, :entry_name => "Post" do
|
|
9
|
+
# div do
|
|
10
|
+
# h2 "Inside the
|
|
11
|
+
# end
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# This will create a div with a sentence describing the number of
|
|
15
|
+
# posts in one of the following formats:
|
|
16
|
+
#
|
|
17
|
+
# * "No Posts found"
|
|
18
|
+
# * "Displaying all 10 Posts"
|
|
19
|
+
# * "Displaying Posts 1 - 30 of 31 in total"
|
|
20
|
+
#
|
|
21
|
+
# It will also generate pagination links.
|
|
22
|
+
#
|
|
23
|
+
class PaginatedCollection < ActiveAdmin::Component
|
|
24
|
+
builder_method :paginated_collection
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# Builds a new paginated collection component
|
|
28
|
+
#
|
|
29
|
+
# @param [Array] collection A "paginated" collection from kaminari
|
|
30
|
+
# @param [Hash] options These options will be passed on to the page_entries_info
|
|
31
|
+
# method.
|
|
32
|
+
# Useful keys:
|
|
33
|
+
# :entry_name - The name to display for this resource collection
|
|
34
|
+
def build(collection, options = {})
|
|
35
|
+
@collection = collection
|
|
36
|
+
div(page_entries_info(options).html_safe, :class => "pagination_information")
|
|
37
|
+
@contents = div(:class => "paginated_collection_contents")
|
|
38
|
+
build_pagination_with_formats
|
|
39
|
+
@built = true
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Override add_child to insert all children into the @contents div
|
|
43
|
+
def add_child(*args, &block)
|
|
44
|
+
if @built
|
|
45
|
+
@contents.add_child(*args, &block)
|
|
46
|
+
else
|
|
47
|
+
super
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
protected
|
|
52
|
+
|
|
53
|
+
def build_pagination_with_formats
|
|
54
|
+
div :id => "index_footer" do
|
|
55
|
+
build_download_format_links
|
|
56
|
+
build_pagination
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def build_pagination
|
|
61
|
+
text_node paginate(collection)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# TODO: Refactor to new HTML DSL
|
|
65
|
+
def build_download_format_links(formats = [:csv, :xml, :json])
|
|
66
|
+
links = formats.collect do |format|
|
|
67
|
+
link_to format.to_s.upcase, { :format => format}.merge(request.query_parameters.except(:commit, :format))
|
|
68
|
+
end
|
|
69
|
+
text_node [I18n.t('active_admin.download'), links].flatten.join(" ").html_safe
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# modified from will_paginate
|
|
73
|
+
def page_entries_info(options = {})
|
|
74
|
+
entry_name = options[:entry_name] ||
|
|
75
|
+
(collection.empty?? 'entry' : collection.first.class.name.underscore.sub('_', ' '))
|
|
76
|
+
|
|
77
|
+
if collection.num_pages < 2
|
|
78
|
+
case collection.size
|
|
79
|
+
when 0; I18n.t('active_admin.pagination.empty', :model => entry_name.pluralize)
|
|
80
|
+
when 1; I18n.t('active_admin.pagination.one', :model => entry_name)
|
|
81
|
+
else; I18n.t('active_admin.pagination.one_page', :model => entry_name.pluralize, :n => collection.size)
|
|
82
|
+
end
|
|
83
|
+
else
|
|
84
|
+
offset = collection.current_page * active_admin_application.default_per_page
|
|
85
|
+
total = collection.total_count
|
|
86
|
+
I18n.t('active_admin.pagination.multiple', :model => entry_name.pluralize, :from => (offset - active_admin_application.default_per_page + 1), :to => offset > total ? total : offset, :total => total)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Views
|
|
3
|
+
|
|
4
|
+
class Panel < ActiveAdmin::Component
|
|
5
|
+
builder_method :panel
|
|
6
|
+
|
|
7
|
+
def build(title, attributes = {})
|
|
8
|
+
icon_name = attributes.delete(:icon)
|
|
9
|
+
icn = icon_name ? icon(icon_name) : ""
|
|
10
|
+
super(attributes)
|
|
11
|
+
add_class "panel"
|
|
12
|
+
@title = h3(icn + title.to_s)
|
|
13
|
+
@contents = div(:class => "panel_contents")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add_child(child)
|
|
17
|
+
if @contents
|
|
18
|
+
@contents << child
|
|
19
|
+
else
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Views
|
|
3
|
+
|
|
4
|
+
# Renders a collection of ActiveAdmin::Scope objects as a
|
|
5
|
+
# simple list with a seperator
|
|
6
|
+
class Scopes < ActiveAdmin::Component
|
|
7
|
+
builder_method :scopes_renderer
|
|
8
|
+
|
|
9
|
+
def build(scopes)
|
|
10
|
+
scopes.each do |scope|
|
|
11
|
+
build_scope(scope)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
protected
|
|
16
|
+
|
|
17
|
+
def build_scope(scope)
|
|
18
|
+
span :class => classes_for_scope(scope) do
|
|
19
|
+
begin
|
|
20
|
+
scope_name = I18n.t!("active_admin.scopes.#{scope.scope_method}")
|
|
21
|
+
rescue I18n::MissingTranslationData
|
|
22
|
+
scope_name = scope.name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
if current_scope?(scope)
|
|
26
|
+
em(scope_name)
|
|
27
|
+
else
|
|
28
|
+
a(scope_name, :href => url_for(params.merge(:scope => scope.id, :page => 1)))
|
|
29
|
+
end
|
|
30
|
+
text_node(" ")
|
|
31
|
+
scope_count(scope)
|
|
32
|
+
text_node(" ")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def classes_for_scope(scope)
|
|
37
|
+
classes = ["scope", scope.id]
|
|
38
|
+
classes << "selected" if current_scope?(scope)
|
|
39
|
+
classes.join(" ")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def current_scope?(scope)
|
|
43
|
+
if params[:scope]
|
|
44
|
+
params[:scope] == scope.id
|
|
45
|
+
else
|
|
46
|
+
active_admin_config.default_scope == scope
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def scope_count(scope)
|
|
51
|
+
span :class => 'count' do
|
|
52
|
+
"(" + get_scope_count(scope).to_s + ")"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def get_scope_count(scope)
|
|
57
|
+
if scope.scope_method
|
|
58
|
+
scoping_class.send(scope.scope_method).count
|
|
59
|
+
else
|
|
60
|
+
instance_exec(scoping_class, &scope.scope_block).count
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def scoping_class
|
|
65
|
+
assigns["before_scope_collection"] || active_admin_config.resource
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Views
|
|
3
|
+
|
|
4
|
+
class SidebarSection < Panel
|
|
5
|
+
builder_method :sidebar_section
|
|
6
|
+
|
|
7
|
+
# Takes a ActiveAdmin::Sidebar::Section instance
|
|
8
|
+
def build(section)
|
|
9
|
+
@section = section
|
|
10
|
+
super(@section.title, :icon => @section.icon)
|
|
11
|
+
self.id = @section.id
|
|
12
|
+
build_sidebar_content
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
protected
|
|
16
|
+
|
|
17
|
+
def build_sidebar_content
|
|
18
|
+
if @section.block
|
|
19
|
+
rvalue = instance_eval(&@section.block)
|
|
20
|
+
self << rvalue if rvalue.is_a?(String)
|
|
21
|
+
else
|
|
22
|
+
text_node render(@section.partial_name)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Views
|
|
3
|
+
# Build a StatusTag
|
|
4
|
+
class StatusTag < ActiveAdmin::Component
|
|
5
|
+
builder_method :status_tag
|
|
6
|
+
|
|
7
|
+
def tag_name
|
|
8
|
+
'span'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def default_class_name
|
|
12
|
+
'status'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @method status_tag(status, type = nil, options = {})
|
|
16
|
+
#
|
|
17
|
+
# @param [String] status the status to display. One of the span classes will be an underscored version of the status.
|
|
18
|
+
# @param [Symbol] type type of status. Will become a class of the span. ActiveAdmin provide style for :ok, :warning and :error.
|
|
19
|
+
# @param [Hash] options such as :class, :id etc
|
|
20
|
+
#
|
|
21
|
+
# @return [ActiveAdmin::Views::StatusTag]
|
|
22
|
+
#
|
|
23
|
+
# Examples:
|
|
24
|
+
# status_tag('In Progress')
|
|
25
|
+
# # => <span class='status in_progress'>In Progress</span>
|
|
26
|
+
#
|
|
27
|
+
# status_tag('active', :ok)
|
|
28
|
+
# # => <span class='status active ok'>Active</span>
|
|
29
|
+
#
|
|
30
|
+
# status_tag('active', :ok, :class => 'important', :id => 'status_123')
|
|
31
|
+
# # => <span class='status active ok important' id='status_123'>Active</span>
|
|
32
|
+
#
|
|
33
|
+
def build(*args)
|
|
34
|
+
options = args.extract_options!
|
|
35
|
+
status = args[0]
|
|
36
|
+
type = args[1]
|
|
37
|
+
classes = options.delete(:class)
|
|
38
|
+
|
|
39
|
+
status = status.titleize if status
|
|
40
|
+
|
|
41
|
+
super(status, options)
|
|
42
|
+
|
|
43
|
+
add_class(status_to_class(status)) if status
|
|
44
|
+
add_class(type.to_s) if type
|
|
45
|
+
add_class(classes) if classes
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
protected
|
|
49
|
+
|
|
50
|
+
def status_to_class(status)
|
|
51
|
+
status.titleize.gsub(/\s/, '').underscore
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Views
|
|
3
|
+
class TableFor < Arbre::HTML::Table
|
|
4
|
+
builder_method :table_for
|
|
5
|
+
|
|
6
|
+
def tag_name
|
|
7
|
+
'table'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def build(collection, options = {})
|
|
11
|
+
@sortable = options.delete(:sortable)
|
|
12
|
+
@resource_class = options.delete(:i18n)
|
|
13
|
+
@collection = collection
|
|
14
|
+
@columns = []
|
|
15
|
+
build_table
|
|
16
|
+
super(options)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def column(*args, &block)
|
|
20
|
+
options = default_options.merge(args.last.is_a?(::Hash) ? args.pop : {})
|
|
21
|
+
title = args[0]
|
|
22
|
+
data = args[1] || args[0]
|
|
23
|
+
|
|
24
|
+
col = Column.new(title, data, options, &block)
|
|
25
|
+
@columns << col
|
|
26
|
+
|
|
27
|
+
# Build our header item
|
|
28
|
+
within @header_row do
|
|
29
|
+
build_table_header(col)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Add a table cell for each item
|
|
33
|
+
@collection.each_with_index do |item, i|
|
|
34
|
+
within @tbody.children[i] do
|
|
35
|
+
build_table_cell(col, item)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def sortable?
|
|
41
|
+
@sortable
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Returns the columns to display based on the conditional block
|
|
45
|
+
def visible_columns
|
|
46
|
+
@visible_columns ||= @columns.select{|col| col.display_column? }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
protected
|
|
50
|
+
|
|
51
|
+
def build_table
|
|
52
|
+
build_table_head
|
|
53
|
+
build_table_body
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def build_table_head
|
|
57
|
+
@thead = thead do
|
|
58
|
+
@header_row = tr
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def build_table_header(col)
|
|
63
|
+
if sortable? && col.sortable?
|
|
64
|
+
build_sortable_header_for(col.title, col.sort_key)
|
|
65
|
+
else
|
|
66
|
+
th(col.title)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def build_sortable_header_for(title, sort_key)
|
|
71
|
+
classes = Arbre::HTML::ClassList.new(["sortable"])
|
|
72
|
+
if current_sort[0] == sort_key
|
|
73
|
+
classes << "sorted-#{current_sort[1]}"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
th :class => classes do
|
|
77
|
+
link_to(title, params.merge(:order => "#{sort_key}_#{order_for_sort_key(sort_key)}").except(:page))
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def build_table_body
|
|
82
|
+
@tbody = tbody do
|
|
83
|
+
# Build enough rows for our collection
|
|
84
|
+
@collection.each{|_| tr(:class => cycle('odd', 'even')) }
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def build_table_cell(col, item)
|
|
89
|
+
td do
|
|
90
|
+
rvalue = call_method_or_proc_on(item, col.data, :exec => false)
|
|
91
|
+
if col.data.is_a?(Symbol)
|
|
92
|
+
rvalue = pretty_format(rvalue)
|
|
93
|
+
end
|
|
94
|
+
rvalue
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Returns an array for the current sort order
|
|
99
|
+
# current_sort[0] #=> sort_key
|
|
100
|
+
# current_sort[1] #=> asc | desc
|
|
101
|
+
def current_sort
|
|
102
|
+
@current_sort ||= if params[:order] && params[:order] =~ /^([\w\_\.]+)_(desc|asc)$/
|
|
103
|
+
[$1,$2]
|
|
104
|
+
else
|
|
105
|
+
[]
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Returns the order to use for a given sort key
|
|
110
|
+
#
|
|
111
|
+
# Default is to use 'desc'. If the current sort key is
|
|
112
|
+
# 'desc' it will return 'asc'
|
|
113
|
+
def order_for_sort_key(sort_key)
|
|
114
|
+
current_key, current_order = current_sort
|
|
115
|
+
return 'desc' unless current_key == sort_key
|
|
116
|
+
current_order == 'desc' ? 'asc' : 'desc'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def default_options
|
|
120
|
+
{
|
|
121
|
+
:i18n => @resource_class
|
|
122
|
+
}
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
class Column
|
|
126
|
+
|
|
127
|
+
attr_accessor :title, :data
|
|
128
|
+
|
|
129
|
+
def initialize(*args, &block)
|
|
130
|
+
@options = default_options.merge(args.last.is_a?(::Hash) ? args.pop : {})
|
|
131
|
+
@title = pretty_title args[0]
|
|
132
|
+
@data = args[1] || args[0]
|
|
133
|
+
@data = block if block
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def sortable?
|
|
137
|
+
if @data.is_a?(Proc)
|
|
138
|
+
[String, Symbol].include?(@options[:sortable].class)
|
|
139
|
+
else
|
|
140
|
+
@options[:sortable]
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
#
|
|
145
|
+
# Returns the key to be used for sorting this column
|
|
146
|
+
#
|
|
147
|
+
# Defaults to the column's method if its a symbol
|
|
148
|
+
# column :username
|
|
149
|
+
# # => Sort key will be set to 'username'
|
|
150
|
+
#
|
|
151
|
+
# You can set the sort key by passing a string or symbol
|
|
152
|
+
# to the sortable option:
|
|
153
|
+
# column :username, :sortable => 'other_column_to_sort_on'
|
|
154
|
+
#
|
|
155
|
+
# If you pass a block to be rendered for this column, the column
|
|
156
|
+
# will not be sortable unless you pass a string to sortable to
|
|
157
|
+
# sort the column on:
|
|
158
|
+
#
|
|
159
|
+
# column('Username', :sortable => 'login'){ @user.pretty_name }
|
|
160
|
+
# # => Sort key will be 'login'
|
|
161
|
+
#
|
|
162
|
+
def sort_key
|
|
163
|
+
if @options[:sortable] == true || @options[:sortable] == false
|
|
164
|
+
@data.to_s
|
|
165
|
+
else
|
|
166
|
+
@options[:sortable].to_s
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
private
|
|
171
|
+
|
|
172
|
+
def pretty_title(raw)
|
|
173
|
+
if raw.is_a?(Symbol)
|
|
174
|
+
if @options[:i18n] && @options[:i18n].respond_to?(:human_attribute_name) && human_name = @options[:i18n].human_attribute_name(raw)
|
|
175
|
+
raw = human_name
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
raw.to_s.titleize
|
|
179
|
+
else
|
|
180
|
+
raw
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def default_options
|
|
185
|
+
{
|
|
186
|
+
:sortable => true
|
|
187
|
+
}
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|