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.
Files changed (255) hide show
  1. data/.document +5 -0
  2. data/.gitignore +32 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.rdoc +76 -0
  5. data/Gemfile +26 -0
  6. data/LICENSE +25 -0
  7. data/README.rdoc +450 -0
  8. data/Rakefile +100 -0
  9. data/activeadmin.gemspec +28 -0
  10. data/cucumber.yml +2 -0
  11. data/features/comments/commenting.feature +99 -0
  12. data/features/comments/viewing_index.feature +19 -0
  13. data/features/dashboard.feature +26 -0
  14. data/features/edit_page.feature +77 -0
  15. data/features/first_boot.feature +16 -0
  16. data/features/global_navigation.feature +30 -0
  17. data/features/index/format_as_csv.feature +45 -0
  18. data/features/index/formats.feature +10 -0
  19. data/features/index/index_as_block.feature +15 -0
  20. data/features/index/index_as_blog.feature +50 -0
  21. data/features/index/index_as_grid.feature +45 -0
  22. data/features/index/index_as_table.feature +79 -0
  23. data/features/index/index_scopes.feature +52 -0
  24. data/features/index/pagination.feature +23 -0
  25. data/features/menu.feature +26 -0
  26. data/features/new_page.feature +75 -0
  27. data/features/registering_assets.feature +35 -0
  28. data/features/registering_resources.feature +33 -0
  29. data/features/show/default_content.feature +43 -0
  30. data/features/show/page_title.feature +33 -0
  31. data/features/sidebar_sections.feature +127 -0
  32. data/features/specifying_actions.feature +60 -0
  33. data/features/step_definitions/action_item_steps.rb +7 -0
  34. data/features/step_definitions/additional_web_steps.rb +67 -0
  35. data/features/step_definitions/asset_steps.rb +7 -0
  36. data/features/step_definitions/attribute_steps.rb +15 -0
  37. data/features/step_definitions/comment_steps.rb +8 -0
  38. data/features/step_definitions/configuration_steps.rb +31 -0
  39. data/features/step_definitions/dashboard_steps.rb +11 -0
  40. data/features/step_definitions/factory_steps.rb +28 -0
  41. data/features/step_definitions/flash_steps.rb +3 -0
  42. data/features/step_definitions/format_steps.rb +34 -0
  43. data/features/step_definitions/index_scope_steps.rb +20 -0
  44. data/features/step_definitions/menu_steps.rb +7 -0
  45. data/features/step_definitions/pagination_steps.rb +8 -0
  46. data/features/step_definitions/sidebar_steps.rb +11 -0
  47. data/features/step_definitions/tab_steps.rb +3 -0
  48. data/features/step_definitions/user_steps.rb +20 -0
  49. data/features/step_definitions/web_steps.rb +219 -0
  50. data/features/sti_resource.feature +49 -0
  51. data/features/support/env.rb +92 -0
  52. data/features/support/paths.rb +48 -0
  53. data/features/users/logging_in.feature +34 -0
  54. data/features/users/logging_out.feature +13 -0
  55. data/lib/active_admin/abstract_view_factory.rb +95 -0
  56. data/lib/active_admin/action_items.rb +37 -0
  57. data/lib/active_admin/application.rb +204 -0
  58. data/lib/active_admin/arbre/attributes.rb +20 -0
  59. data/lib/active_admin/arbre/class_list.rb +28 -0
  60. data/lib/active_admin/arbre/collection.rb +27 -0
  61. data/lib/active_admin/arbre/context.rb +8 -0
  62. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  63. data/lib/active_admin/arbre/document.rb +42 -0
  64. data/lib/active_admin/arbre/element.rb +151 -0
  65. data/lib/active_admin/arbre/html.rb +84 -0
  66. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  67. data/lib/active_admin/arbre/tag.rb +137 -0
  68. data/lib/active_admin/arbre/text_node.rb +35 -0
  69. data/lib/active_admin/arbre.rb +23 -0
  70. data/lib/active_admin/asset_registration.rb +34 -0
  71. data/lib/active_admin/callbacks.rb +87 -0
  72. data/lib/active_admin/comments/comment.rb +21 -0
  73. data/lib/active_admin/comments/configuration.rb +18 -0
  74. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  75. data/lib/active_admin/comments/resource_helper.rb +17 -0
  76. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  77. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  78. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  79. data/lib/active_admin/comments/views.rb +3 -0
  80. data/lib/active_admin/comments.rb +88 -0
  81. data/lib/active_admin/component.rb +22 -0
  82. data/lib/active_admin/controller_action.rb +12 -0
  83. data/lib/active_admin/csv_builder.rb +45 -0
  84. data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
  85. data/lib/active_admin/dashboards/section.rb +34 -0
  86. data/lib/active_admin/dashboards.rb +48 -0
  87. data/lib/active_admin/devise.rb +43 -0
  88. data/lib/active_admin/dsl.rb +215 -0
  89. data/lib/active_admin/event.rb +31 -0
  90. data/lib/active_admin/form_builder.rb +109 -0
  91. data/lib/active_admin/helpers/optional_display.rb +34 -0
  92. data/lib/active_admin/iconic/icons.rb +142 -0
  93. data/lib/active_admin/iconic.rb +51 -0
  94. data/lib/active_admin/locales/da.yml +26 -0
  95. data/lib/active_admin/locales/en.yml +34 -0
  96. data/lib/active_admin/locales/es.yml +34 -0
  97. data/lib/active_admin/locales/pt.yml +34 -0
  98. data/lib/active_admin/menu.rb +42 -0
  99. data/lib/active_admin/menu_item.rb +73 -0
  100. data/lib/active_admin/namespace.rb +198 -0
  101. data/lib/active_admin/page_config.rb +15 -0
  102. data/lib/active_admin/renderer.rb +87 -0
  103. data/lib/active_admin/resource/belongs_to.rb +31 -0
  104. data/lib/active_admin/resource.rb +229 -0
  105. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  106. data/lib/active_admin/resource_controller/actions.rb +79 -0
  107. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  108. data/lib/active_admin/resource_controller/collection.rb +144 -0
  109. data/lib/active_admin/resource_controller/filters.rb +58 -0
  110. data/lib/active_admin/resource_controller/form.rb +42 -0
  111. data/lib/active_admin/resource_controller/menu.rb +29 -0
  112. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  113. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  114. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  115. data/lib/active_admin/resource_controller.rb +119 -0
  116. data/lib/active_admin/router.rb +85 -0
  117. data/lib/active_admin/scope.rb +17 -0
  118. data/lib/active_admin/sidebar.rb +43 -0
  119. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  120. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  121. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  122. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  123. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  124. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  125. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  126. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  127. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  128. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  129. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  130. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  131. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  132. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  133. data/lib/active_admin/stylesheets/active_admin.scss +429 -0
  134. data/lib/active_admin/version.rb +3 -0
  135. data/lib/active_admin/view_factory.rb +21 -0
  136. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  137. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  138. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  139. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  140. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  141. data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
  142. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  143. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  144. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  145. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  146. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  147. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  148. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  149. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  150. data/lib/active_admin/view_helpers.rb +23 -0
  151. data/lib/active_admin/views/action_items.rb +17 -0
  152. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  153. data/lib/active_admin/views/components/columns.rb +47 -0
  154. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  155. data/lib/active_admin/views/components/panel.rb +26 -0
  156. data/lib/active_admin/views/components/scopes.rb +70 -0
  157. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  158. data/lib/active_admin/views/components/status_tag.rb +55 -0
  159. data/lib/active_admin/views/components/table_for.rb +193 -0
  160. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  161. data/lib/active_admin/views/header_renderer.rb +37 -0
  162. data/lib/active_admin/views/index_as_block.rb +24 -0
  163. data/lib/active_admin/views/index_as_blog.rb +89 -0
  164. data/lib/active_admin/views/index_as_grid.rb +49 -0
  165. data/lib/active_admin/views/index_as_table.rb +75 -0
  166. data/lib/active_admin/views/pages/base.rb +144 -0
  167. data/lib/active_admin/views/pages/dashboard.rb +59 -0
  168. data/lib/active_admin/views/pages/edit.rb +27 -0
  169. data/lib/active_admin/views/pages/index.rb +66 -0
  170. data/lib/active_admin/views/pages/new.rb +27 -0
  171. data/lib/active_admin/views/pages/show.rb +56 -0
  172. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  173. data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
  174. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  175. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  176. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  177. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  178. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  179. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  180. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  181. data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
  182. data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
  183. data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
  184. data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
  185. data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
  186. data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
  187. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  188. data/lib/active_admin/views.rb +8 -0
  189. data/lib/active_admin.rb +71 -0
  190. data/lib/activeadmin.rb +1 -0
  191. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  192. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  193. data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
  194. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
  195. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
  196. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  197. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  198. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  199. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  200. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  201. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  202. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  203. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  204. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  205. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  206. data/spec/integration/belongs_to_spec.rb +42 -0
  207. data/spec/spec_helper.rb +156 -0
  208. data/spec/support/integration_example_group.rb +33 -0
  209. data/spec/support/rails_template.rb +32 -0
  210. data/spec/support/rails_template_with_data.rb +32 -0
  211. data/spec/support/templates/cucumber.rb +24 -0
  212. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  213. data/spec/unit/action_builder_spec.rb +88 -0
  214. data/spec/unit/action_items_spec.rb +27 -0
  215. data/spec/unit/application_spec.rb +67 -0
  216. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  217. data/spec/unit/arbre/html/element_spec.rb +224 -0
  218. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  219. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  220. data/spec/unit/arbre/html_spec.rb +210 -0
  221. data/spec/unit/asset_registration_spec.rb +37 -0
  222. data/spec/unit/auto_link_spec.rb +39 -0
  223. data/spec/unit/belongs_to_spec.rb +45 -0
  224. data/spec/unit/breadcrumbs_spec.rb +110 -0
  225. data/spec/unit/comments_spec.rb +57 -0
  226. data/spec/unit/component_spec.rb +18 -0
  227. data/spec/unit/components/attributes_table_spec.rb +100 -0
  228. data/spec/unit/components/columns_spec.rb +75 -0
  229. data/spec/unit/components/panel_spec.rb +31 -0
  230. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  231. data/spec/unit/components/status_tag_spec.rb +81 -0
  232. data/spec/unit/components/table_for_spec.rb +130 -0
  233. data/spec/unit/controller_filters_spec.rb +27 -0
  234. data/spec/unit/csv_builder_spec.rb +83 -0
  235. data/spec/unit/dashboard_controller_spec.rb +26 -0
  236. data/spec/unit/dashboard_section_spec.rb +56 -0
  237. data/spec/unit/dashboards_spec.rb +59 -0
  238. data/spec/unit/display_name_spec.rb +29 -0
  239. data/spec/unit/event_spec.rb +41 -0
  240. data/spec/unit/filter_form_builder_spec.rb +179 -0
  241. data/spec/unit/form_builder_spec.rb +238 -0
  242. data/spec/unit/menu_item_spec.rb +143 -0
  243. data/spec/unit/menu_spec.rb +53 -0
  244. data/spec/unit/namespace_spec.rb +203 -0
  245. data/spec/unit/pretty_format_spec.rb +35 -0
  246. data/spec/unit/registration_spec.rb +76 -0
  247. data/spec/unit/renderer_spec.rb +108 -0
  248. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  249. data/spec/unit/resource_controller_spec.rb +147 -0
  250. data/spec/unit/resource_spec.rb +290 -0
  251. data/spec/unit/routing_spec.rb +88 -0
  252. data/spec/unit/scope_spec.rb +31 -0
  253. data/spec/unit/tabs_renderer_spec.rb +85 -0
  254. data/spec/unit/view_factory_spec.rb +16 -0
  255. metadata +482 -0
