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,42 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class Menu
|
|
3
|
+
|
|
4
|
+
def initialize
|
|
5
|
+
@items = []
|
|
6
|
+
yield(self) if block_given?
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def add(*args, &block)
|
|
10
|
+
@items << MenuItem.new(*args, &block)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def [](name)
|
|
14
|
+
items.find{ |i| i.name == name }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def items
|
|
18
|
+
@items.sort
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def find_by_url(url)
|
|
22
|
+
recursive_find_by_url(items, url)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def recursive_find_by_url(collection, url)
|
|
28
|
+
found = nil
|
|
29
|
+
collection.each do |item|
|
|
30
|
+
if item.url == url
|
|
31
|
+
found = item
|
|
32
|
+
break
|
|
33
|
+
else
|
|
34
|
+
found = recursive_find_by_url(item.children, url)
|
|
35
|
+
break if found
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
found
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class MenuItem
|
|
3
|
+
|
|
4
|
+
# Use this to get to the routes
|
|
5
|
+
include Rails.application.routes.url_helpers
|
|
6
|
+
|
|
7
|
+
attr_accessor :name, :url, :priority, :parent, :display_if_block
|
|
8
|
+
|
|
9
|
+
def initialize(name, url, priority = 10, options = {})
|
|
10
|
+
@name, @url, @priority = name, url, priority
|
|
11
|
+
@children = []
|
|
12
|
+
@cached_url = {} # Stores the cached url in a hash to allow us to change it and still cache it
|
|
13
|
+
|
|
14
|
+
@display_if_block = options.delete(:if)
|
|
15
|
+
|
|
16
|
+
yield(self) if block_given? # Builder style syntax
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def add(name, url, priority=10, options = {}, &block)
|
|
20
|
+
item = MenuItem.new(name, url, priority, options, &block)
|
|
21
|
+
item.parent = self
|
|
22
|
+
@children << item
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def children
|
|
26
|
+
@children.sort
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def parent?
|
|
30
|
+
!parent.nil?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def dom_id
|
|
34
|
+
name.downcase.gsub( " ", '_' ).gsub( /[^a-z0-9_]/, '' )
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def url
|
|
38
|
+
case @url
|
|
39
|
+
when Symbol
|
|
40
|
+
generated = send(@url) # Call the named route
|
|
41
|
+
else
|
|
42
|
+
generated = @url
|
|
43
|
+
end
|
|
44
|
+
@cached_url[@url] ||= generated
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Returns an array of the ancestory of this menu item
|
|
48
|
+
# The first item is the immediate parent fo the item
|
|
49
|
+
def ancestors
|
|
50
|
+
return [] unless parent?
|
|
51
|
+
[parent, parent.ancestors].flatten
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Returns the child item with the name passed in
|
|
55
|
+
# @blog_menu["Create New"] => <#MenuItem @name="Create New" >
|
|
56
|
+
def [](name)
|
|
57
|
+
@children.find{ |i| i.name == name }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def <=>(other)
|
|
61
|
+
result = priority <=> other.priority
|
|
62
|
+
result = name <=> other.name if result == 0
|
|
63
|
+
result
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Returns the display if block. If the block was not explicitly defined
|
|
67
|
+
# a default block always returning true will be returned.
|
|
68
|
+
def display_if_block
|
|
69
|
+
@display_if_block || lambda { |_| true }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
class ResourceMismatchError < StandardError; end
|
|
4
|
+
|
|
5
|
+
# Namespaces are the basic organizing principle for resources within Active Admin
|
|
6
|
+
#
|
|
7
|
+
# Each resource is registered into a namespace which defines:
|
|
8
|
+
# * the namespaceing for routing
|
|
9
|
+
# * the module to namespace controllers
|
|
10
|
+
# * the menu which gets displayed (other resources in the same namespace)
|
|
11
|
+
#
|
|
12
|
+
# For example:
|
|
13
|
+
#
|
|
14
|
+
# ActiveAdmin.register Post, :namespace => :admin
|
|
15
|
+
#
|
|
16
|
+
# Will register the Post model into the "admin" namespace. This will namespace the
|
|
17
|
+
# urls for the resource to "/admin/posts" and will set the controller to
|
|
18
|
+
# Admin::PostsController
|
|
19
|
+
#
|
|
20
|
+
# You can also register to the "root" namespace, which is to say no namespace at all.
|
|
21
|
+
#
|
|
22
|
+
# ActiveAdmin.register Post, :namespace => false
|
|
23
|
+
#
|
|
24
|
+
# This will register the resource to an instantiated namespace called :root. The
|
|
25
|
+
# resource will be accessible from "/posts" and the controller will be PostsController.
|
|
26
|
+
#
|
|
27
|
+
class Namespace
|
|
28
|
+
|
|
29
|
+
RegisterEvent = 'active_admin.namespace.register'.freeze
|
|
30
|
+
|
|
31
|
+
attr_reader :application, :resources, :name, :menu
|
|
32
|
+
|
|
33
|
+
def initialize(application, name)
|
|
34
|
+
@application = application
|
|
35
|
+
@name = name.to_s.underscore.to_sym
|
|
36
|
+
@resources = {}
|
|
37
|
+
@menu = Menu.new
|
|
38
|
+
register_module unless root?
|
|
39
|
+
generate_dashboard_controller
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Register a resource into this namespace. The preffered method to access this is to
|
|
43
|
+
# use the global registration ActiveAdmin.register which delegates to the proper
|
|
44
|
+
# namespace instance.
|
|
45
|
+
def register(resource, options = {}, &block)
|
|
46
|
+
config = find_or_build_resource(resource, options)
|
|
47
|
+
|
|
48
|
+
# Register the resource
|
|
49
|
+
register_resource_controller(config)
|
|
50
|
+
parse_registration_block(config, &block) if block_given?
|
|
51
|
+
register_with_menu(config) if config.include_in_menu?
|
|
52
|
+
|
|
53
|
+
# Ensure that the dashboard is generated
|
|
54
|
+
generate_dashboard_controller
|
|
55
|
+
|
|
56
|
+
# Dispatch a registration event
|
|
57
|
+
ActiveAdmin::Event.dispatch ActiveAdmin::Resource::RegisterEvent, config
|
|
58
|
+
|
|
59
|
+
# Return the config
|
|
60
|
+
config
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def root?
|
|
64
|
+
name == :root
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns the name of the module if required. Will be nil if none
|
|
68
|
+
# is required.
|
|
69
|
+
#
|
|
70
|
+
# eg:
|
|
71
|
+
# Namespace.new(:admin).module_name # => 'Admin'
|
|
72
|
+
# Namespace.new(:root).module_name # => nil
|
|
73
|
+
#
|
|
74
|
+
def module_name
|
|
75
|
+
return nil if root?
|
|
76
|
+
@module_name ||= name.to_s.camelize
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Returns the name of the dashboard controller for this namespace
|
|
80
|
+
def dashboard_controller_name
|
|
81
|
+
[module_name, "DashboardController"].compact.join("::")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Unload all the registered resources for this namespace
|
|
85
|
+
def unload!
|
|
86
|
+
unload_resources!
|
|
87
|
+
unload_dashboard!
|
|
88
|
+
unload_menu!
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# The menu gets built by Active Admin once all the resources have been
|
|
92
|
+
# loaded. This method gets called to register each resource with the menu system.
|
|
93
|
+
def load_menu!
|
|
94
|
+
register_dashboard
|
|
95
|
+
resources.values.each do |config|
|
|
96
|
+
register_with_menu(config) if config.include_in_menu?
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Returns the first registered ActiveAdmin::Resource instance for a given class
|
|
101
|
+
def resource_for(klass)
|
|
102
|
+
actual = resources.values.find{|config| config.resource == klass }
|
|
103
|
+
return actual if actual
|
|
104
|
+
|
|
105
|
+
if klass.respond_to?(:base_class)
|
|
106
|
+
base_class = klass.base_class
|
|
107
|
+
resources.values.find{|config| config.resource == base_class }
|
|
108
|
+
else
|
|
109
|
+
nil
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
protected
|
|
114
|
+
|
|
115
|
+
# Either returns an existing Resource instance or builds a new
|
|
116
|
+
# one for the resource and options
|
|
117
|
+
def find_or_build_resource(resource_class, options)
|
|
118
|
+
resource = Resource.new(self, resource_class, options)
|
|
119
|
+
|
|
120
|
+
# If we've already registered this resource, use the existing
|
|
121
|
+
if @resources.has_key? resource.camelized_resource_name
|
|
122
|
+
existing_resource = @resources[resource.camelized_resource_name]
|
|
123
|
+
|
|
124
|
+
if existing_resource.resource != resource_class
|
|
125
|
+
raise ActiveAdmin::ResourceMismatchError,
|
|
126
|
+
"Tried to register #{resource_class} as #{resource.camelized_resource_name} but already registered to #{resource.resource}"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
resource = existing_resource
|
|
130
|
+
else
|
|
131
|
+
@resources[resource.camelized_resource_name] = resource
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
resource
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def unload_resources!
|
|
138
|
+
resources.each do |name, config|
|
|
139
|
+
parent = (module_name || 'Object').constantize
|
|
140
|
+
const_name = config.controller_name.split('::').last
|
|
141
|
+
# Remove the const if its been defined
|
|
142
|
+
parent.send(:remove_const, const_name) if parent.const_defined?(const_name)
|
|
143
|
+
end
|
|
144
|
+
@resources = {}
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def unload_dashboard!
|
|
148
|
+
# TODO: Only clear out my sections
|
|
149
|
+
Dashboards.clear_all_sections!
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def unload_menu!
|
|
153
|
+
@menu = Menu.new
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Creates a ruby module to namespace all the classes in if required
|
|
157
|
+
def register_module
|
|
158
|
+
eval "module ::#{module_name}; end"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def register_resource_controller(config)
|
|
162
|
+
eval "class ::#{config.controller_name} < ActiveAdmin::ResourceController; end"
|
|
163
|
+
config.controller.active_admin_config = config
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def dsl
|
|
167
|
+
@dsl ||= DSL.new
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def parse_registration_block(config, &block)
|
|
171
|
+
dsl.run_registration_block(config, &block)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Creates a dashboard controller for this config
|
|
175
|
+
def generate_dashboard_controller
|
|
176
|
+
eval "class ::#{dashboard_controller_name} < ActiveAdmin::Dashboards::DashboardController; end"
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Adds the dashboard to the menu
|
|
180
|
+
def register_dashboard
|
|
181
|
+
dashboard_path = root? ? :dashboard_path : "#{name}_dashboard_path".to_sym
|
|
182
|
+
menu.add(I18n.t("active_admin.dashboard"), dashboard_path, 1) unless menu[I18n.t("active_admin.dashboard")]
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Does all the work of registernig a config with the menu system
|
|
186
|
+
def register_with_menu(config)
|
|
187
|
+
# The menu we're going to add this resource to
|
|
188
|
+
add_to = menu
|
|
189
|
+
|
|
190
|
+
# Adding as a child
|
|
191
|
+
if config.parent_menu_item_name
|
|
192
|
+
# Create the parent if it doesn't exist
|
|
193
|
+
menu.add(config.parent_menu_item_name, '#') unless menu[config.parent_menu_item_name]
|
|
194
|
+
add_to = menu[config.parent_menu_item_name]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Check if this menu item has already been created
|
|
198
|
+
if add_to[config.menu_item_name]
|
|
199
|
+
# Update the url if it's already been created
|
|
200
|
+
add_to[config.menu_item_name].url = config.route_collection_path
|
|
201
|
+
else
|
|
202
|
+
add_to.add(config.menu_item_name, config.route_collection_path, config.menu_item_priority, { :if => config.menu_item_display_if })
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
# Deals with reloading Active Admin on each request in
|
|
3
|
+
# development and once in production.
|
|
4
|
+
class Reloader
|
|
5
|
+
|
|
6
|
+
# @param [String] rails_version
|
|
7
|
+
# The version of Rails we're using. We use this to switch between
|
|
8
|
+
# the correcr Rails reloader class.
|
|
9
|
+
def initialize(rails_version)
|
|
10
|
+
@rails_version = rails_version.to_s
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Attach to Rails and perform the reload on each request.
|
|
14
|
+
def attach!
|
|
15
|
+
reloader_class.to_prepare do
|
|
16
|
+
ActiveAdmin.application.unload!
|
|
17
|
+
Rails.application.reload_routes!
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def reloader_class
|
|
22
|
+
if @rails_version[0..2] == '3.1'
|
|
23
|
+
ActionDispatch::Reloader
|
|
24
|
+
else
|
|
25
|
+
ActionDispatch::Callbacks
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class Renderer
|
|
3
|
+
|
|
4
|
+
include ::ActiveAdmin::ViewHelpers::RendererHelper
|
|
5
|
+
include Arbre::HTML
|
|
6
|
+
|
|
7
|
+
attr_accessor :view, :assigns
|
|
8
|
+
|
|
9
|
+
# For use in html
|
|
10
|
+
alias_method :helpers, :view
|
|
11
|
+
|
|
12
|
+
def initialize(view_or_renderer)
|
|
13
|
+
@view = view_or_renderer.is_a?(Renderer) ? view_or_renderer.view : view_or_renderer
|
|
14
|
+
|
|
15
|
+
if view.respond_to?(:assigns)
|
|
16
|
+
@assigns = view.assigns.each { |key, value| instance_variable_set("@#{key}", value) }
|
|
17
|
+
else
|
|
18
|
+
@assigns = {}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def method_missing(name,*args, &block)
|
|
23
|
+
if view.respond_to?(name)
|
|
24
|
+
view.send(name, *args, &block)
|
|
25
|
+
else
|
|
26
|
+
super
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def to_html(*args)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def to_s(*args)
|
|
34
|
+
to_html(*args)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def haml(template)
|
|
38
|
+
begin
|
|
39
|
+
require 'haml' unless defined?(Haml)
|
|
40
|
+
rescue LoadError
|
|
41
|
+
raise LoadError, "Please install the HAML gem to use the HAML method with ActiveAdmin"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Find the first non whitespace character in the template
|
|
45
|
+
indent = template.index(/\S/)
|
|
46
|
+
|
|
47
|
+
# Remove the indent if its greater than 0
|
|
48
|
+
if indent > 0
|
|
49
|
+
template = template.split("\n").collect do |line|
|
|
50
|
+
line[indent..-1]
|
|
51
|
+
end.join("\n")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Render it baby
|
|
55
|
+
Haml::Engine.new(template).render(self)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
protected
|
|
59
|
+
|
|
60
|
+
# Although we make a copy of all the instance variables on the way in, it
|
|
61
|
+
# doesn't mean that we can set new instance variables that are stored in
|
|
62
|
+
# the context of the view. This method allows you to do that. It can be useful
|
|
63
|
+
# when trying to share variables with a layout.
|
|
64
|
+
def set_ivar_on_view(name, value)
|
|
65
|
+
view.instance_variable_set(name, value)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Many times throughout the views we want to either call a method on an object
|
|
69
|
+
# or instance_exec a proc passing in the object as the first parameter. This
|
|
70
|
+
# method takes care of this functionality.
|
|
71
|
+
#
|
|
72
|
+
# call_method_or_proc_on(@my_obj, :size) same as @my_obj.size
|
|
73
|
+
# OR
|
|
74
|
+
# proc = Proc.new{|s| s.size }
|
|
75
|
+
# call_method_or_proc_on(@my_obj, proc)
|
|
76
|
+
#
|
|
77
|
+
def call_method_or_proc_on(obj, symbol_or_proc)
|
|
78
|
+
case symbol_or_proc
|
|
79
|
+
when Symbol, String
|
|
80
|
+
obj.send(symbol_or_proc.to_sym)
|
|
81
|
+
when Proc
|
|
82
|
+
instance_exec(obj, &symbol_or_proc)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
end
|