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,129 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Arbre
|
4
|
+
module HTML
|
5
|
+
|
6
|
+
class Tag < Element
|
7
|
+
attr_reader :attributes
|
8
|
+
|
9
|
+
def initialize(*)
|
10
|
+
super
|
11
|
+
@attributes = Attributes.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def build(*args)
|
15
|
+
super
|
16
|
+
attributes = args.extract_options!
|
17
|
+
self.content = args.first if args.first
|
18
|
+
|
19
|
+
set_for_attribute(attributes.delete(:for))
|
20
|
+
|
21
|
+
attributes.each do |key, value|
|
22
|
+
set_attribute(key, value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_attribute(name, value)
|
27
|
+
@attributes[name.to_sym] = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_attribute(name)
|
31
|
+
@attributes[name.to_sym]
|
32
|
+
end
|
33
|
+
alias :attr :get_attribute
|
34
|
+
|
35
|
+
def has_attribute?(name)
|
36
|
+
@attributes.has_key?(name.to_sym)
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove_attribute(name)
|
40
|
+
@attributes.delete(name.to_sym)
|
41
|
+
end
|
42
|
+
|
43
|
+
def id
|
44
|
+
get_attribute(:id)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Generates and id for the object if it doesn't exist already
|
48
|
+
def id!
|
49
|
+
return id if id
|
50
|
+
self.id = object_id.to_s
|
51
|
+
id
|
52
|
+
end
|
53
|
+
|
54
|
+
def id=(id)
|
55
|
+
set_attribute(:id, id)
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_class(class_names)
|
59
|
+
class_list.add class_names
|
60
|
+
end
|
61
|
+
|
62
|
+
def remove_class(class_names)
|
63
|
+
class_list.delete(class_names)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns a string of classes
|
67
|
+
def class_names
|
68
|
+
class_list.to_html
|
69
|
+
end
|
70
|
+
|
71
|
+
def class_list
|
72
|
+
get_attribute(:class) || set_attribute(:class, ClassList.new)
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_html
|
76
|
+
indent("<#{tag_name}#{attributes_html}>", content, "</#{tag_name}>").html_safe
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
INDENT_SIZE = 2
|
82
|
+
|
83
|
+
def indent(open_tag, child_content, close_tag)
|
84
|
+
spaces = ' ' * indent_level * INDENT_SIZE
|
85
|
+
|
86
|
+
html = ""
|
87
|
+
|
88
|
+
if no_child? || child_is_text?
|
89
|
+
# one line
|
90
|
+
html << spaces << open_tag << child_content << close_tag
|
91
|
+
else
|
92
|
+
# multiple lines
|
93
|
+
html << spaces << open_tag << "\n"
|
94
|
+
html << child_content # the child takes care of its own spaces
|
95
|
+
html << spaces << close_tag
|
96
|
+
end
|
97
|
+
|
98
|
+
html << "\n"
|
99
|
+
|
100
|
+
html
|
101
|
+
end
|
102
|
+
|
103
|
+
def no_child?
|
104
|
+
children.empty?
|
105
|
+
end
|
106
|
+
|
107
|
+
def child_is_text?
|
108
|
+
children.size == 1 && children.first.is_a?(TextNode)
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
def attributes_html
|
113
|
+
attributes.any? ? " " + attributes.to_html : nil
|
114
|
+
end
|
115
|
+
|
116
|
+
def set_for_attribute(record)
|
117
|
+
return unless record
|
118
|
+
set_attribute :id, ActionController::RecordIdentifier.dom_id(record, default_id_for_prefix)
|
119
|
+
add_class ActionController::RecordIdentifier.dom_class(record)
|
120
|
+
end
|
121
|
+
|
122
|
+
def default_id_for_prefix
|
123
|
+
nil
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Arbre
|
4
|
+
module HTML
|
5
|
+
|
6
|
+
class TextNode < Element
|
7
|
+
|
8
|
+
builder_method :text_node
|
9
|
+
|
10
|
+
# Builds a text node from a string
|
11
|
+
def self.from_string(string)
|
12
|
+
node = new
|
13
|
+
node.build(string)
|
14
|
+
node
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_child(*args)
|
18
|
+
raise "TextNodes do not have children"
|
19
|
+
end
|
20
|
+
|
21
|
+
def build(string)
|
22
|
+
@content = string
|
23
|
+
end
|
24
|
+
|
25
|
+
def tag_name
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_html
|
30
|
+
ERB::Util.html_escape(@content.to_html)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module Callbacks
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
module InstanceMethods
|
6
|
+
protected
|
7
|
+
|
8
|
+
# Simple callback system. Implements before and after callbacks for
|
9
|
+
# use within the controllers.
|
10
|
+
#
|
11
|
+
# We didn't use the ActiveSupport callbacks becuase they do not support
|
12
|
+
# passing in any arbitrary object into the callback method (which we
|
13
|
+
# need to do)
|
14
|
+
|
15
|
+
def call_callback_with(method, *args)
|
16
|
+
case method
|
17
|
+
when Symbol
|
18
|
+
send(method, *args)
|
19
|
+
when Proc
|
20
|
+
instance_exec(*args, &method)
|
21
|
+
else
|
22
|
+
raise "Please register with callbacks using a symbol or a block/proc."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module ClassMethods
|
28
|
+
|
29
|
+
# Define a new callback.
|
30
|
+
#
|
31
|
+
# Example:
|
32
|
+
#
|
33
|
+
# class MyClassWithCallbacks
|
34
|
+
# include ActiveAdmin::Callbacks
|
35
|
+
#
|
36
|
+
# define_active_admin_callbacks :save
|
37
|
+
#
|
38
|
+
# before_save do |arg1, arg2|
|
39
|
+
# # runs before save
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# after_save :call_after_save
|
43
|
+
#
|
44
|
+
# def save
|
45
|
+
# # Will run before, yield, then after
|
46
|
+
# run_save_callbacks :arg1, :arg2 do
|
47
|
+
# save!
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# protected
|
52
|
+
#
|
53
|
+
# def call_after_save(arg1, arg2)
|
54
|
+
# # runs after save
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
def define_active_admin_callbacks(*names)
|
59
|
+
names.each do |name|
|
60
|
+
[:before, :after].each do |type|
|
61
|
+
# Create an inheritable accessor array for the callbacks
|
62
|
+
class_inheritable_array "#{type}_#{name}_callbacks".to_sym
|
63
|
+
send("#{type}_#{name}_callbacks=".to_sym, [])
|
64
|
+
|
65
|
+
# Define a method to set the callback
|
66
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
67
|
+
# def self.before_create
|
68
|
+
def self.#{type}_#{name}(method = nil, &block)
|
69
|
+
#{type}_#{name}_callbacks << (method || block)
|
70
|
+
end
|
71
|
+
EOS
|
72
|
+
end
|
73
|
+
|
74
|
+
# Define a method to run the callbacks
|
75
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
76
|
+
def run_#{name}_callbacks(*args)
|
77
|
+
self.class.before_#{name}_callbacks.each{|callback| call_callback_with(callback, *args)}
|
78
|
+
value = yield if block_given?
|
79
|
+
self.class.after_#{name}_callbacks.each{|callback| call_callback_with(callback, *args)}
|
80
|
+
return value
|
81
|
+
end
|
82
|
+
EOS
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'active_admin/comments/configuration'
|
2
|
+
require 'active_admin/comments/comment'
|
3
|
+
require 'active_admin/comments/views'
|
4
|
+
require 'active_admin/comments/show_page_helper'
|
5
|
+
require 'active_admin/comments/namespace_helper'
|
6
|
+
require 'active_admin/comments/resource_helper'
|
7
|
+
|
8
|
+
# Add the comments configuration
|
9
|
+
ActiveAdmin.extend ActiveAdmin::Comments::Configuration
|
10
|
+
|
11
|
+
# Add the comments module to ActiveAdmin::Namespace
|
12
|
+
ActiveAdmin::Namespace.send :include, ActiveAdmin::Comments::NamespaceHelper
|
13
|
+
|
14
|
+
# Add the comments module to ActiveAdmin::Resource
|
15
|
+
ActiveAdmin::Resource.send :include, ActiveAdmin::Comments::ResourceHelper
|
16
|
+
|
17
|
+
# Add the module to the show page
|
18
|
+
ActiveAdmin.view_factory.show_page.send :include, ActiveAdmin::Comments::ShowPageHelper
|
19
|
+
|
20
|
+
# Generate a Comment resource when namespaces are registered
|
21
|
+
ActiveAdmin::Event.subscribe ActiveAdmin::Namespace::RegisterEvent do |namespace|
|
22
|
+
if namespace.comments?
|
23
|
+
namespace.register ActiveAdmin::Comment, :as => 'Comment' do
|
24
|
+
actions :index, :show, :create
|
25
|
+
|
26
|
+
# Don't display in the menu
|
27
|
+
menu false
|
28
|
+
|
29
|
+
# Don't allow comments on comments
|
30
|
+
config.comments = false
|
31
|
+
|
32
|
+
# Filter Comments by date
|
33
|
+
filter :resource_type
|
34
|
+
filter :body
|
35
|
+
filter :created_at
|
36
|
+
|
37
|
+
# Only view comments in this namespace
|
38
|
+
scope :all, :default => true do |comments|
|
39
|
+
comments.where(:namespace => active_admin_config.namespace.name)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Always redirect to the resource on show
|
43
|
+
before_filter :only => :show do
|
44
|
+
flash[:notice] = flash[:notice].dup if flash[:notice]
|
45
|
+
comment = ActiveAdmin::Comment.find(params[:id])
|
46
|
+
resource_config = active_admin_config.namespace.resource_for(comment.resource.class)
|
47
|
+
redirect_to send(resource_config.route_instance_path, comment.resource)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Store the author and namespace
|
51
|
+
before_save do |comment|
|
52
|
+
comment.namespace = active_admin_config.namespace.name
|
53
|
+
comment.author = current_active_admin_user
|
54
|
+
end
|
55
|
+
|
56
|
+
# Display as a table
|
57
|
+
index do
|
58
|
+
column("Resource"){|comment| auto_link(comment.resource) }
|
59
|
+
column("Author"){|comment| auto_link(comment.author) }
|
60
|
+
column :body
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Register for comments when new resources are registered
|
67
|
+
ActiveAdmin::Event.subscribe ActiveAdmin::Resource::RegisterEvent do |resource|
|
68
|
+
if resource.comments?
|
69
|
+
resource.resource.has_many :active_admin_comments, :class_name => "ActiveAdmin::Comment",
|
70
|
+
:as => :resource,
|
71
|
+
:dependent => :destroy
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
|
3
|
+
class Comment < ActiveRecord::Base
|
4
|
+
self.table_name = "active_admin_comments"
|
5
|
+
|
6
|
+
belongs_to :resource, :polymorphic => true
|
7
|
+
belongs_to :author, :polymorphic => true
|
8
|
+
|
9
|
+
validates_presence_of :resource_id
|
10
|
+
validates_presence_of :resource_type
|
11
|
+
validates_presence_of :body
|
12
|
+
validates_presence_of :namespace
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module Comments
|
3
|
+
|
4
|
+
module Configuration
|
5
|
+
|
6
|
+
# Set the namespaces that can create and view comments
|
7
|
+
#
|
8
|
+
# config.allow_comments_in = [:admin, :root]
|
9
|
+
#
|
10
|
+
@@allow_comments_in = [ActiveAdmin.default_namespace]
|
11
|
+
mattr_accessor :allow_comments_in
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module Comments
|
3
|
+
|
4
|
+
# Adds #active_admin_comments to the show page for use
|
5
|
+
# and sets it up on the default main content
|
6
|
+
module ShowPageHelper
|
7
|
+
|
8
|
+
# Add admin comments to the main content if they are
|
9
|
+
# turned on for the current resource
|
10
|
+
def default_main_content
|
11
|
+
super
|
12
|
+
active_admin_comments if active_admin_config.comments?
|
13
|
+
end
|
14
|
+
|
15
|
+
# Display the comments for the resource. Same as calling
|
16
|
+
# #active_admin_comments_for with the current resource
|
17
|
+
def active_admin_comments(*args, &block)
|
18
|
+
active_admin_comments_for(resource, *args, &block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
File without changes
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'active_admin/views'
|
2
|
+
require 'active_admin/views/components/panel'
|
3
|
+
|
4
|
+
module ActiveAdmin
|
5
|
+
module Comments
|
6
|
+
module Views
|
7
|
+
|
8
|
+
class Comments < ActiveAdmin::Views::Panel
|
9
|
+
builder_method :active_admin_comments_for
|
10
|
+
|
11
|
+
def build(record)
|
12
|
+
@record = record
|
13
|
+
super(title_content, :for => record)
|
14
|
+
build_comments
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def title_content
|
20
|
+
"Comments (#{record_comments.count})"
|
21
|
+
end
|
22
|
+
|
23
|
+
def record_comments
|
24
|
+
@record_comments ||= @record.active_admin_comments.where(:namespace => active_admin_namespace.name)
|
25
|
+
end
|
26
|
+
|
27
|
+
def build_comments
|
28
|
+
if record_comments.count > 0
|
29
|
+
record_comments.each do |comment|
|
30
|
+
build_comment(comment)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
build_empty_message
|
34
|
+
end
|
35
|
+
build_comment_form
|
36
|
+
end
|
37
|
+
|
38
|
+
def build_comment(comment)
|
39
|
+
div :for => comment do
|
40
|
+
div :class => "active_admin_comment_meta" do
|
41
|
+
user_name = comment.author ? auto_link(comment.author) : "Anonymous"
|
42
|
+
h4(user_name, :class => "active_admin_comment_author")
|
43
|
+
span(pretty_format(comment.created_at))
|
44
|
+
end
|
45
|
+
div :class => "active_admin_comment_body" do
|
46
|
+
simple_format(comment.body)
|
47
|
+
end
|
48
|
+
div :style => "clear:both;"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def build_empty_message
|
53
|
+
span :class => "empty" do
|
54
|
+
"No comments yet."
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def comment_form_url
|
59
|
+
send(:"#{active_admin_namespace.name}_comments_path")
|
60
|
+
end
|
61
|
+
|
62
|
+
def build_comment_form
|
63
|
+
self << active_admin_form_for(ActiveAdmin::Comment.new, :url => comment_form_url, :html => {:class => "inline_form"}) do |form|
|
64
|
+
form.inputs do
|
65
|
+
form.input :resource_type, :value => @record.class.base_class.name.to_s, :as => :hidden
|
66
|
+
form.input :resource_id, :value => @record.id, :as => :hidden
|
67
|
+
form.input :body, :input_html => {:size => "80x8"}, :label => false
|
68
|
+
end
|
69
|
+
form.buttons do
|
70
|
+
form.commit_button 'Add Comment'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def default_id_for_prefix
|
76
|
+
'active_admin_comments_for'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|