andrewroth_activeadmin 0.3.4
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 +35 -0
- data/.travis.yml +4 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +301 -0
- data/Gemfile +40 -0
- data/Guardfile +8 -0
- data/LICENSE +25 -0
- data/README.rdoc +113 -0
- data/Rakefile +18 -0
- data/activeadmin.gemspec +28 -0
- data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
- data/app/assets/images/active_admin/loading.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/base.js +12 -0
- data/app/assets/javascripts/active_admin/vendor.js +382 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +363 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +259 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +121 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +102 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +125 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +68 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +10 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +27 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +29 -0
- data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +34 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +21 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +21 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +16 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +18 -0
- data/app/views/active_admin/devise/shared/_links.erb +20 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +12 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.csv.erb +20 -0
- data/app/views/active_admin/resource/index.html.arb +1 -0
- data/app/views/active_admin/resource/new.html.arb +1 -0
- data/app/views/active_admin/resource/show.html.arb +1 -0
- data/app/views/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +35 -0
- data/cucumber.yml +2 -0
- data/docs/0-installation.md +50 -0
- data/docs/1-general-configuration.md +43 -0
- data/docs/2-resource-customization.md +114 -0
- data/docs/3-index-pages.md +55 -0
- data/docs/3-index-pages/index-as-block.md +16 -0
- data/docs/3-index-pages/index-as-blog.md +61 -0
- data/docs/3-index-pages/index-as-grid.md +21 -0
- data/docs/3-index-pages/index-as-table.md +90 -0
- data/docs/4-csv-format.md +14 -0
- data/docs/5-forms.md +39 -0
- data/docs/6-show-screens.md +36 -0
- data/docs/7-sidebars.md +35 -0
- data/docs/8-custom-actions.md +123 -0
- data/features/comments/commenting.feature +112 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +106 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/filters.feature +35 -0
- data/features/index/format_as_csv.feature +46 -0
- data/features/index/formats.feature +12 -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 +81 -0
- data/features/index/index_blank_slate.feature +56 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +17 -0
- data/features/menu.feature +37 -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 +87 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +77 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +13 -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 +29 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +35 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/layout_steps.rb +3 -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 +7 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +26 -0
- data/features/step_definitions/web_steps.rb +211 -0
- data/features/sti_resource.feature +61 -0
- data/features/support/env.rb +96 -0
- data/features/support/paths.rb +50 -0
- data/features/support/selectors.rb +45 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin.rb +82 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/application.rb +231 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/arbre/builder.rb +111 -0
- data/lib/active_admin/arbre/context.rb +45 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/html/attributes.rb +20 -0
- data/lib/active_admin/arbre/html/class_list.rb +28 -0
- data/lib/active_admin/arbre/html/collection.rb +27 -0
- data/lib/active_admin/arbre/html/document.rb +42 -0
- data/lib/active_admin/arbre/html/element.rb +151 -0
- data/lib/active_admin/arbre/html/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/html/tag.rb +137 -0
- data/lib/active_admin/arbre/html/text_node.rb +35 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +89 -0
- data/lib/active_admin/comments.rb +88 -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.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/csv_builder.rb +45 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/dashboards/dashboard_controller.rb +38 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/dependency_checker.rb +30 -0
- data/lib/active_admin/deprecation.rb +36 -0
- data/lib/active_admin/devise.rb +54 -0
- data/lib/active_admin/dsl.rb +224 -0
- data/lib/active_admin/engine.rb +4 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +118 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +70 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/locales/bg.yml +40 -0
- data/lib/active_admin/locales/cs.yml +34 -0
- data/lib/active_admin/locales/da.yml +28 -0
- data/lib/active_admin/locales/en.yml +40 -0
- data/lib/active_admin/locales/es.yml +40 -0
- data/lib/active_admin/locales/fr.yml +40 -0
- data/lib/active_admin/locales/it.yml +40 -0
- data/lib/active_admin/locales/ja.yml +40 -0
- data/lib/active_admin/locales/pl.yml +34 -0
- data/lib/active_admin/locales/pt-BR.yml +41 -0
- data/lib/active_admin/locales/ru.yml +40 -0
- data/lib/active_admin/locales/sv-SE.yml +40 -0
- data/lib/active_admin/locales/zh_cn.yml +40 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +206 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/reloader.rb +64 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource.rb +159 -0
- data/lib/active_admin/resource/action_items.rb +88 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource/menu.rb +45 -0
- data/lib/active_admin/resource/naming.rb +50 -0
- data/lib/active_admin/resource/scopes.rb +33 -0
- data/lib/active_admin/resource/sidebars.rb +36 -0
- data/lib/active_admin/resource_controller.rb +105 -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 +138 -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 +18 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/sass/active_admin.scss +3 -0
- data/lib/active_admin/sass/css_loader.rb +16 -0
- data/lib/active_admin/sass/helpers.rb +45 -0
- data/lib/active_admin/scope.rb +31 -0
- data/lib/active_admin/sidebar_section.rb +41 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +23 -0
- data/lib/active_admin/view_helpers.rb +22 -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 +186 -0
- data/lib/active_admin/view_helpers/form_helper.rb +13 -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/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/blank_slate.rb +17 -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 +69 -0
- data/lib/active_admin/views/components/sidebar_section.rb +28 -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 +57 -0
- data/lib/active_admin/views/index_as_block.rb +29 -0
- data/lib/active_admin/views/index_as_blog.rb +129 -0
- data/lib/active_admin/views/index_as_grid.rb +70 -0
- data/lib/active_admin/views/index_as_table.rb +164 -0
- data/lib/active_admin/views/pages/base.rb +167 -0
- data/lib/active_admin/views/pages/dashboard.rb +62 -0
- data/lib/active_admin/views/pages/edit.rb +28 -0
- data/lib/active_admin/views/pages/index.rb +91 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/new.rb +28 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabbed_navigation.rb +94 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +21 -0
- data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +427 -0
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +6 -0
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +1 -0
- data/lib/generators/active_admin/assets/templates/dashboards.rb +36 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +44 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +103 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -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/script/local +44 -0
- data/script/use_rails +46 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/integration/default_namespace.rb +77 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/memory_spec.rb +38 -0
- data/spec/integration/stylesheets_spec.rb +41 -0
- data/spec/spec_helper.rb +167 -0
- data/spec/support/detect_rails_version.rb +10 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +33 -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/active_admin_spec.rb +17 -0
- data/spec/unit/application_spec.rb +87 -0
- data/spec/unit/arbre/context_spec.rb +35 -0
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +223 -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 +209 -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/controller_filters_spec.rb +34 -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/devise_spec.rb +66 -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 +182 -0
- data/spec/unit/form_builder_spec.rb +256 -0
- data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
- data/spec/unit/helpers/scope_chain_spec.rb +36 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +214 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/rails_spec.rb +43 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/reloader_spec.rb +80 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource/action_items_spec.rb +62 -0
- data/spec/unit/resource/menu_spec.rb +80 -0
- data/spec/unit/resource/naming_spec.rb +75 -0
- data/spec/unit/resource/scopes_spec.rb +30 -0
- data/spec/unit/resource/sidebars_spec.rb +50 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +152 -0
- data/spec/unit/resource_spec.rb +269 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/sass/helpers_spec.rb +47 -0
- data/spec/unit/scope_spec.rb +41 -0
- data/spec/unit/view_factory_spec.rb +19 -0
- data/spec/unit/views/components/attributes_table_spec.rb +100 -0
- data/spec/unit/views/components/blank_slate_spec.rb +15 -0
- data/spec/unit/views/components/columns_spec.rb +75 -0
- data/spec/unit/views/components/panel_spec.rb +29 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/views/components/status_tag_spec.rb +79 -0
- data/spec/unit/views/components/table_for_spec.rb +131 -0
- data/spec/unit/views/pages/layout_spec.rb +22 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +125 -0
- data/tasks/docs.rake +39 -0
- data/tasks/test.rake +57 -0
- data/tasks/yard.rake +6 -0
- metadata +646 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
zh_cn:
|
|
2
|
+
active_admin:
|
|
3
|
+
dashboard: "控制面板"
|
|
4
|
+
dashboard_welcome:
|
|
5
|
+
welcome: "欢迎使用Active Admin. 这是默认的控制面板页."
|
|
6
|
+
call_to_action: "若要添加新的面板内容, 请修改 'app/admin/dashboards.rb'"
|
|
7
|
+
view: "查看"
|
|
8
|
+
edit: "编辑"
|
|
9
|
+
delete: "删除"
|
|
10
|
+
delete_confirmation: "确定删除?"
|
|
11
|
+
new_model: "新建%{model}"
|
|
12
|
+
edit_model: "编辑%{model}"
|
|
13
|
+
delete_model: "删除%{model}"
|
|
14
|
+
details: "%{model}详情"
|
|
15
|
+
cancel: "取消"
|
|
16
|
+
empty: "清空"
|
|
17
|
+
previous: "上一个"
|
|
18
|
+
next: "下一个"
|
|
19
|
+
download: "下载:"
|
|
20
|
+
has_many_new: "新建一个%{model}"
|
|
21
|
+
has_many_delete: "删除"
|
|
22
|
+
filter: "过滤"
|
|
23
|
+
clear_filters: "清除条件"
|
|
24
|
+
search_field: "查找%{field}"
|
|
25
|
+
equal_to: "等于"
|
|
26
|
+
greater_than: "大于"
|
|
27
|
+
less_than: "小于"
|
|
28
|
+
main_content: "请执行 %{model}#main_content 来显示内容."
|
|
29
|
+
logout: "退出"
|
|
30
|
+
sidebars:
|
|
31
|
+
filters: "所有条件"
|
|
32
|
+
pagination:
|
|
33
|
+
empty: "暂时没有%{model}"
|
|
34
|
+
one: "显示 <b>1</b> %{model}"
|
|
35
|
+
one_page: "显示 <b>所有 %{n}</b> %{model}"
|
|
36
|
+
multiple: "显示所有 <b>%{total}</b> %{model}中的<b>%{from} - %{to}</b> 条"
|
|
37
|
+
any: "任何"
|
|
38
|
+
blank_slate:
|
|
39
|
+
content: "暂时还没有%{resource_name}."
|
|
40
|
+
link: "新建一个"
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class Menu
|
|
3
|
+
|
|
4
|
+
def initialize
|
|
5
|
+
@items = []
|
|
6
|
+
yield(self) if block_given?
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def add(*args, &block)
|
|
10
|
+
@items << MenuItem.new(*args, &block)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def [](name)
|
|
14
|
+
items.find{ |i| i.name == name }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def items
|
|
18
|
+
@items.sort
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def find_by_url(url)
|
|
22
|
+
recursive_find_by_url(items, url)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def recursive_find_by_url(collection, url)
|
|
28
|
+
found = nil
|
|
29
|
+
collection.each do |item|
|
|
30
|
+
if item.url == url
|
|
31
|
+
found = item
|
|
32
|
+
break
|
|
33
|
+
else
|
|
34
|
+
found = recursive_find_by_url(item.children, url)
|
|
35
|
+
break if found
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
found
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -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,206 @@
|
|
|
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
|
+
actual = resources.values.find{|config| config.resource == klass }
|
|
103
|
+
return actual if actual
|
|
104
|
+
|
|
105
|
+
if klass.respond_to?(:base_class)
|
|
106
|
+
base_class = klass.base_class
|
|
107
|
+
resources.values.find{|config| config.resource == base_class }
|
|
108
|
+
else
|
|
109
|
+
nil
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
protected
|
|
114
|
+
|
|
115
|
+
# Either returns an existing Resource instance or builds a new
|
|
116
|
+
# one for the resource and options
|
|
117
|
+
def find_or_build_resource(resource_class, options)
|
|
118
|
+
resource = Resource.new(self, resource_class, options)
|
|
119
|
+
|
|
120
|
+
# If we've already registered this resource, use the existing
|
|
121
|
+
if @resources.has_key? resource.camelized_resource_name
|
|
122
|
+
existing_resource = @resources[resource.camelized_resource_name]
|
|
123
|
+
|
|
124
|
+
if existing_resource.resource != resource_class
|
|
125
|
+
raise ActiveAdmin::ResourceMismatchError,
|
|
126
|
+
"Tried to register #{resource_class} as #{resource.camelized_resource_name} but already registered to #{resource.resource}"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
resource = existing_resource
|
|
130
|
+
else
|
|
131
|
+
@resources[resource.camelized_resource_name] = resource
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
resource
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def unload_resources!
|
|
138
|
+
resources.each do |name, config|
|
|
139
|
+
parent = (module_name || 'Object').constantize
|
|
140
|
+
const_name = config.controller_name.split('::').last
|
|
141
|
+
# Remove the const if its been defined
|
|
142
|
+
parent.send(:remove_const, const_name) if parent.const_defined?(const_name)
|
|
143
|
+
end
|
|
144
|
+
@resources = {}
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def unload_dashboard!
|
|
148
|
+
# TODO: Only clear out my sections
|
|
149
|
+
Dashboards.clear_all_sections!
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def unload_menu!
|
|
153
|
+
@menu = Menu.new
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Creates a ruby module to namespace all the classes in if required
|
|
157
|
+
def register_module
|
|
158
|
+
eval "module ::#{module_name}; end"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def register_resource_controller(config)
|
|
162
|
+
eval "class ::#{config.controller_name} < ActiveAdmin::ResourceController; end"
|
|
163
|
+
config.controller.active_admin_config = config
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def dsl
|
|
167
|
+
@dsl ||= DSL.new
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def parse_registration_block(config, &block)
|
|
171
|
+
dsl.run_registration_block(config, &block)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Creates a dashboard controller for this config
|
|
175
|
+
def generate_dashboard_controller
|
|
176
|
+
eval "class ::#{dashboard_controller_name} < ActiveAdmin::Dashboards::DashboardController; end"
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Adds the dashboard to the menu
|
|
180
|
+
def register_dashboard
|
|
181
|
+
dashboard_path = root? ? :dashboard_path : "#{name}_dashboard_path".to_sym
|
|
182
|
+
menu.add(I18n.t("active_admin.dashboard"), dashboard_path, 1) unless menu[I18n.t("active_admin.dashboard")]
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Does all the work of registernig a config with the menu system
|
|
186
|
+
def register_with_menu(config)
|
|
187
|
+
# The menu we're going to add this resource to
|
|
188
|
+
add_to = menu
|
|
189
|
+
|
|
190
|
+
# Adding as a child
|
|
191
|
+
if config.parent_menu_item_name
|
|
192
|
+
# Create the parent if it doesn't exist
|
|
193
|
+
menu.add(config.parent_menu_item_name, '#') unless menu[config.parent_menu_item_name]
|
|
194
|
+
add_to = menu[config.parent_menu_item_name]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Check if this menu item has already been created
|
|
198
|
+
if add_to[config.menu_item_name]
|
|
199
|
+
# Update the url if it's already been created
|
|
200
|
+
add_to[config.menu_item_name].url = config.route_collection_path
|
|
201
|
+
else
|
|
202
|
+
add_to.add(config.menu_item_name, config.route_collection_path, config.menu_item_priority, { :if => config.menu_item_display_if })
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
class FileUpdateChecker < ::ActiveSupport::FileUpdateChecker
|
|
4
|
+
|
|
5
|
+
# Over-ride the default #updated_at to support the deletion of files
|
|
6
|
+
def updated_at
|
|
7
|
+
paths.map { |path| File.mtime(path) rescue Time.now }.max
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Deals with reloading Active Admin on each request in
|
|
13
|
+
# development and once in production.
|
|
14
|
+
class Reloader
|
|
15
|
+
|
|
16
|
+
attr_reader :active_admin_app,
|
|
17
|
+
:rails_app,
|
|
18
|
+
:file_update_checker
|
|
19
|
+
|
|
20
|
+
# @param [ActiveAdmin::Application] app
|
|
21
|
+
# @param [String] rails_version The version of Rails we're using.
|
|
22
|
+
# We use this to switch between the correcrt Rails reloader class.
|
|
23
|
+
def initialize(rails_app, active_admin_app, rails_version)
|
|
24
|
+
@rails_app = rails_app
|
|
25
|
+
@active_admin_app = active_admin_app
|
|
26
|
+
@rails_version = rails_version.to_s
|
|
27
|
+
@file_update_checker = FileUpdateChecker.new(watched_paths) do
|
|
28
|
+
reload!
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def reload!
|
|
33
|
+
active_admin_app.unload!
|
|
34
|
+
rails_app.reload_routes!
|
|
35
|
+
file_update_checker.paths.clear
|
|
36
|
+
watched_paths.each{|path| file_update_checker.paths << path }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Attach to Rails and perform the reload on each request.
|
|
40
|
+
def attach!
|
|
41
|
+
# Bring the checker into local scope for the ruby block
|
|
42
|
+
checker = file_update_checker
|
|
43
|
+
|
|
44
|
+
reloader_class.to_prepare do
|
|
45
|
+
checker.execute_if_updated
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def watched_paths
|
|
50
|
+
paths = active_admin_app.load_paths
|
|
51
|
+
active_admin_app.load_paths.each{|path| paths += Dir[File.join(path, "**", "*.rb")]}
|
|
52
|
+
paths
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def reloader_class
|
|
56
|
+
if @rails_version[0..2] == '3.1'
|
|
57
|
+
ActionDispatch::Reloader
|
|
58
|
+
else
|
|
59
|
+
ActionDispatch::Callbacks
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
end
|