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,95 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class AbstractViewFactory
|
|
3
|
+
@@default_views = {}
|
|
4
|
+
|
|
5
|
+
def self.register(view_hash)
|
|
6
|
+
view_hash.each do |view_key, view_class|
|
|
7
|
+
@@default_views[view_key] = view_class
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def initialize
|
|
12
|
+
@views = {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Register a new view key with the view factory
|
|
16
|
+
#
|
|
17
|
+
# eg:
|
|
18
|
+
#
|
|
19
|
+
# factory = AbstractViewFactory.new
|
|
20
|
+
# factory.register :my_view => SomeViewClass
|
|
21
|
+
#
|
|
22
|
+
# You can setup many at the same time:
|
|
23
|
+
#
|
|
24
|
+
# factory.register :my_view => SomeClass,
|
|
25
|
+
# :another_view => OtherViewClass
|
|
26
|
+
#
|
|
27
|
+
def register(view_hash)
|
|
28
|
+
view_hash.each do |view_key, view_class|
|
|
29
|
+
@views[view_key] = view_class
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def default_for(key)
|
|
34
|
+
@@default_views[key.to_sym]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def has_key?(key)
|
|
38
|
+
@views.has_key?(key.to_sym) || @@default_views.has_key?(key.to_sym)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def [](key)
|
|
42
|
+
get_view_for_key(key)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def []=(key, value)
|
|
46
|
+
set_view_for_key(key, value)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Override respond to to include keys
|
|
50
|
+
def respond_to?(method)
|
|
51
|
+
key = key_from_method_name(method)
|
|
52
|
+
if has_key?(key)
|
|
53
|
+
true
|
|
54
|
+
else
|
|
55
|
+
super
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def method_missing(method, *args)
|
|
62
|
+
key = key_from_method_name(method)
|
|
63
|
+
if has_key?(key)
|
|
64
|
+
if method.to_s.include?('=')
|
|
65
|
+
self.class_eval <<-EOS
|
|
66
|
+
def #{key}=(value)
|
|
67
|
+
set_view_for_key(:#{key}, value)
|
|
68
|
+
end
|
|
69
|
+
EOS
|
|
70
|
+
else
|
|
71
|
+
self.class_eval <<-EOS
|
|
72
|
+
def #{key}
|
|
73
|
+
get_view_for_key(:#{key})
|
|
74
|
+
end
|
|
75
|
+
EOS
|
|
76
|
+
end
|
|
77
|
+
self.send(method, *args)
|
|
78
|
+
else
|
|
79
|
+
super
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def key_from_method_name(method)
|
|
84
|
+
method.to_s.gsub('=', '').to_sym
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def get_view_for_key(key)
|
|
88
|
+
@views[key.to_sym] || @@default_views[key.to_sym]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def set_view_for_key(key, view)
|
|
92
|
+
@views[key.to_sym] = view
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'active_admin/helpers/optional_display'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
module ActionItems
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
self.class_inheritable_accessor :action_items
|
|
9
|
+
self.action_items = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module ClassMethods
|
|
13
|
+
def action_item(options = {}, &block)
|
|
14
|
+
self.action_items << ActiveAdmin::ActionItems::ActionItem.new(options, &block)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def clear_action_items!
|
|
18
|
+
self.action_items = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def action_items_for(action)
|
|
22
|
+
action_items.select{|item| item.display_on?(action) }
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class ActionItem
|
|
27
|
+
include ActiveAdmin::OptionalDisplay
|
|
28
|
+
|
|
29
|
+
attr_accessor :block
|
|
30
|
+
|
|
31
|
+
def initialize(options = {}, &block)
|
|
32
|
+
@options, @block = options, block
|
|
33
|
+
normalize_display_options!
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
require 'active_admin/router'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
class Application
|
|
5
|
+
|
|
6
|
+
# The default namespace to put controllers and routes inside. Set this
|
|
7
|
+
# in config/initializers/active_admin.rb using:
|
|
8
|
+
#
|
|
9
|
+
# config.default_namespace = :super_admin
|
|
10
|
+
#
|
|
11
|
+
attr_accessor_with_default :default_namespace, :admin
|
|
12
|
+
|
|
13
|
+
# The default number of resources to display on index pages
|
|
14
|
+
attr_accessor_with_default :default_per_page, 30
|
|
15
|
+
|
|
16
|
+
# The default sort order for index pages
|
|
17
|
+
attr_accessor_with_default :default_sort_order, 'id_desc'
|
|
18
|
+
|
|
19
|
+
# A hash of all the registered namespaces
|
|
20
|
+
attr_accessor_with_default :namespaces, {}
|
|
21
|
+
|
|
22
|
+
# The title which gets displayed in the main layout
|
|
23
|
+
attr_accessor_with_default :site_title, ""
|
|
24
|
+
|
|
25
|
+
# Load paths for admin configurations. Add folders to this load path
|
|
26
|
+
# to load up other resources for administration. External gems can
|
|
27
|
+
# include their paths in this load path to provide active_admin UIs
|
|
28
|
+
attr_accessor_with_default :load_paths, [File.expand_path('app/admin', Rails.root)]
|
|
29
|
+
|
|
30
|
+
# The view factory to use to generate all the view classes. Take
|
|
31
|
+
# a look at ActiveAdmin::ViewFactory
|
|
32
|
+
attr_accessor_with_default :view_factory, ActiveAdmin::ViewFactory.new
|
|
33
|
+
|
|
34
|
+
# DEPRECATED: This option is deprecated and will be removed. Use
|
|
35
|
+
# the #allow_comments_in option instead
|
|
36
|
+
attr_accessor :admin_notes
|
|
37
|
+
|
|
38
|
+
# The method to call in controllers to get the current user
|
|
39
|
+
attr_accessor_with_default :current_user_method, false
|
|
40
|
+
|
|
41
|
+
# The method to call in the controllers to ensure that there
|
|
42
|
+
# is a currently authenticated admin user
|
|
43
|
+
attr_accessor_with_default :authentication_method, false
|
|
44
|
+
|
|
45
|
+
# Active Admin makes educated guesses when displaying objects, this is
|
|
46
|
+
# the list of methods it tries calling in order
|
|
47
|
+
attr_accessor_with_default :display_name_methods, [ :display_name,
|
|
48
|
+
:full_name,
|
|
49
|
+
:name,
|
|
50
|
+
:username,
|
|
51
|
+
:login,
|
|
52
|
+
:title,
|
|
53
|
+
:email,
|
|
54
|
+
:to_s ]
|
|
55
|
+
|
|
56
|
+
attr_accessor_with_default :views_path, File.expand_path('../views/templates', __FILE__)
|
|
57
|
+
|
|
58
|
+
include AssetRegistration
|
|
59
|
+
|
|
60
|
+
def initialize
|
|
61
|
+
register_default_assets
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def prepare!
|
|
65
|
+
remove_active_admin_load_paths_from_rails_autoload_and_eager_load
|
|
66
|
+
append_active_admin_views_path
|
|
67
|
+
generate_stylesheets
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Registers a brand new configuration for the given resource.
|
|
71
|
+
def register(resource, options = {}, &block)
|
|
72
|
+
namespace_name = options[:namespace] == false ? :root : (options[:namespace] || default_namespace || :root)
|
|
73
|
+
namespace = find_or_create_namespace(namespace_name)
|
|
74
|
+
namespace.register(resource, options, &block)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Creates a namespace for the given name
|
|
78
|
+
def find_or_create_namespace(name)
|
|
79
|
+
return namespaces[name] if namespaces[name]
|
|
80
|
+
namespace = Namespace.new(self, name)
|
|
81
|
+
ActiveAdmin::Event.dispatch ActiveAdmin::Namespace::RegisterEvent, namespace
|
|
82
|
+
namespaces[name] = namespace
|
|
83
|
+
namespace
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
# Stores if everything has been loaded or we need to reload
|
|
88
|
+
@@loaded = false
|
|
89
|
+
|
|
90
|
+
# Returns true if all the configuration files have been loaded.
|
|
91
|
+
def loaded?
|
|
92
|
+
@@loaded
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Removes all the controllers that were defined by registering
|
|
96
|
+
# resources for administration.
|
|
97
|
+
#
|
|
98
|
+
# We remove them, then load them on each request in development
|
|
99
|
+
# to allow for changes without having to restart the server.
|
|
100
|
+
def unload!
|
|
101
|
+
namespaces.values.each{|namespace| namespace.unload! }
|
|
102
|
+
self.namespaces = {}
|
|
103
|
+
@@loaded = false
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Loads all of the ruby files that are within the load path of
|
|
107
|
+
# ActiveAdmin.load_paths. This should load all of the administration
|
|
108
|
+
# UIs so that they are available for the router to proceed.
|
|
109
|
+
#
|
|
110
|
+
# The files are only loaded if we haven't already loaded all the files
|
|
111
|
+
# and they aren't marked for re-loading. To mark the files for re-loading
|
|
112
|
+
# you must first call ActiveAdmin.unload!
|
|
113
|
+
def load!
|
|
114
|
+
# No work to do if we've already loaded
|
|
115
|
+
return false if loaded?
|
|
116
|
+
|
|
117
|
+
# Load files
|
|
118
|
+
files_in_load_path.each{|file| load file }
|
|
119
|
+
|
|
120
|
+
# If no configurations, let's make sure you can still login
|
|
121
|
+
load_default_namespace if namespaces.values.empty?
|
|
122
|
+
|
|
123
|
+
# Load Menus
|
|
124
|
+
namespaces.values.each{|namespace| namespace.load_menu! }
|
|
125
|
+
|
|
126
|
+
@@loaded = true
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Returns ALL the files to load from all the load paths
|
|
130
|
+
def files_in_load_path
|
|
131
|
+
load_paths.flatten.compact.uniq.collect{|path| Dir["#{path}/**/*.rb"] }.flatten
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def router
|
|
135
|
+
@router ||= Router.new(self)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def routes(rails_router)
|
|
139
|
+
# Ensure that all the configurations (which define the routes)
|
|
140
|
+
# are all loaded
|
|
141
|
+
load!
|
|
142
|
+
|
|
143
|
+
router.apply(rails_router)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def load_default_namespace
|
|
147
|
+
find_or_create_namespace(default_namespace)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
#
|
|
151
|
+
# Add before, around and after filters to each registered resource.
|
|
152
|
+
#
|
|
153
|
+
# eg:
|
|
154
|
+
#
|
|
155
|
+
# ActiveAdmin.before_filter :authenticate_admin!
|
|
156
|
+
#
|
|
157
|
+
def before_filter(*args, &block)
|
|
158
|
+
ResourceController.before_filter(*args, &block)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def after_filter(*args, &block)
|
|
162
|
+
ResourceController.after_filter(*args, &block)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def around_filter(*args, &block)
|
|
166
|
+
ResourceController.around_filter(*args, &block)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Helper method to add a dashboard section
|
|
170
|
+
def dashboard_section(name, options = {}, &block)
|
|
171
|
+
ActiveAdmin::Dashboards.add_section(name, options, &block)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
private
|
|
175
|
+
|
|
176
|
+
def register_default_assets
|
|
177
|
+
register_stylesheet 'admin/active_admin.css'
|
|
178
|
+
register_javascript 'active_admin_vendor.js'
|
|
179
|
+
register_javascript 'active_admin.js'
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Since we're dealing with all our own file loading, we need
|
|
183
|
+
# to remove our paths from the ActiveSupport autoload paths.
|
|
184
|
+
# If not, file naming becomes very important and can cause clashes.
|
|
185
|
+
def remove_active_admin_load_paths_from_rails_autoload_and_eager_load
|
|
186
|
+
ActiveSupport::Dependencies.autoload_paths.reject!{|path| load_paths.include?(path) }
|
|
187
|
+
# Don't eagerload our configs, we'll deal with them ourselves
|
|
188
|
+
Rails.application.config.eager_load_paths = Rails.application.config.eager_load_paths.reject do |path|
|
|
189
|
+
load_paths.include?(path)
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Add the Active Admin view path to the rails view path
|
|
194
|
+
def append_active_admin_views_path
|
|
195
|
+
ActionController::Base.append_view_path views_path
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def generate_stylesheets
|
|
199
|
+
# Setup SASS
|
|
200
|
+
require 'sass/plugin' # This must be required after initialization
|
|
201
|
+
Sass::Plugin.add_template_location(File.expand_path("../active_admin/stylesheets/", __FILE__), File.join(Sass::Plugin.options[:css_location], 'admin'))
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Arbre
|
|
2
|
+
module HTML
|
|
3
|
+
|
|
4
|
+
class Attributes < Hash
|
|
5
|
+
|
|
6
|
+
def to_html
|
|
7
|
+
self.collect do |name, value|
|
|
8
|
+
"#{html_escape(name)}=\"#{html_escape(value)}\""
|
|
9
|
+
end.join(" ")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
|
|
14
|
+
def html_escape(s)
|
|
15
|
+
ERB::Util.html_escape(s)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
|
|
3
|
+
module Arbre
|
|
4
|
+
module HTML
|
|
5
|
+
|
|
6
|
+
# Holds a set of classes
|
|
7
|
+
class ClassList < Set
|
|
8
|
+
|
|
9
|
+
def add(class_names)
|
|
10
|
+
class_names.to_s.split(" ").each do |class_name|
|
|
11
|
+
super(class_name)
|
|
12
|
+
end
|
|
13
|
+
self
|
|
14
|
+
end
|
|
15
|
+
alias :<< :add
|
|
16
|
+
|
|
17
|
+
def to_s
|
|
18
|
+
to_html
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_html
|
|
22
|
+
to_a.join(" ")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Arbre
|
|
2
|
+
module HTML
|
|
3
|
+
|
|
4
|
+
# Stores a collection of Element objects
|
|
5
|
+
class Collection < Array
|
|
6
|
+
|
|
7
|
+
def +(other)
|
|
8
|
+
self.class.new(super)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def -(other)
|
|
12
|
+
self.class.new(super)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def &(other)
|
|
16
|
+
self.class.new(super)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_html
|
|
20
|
+
self.collect do |element|
|
|
21
|
+
element.to_html
|
|
22
|
+
end.join.html_safe
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Arbre
|
|
2
|
+
module HTML
|
|
3
|
+
|
|
4
|
+
class Document < Tag
|
|
5
|
+
|
|
6
|
+
def build(*args)
|
|
7
|
+
super
|
|
8
|
+
build_head
|
|
9
|
+
build_body
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def document
|
|
13
|
+
self
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def tag_name
|
|
17
|
+
'html'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def doctype
|
|
21
|
+
'<!DOCTYPE html>'.html_safe
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_html
|
|
25
|
+
doctype + super
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
protected
|
|
29
|
+
|
|
30
|
+
def build_head
|
|
31
|
+
@head = head do
|
|
32
|
+
meta :"http-equiv" => "Content-type", :content => "text/html; charset=utf-8"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def build_body
|
|
37
|
+
@body = body
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
module Arbre
|
|
2
|
+
module HTML
|
|
3
|
+
|
|
4
|
+
class Element
|
|
5
|
+
include ::Arbre::HTML
|
|
6
|
+
include ::Arbre::HTML::BuilderMethods
|
|
7
|
+
|
|
8
|
+
attr_accessor :parent
|
|
9
|
+
attr_reader :children
|
|
10
|
+
|
|
11
|
+
def self.builder_method(method_name)
|
|
12
|
+
::Arbre::HTML::BuilderMethods.class_eval <<-EOF, __FILE__, __LINE__
|
|
13
|
+
def #{method_name}(*args, &block)
|
|
14
|
+
insert_tag #{self.name}, *args, &block
|
|
15
|
+
end
|
|
16
|
+
EOF
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def initialize(assigns = {}, helpers = nil)
|
|
20
|
+
@_assigns, @_helpers = assigns, helpers
|
|
21
|
+
@children = Collection.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def assigns
|
|
25
|
+
@_assigns
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def helpers
|
|
29
|
+
@_helpers
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def tag_name
|
|
33
|
+
@tag_name ||= self.class.name.demodulize.downcase
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def build(*args, &block)
|
|
37
|
+
# Render the block passing ourselves in
|
|
38
|
+
insert_text_node_if_string(block.call(self)) if block
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def add_child(child)
|
|
42
|
+
return unless child
|
|
43
|
+
|
|
44
|
+
if child.is_a?(Array)
|
|
45
|
+
child.each{|item| add_child(item) }
|
|
46
|
+
return @children
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# If its not an element, wrap it in a TextNode
|
|
50
|
+
unless child.is_a?(Element)
|
|
51
|
+
child = TextNode.from_string(child)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if child.respond_to?(:parent)
|
|
55
|
+
# Remove the child
|
|
56
|
+
child.parent.remove_child(child) if child.parent
|
|
57
|
+
# Set ourselves as the parent
|
|
58
|
+
child.parent = self
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
@children << child
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def remove_child(child)
|
|
65
|
+
child.parent = nil if child.respond_to?(:parent=)
|
|
66
|
+
@children.delete(child)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def <<(child)
|
|
70
|
+
add_child(child)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def parent=(parent)
|
|
74
|
+
@parent = parent
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def parent?
|
|
78
|
+
!@parent.nil?
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def document
|
|
82
|
+
parent.document if parent?
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def content=(contents)
|
|
86
|
+
clear_children!
|
|
87
|
+
add_child(contents)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def get_elements_by_tag_name(tag_name)
|
|
91
|
+
elements = Collection.new
|
|
92
|
+
children.each do |child|
|
|
93
|
+
elements << child if child.tag_name == tag_name
|
|
94
|
+
elements.concat(child.get_elements_by_tag_name(tag_name))
|
|
95
|
+
end
|
|
96
|
+
elements
|
|
97
|
+
end
|
|
98
|
+
alias_method :find_by_tag, :get_elements_by_tag_name
|
|
99
|
+
|
|
100
|
+
def content
|
|
101
|
+
children.to_html
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def html_safe
|
|
105
|
+
to_html
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def indent_level
|
|
109
|
+
parent? ? parent.indent_level + 1 : 0
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def each(&block)
|
|
113
|
+
[to_html].each(&block)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def to_s
|
|
117
|
+
to_html
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def to_str
|
|
121
|
+
to_s
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def to_html
|
|
125
|
+
content
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def +(element)
|
|
129
|
+
case element
|
|
130
|
+
when Element, Collection
|
|
131
|
+
else
|
|
132
|
+
element = TextNode.from_string(element)
|
|
133
|
+
end
|
|
134
|
+
Collection.new([self]) + element
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def to_ary
|
|
138
|
+
Collection.new [self]
|
|
139
|
+
end
|
|
140
|
+
alias_method :to_a, :to_ary
|
|
141
|
+
|
|
142
|
+
private
|
|
143
|
+
|
|
144
|
+
# Resets the Elements children
|
|
145
|
+
def clear_children!
|
|
146
|
+
@children.clear
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
module Arbre
|
|
2
|
+
module HTML
|
|
3
|
+
def current_dom_context
|
|
4
|
+
@__current_dom_element__ ||= Arbre::Context.new(assigns, helpers)
|
|
5
|
+
@__current_dom_element__.current_dom_context
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def helpers
|
|
9
|
+
@_helpers
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def method_missing(name, *args, &block)
|
|
13
|
+
if current_dom_context.respond_to?(name)
|
|
14
|
+
current_dom_context.send name, *args, &block
|
|
15
|
+
elsif assigns && assigns.has_key?(name)
|
|
16
|
+
assigns[name]
|
|
17
|
+
elsif helpers.respond_to?(name)
|
|
18
|
+
helpers.send(name, *args, &block)
|
|
19
|
+
else
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
module BuilderMethods
|
|
25
|
+
def build_tag(klass, *args, &block)
|
|
26
|
+
tag = klass.new(assigns, helpers)
|
|
27
|
+
|
|
28
|
+
# If you passed in a block and want the object
|
|
29
|
+
if block_given? && block.arity > 0
|
|
30
|
+
# Set out context to the tag, and pass responsibility to the tag
|
|
31
|
+
with_current_dom_context tag do
|
|
32
|
+
tag.build(*args, &block)
|
|
33
|
+
end
|
|
34
|
+
else
|
|
35
|
+
# Build the tag
|
|
36
|
+
tag.build(*args)
|
|
37
|
+
|
|
38
|
+
# Render the blocks contents
|
|
39
|
+
if block_given?
|
|
40
|
+
with_current_dom_context tag do
|
|
41
|
+
insert_text_node_if_string(yield)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
tag
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def insert_tag(klass, *args, &block)
|
|
50
|
+
tag = build_tag(klass, *args, &block)
|
|
51
|
+
current_dom_context.add_child(tag)
|
|
52
|
+
tag
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def current_dom_context
|
|
56
|
+
@__current_dom_element_buffer__ ||= [self]
|
|
57
|
+
current_element = @__current_dom_element_buffer__.last
|
|
58
|
+
if current_element == self
|
|
59
|
+
self
|
|
60
|
+
else
|
|
61
|
+
current_element.current_dom_context
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def with_current_dom_context(tag)
|
|
66
|
+
raise ArgumentError, "Can't be in the context of nil. #{@__current_dom_element_buffer__.inspect}" unless tag
|
|
67
|
+
current_dom_context # Ensure a context is setup
|
|
68
|
+
@__current_dom_element_buffer__.push tag
|
|
69
|
+
yield
|
|
70
|
+
@__current_dom_element_buffer__.pop
|
|
71
|
+
end
|
|
72
|
+
alias_method :within, :with_current_dom_context
|
|
73
|
+
|
|
74
|
+
# Inserts a text node if the tag is a string
|
|
75
|
+
def insert_text_node_if_string(tag)
|
|
76
|
+
if tag.is_a?(String)
|
|
77
|
+
current_dom_context << TextNode.from_string(tag)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|