@@ -0,0 +1,73 @@
1
+ module ActiveAdmin
2
+ class MenuItem
3
+
4
+ # Use this to get to the routes
5
+ include Rails.application.routes.url_helpers
6
+
7
+ attr_accessor :name, :url, :priority, :parent, :display_if_block
8
+
9
+ def initialize(name, url, priority = 10, options = {})
10
+ @name, @url, @priority = name, url, priority
11
+ @children = []
12
+ @cached_url = {} # Stores the cached url in a hash to allow us to change it and still cache it
13
+
14
+ @display_if_block = options.delete(:if)
15
+
16
+ yield(self) if block_given? # Builder style syntax
17
+ end
18
+
19
+ def add(name, url, priority=10, options = {}, &block)
20
+ item = MenuItem.new(name, url, priority, options, &block)
21
+ item.parent = self
22
+ @children << item
23
+ end
24
+
25
+ def children
26
+ @children.sort
27
+ end
28
+
29
+ def parent?
30
+ !parent.nil?
31
+ end
32
+
33
+ def dom_id
34
+ name.downcase.gsub( " ", '_' ).gsub( /[^a-z0-9_]/, '' )
35
+ end
36
+
37
+ def url
38
+ case @url
39
+ when Symbol
40
+ generated = send(@url) # Call the named route
41
+ else
42
+ generated = @url
43
+ end
44
+ @cached_url[@url] ||= generated
45
+ end
46
+
47
+ # Returns an array of the ancestory of this menu item
48
+ # The first item is the immediate parent fo the item
49
+ def ancestors
50
+ return [] unless parent?
51
+ [parent, parent.ancestors].flatten
52
+ end
53
+
54
+ # Returns the child item with the name passed in
55
+ # @blog_menu["Create New"] => <#MenuItem @name="Create New" >
56
+ def [](name)
57
+ @children.find{ |i| i.name == name }
58
+ end
59
+
60
+ def <=>(other)
61
+ result = priority <=> other.priority
62
+ result = name <=> other.name if result == 0
63
+ result
64
+ end
65
+
66
+ # Returns the display if block. If the block was not explicitly defined
67
+ # a default block always returning true will be returned.
68
+ def display_if_block
69
+ @display_if_block || lambda { |_| true }
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,198 @@
1
+ module ActiveAdmin
2
+
3
+ class ResourceMismatchError < StandardError; end
4
+
5
+ # Namespaces are the basic organizing principle for resources within Active Admin
6
+ #
7
+ # Each resource is registered into a namespace which defines:
8
+ # * the namespaceing for routing
9
+ # * the module to namespace controllers
10
+ # * the menu which gets displayed (other resources in the same namespace)
11
+ #
12
+ # For example:
13
+ #
14
+ # ActiveAdmin.register Post, :namespace => :admin
15
+ #
16
+ # Will register the Post model into the "admin" namespace. This will namespace the
17
+ # urls for the resource to "/admin/posts" and will set the controller to
18
+ # Admin::PostsController
19
+ #
20
+ # You can also register to the "root" namespace, which is to say no namespace at all.
21
+ #
22
+ # ActiveAdmin.register Post, :namespace => false
23
+ #
24
+ # This will register the resource to an instantiated namespace called :root. The
25
+ # resource will be accessible from "/posts" and the controller will be PostsController.
26
+ #
27
+ class Namespace
28
+
29
+ RegisterEvent = 'active_admin.namespace.register'.freeze
30
+
31
+ attr_reader :application, :resources, :name, :menu
32
+
33
+ def initialize(application, name)
34
+ @application = application
35
+ @name = name.to_s.underscore.to_sym
36
+ @resources = {}
37
+ @menu = Menu.new
38
+ register_module unless root?
39
+ generate_dashboard_controller
40
+ end
41
+
42
+ # Register a resource into this namespace. The preffered method to access this is to
43
+ # use the global registration ActiveAdmin.register which delegates to the proper
44
+ # namespace instance.
45
+ def register(resource, options = {}, &block)
46
+ config = find_or_build_resource(resource, options)
47
+
48
+ # Register the resource
49
+ register_resource_controller(config)
50
+ parse_registration_block(config, &block) if block_given?
51
+ register_with_menu(config) if config.include_in_menu?
52
+
53
+ # Ensure that the dashboard is generated
54
+ generate_dashboard_controller
55
+
56
+ # Dispatch a registration event
57
+ ActiveAdmin::Event.dispatch ActiveAdmin::Resource::RegisterEvent, config
58
+
59
+ # Return the config
60
+ config
61
+ end
62
+
63
+ def root?
64
+ name == :root
65
+ end
66
+
67
+ # Returns the name of the module if required. Will be nil if none
68
+ # is required.
69
+ #
70
+ # eg:
71
+ # Namespace.new(:admin).module_name # => 'Admin'
72
+ # Namespace.new(:root).module_name # => nil
73
+ #
74
+ def module_name
75
+ return nil if root?
76
+ @module_name ||= name.to_s.camelize
77
+ end
78
+
79
+ # Returns the name of the dashboard controller for this namespace
80
+ def dashboard_controller_name
81
+ [module_name, "DashboardController"].compact.join("::")
82
+ end
83
+
84
+ # Unload all the registered resources for this namespace
85
+ def unload!
86
+ unload_resources!
87
+ unload_dashboard!
88
+ unload_menu!
89
+ end
90
+
91
+ # The menu gets built by Active Admin once all the resources have been
92
+ # loaded. This method gets called to register each resource with the menu system.
93
+ def load_menu!
94
+ register_dashboard
95
+ resources.values.each do |config|
96
+ register_with_menu(config) if config.include_in_menu?
97
+ end
98
+ end
99
+
100
+ # Returns the first registered ActiveAdmin::Resource instance for a given class
101
+ def resource_for(klass)
102
+ resources.values.find{|config| config.resource == klass }
103
+ end
104
+
105
+ protected
106
+
107
+ # Either returns an existing Resource instance or builds a new
108
+ # one for the resource and options
109
+ def find_or_build_resource(resource_class, options)
110
+ resource = Resource.new(self, resource_class, options)
111
+
112
+ # If we've already registered this resource, use the existing
113
+ if @resources.has_key? resource.camelized_resource_name
114
+ existing_resource = @resources[resource.camelized_resource_name]
115
+
116
+ if existing_resource.resource != resource_class
117
+ raise ActiveAdmin::ResourceMismatchError,
118
+ "Tried to register #{resource_class} as #{resource.camelized_resource_name} but already registered to #{resource.resource}"
119
+ end
120
+
121
+ resource = existing_resource
122
+ else
123
+ @resources[resource.camelized_resource_name] = resource
124
+ end
125
+
126
+ resource
127
+ end
128
+
129
+ def unload_resources!
130
+ resources.each do |name, config|
131
+ parent = (module_name || 'Object').constantize
132
+ const_name = config.controller_name.split('::').last
133
+ # Remove the const if its been defined
134
+ parent.send(:remove_const, const_name) if parent.const_defined?(const_name)
135
+ end
136
+ @resources = {}
137
+ end
138
+
139
+ def unload_dashboard!
140
+ # TODO: Only clear out my sections
141
+ Dashboards.clear_all_sections!
142
+ end
143
+
144
+ def unload_menu!
145
+ @menu = Menu.new
146
+ end
147
+
148
+ # Creates a ruby module to namespace all the classes in if required
149
+ def register_module
150
+ eval "module ::#{module_name}; end"
151
+ end
152
+
153
+ def register_resource_controller(config)
154
+ eval "class ::#{config.controller_name} < ActiveAdmin::ResourceController; end"
155
+ config.controller.active_admin_config = config
156
+ end
157
+
158
+ def dsl
159
+ @dsl ||= DSL.new
160
+ end
161
+
162
+ def parse_registration_block(config, &block)
163
+ dsl.run_registration_block(config, &block)
164
+ end
165
+
166
+ # Creates a dashboard controller for this config
167
+ def generate_dashboard_controller
168
+ eval "class ::#{dashboard_controller_name} < ActiveAdmin::Dashboards::DashboardController; end"
169
+ end
170
+
171
+ # Adds the dashboard to the menu
172
+ def register_dashboard
173
+ dashboard_path = root? ? :dashboard_path : "#{name}_dashboard_path".to_sym
174
+ menu.add("Dashboard", dashboard_path, 1) unless menu["Dashboard"]
175
+ end
176
+
177
+ # Does all the work of registernig a config with the menu system
178
+ def register_with_menu(config)
179
+ # The menu we're going to add this resource to
180
+ add_to = menu
181
+
182
+ # Adding as a child
183
+ if config.parent_menu_item_name
184
+ # Create the parent if it doesn't exist
185
+ menu.add(config.parent_menu_item_name, '#') unless menu[config.parent_menu_item_name]
186
+ add_to = menu[config.parent_menu_item_name]
187
+ end
188
+
189
+ # Check if this menu item has already been created
190
+ if add_to[config.menu_item_name]
191
+ # Update the url if it's already been created
192
+ add_to[config.menu_item_name].url = config.route_collection_path
193
+ else
194
+ add_to.add(config.menu_item_name, config.route_collection_path, config.menu_item_priority, { :if => config.menu_item_display_if })
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveAdmin
2
+ class PageConfig
3
+
4
+ attr_reader :block
5
+
6
+ def initialize(options = {}, &block)
7
+ @options, @block = options, block
8
+ end
9
+
10
+ def [](key)
11
+ @options[key]
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,87 @@
1
+ module ActiveAdmin
2
+ class Renderer
3
+
4
+ include ::ActiveAdmin::ViewHelpers::RendererHelper
5
+ include Arbre::HTML
6
+
7
+ attr_accessor :view, :assigns
8
+
9
+ # For use in html
10
+ alias_method :helpers, :view
11
+
12
+ def initialize(view_or_renderer)
13
+ @view = view_or_renderer.is_a?(Renderer) ? view_or_renderer.view : view_or_renderer
14
+
15
+ if view.respond_to?(:assigns)
16
+ @assigns = view.assigns.each { |key, value| instance_variable_set("@#{key}", value) }
17
+ else
18
+ @assigns = {}
19
+ end
20
+ end
21
+
22
+ def method_missing(name,*args, &block)
23
+ if view.respond_to?(name)
24
+ view.send(name, *args, &block)
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+ def to_html(*args)
31
+ end
32
+
33
+ def to_s(*args)
34
+ to_html(*args)
35
+ end
36
+
37
+ def haml(template)
38
+ begin
39
+ require 'haml' unless defined?(Haml)
40
+ rescue LoadError
41
+ raise LoadError, "Please install the HAML gem to use the HAML method with ActiveAdmin"
42
+ end
43
+
44
+ # Find the first non whitespace character in the template
45
+ indent = template.index(/\S/)
46
+
47
+ # Remove the indent if its greater than 0
48
+ if indent > 0
49
+ template = template.split("\n").collect do |line|
50
+ line[indent..-1]
51
+ end.join("\n")
52
+ end
53
+
54
+ # Render it baby
55
+ Haml::Engine.new(template).render(self)
56
+ end
57
+
58
+ protected
59
+
60
+ # Although we make a copy of all the instance variables on the way in, it
61
+ # doesn't mean that we can set new instance variables that are stored in
62
+ # the context of the view. This method allows you to do that. It can be useful
63
+ # when trying to share variables with a layout.
64
+ def set_ivar_on_view(name, value)
65
+ view.instance_variable_set(name, value)
66
+ end
67
+
68
+ # Many times throughout the views we want to either call a method on an object
69
+ # or instance_exec a proc passing in the object as the first parameter. This
70
+ # method takes care of this functionality.
71
+ #
72
+ # call_method_or_proc_on(@my_obj, :size) same as @my_obj.size
73
+ # OR
74
+ # proc = Proc.new{|s| s.size }
75
+ # call_method_or_proc_on(@my_obj, proc)
76
+ #
77
+ def call_method_or_proc_on(obj, symbol_or_proc)
78
+ case symbol_or_proc
79
+ when Symbol, String
80
+ obj.send(symbol_or_proc.to_sym)
81
+ when Proc
82
+ instance_exec(obj, &symbol_or_proc)
83
+ end
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,31 @@
1
+ module ActiveAdmin
2
+ class Resource
3
+ class BelongsTo
4
+
5
+ class TargetNotFound < StandardError; end
6
+
7
+ # The resource which initiated this relationship
8
+ attr_reader :owner
9
+
10
+ def initialize(owner_resource, target_name, options = {})
11
+ @owner, @target_name = owner_resource, target_name
12
+ @options = options
13
+ end
14
+
15
+ # Returns the target resource class or raises an exception if it doesn't exist
16
+ def target
17
+ namespace.resources[@target_name.to_s.camelize] or
18
+ raise TargetNotFound, "Could not find registered resource #{@target_name} in #{namespace.name} with #{namespace.resources.keys.inspect}"
19
+ end
20
+
21
+ def namespace
22
+ @owner.namespace
23
+ end
24
+
25
+ def optional?
26
+ @options[:optional]
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,229 @@
1
+ module ActiveAdmin
2
+
3
+ # Resource is the primary data storage for resource configuration in Active Admin
4
+ #
5
+ # When you register a resource (ActiveAdmin.register Post) you are actually creating
6
+ # a new Resource instance within the given Namespace.
7
+ #
8
+ # The instance of the current resource is available in ResourceController and views
9
+ # by calling the #active_admin_config method.
10
+ #
11
+ class Resource
12
+
13
+ # Event dispatched when a new resource is registered
14
+ RegisterEvent = 'active_admin.resource.register'.freeze
15
+
16
+ autoload :BelongsTo, 'active_admin/resource/belongs_to'
17
+
18
+ # The namespace this resource belongs to
19
+ attr_reader :namespace
20
+
21
+ # The class this resource wraps. If you register the Post model, Resource#resource
22
+ # will point to the Post class
23
+ attr_reader :resource
24
+
25
+ # A hash of page configurations for the controller indexed by action name
26
+ attr_reader :page_configs
27
+
28
+ # An array of member actions defined for this resource
29
+ attr_reader :member_actions
30
+
31
+ # An array of collection actions defined for this resource
32
+ attr_reader :collection_actions
33
+
34
+ # The titleized name to use for this resource
35
+ attr_accessor :resource_name
36
+
37
+ # The default sort order to use in the controller
38
+ attr_accessor :sort_order
39
+
40
+ # Scope this resource to an association in the controller
41
+ attr_accessor :scope_to
42
+
43
+ # If we're scoping resources, use this method on the parent to return the collection
44
+ attr_accessor :scope_to_association_method
45
+
46
+ # Set to false to turn off admin notes
47
+ attr_accessor :admin_notes
48
+
49
+ # Set the configuration for the CSV
50
+ attr_writer :csv_builder
51
+
52
+ def initialize(namespace, resource, options = {})
53
+ @namespace = namespace
54
+ @resource = resource
55
+ @options = default_options.merge(options)
56
+ @sort_order = @options[:sort_order]
57
+ @page_configs = {}
58
+ @menu_options = {}
59
+ @member_actions, @collection_actions = [], []
60
+ @scopes = []
61
+ end
62
+
63
+ # An underscored safe representation internally for this resource
64
+ def underscored_resource_name
65
+ @underscored_resource_name ||= if @options[:as]
66
+ @options[:as].gsub(' ', '').underscore.singularize
67
+ else
68
+ resource.name.gsub('::','').underscore
69
+ end
70
+ end
71
+
72
+ # A camelized safe representation for this resource
73
+ def camelized_resource_name
74
+ underscored_resource_name.camelize
75
+ end
76
+
77
+ # Returns the name to call this resource.
78
+ # By default will use resource.model_name.human
79
+ def resource_name
80
+ @resource_name ||= if @options[:as] || !resource.respond_to?(:model_name)
81
+ underscored_resource_name.titleize
82
+ else
83
+ resource.model_name.human.titleize
84
+ end
85
+ end
86
+
87
+ # Returns the plural version of this resource
88
+ def plural_resource_name
89
+ @plural_resource_name ||= resource_name.pluralize
90
+ end
91
+
92
+ def resource_table_name
93
+ resource.table_name
94
+ end
95
+
96
+ # Returns a properly formatted controller name for this
97
+ # resource within its namespace
98
+ def controller_name
99
+ [namespace.module_name, camelized_resource_name.pluralize + "Controller"].compact.join('::')
100
+ end
101
+
102
+ # Returns the controller for this resource
103
+ def controller
104
+ @controller ||= controller_name.constantize
105
+ end
106
+
107
+ # Returns the routes prefix for this resource
108
+ def route_prefix
109
+ namespace.module_name.try(:underscore)
110
+ end
111
+
112
+ # Returns a symbol for the route to use to get to the
113
+ # collection of this resource
114
+ def route_collection_path
115
+ [route_prefix, controller.resources_configuration[:self][:route_collection_name], 'path'].compact.join('_').to_sym
116
+ end
117
+
118
+ # Returns the named route for an instance of this resource
119
+ def route_instance_path
120
+ [route_prefix, controller.resources_configuration[:self][:route_instance_name], 'path'].compact.join('_').to_sym
121
+ end
122
+
123
+ # Set the menu options. To not add this resource to the menu, just
124
+ # call #menu(false)
125
+ def menu(options = {})
126
+ options = options == false ? { :display => false } : options
127
+ @menu_options = options
128
+ end
129
+
130
+ # Returns the name to put this resource under in the menu
131
+ def parent_menu_item_name
132
+ @menu_options[:parent]
133
+ end
134
+
135
+ # Returns the name to be displayed in the menu for this resource
136
+ def menu_item_name
137
+ @menu_options[:label] || plural_resource_name
138
+ end
139
+
140
+ # Returns the items priority for altering the default sort order
141
+ def menu_item_priority
142
+ @menu_options[:priority] || 10
143
+ end
144
+
145
+ # Returns a proc for deciding whether to display the menu item or not in the view
146
+ def menu_item_display_if
147
+ @menu_options[:if] || proc { true }
148
+ end
149
+
150
+ # Should this resource be added to the menu system?
151
+ def include_in_menu?
152
+ return false if @menu_options[:display] == false
153
+ !(belongs_to? && !belongs_to_config.optional?)
154
+ end
155
+
156
+
157
+ # Clears all the member actions this resource knows about
158
+ def clear_member_actions!
159
+ @member_actions = []
160
+ end
161
+
162
+ def clear_collection_actions!
163
+ @collection_actions = []
164
+ end
165
+
166
+ # Return an array of scopes for this resource
167
+ def scopes
168
+ @scopes
169
+ end
170
+
171
+ # Returns a scope for this object by its identifier
172
+ def get_scope_by_id(id)
173
+ id = id.to_s
174
+ @scopes.find{|s| s.id == id }
175
+ end
176
+
177
+ def default_scope
178
+ @default_scope
179
+ end
180
+
181
+ # Create a new scope object for this resource.
182
+ # If you want to internationalize the scope name, you can add
183
+ # to your i18n files a key like "active_admin.scopes.scope_method".
184
+ def scope(*args, &block)
185
+ options = args.extract_options!
186
+ @scopes << ActiveAdmin::Scope.new(*args, &block)
187
+ if options[:default]
188
+ @default_scope = @scopes.last
189
+ end
190
+ end
191
+
192
+ # Are admin notes turned on for this resource
193
+ def admin_notes?
194
+ admin_notes.nil? ? ActiveAdmin.admin_notes : admin_notes
195
+ end
196
+
197
+ def belongs_to(target, options = {})
198
+ @belongs_to = Resource::BelongsTo.new(self, target, options)
199
+ controller.belongs_to(target, options.dup)
200
+ end
201
+
202
+ def belongs_to_config
203
+ @belongs_to
204
+ end
205
+
206
+ # Do we belong to another resource
207
+ def belongs_to?
208
+ !belongs_to_config.nil?
209
+ end
210
+
211
+ # The csv builder for this resource
212
+ def csv_builder
213
+ @csv_builder || default_csv_builder
214
+ end
215
+
216
+ private
217
+
218
+ def default_options
219
+ {
220
+ :namespace => ActiveAdmin.application.default_namespace,
221
+ :sort_order => ActiveAdmin.application.default_sort_order
222
+ }
223
+ end
224
+
225
+ def default_csv_builder
226
+ @default_csv_builder ||= CSVBuilder.default_for_resource(resource)
227
+ end
228
+ end # class Resource
229
+ end # module ActiveAdmin
@@ -0,0 +1,21 @@
1
+ module ActiveAdmin
2
+ class ResourceController < ::InheritedResources::Base
3
+
4
+ module ActionBuilder
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+
9
+ def clear_member_actions!
10
+ active_admin_config.clear_member_actions!
11
+ end
12
+
13
+ def clear_collection_actions!
14
+ active_admin_config.clear_collection_actions!
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+ end