activeadmin 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activeadmin might be problematic. Click here for more details.
- data/CHANGELOG.rdoc +15 -1
- data/Gemfile +41 -11
- data/LICENSE +5 -0
- data/README.rdoc +202 -87
- data/Rakefile +51 -15
- data/activeadmin.gemspec +310 -131
- data/cucumber.yml +1 -0
- data/features/comments/commenting.feature +81 -0
- data/features/comments/viewing_index.feature +19 -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/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/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 +128 -0
- data/features/specifying_actions.feature +16 -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/factory_steps.rb +28 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +7 -0
- data/features/step_definitions/index_scope_steps.rb +20 -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/support/env.rb +88 -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.rb +155 -79
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +4 -15
- 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 +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 +129 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/comments.rb +73 -0
- data/lib/active_admin/comments/comment.rb +15 -0
- data/lib/active_admin/comments/configuration.rb +16 -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/dashboards.rb +0 -2
- data/lib/active_admin/dashboards/dashboard_controller.rb +10 -5
- data/lib/active_admin/dashboards/section.rb +5 -14
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +202 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +68 -50
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/namespace.rb +102 -16
- data/lib/active_admin/renderer.rb +18 -3
- data/lib/active_admin/resource.rb +110 -9
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource_controller.rb +45 -260
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +53 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +142 -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/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +8 -47
- data/lib/active_admin/stylesheets/active_admin.scss +418 -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/version.rb +1 -1
- data/lib/active_admin/view_factory.rb +21 -0
- data/lib/active_admin/view_helpers.rb +17 -100
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +41 -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 +174 -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/status_tag_helper.rb +13 -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/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/columns.rb +49 -0
- data/lib/active_admin/views/components/paginated_collection.rb +74 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +64 -0
- data/lib/active_admin/views/components/sidebar_section.rb +30 -0
- data/lib/active_admin/views/components/table_for.rb +174 -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 +73 -0
- data/lib/active_admin/views/pages/base.rb +138 -0
- data/lib/active_admin/views/pages/dashboard.rb +61 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +64 -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 +52 -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_dashboard/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/edit.html.arb +1 -0
- data/lib/active_admin/views/{active_admin_default → templates/active_admin_default}/index.csv.erb +0 -0
- data/lib/active_admin/views/templates/active_admin_default/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/show.html.arb +1 -0
- data/lib/active_admin/views/{layouts → templates/layouts}/active_admin.html.erb +3 -4
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +45 -0
- data/lib/generators/active_admin/install/install_generator.rb +18 -3
- data/lib/generators/active_admin/install/templates/active_admin.js +41 -0
- data/lib/generators/active_admin/install/templates/{active_admin.rb → active_admin.rb.erb} +33 -3
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +1 -1
- data/lib/generators/active_admin/install/templates/dashboards.rb +3 -4
- 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/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/integration/index_as_table_spec.rb +0 -119
- data/spec/integration/layout_spec.rb +3 -37
- data/spec/spec_helper.rb +89 -50
- data/spec/support/integration_example_group.rb +37 -0
- data/spec/support/rails_template.rb +21 -9
- data/spec/support/rails_template_with_data.rb +32 -0
- data/spec/support/templates/cucumber.rb +28 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +19 -7
- data/spec/unit/action_items_spec.rb +16 -30
- data/spec/unit/active_admin_spec.rb +10 -22
- 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 +185 -0
- data/spec/unit/auto_link_spec.rb +38 -0
- data/spec/unit/belongs_to_spec.rb +44 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +53 -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/table_for_spec.rb +130 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +10 -17
- 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 +99 -77
- data/spec/unit/form_builder_spec.rb +69 -69
- data/spec/unit/namespace_spec.rb +61 -3
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +40 -1
- data/spec/unit/renderer_spec.rb +8 -0
- data/spec/unit/resource_controller_spec.rb +105 -6
- data/spec/unit/resource_spec.rb +78 -11
- data/spec/unit/routing_spec.rb +82 -6
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +24 -2
- data/spec/unit/view_factory_spec.rb +16 -0
- metadata +268 -82
- data/.gitignore +0 -25
- data/active_admin.gemspec +0 -22
- data/lib/active_admin/action_builder.rb +0 -60
- data/lib/active_admin/breadcrumbs.rb +0 -26
- data/lib/active_admin/dashboards/renderer.rb +0 -45
- data/lib/active_admin/dashboards/section_renderer.rb +0 -28
- data/lib/active_admin/filters.rb +0 -189
- data/lib/active_admin/pages.rb +0 -11
- data/lib/active_admin/pages/base.rb +0 -92
- data/lib/active_admin/pages/edit.rb +0 -21
- data/lib/active_admin/pages/index.rb +0 -58
- data/lib/active_admin/pages/index/blog.rb +0 -65
- data/lib/active_admin/pages/index/table.rb +0 -48
- data/lib/active_admin/pages/index/thumbnails.rb +0 -40
- data/lib/active_admin/pages/new.rb +0 -21
- data/lib/active_admin/pages/show.rb +0 -54
- data/lib/active_admin/table_builder.rb +0 -162
- data/lib/active_admin/tabs_renderer.rb +0 -39
- data/lib/active_admin/views/active_admin_dashboard/index.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/edit.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/index.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/new.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/show.html.erb +0 -1
- data/lib/generators/active_admin/install/templates/active_admin.css +0 -325
- data/lib/generators/active_admin/install/templates/images/orderable.gif +0 -0
- data/spec/integration/index_as_blog_spec.rb +0 -65
- data/spec/integration/index_as_thumbnails_spec.rb +0 -43
- data/spec/integration/new_view_spec.rb +0 -52
- data/spec/integration/show_view_spec.rb +0 -91
- data/spec/unit/sidebar_spec.rb +0 -96
- data/spec/unit/table_builder_spec.rb +0 -162
@@ -0,0 +1,22 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
class Component < Arbre::HTML::Div
|
3
|
+
|
4
|
+
# By default components render a div
|
5
|
+
def tag_name
|
6
|
+
'div'
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(*)
|
10
|
+
super
|
11
|
+
add_class default_class_name
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
# By default, add a css class named after the ruby class
|
17
|
+
def default_class_name
|
18
|
+
self.class.name.demodulize.underscore
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -2,9 +2,7 @@ module ActiveAdmin
|
|
2
2
|
module Dashboards
|
3
3
|
|
4
4
|
autoload :DashboardController, 'active_admin/dashboards/dashboard_controller'
|
5
|
-
autoload :Renderer, 'active_admin/dashboards/renderer'
|
6
5
|
autoload :Section, 'active_admin/dashboards/section'
|
7
|
-
autoload :SectionRenderer, 'active_admin/dashboards/section_renderer'
|
8
6
|
|
9
7
|
@@sections = {}
|
10
8
|
mattr_accessor :sections
|
@@ -2,13 +2,16 @@ module ActiveAdmin
|
|
2
2
|
module Dashboards
|
3
3
|
class DashboardController < ResourceController
|
4
4
|
|
5
|
+
before_filter :skip_sidebar!
|
6
|
+
|
7
|
+
actions :index
|
8
|
+
|
5
9
|
# Render from here if not overriden
|
6
10
|
self.default_views = 'active_admin_dashboard'
|
7
11
|
|
8
12
|
clear_action_items!
|
9
13
|
|
10
14
|
def index
|
11
|
-
skip_sidebar!
|
12
15
|
@dashboard_sections = find_sections
|
13
16
|
render_or_default 'index'
|
14
17
|
end
|
@@ -24,7 +27,12 @@ module ActiveAdmin
|
|
24
27
|
end
|
25
28
|
|
26
29
|
def namespace
|
27
|
-
self.class.name
|
30
|
+
class_name = self.class.name
|
31
|
+
if class_name.include?('::')
|
32
|
+
self.class.name.split('::').first.underscore.to_sym
|
33
|
+
else
|
34
|
+
:root
|
35
|
+
end
|
28
36
|
end
|
29
37
|
|
30
38
|
# Return the current menu for the view. This is a helper method
|
@@ -32,9 +40,6 @@ module ActiveAdmin
|
|
32
40
|
ActiveAdmin.namespaces[namespace].menu
|
33
41
|
end
|
34
42
|
|
35
|
-
# Override to do nothing
|
36
|
-
def add_section_breadcrumb
|
37
|
-
end
|
38
43
|
end
|
39
44
|
end
|
40
45
|
end
|
@@ -2,15 +2,10 @@ module ActiveAdmin
|
|
2
2
|
module Dashboards
|
3
3
|
class Section
|
4
4
|
|
5
|
-
@@renderers = {
|
6
|
-
:default => SectionRenderer
|
7
|
-
}
|
8
|
-
cattr_accessor :renderers
|
9
|
-
|
10
5
|
DEFAULT_PRIORITY = 10
|
11
6
|
|
12
7
|
attr_accessor :name, :block
|
13
|
-
attr_reader :namespace
|
8
|
+
attr_reader :namespace, :options
|
14
9
|
|
15
10
|
def initialize(namespace, name, options = {}, &block)
|
16
11
|
@namespace = namespace
|
@@ -23,6 +18,10 @@ module ActiveAdmin
|
|
23
18
|
@options[:priority] || DEFAULT_PRIORITY
|
24
19
|
end
|
25
20
|
|
21
|
+
def icon
|
22
|
+
@options[:icon]
|
23
|
+
end
|
24
|
+
|
26
25
|
# Sort by priority then by name
|
27
26
|
def <=>(other)
|
28
27
|
result = priority <=> other.priority
|
@@ -30,14 +29,6 @@ module ActiveAdmin
|
|
30
29
|
result
|
31
30
|
end
|
32
31
|
|
33
|
-
# Returns the class to use as this sections renderer. Raises
|
34
|
-
# an exception if the renderer could not be found
|
35
|
-
def renderer
|
36
|
-
klass = Section.renderers[@options[:as] || :default]
|
37
|
-
raise StandardError, "Could not find the #{@options[:as].inspect} dashboard section renderer." unless klass
|
38
|
-
klass
|
39
|
-
end
|
40
|
-
|
41
32
|
end
|
42
33
|
end
|
43
34
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'devise'
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module Devise
|
5
|
+
|
6
|
+
def self.config
|
7
|
+
{
|
8
|
+
:path => ActiveAdmin.default_namespace,
|
9
|
+
:controllers => ActiveAdmin::Devise.controllers,
|
10
|
+
:path_names => { :sign_in => 'login', :sign_out => "logout" }
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.controllers
|
15
|
+
{
|
16
|
+
:sessions => "active_admin/devise/sessions",
|
17
|
+
:passwords => "active_admin/devise/passwords"
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
module Controller
|
22
|
+
extend ::ActiveSupport::Concern
|
23
|
+
included do
|
24
|
+
layout 'active_admin_logged_out'
|
25
|
+
helper ::ActiveAdmin::ViewHelpers
|
26
|
+
end
|
27
|
+
|
28
|
+
# Redirect to the default namespace on logout
|
29
|
+
def root_path
|
30
|
+
"/#{ActiveAdmin.default_namespace}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class SessionsController < ::Devise::SessionsController
|
35
|
+
include ::ActiveAdmin::Devise::Controller
|
36
|
+
end
|
37
|
+
|
38
|
+
class PasswordsController < ::Devise::PasswordsController
|
39
|
+
include ::ActiveAdmin::Devise::Controller
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
|
3
|
+
#
|
4
|
+
# The Active Admin DSL. This class is where all the registration blocks
|
5
|
+
# are instance eval'd. This is the central place for the API given to
|
6
|
+
# users of Active Admin
|
7
|
+
#
|
8
|
+
class DSL
|
9
|
+
|
10
|
+
# Runs the registration block inside this object
|
11
|
+
def run_registration_block(config, &block)
|
12
|
+
@config = config
|
13
|
+
instance_eval &block
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
# The instance of ActiveAdmin::Resource that's being registered
|
19
|
+
# currently. You can use this within your registration blocks to
|
20
|
+
# modify options:
|
21
|
+
#
|
22
|
+
# eg:
|
23
|
+
#
|
24
|
+
# ActiveAdmin.register Post do
|
25
|
+
# config.admin_notes = false
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
def config
|
29
|
+
@config
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns the controller for this resource. If you pass a
|
33
|
+
# block, it will be eval'd in the controller
|
34
|
+
#
|
35
|
+
# Example:
|
36
|
+
#
|
37
|
+
# ActiveAdmin.register Post do
|
38
|
+
#
|
39
|
+
# controller do
|
40
|
+
# def some_method_on_controller
|
41
|
+
# # Method gets added to Admin::PostsController
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
def controller(&block)
|
48
|
+
@config.controller.class_eval(&block) if block_given?
|
49
|
+
@config.controller
|
50
|
+
end
|
51
|
+
|
52
|
+
def belongs_to(target, options = {})
|
53
|
+
config.belongs_to(target, options)
|
54
|
+
end
|
55
|
+
|
56
|
+
def menu(options = {})
|
57
|
+
config.menu(options)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Scope this controller to some object which has a relation
|
61
|
+
# to the resource. Can either accept a block or a symbol
|
62
|
+
# of a method to call.
|
63
|
+
#
|
64
|
+
# Eg:
|
65
|
+
#
|
66
|
+
# ActiveAdmin.register Post do
|
67
|
+
# scope_to :current_user
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# Then every time we instantiate and object, it would call
|
71
|
+
#
|
72
|
+
# current_user.posts.build
|
73
|
+
#
|
74
|
+
# By default Active Admin will use the resource name to build a
|
75
|
+
# method to call as the association. If its different, you can
|
76
|
+
# pass in the association_method as an option.
|
77
|
+
#
|
78
|
+
# scope_to :current_user, :association_method => :blog_posts
|
79
|
+
#
|
80
|
+
# will result in the following
|
81
|
+
#
|
82
|
+
# current_user.blog_posts.build
|
83
|
+
#
|
84
|
+
def scope_to(*args, &block)
|
85
|
+
options = args.extract_options!
|
86
|
+
method = args.first
|
87
|
+
|
88
|
+
config.scope_to = block_given? ? block : method
|
89
|
+
config.scope_to_association_method = options[:association_method]
|
90
|
+
end
|
91
|
+
|
92
|
+
# Create a scope
|
93
|
+
def scope(*args, &block)
|
94
|
+
config.scope(*args, &block)
|
95
|
+
end
|
96
|
+
|
97
|
+
def action_item(options = {}, &block)
|
98
|
+
controller.action_item(options, &block)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Configure the index page for the resource
|
102
|
+
def index(options = {}, &block)
|
103
|
+
options[:as] ||= :table
|
104
|
+
controller.set_page_config :index, options, &block
|
105
|
+
end
|
106
|
+
|
107
|
+
# Configure the show page for the resource
|
108
|
+
def show(options = {}, &block)
|
109
|
+
# TODO: controller.set_page_config just sets page_configs on the Resource (config) obj
|
110
|
+
controller.set_page_config :show, options, &block
|
111
|
+
end
|
112
|
+
|
113
|
+
def form(options = {}, &block)
|
114
|
+
options[:block] = block
|
115
|
+
controller.form_config = options
|
116
|
+
end
|
117
|
+
|
118
|
+
# Member Actions give you the functionality of defining both the
|
119
|
+
# action and the route directly from your ActiveAdmin registration
|
120
|
+
# block.
|
121
|
+
#
|
122
|
+
# For example:
|
123
|
+
#
|
124
|
+
# ActiveAdmin.register Post do
|
125
|
+
# member_action :comments do
|
126
|
+
# @post = Post.find(params[:id]
|
127
|
+
# @comments = @post.comments
|
128
|
+
# end
|
129
|
+
# end
|
130
|
+
#
|
131
|
+
# Will create a new controller action comments and will hook it up to
|
132
|
+
# the named route (comments_admin_post_path) /admin/posts/:id/comments
|
133
|
+
#
|
134
|
+
# You can treat everything within the block as a standard Rails controller
|
135
|
+
# action.
|
136
|
+
#
|
137
|
+
def member_action(name, options = {}, &block)
|
138
|
+
config.member_actions << ControllerAction.new(name, options)
|
139
|
+
controller do
|
140
|
+
define_method(name, &block || Proc.new{})
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def collection_action(name, options = {}, &block)
|
145
|
+
config.collection_actions << ControllerAction.new(name, options)
|
146
|
+
controller do
|
147
|
+
define_method(name, &block || Proc.new{})
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Defined Callbacks
|
152
|
+
#
|
153
|
+
# == After Build
|
154
|
+
# Called after the resource is built in the new and create actions.
|
155
|
+
#
|
156
|
+
# ActiveAdmin.register Post do
|
157
|
+
# after_build do |post|
|
158
|
+
# post.author = current_user
|
159
|
+
# end
|
160
|
+
# end
|
161
|
+
#
|
162
|
+
# == Before / After Create
|
163
|
+
# Called before and after a resource is saved to the db on the create action.
|
164
|
+
#
|
165
|
+
# == Before / After Update
|
166
|
+
# Called before and after a resource is saved to the db on the update action.
|
167
|
+
#
|
168
|
+
# == Before / After Save
|
169
|
+
# Called before and after the object is saved in the create and update action.
|
170
|
+
# Note: Gets called after the create and update callbacks
|
171
|
+
#
|
172
|
+
# == Before / After Destroy
|
173
|
+
# Called before and after the object is destroyed from the database.
|
174
|
+
#
|
175
|
+
delegate :before_build, :after_build, :to => :controller
|
176
|
+
delegate :before_create, :after_create, :to => :controller
|
177
|
+
delegate :before_update, :after_update, :to => :controller
|
178
|
+
delegate :before_save, :after_save, :to => :controller
|
179
|
+
delegate :before_destroy, :after_destroy, :to => :controller
|
180
|
+
|
181
|
+
# Filters
|
182
|
+
delegate :filter, :to => :controller
|
183
|
+
|
184
|
+
# Sidebar
|
185
|
+
delegate :sidebar, :to => :controller
|
186
|
+
|
187
|
+
# Standard rails filters
|
188
|
+
delegate :before_filter, :after_filter, :around_filter, :to => :controller
|
189
|
+
|
190
|
+
# Specify which actions to create in the controller
|
191
|
+
#
|
192
|
+
# Eg:
|
193
|
+
#
|
194
|
+
# ActiveAdmin.register Post do
|
195
|
+
# actions :index, :show
|
196
|
+
# end
|
197
|
+
#
|
198
|
+
# Will only create the index and show actions (no create, update or delete)
|
199
|
+
delegate :actions, :to => :controller
|
200
|
+
|
201
|
+
end
|
202
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
|
3
|
+
class EventDispatcher
|
4
|
+
def initialize
|
5
|
+
@events = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def clear_all_subscribers!
|
9
|
+
@events = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def subscribe(event, &block)
|
13
|
+
@events[event] ||= []
|
14
|
+
@events[event] << block
|
15
|
+
end
|
16
|
+
|
17
|
+
def subscribers(event)
|
18
|
+
@events[event] || []
|
19
|
+
end
|
20
|
+
|
21
|
+
def dispatch(event, *args)
|
22
|
+
subscribers(event).each do |subscriber|
|
23
|
+
subscriber.call(*args)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# ActiveAdmin::Event is set to a dispatcher
|
29
|
+
Event = EventDispatcher.new
|
30
|
+
|
31
|
+
end
|
@@ -1,68 +1,55 @@
|
|
1
|
+
require 'formtastic'
|
2
|
+
|
1
3
|
module ActiveAdmin
|
2
4
|
class FormBuilder < ::Formtastic::SemanticFormBuilder
|
5
|
+
|
6
|
+
attr_reader :form_buffers
|
3
7
|
|
4
8
|
def initialize(*args)
|
5
9
|
@form_buffers = ["".html_safe]
|
6
|
-
@skip_form_buffer = false
|
7
10
|
super
|
8
11
|
end
|
9
12
|
|
10
|
-
# Sets up buffering for this form which allows
|
11
|
-
# the entire form to be built in a block outside
|
12
|
-
# of the context of the view. Ie: you don't need
|
13
|
-
# to use erb tags.
|
14
|
-
def self.buffer_output_for(*method_names)
|
15
|
-
method_names.each do |method_name|
|
16
|
-
module_eval <<-EOF
|
17
|
-
def #{method_name}(*args)
|
18
|
-
content = block_given? ? with_new_form_buffer{ super } : super
|
19
|
-
return content if @skip_form_buffer
|
20
|
-
@form_buffers.last << content.html_safe
|
21
|
-
end
|
22
|
-
EOF
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
buffer_output_for :submit,
|
27
|
-
:label,
|
28
|
-
:inputs_for_nested_attributes,
|
29
|
-
:semantic_fields_for,
|
30
|
-
:text_field,
|
31
|
-
:text_area,
|
32
|
-
:datetime_select,
|
33
|
-
:time_select,
|
34
|
-
:date_select,
|
35
|
-
:radio_button,
|
36
|
-
:file_field,
|
37
|
-
:hidden_field,
|
38
|
-
:select,
|
39
|
-
:grouped_collection_select,
|
40
|
-
:collection_select
|
41
|
-
|
42
13
|
def inputs(*args, &block)
|
43
14
|
# Store that we are creating inputs without a block
|
44
|
-
@
|
15
|
+
@inputs_with_block = block_given? ? true : false
|
45
16
|
content = with_new_form_buffer { super }
|
46
|
-
|
17
|
+
form_buffers.last << content.html_safe
|
47
18
|
end
|
48
19
|
|
49
20
|
# The input method returns a properly formatted string for
|
50
21
|
# its contents, so we want to skip the internal buffering
|
51
22
|
# while building up its contents
|
52
23
|
def input(*args)
|
53
|
-
@skip_form_buffer = true
|
54
24
|
content = with_new_form_buffer { super }
|
55
|
-
|
56
|
-
|
57
|
-
@form_buffers.last << content.html_safe
|
25
|
+
return content.html_safe unless @inputs_with_block
|
26
|
+
form_buffers.last << content.html_safe
|
58
27
|
end
|
59
28
|
|
60
29
|
# The buttons method always needs to be wrapped in a new buffer
|
61
30
|
def buttons(*args, &block)
|
62
|
-
content = with_new_form_buffer
|
63
|
-
|
31
|
+
content = with_new_form_buffer do
|
32
|
+
block_given? ? super : super { commit_button_with_cancel_link }
|
33
|
+
end
|
34
|
+
form_buffers.last << content.html_safe
|
64
35
|
end
|
65
36
|
|
37
|
+
def commit_button(*args)
|
38
|
+
content = with_new_form_buffer{ super }
|
39
|
+
form_buffers.last << content.html_safe
|
40
|
+
end
|
41
|
+
|
42
|
+
def cancel_link(url = nil, html_options = {}, li_attributes = {})
|
43
|
+
li_attributes[:class] ||= "cancel"
|
44
|
+
url ||= {:action => "index"}
|
45
|
+
template.content_tag(:li, (template.link_to ActiveAdmin::Iconic.icon(:x) + " Cancel", url, html_options), li_attributes)
|
46
|
+
end
|
47
|
+
|
48
|
+
def commit_button_with_cancel_link
|
49
|
+
content = commit_button
|
50
|
+
content << cancel_link
|
51
|
+
end
|
52
|
+
|
66
53
|
def datepicker_input(method, options)
|
67
54
|
options = options.dup
|
68
55
|
options[:input_html] ||= {}
|
@@ -71,19 +58,50 @@ module ActiveAdmin
|
|
71
58
|
string_input(method, options)
|
72
59
|
end
|
73
60
|
|
74
|
-
|
61
|
+
def has_many(association, options = {}, &block)
|
62
|
+
options = { :for => association }.merge(options)
|
63
|
+
options[:class] ||= ""
|
64
|
+
options[:class] << "inputs has_many_fields"
|
75
65
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
66
|
+
# Add Delete Links
|
67
|
+
form_block = proc do |has_many_form|
|
68
|
+
block.call(has_many_form) + if has_many_form.object.new_record?
|
69
|
+
template.content_tag :li do
|
70
|
+
template.link_to "Delete", "#", :onclick => "$(this).closest('.has_many_fields').remove(); return false;", :class => "button"
|
71
|
+
end
|
72
|
+
else
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
content = with_new_form_buffer do
|
77
|
+
template.content_tag :div, :class => "has_many #{association}" do
|
78
|
+
form_buffers.last << template.content_tag(:h3, association.to_s.titlecase)
|
79
|
+
inputs options, &form_block
|
80
|
+
|
81
|
+
# Capture the ADD JS
|
82
|
+
js = with_new_form_buffer do
|
83
|
+
inputs_for_nested_attributes :for => [association, object.class.reflect_on_association(association).klass.new],
|
84
|
+
:class => "inputs has_many_fields",
|
85
|
+
:for_options => {
|
86
|
+
:child_index => "NEW_RECORD"
|
87
|
+
}, &form_block
|
88
|
+
end
|
89
|
+
|
90
|
+
js = template.escape_javascript(js)
|
91
|
+
js = template.link_to "Add New #{association.to_s.singularize.titlecase}", "#", :onclick => "$(this).before('#{js}'.replace(/NEW_RECORD/g, new Date().getTime())); return false;", :class => "button"
|
92
|
+
|
93
|
+
form_buffers.last << js.html_safe
|
94
|
+
end
|
95
|
+
end
|
96
|
+
form_buffers.last << content.html_safe
|
81
97
|
end
|
82
98
|
|
83
|
-
|
84
|
-
|
99
|
+
private
|
100
|
+
|
101
|
+
def with_new_form_buffer
|
102
|
+
form_buffers << "".html_safe
|
85
103
|
return_value = yield
|
86
|
-
|
104
|
+
form_buffers.pop
|
87
105
|
return_value
|
88
106
|
end
|
89
107
|
|