saulolso-activeadmin 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +32 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.rdoc +76 -0
- data/Gemfile +26 -0
- data/LICENSE +25 -0
- data/README.rdoc +450 -0
- data/Rakefile +100 -0
- data/activeadmin.gemspec +28 -0
- data/cucumber.yml +2 -0
- data/features/comments/commenting.feature +99 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +77 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/format_as_csv.feature +45 -0
- data/features/index/formats.feature +10 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +50 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +79 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +23 -0
- data/features/menu.feature +26 -0
- data/features/new_page.feature +75 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_resources.feature +33 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +33 -0
- data/features/sidebar_sections.feature +127 -0
- data/features/specifying_actions.feature +60 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +67 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +15 -0
- data/features/step_definitions/comment_steps.rb +8 -0
- data/features/step_definitions/configuration_steps.rb +31 -0
- data/features/step_definitions/dashboard_steps.rb +11 -0
- data/features/step_definitions/factory_steps.rb +28 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +34 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/menu_steps.rb +7 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +11 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +20 -0
- data/features/step_definitions/web_steps.rb +219 -0
- data/features/sti_resource.feature +49 -0
- data/features/support/env.rb +92 -0
- data/features/support/paths.rb +48 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +37 -0
- data/lib/active_admin/application.rb +204 -0
- data/lib/active_admin/arbre/attributes.rb +20 -0
- data/lib/active_admin/arbre/class_list.rb +28 -0
- data/lib/active_admin/arbre/collection.rb +27 -0
- data/lib/active_admin/arbre/context.rb +8 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/document.rb +42 -0
- data/lib/active_admin/arbre/element.rb +151 -0
- data/lib/active_admin/arbre/html.rb +84 -0
- data/lib/active_admin/arbre/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/tag.rb +137 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/comments/comment.rb +21 -0
- data/lib/active_admin/comments/configuration.rb +18 -0
- data/lib/active_admin/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/comments/resource_helper.rb +17 -0
- data/lib/active_admin/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments.rb +88 -0
- data/lib/active_admin/component.rb +22 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +45 -0
- data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +215 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +109 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/locales/da.yml +26 -0
- data/lib/active_admin/locales/en.yml +34 -0
- data/lib/active_admin/locales/es.yml +34 -0
- data/lib/active_admin/locales/pt.yml +34 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +198 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource.rb +229 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +79 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +144 -0
- data/lib/active_admin/resource_controller/filters.rb +58 -0
- data/lib/active_admin/resource_controller/form.rb +42 -0
- data/lib/active_admin/resource_controller/menu.rb +29 -0
- data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
- data/lib/active_admin/resource_controller/scoping.rb +36 -0
- data/lib/active_admin/resource_controller/sidebars.rb +38 -0
- data/lib/active_admin/resource_controller.rb +119 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +43 -0
- data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
- data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
- data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
- data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
- data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
- data/lib/active_admin/stylesheets/active_admin.scss +429 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +21 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
- data/lib/active_admin/view_helpers/display_helper.rb +38 -0
- data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
- data/lib/active_admin/view_helpers/form_helper.rb +12 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
- data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/table_helper.rb +12 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/view_helpers.rb +23 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/attributes_table.rb +66 -0
- data/lib/active_admin/views/components/columns.rb +47 -0
- data/lib/active_admin/views/components/paginated_collection.rb +92 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +70 -0
- data/lib/active_admin/views/components/sidebar_section.rb +30 -0
- data/lib/active_admin/views/components/status_tag.rb +55 -0
- data/lib/active_admin/views/components/table_for.rb +193 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
- data/lib/active_admin/views/header_renderer.rb +37 -0
- data/lib/active_admin/views/index_as_block.rb +24 -0
- data/lib/active_admin/views/index_as_blog.rb +89 -0
- data/lib/active_admin/views/index_as_grid.rb +49 -0
- data/lib/active_admin/views/index_as_table.rb +75 -0
- data/lib/active_admin/views/pages/base.rb +144 -0
- data/lib/active_admin/views/pages/dashboard.rb +59 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +66 -0
- data/lib/active_admin/views/pages/new.rb +27 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +58 -0
- data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
- data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
- data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
- data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
- data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +71 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
- data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
- data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
- data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/spec_helper.rb +156 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +32 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +88 -0
- data/spec/unit/action_items_spec.rb +27 -0
- data/spec/unit/application_spec.rb +67 -0
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +224 -0
- data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
- data/spec/unit/arbre/html/tag_spec.rb +63 -0
- data/spec/unit/arbre/html_spec.rb +210 -0
- data/spec/unit/asset_registration_spec.rb +37 -0
- data/spec/unit/auto_link_spec.rb +39 -0
- data/spec/unit/belongs_to_spec.rb +45 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +57 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/components/attributes_table_spec.rb +100 -0
- data/spec/unit/components/columns_spec.rb +75 -0
- data/spec/unit/components/panel_spec.rb +31 -0
- data/spec/unit/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/components/status_tag_spec.rb +81 -0
- data/spec/unit/components/table_for_spec.rb +130 -0
- data/spec/unit/controller_filters_spec.rb +27 -0
- data/spec/unit/csv_builder_spec.rb +83 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +56 -0
- data/spec/unit/dashboards_spec.rb +59 -0
- data/spec/unit/display_name_spec.rb +29 -0
- data/spec/unit/event_spec.rb +41 -0
- data/spec/unit/filter_form_builder_spec.rb +179 -0
- data/spec/unit/form_builder_spec.rb +238 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +203 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +147 -0
- data/spec/unit/resource_spec.rb +290 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +85 -0
- data/spec/unit/view_factory_spec.rb +16 -0
- metadata +482 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
# CSVBuilder stores CSV configuration
|
|
3
|
+
#
|
|
4
|
+
# Usage example:
|
|
5
|
+
#
|
|
6
|
+
# csv_builder = CSVBuilder.new
|
|
7
|
+
# csv_builder.column :id
|
|
8
|
+
# csv_builder.column("Name") { |resource| resource.full_name }
|
|
9
|
+
#
|
|
10
|
+
class CSVBuilder
|
|
11
|
+
|
|
12
|
+
# Return a default CSVBuilder for a resource
|
|
13
|
+
# The CSVBuilder's columns would be Id followed by this
|
|
14
|
+
# resource's content columns
|
|
15
|
+
def self.default_for_resource(resource)
|
|
16
|
+
new.tap do |csv_builder|
|
|
17
|
+
csv_builder.column(:id)
|
|
18
|
+
resource.content_columns.each do |content_column|
|
|
19
|
+
csv_builder.column(content_column.name.to_sym)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
attr_reader :columns
|
|
25
|
+
|
|
26
|
+
def initialize(&block)
|
|
27
|
+
@columns = []
|
|
28
|
+
instance_eval &block if block_given?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Add a column
|
|
32
|
+
def column(name, &block)
|
|
33
|
+
@columns << Column.new(name, block)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class Column
|
|
37
|
+
attr_reader :name, :data
|
|
38
|
+
|
|
39
|
+
def initialize(name, block = nil)
|
|
40
|
+
@name = name.is_a?(Symbol) ? name.to_s.titleize : name
|
|
41
|
+
@data = block || name.to_sym
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Dashboards
|
|
3
|
+
class DashboardController < ResourceController
|
|
4
|
+
|
|
5
|
+
before_filter :skip_sidebar!
|
|
6
|
+
|
|
7
|
+
actions :index
|
|
8
|
+
|
|
9
|
+
clear_action_items!
|
|
10
|
+
|
|
11
|
+
def index
|
|
12
|
+
@dashboard_sections = find_sections
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
protected
|
|
16
|
+
|
|
17
|
+
# Override _prefix so we force ActionController to render
|
|
18
|
+
# the views from active_admin/dashboard instead of default path.
|
|
19
|
+
def _prefix
|
|
20
|
+
'active_admin/dashboard'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def set_current_tab
|
|
24
|
+
@current_tab = "Dashboard"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def find_sections
|
|
28
|
+
ActiveAdmin::Dashboards.sections_for_namespace(namespace)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def namespace
|
|
32
|
+
class_name = self.class.name
|
|
33
|
+
if class_name.include?('::')
|
|
34
|
+
self.class.name.split('::').first.underscore.to_sym
|
|
35
|
+
else
|
|
36
|
+
:root
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Return the current menu for the view. This is a helper method
|
|
41
|
+
def current_menu
|
|
42
|
+
ActiveAdmin.application.namespaces[namespace].menu
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Dashboards
|
|
3
|
+
class Section
|
|
4
|
+
|
|
5
|
+
DEFAULT_PRIORITY = 10
|
|
6
|
+
|
|
7
|
+
attr_accessor :name, :block
|
|
8
|
+
attr_reader :namespace, :options
|
|
9
|
+
|
|
10
|
+
def initialize(namespace, name, options = {}, &block)
|
|
11
|
+
@namespace = namespace
|
|
12
|
+
@name = name
|
|
13
|
+
@options = options
|
|
14
|
+
@block = block
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def priority
|
|
18
|
+
@options[:priority] || DEFAULT_PRIORITY
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def icon
|
|
22
|
+
@options[:icon]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Sort by priority then by name
|
|
26
|
+
def <=>(other)
|
|
27
|
+
result = priority <=> other.priority
|
|
28
|
+
result = name.to_s <=> other.name.to_s if result == 0
|
|
29
|
+
result
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Dashboards
|
|
3
|
+
|
|
4
|
+
autoload :DashboardController, 'active_admin/dashboards/dashboard_controller'
|
|
5
|
+
autoload :Section, 'active_admin/dashboards/section'
|
|
6
|
+
|
|
7
|
+
@@sections = {}
|
|
8
|
+
mattr_accessor :sections
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
|
|
12
|
+
# Eval an entire block in the context of this module to build
|
|
13
|
+
# dashboards quicker.
|
|
14
|
+
#
|
|
15
|
+
# Example:
|
|
16
|
+
#
|
|
17
|
+
# ActiveAdmin::Dashboards.build do
|
|
18
|
+
# section "Recent Post" do
|
|
19
|
+
# # return a list of posts
|
|
20
|
+
# end
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
def build(&block)
|
|
24
|
+
module_eval(&block)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Add a new dashboard section to a namespace. If no namespace is given
|
|
28
|
+
# it will be added to the default namespace.
|
|
29
|
+
def add_section(name, options = {}, &block)
|
|
30
|
+
namespace = options.delete(:namespace) || ActiveAdmin.application.default_namespace || :root
|
|
31
|
+
self.sections[namespace] ||= []
|
|
32
|
+
self.sections[namespace] << Section.new(namespace, name, options, &block)
|
|
33
|
+
self.sections[namespace].sort!
|
|
34
|
+
end
|
|
35
|
+
alias_method :section, :add_section
|
|
36
|
+
|
|
37
|
+
def sections_for_namespace(namespace)
|
|
38
|
+
@@sections[namespace] || []
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def clear_all_sections!
|
|
42
|
+
@@sections = {}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'devise'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
module Devise
|
|
5
|
+
|
|
6
|
+
def self.config
|
|
7
|
+
{
|
|
8
|
+
:path => ActiveAdmin.application.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.application.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,215 @@
|
|
|
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
|
+
# Configure the CSV format
|
|
119
|
+
#
|
|
120
|
+
# For example:
|
|
121
|
+
#
|
|
122
|
+
# csv do
|
|
123
|
+
# column :name
|
|
124
|
+
# column("Author") { |post| post.author.full_name }
|
|
125
|
+
# end
|
|
126
|
+
#
|
|
127
|
+
def csv(&block)
|
|
128
|
+
config.csv_builder = CSVBuilder.new(&block)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Member Actions give you the functionality of defining both the
|
|
132
|
+
# action and the route directly from your ActiveAdmin registration
|
|
133
|
+
# block.
|
|
134
|
+
#
|
|
135
|
+
# For example:
|
|
136
|
+
#
|
|
137
|
+
# ActiveAdmin.register Post do
|
|
138
|
+
# member_action :comments do
|
|
139
|
+
# @post = Post.find(params[:id]
|
|
140
|
+
# @comments = @post.comments
|
|
141
|
+
# end
|
|
142
|
+
# end
|
|
143
|
+
#
|
|
144
|
+
# Will create a new controller action comments and will hook it up to
|
|
145
|
+
# the named route (comments_admin_post_path) /admin/posts/:id/comments
|
|
146
|
+
#
|
|
147
|
+
# You can treat everything within the block as a standard Rails controller
|
|
148
|
+
# action.
|
|
149
|
+
#
|
|
150
|
+
def member_action(name, options = {}, &block)
|
|
151
|
+
config.member_actions << ControllerAction.new(name, options)
|
|
152
|
+
controller do
|
|
153
|
+
define_method(name, &block || Proc.new{})
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def collection_action(name, options = {}, &block)
|
|
158
|
+
config.collection_actions << ControllerAction.new(name, options)
|
|
159
|
+
controller do
|
|
160
|
+
define_method(name, &block || Proc.new{})
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Defined Callbacks
|
|
165
|
+
#
|
|
166
|
+
# == After Build
|
|
167
|
+
# Called after the resource is built in the new and create actions.
|
|
168
|
+
#
|
|
169
|
+
# ActiveAdmin.register Post do
|
|
170
|
+
# after_build do |post|
|
|
171
|
+
# post.author = current_user
|
|
172
|
+
# end
|
|
173
|
+
# end
|
|
174
|
+
#
|
|
175
|
+
# == Before / After Create
|
|
176
|
+
# Called before and after a resource is saved to the db on the create action.
|
|
177
|
+
#
|
|
178
|
+
# == Before / After Update
|
|
179
|
+
# Called before and after a resource is saved to the db on the update action.
|
|
180
|
+
#
|
|
181
|
+
# == Before / After Save
|
|
182
|
+
# Called before and after the object is saved in the create and update action.
|
|
183
|
+
# Note: Gets called after the create and update callbacks
|
|
184
|
+
#
|
|
185
|
+
# == Before / After Destroy
|
|
186
|
+
# Called before and after the object is destroyed from the database.
|
|
187
|
+
#
|
|
188
|
+
delegate :before_build, :after_build, :to => :controller
|
|
189
|
+
delegate :before_create, :after_create, :to => :controller
|
|
190
|
+
delegate :before_update, :after_update, :to => :controller
|
|
191
|
+
delegate :before_save, :after_save, :to => :controller
|
|
192
|
+
delegate :before_destroy, :after_destroy, :to => :controller
|
|
193
|
+
|
|
194
|
+
# Filters
|
|
195
|
+
delegate :filter, :to => :controller
|
|
196
|
+
|
|
197
|
+
# Sidebar
|
|
198
|
+
delegate :sidebar, :to => :controller
|
|
199
|
+
|
|
200
|
+
# Standard rails filters
|
|
201
|
+
delegate :before_filter, :after_filter, :around_filter, :to => :controller
|
|
202
|
+
|
|
203
|
+
# Specify which actions to create in the controller
|
|
204
|
+
#
|
|
205
|
+
# Eg:
|
|
206
|
+
#
|
|
207
|
+
# ActiveAdmin.register Post do
|
|
208
|
+
# actions :index, :show
|
|
209
|
+
# end
|
|
210
|
+
#
|
|
211
|
+
# Will only create the index and show actions (no create, update or delete)
|
|
212
|
+
delegate :actions, :to => :controller
|
|
213
|
+
|
|
214
|
+
end
|
|
215
|
+
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
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require 'formtastic'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
class FormBuilder < ::Formtastic::SemanticFormBuilder
|
|
5
|
+
|
|
6
|
+
attr_reader :form_buffers
|
|
7
|
+
|
|
8
|
+
def initialize(*args)
|
|
9
|
+
@form_buffers = ["".html_safe]
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def inputs(*args, &block)
|
|
14
|
+
# Store that we are creating inputs without a block
|
|
15
|
+
@inputs_with_block = block_given? ? true : false
|
|
16
|
+
content = with_new_form_buffer { super }
|
|
17
|
+
form_buffers.last << content.html_safe
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# The input method returns a properly formatted string for
|
|
21
|
+
# its contents, so we want to skip the internal buffering
|
|
22
|
+
# while building up its contents
|
|
23
|
+
def input(*args)
|
|
24
|
+
content = with_new_form_buffer { super }
|
|
25
|
+
return content.html_safe unless @inputs_with_block
|
|
26
|
+
form_buffers.last << content.html_safe
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# The buttons method always needs to be wrapped in a new buffer
|
|
30
|
+
def buttons(*args, &block)
|
|
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
|
|
35
|
+
end
|
|
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 I18n.t('active_admin.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
|
+
|
|
53
|
+
def datepicker_input(method, options)
|
|
54
|
+
options = options.dup
|
|
55
|
+
options[:input_html] ||= {}
|
|
56
|
+
options[:input_html][:class] = [options[:input_html][:class], "datepicker"].compact.join(' ')
|
|
57
|
+
options[:input_html][:size] ||= "10"
|
|
58
|
+
string_input(method, options)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def has_many(association, options = {}, &block)
|
|
62
|
+
options = { :for => association }.merge(options)
|
|
63
|
+
options[:class] ||= ""
|
|
64
|
+
options[:class] << "inputs has_many_fields"
|
|
65
|
+
|
|
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 I18n.t('active_admin.has_many_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 I18n.t('active_admin.has_many_new', :model => 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
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def with_new_form_buffer
|
|
102
|
+
form_buffers << "".html_safe
|
|
103
|
+
return_value = yield
|
|
104
|
+
form_buffers.pop
|
|
105
|
+
return_value
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
# Shareable module to give a #display_on?(action) method
|
|
4
|
+
# which returns true or false depending on an options hash.
|
|
5
|
+
#
|
|
6
|
+
# The options hash accepts:
|
|
7
|
+
#
|
|
8
|
+
# :only => :index
|
|
9
|
+
# :only => [:index, :show]
|
|
10
|
+
# :except => :index
|
|
11
|
+
# :except => [:index, :show]
|
|
12
|
+
#
|
|
13
|
+
# call #normalize_display_options! after @options has been set
|
|
14
|
+
# to ensure that the display options are setup correctly
|
|
15
|
+
|
|
16
|
+
module OptionalDisplay
|
|
17
|
+
def display_on?(action)
|
|
18
|
+
return @options[:only].include?(action.to_sym) if @options[:only]
|
|
19
|
+
return !@options[:except].include?(action.to_sym) if @options[:except]
|
|
20
|
+
true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def normalize_display_options!
|
|
26
|
+
if @options[:only]
|
|
27
|
+
@options[:only] = @options[:only].is_a?(Array) ? @options[:only] : [@options[:only]]
|
|
28
|
+
end
|
|
29
|
+
if @options[:except]
|
|
30
|
+
@options[:except] = @options[:except].is_a?(Array) ? @options[:except] : [@options[:except]]
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|