yousty-activeadmin 1.0.0.pre
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.
- checksums.yaml +7 -0
- data/.gitignore +43 -0
- data/.travis.yml +8 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +1056 -0
- data/CONTRIBUTING.md +110 -0
- data/Gemfile +41 -0
- data/Guardfile +7 -0
- data/LICENSE +25 -0
- data/README.md +67 -0
- data/Rakefile +25 -0
- data/activeadmin.gemspec +33 -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/index_list_icons/block_icon.svg +10 -0
- data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +4 -0
- data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +13 -0
- data/app/assets/images/active_admin/index_list_icons/table_icon.svg +3 -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/application.js.coffee +6 -0
- data/app/assets/javascripts/active_admin/base.js.coffee +5 -0
- data/app/assets/javascripts/active_admin/components/application.js.coffee +23 -0
- data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +26 -0
- data/app/assets/javascripts/active_admin/components/has_many.js.coffee +41 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +37 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +105 -0
- data/app/assets/javascripts/active_admin/lib/popover.js.coffee +97 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +25 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +41 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +293 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +152 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
- data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
- data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +95 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +110 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
- data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +21 -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 +36 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +32 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.css.scss +284 -0
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +43 -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 +19 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
- data/app/views/active_admin/devise/shared/_links.erb +27 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +14 -0
- data/app/views/active_admin/page/index.html.arb +1 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.csv.erb +17 -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 +37 -0
- data/config/locales/bg.yml +101 -0
- data/config/locales/ca.yml +98 -0
- data/config/locales/cs.yml +105 -0
- data/config/locales/da.yml +102 -0
- data/config/locales/de-CH.yml +117 -0
- data/config/locales/de.yml +119 -0
- data/config/locales/en-GB.yml +91 -0
- data/config/locales/en.yml +110 -0
- data/config/locales/es.yml +106 -0
- data/config/locales/es_MX.yml +104 -0
- data/config/locales/fi.yml +109 -0
- data/config/locales/fr.yml +97 -0
- data/config/locales/he.yml +91 -0
- data/config/locales/hr.yml +93 -0
- data/config/locales/hu.yml +92 -0
- data/config/locales/it.yml +89 -0
- data/config/locales/ja.yml +104 -0
- data/config/locales/ko.yml +84 -0
- data/config/locales/lt.yml +90 -0
- data/config/locales/lv.yml +89 -0
- data/config/locales/nl.yml +90 -0
- data/config/locales/no-NB.yml +85 -0
- data/config/locales/pl.yml +93 -0
- data/config/locales/pt-BR.yml +90 -0
- data/config/locales/pt-PT.yml +89 -0
- data/config/locales/ro.yml +93 -0
- data/config/locales/ru.yml +103 -0
- data/config/locales/sv-SE.yml +89 -0
- data/config/locales/tr.yml +90 -0
- data/config/locales/uk.yml +100 -0
- data/config/locales/vi.yml +90 -0
- data/config/locales/zh-CN.yml +90 -0
- data/config/locales/zh-TW.yml +90 -0
- data/cucumber.yml +3 -0
- data/docs/0-installation.md +84 -0
- data/docs/1-general-configuration.md +137 -0
- data/docs/10-custom-pages.md +98 -0
- data/docs/11-decorators.md +66 -0
- data/docs/12-arbre-components.md +144 -0
- data/docs/13-authorization-adapter.md +227 -0
- data/docs/2-resource-customization.md +340 -0
- data/docs/3-index-pages/create-an-index.md +29 -0
- data/docs/3-index-pages/index-as-block.md +21 -0
- data/docs/3-index-pages/index-as-blog.md +71 -0
- data/docs/3-index-pages/index-as-grid.md +29 -0
- data/docs/3-index-pages/index-as-table.md +154 -0
- data/docs/3-index-pages.md +206 -0
- data/docs/4-csv-format.md +39 -0
- data/docs/5-forms.md +110 -0
- data/docs/6-show-pages.md +77 -0
- data/docs/7-sidebars.md +42 -0
- data/docs/8-custom-actions.md +139 -0
- data/docs/9-batch-actions.md +155 -0
- data/features/action_item.feature +73 -0
- data/features/authorization.feature +64 -0
- data/features/authorization_cancan.feature +52 -0
- data/features/belongs_to.feature +63 -0
- data/features/breadcrumb.feature +27 -0
- data/features/comments/commenting.feature +140 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +16 -0
- data/features/decorators.feature +41 -0
- data/features/development_reloading.feature +31 -0
- data/features/edit_page.feature +127 -0
- data/features/favicon.feature +20 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +29 -0
- data/features/i18n.feature +38 -0
- data/features/index/batch_actions.feature +123 -0
- data/features/index/filters.feature +138 -0
- data/features/index/format_as_csv.feature +117 -0
- data/features/index/formats.feature +66 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +69 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +195 -0
- data/features/index/index_blank_slate.feature +61 -0
- data/features/index/index_parameters.feature +75 -0
- data/features/index/index_scope_to.feature +56 -0
- data/features/index/index_scopes.feature +251 -0
- data/features/index/page_title.feature +30 -0
- data/features/index/pagination.feature +59 -0
- data/features/index/switch_index_view.feature +73 -0
- data/features/menu.feature +53 -0
- data/features/new_page.feature +119 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_pages.feature +148 -0
- data/features/registering_resources.feature +33 -0
- data/features/root_to.feature +17 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +47 -0
- data/features/sidebar_sections.feature +198 -0
- data/features/site_title.feature +47 -0
- data/features/specifying_actions.feature +93 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/action_link_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +82 -0
- data/features/step_definitions/asset_steps.rb +15 -0
- data/features/step_definitions/attribute_steps.rb +13 -0
- data/features/step_definitions/batch_action_steps.rb +55 -0
- data/features/step_definitions/breadcrumb_steps.rb +3 -0
- data/features/step_definitions/comment_steps.rb +12 -0
- data/features/step_definitions/configuration_steps.rb +100 -0
- data/features/step_definitions/dashboard_steps.rb +15 -0
- data/features/step_definitions/factory_steps.rb +34 -0
- data/features/step_definitions/filter_steps.rb +17 -0
- data/features/step_definitions/flash_steps.rb +11 -0
- data/features/step_definitions/format_steps.rb +45 -0
- data/features/step_definitions/i18n_steps.rb +3 -0
- data/features/step_definitions/index_scope_steps.rb +21 -0
- data/features/step_definitions/index_views_steps.rb +3 -0
- data/features/step_definitions/layout_steps.rb +3 -0
- data/features/step_definitions/member_link_steps.rb +7 -0
- data/features/step_definitions/menu_steps.rb +11 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +8 -0
- data/features/step_definitions/site_title_steps.rb +15 -0
- data/features/step_definitions/symbol_leak_steps.rb +3 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/table_steps.rb +119 -0
- data/features/step_definitions/user_steps.rb +39 -0
- data/features/step_definitions/web_steps.rb +86 -0
- data/features/sti_resource.feature +73 -0
- data/features/support/env.rb +112 -0
- data/features/support/paths.rb +71 -0
- data/features/support/selectors.rb +45 -0
- data/features/symbol_leak.feature +35 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/features/users/resetting_password.feature +34 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/application.rb +242 -0
- data/lib/active_admin/asset_registration.rb +29 -0
- data/lib/active_admin/authorization_adapter.rb +132 -0
- data/lib/active_admin/base_controller/authorization.rb +151 -0
- data/lib/active_admin/base_controller/menu.rb +34 -0
- data/lib/active_admin/base_controller.rb +78 -0
- data/lib/active_admin/batch_actions/controller.rb +24 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +127 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +35 -0
- data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +66 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
- data/lib/active_admin/batch_actions.rb +17 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/cancan_adapter.rb +40 -0
- data/lib/active_admin/component.rb +5 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +49 -0
- data/lib/active_admin/deprecation.rb +36 -0
- data/lib/active_admin/devise.rb +70 -0
- data/lib/active_admin/dsl.rb +166 -0
- data/lib/active_admin/engine.rb +7 -0
- data/lib/active_admin/event.rb +33 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +89 -0
- data/lib/active_admin/filters/formtastic_addons.rb +70 -0
- data/lib/active_admin/filters/resource_extension.rb +136 -0
- data/lib/active_admin/filters.rb +9 -0
- data/lib/active_admin/form_builder.rb +152 -0
- data/lib/active_admin/helpers/collection.rb +23 -0
- data/lib/active_admin/helpers/optional_display.rb +38 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +108 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/inputs/datepicker_input.rb +20 -0
- data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
- data/lib/active_admin/inputs/filter_base.rb +33 -0
- data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
- data/lib/active_admin/inputs/filter_check_boxes_input.rb +51 -0
- data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
- data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
- data/lib/active_admin/inputs/filter_select_input.rb +61 -0
- data/lib/active_admin/inputs/filter_string_input.rb +24 -0
- data/lib/active_admin/inputs.rb +15 -0
- data/lib/active_admin/menu.rb +107 -0
- data/lib/active_admin/menu_collection.rb +96 -0
- data/lib/active_admin/menu_item.rb +97 -0
- data/lib/active_admin/namespace.rb +224 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +39 -0
- data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
- data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +75 -0
- data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
- data/lib/active_admin/orm/active_record/comments.rb +84 -0
- data/lib/active_admin/orm/active_record.rb +3 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/page.rb +88 -0
- data/lib/active_admin/page_controller.rb +29 -0
- data/lib/active_admin/page_dsl.rb +28 -0
- data/lib/active_admin/page_presenter.rb +32 -0
- data/lib/active_admin/resource/action_items.rb +91 -0
- data/lib/active_admin/resource/belongs_to.rb +36 -0
- data/lib/active_admin/resource/controllers.rb +18 -0
- data/lib/active_admin/resource/menu.rb +64 -0
- data/lib/active_admin/resource/naming.rb +84 -0
- data/lib/active_admin/resource/page_presenters.rb +82 -0
- data/lib/active_admin/resource/pagination.rb +19 -0
- data/lib/active_admin/resource/routes.rb +99 -0
- data/lib/active_admin/resource/scope_to.rb +74 -0
- data/lib/active_admin/resource/scopes.rb +50 -0
- data/lib/active_admin/resource/sidebars.rb +27 -0
- data/lib/active_admin/resource.rb +153 -0
- data/lib/active_admin/resource_collection.rb +42 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/data_access.rb +298 -0
- data/lib/active_admin/resource_controller/decorators.rb +20 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
- data/lib/active_admin/resource_controller/scoping.rb +31 -0
- data/lib/active_admin/resource_controller/sidebars.rb +18 -0
- data/lib/active_admin/resource_controller.rb +50 -0
- data/lib/active_admin/resource_dsl.rb +134 -0
- data/lib/active_admin/router.rb +106 -0
- data/lib/active_admin/scope.rb +57 -0
- data/lib/active_admin/sidebar_section.rb +37 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +27 -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 +34 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +26 -0
- data/lib/active_admin/view_helpers/display_helper.rb +49 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
- data/lib/active_admin/view_helpers/fields_for.rb +50 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
- data/lib/active_admin/view_helpers/form_helper.rb +24 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -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/view_helpers.rb +21 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/action_list_popover.rb +29 -0
- data/lib/active_admin/views/components/attributes_table.rb +103 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +150 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
- data/lib/active_admin/views/components/index_list.rb +68 -0
- data/lib/active_admin/views/components/paginated_collection.rb +125 -0
- data/lib/active_admin/views/components/panel.rb +34 -0
- data/lib/active_admin/views/components/popover.rb +27 -0
- data/lib/active_admin/views/components/scopes.rb +66 -0
- data/lib/active_admin/views/components/sidebar_section.rb +28 -0
- data/lib/active_admin/views/components/site_title.rb +55 -0
- data/lib/active_admin/views/components/status_tag.rb +56 -0
- data/lib/active_admin/views/components/table_for.rb +191 -0
- data/lib/active_admin/views/footer.rb +20 -0
- data/lib/active_admin/views/header.rb +32 -0
- data/lib/active_admin/views/index_as_block.rb +36 -0
- data/lib/active_admin/views/index_as_blog.rb +156 -0
- data/lib/active_admin/views/index_as_grid.rb +80 -0
- data/lib/active_admin/views/index_as_table.rb +264 -0
- data/lib/active_admin/views/pages/base.rb +139 -0
- data/lib/active_admin/views/pages/form.rb +51 -0
- data/lib/active_admin/views/pages/index.rb +147 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/page.rb +30 -0
- data/lib/active_admin/views/pages/show.rb +59 -0
- data/lib/active_admin/views/tabbed_navigation.rb +62 -0
- data/lib/active_admin/views/title_bar.rb +53 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +125 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +16 -0
- data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +86 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +235 -0
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +27 -0
- data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/lib/ransack_ext.rb +12 -0
- data/script/local +44 -0
- data/script/use_rails +53 -0
- data/spec/integration/default_namespace_spec.rb +61 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/memory_spec.rb +29 -0
- data/spec/integration/stylesheets_spec.rb +41 -0
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
- data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
- data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
- data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
- data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
- data/spec/javascripts/fixtures/checkboxes.html +9 -0
- data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
- data/spec/javascripts/helpers/SpecHelper.js +3 -0
- data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
- data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
- data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
- data/spec/javascripts/support/jasmine.yml +74 -0
- data/spec/javascripts/support/jasmine_config.rb +23 -0
- data/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
- data/spec/javascripts/support/jquery.min.js +4 -0
- data/spec/spec_helper.rb +175 -0
- data/spec/spec_helper_without_rails.rb +16 -0
- data/spec/support/deferred_garbage_collection.rb +19 -0
- data/spec/support/detect_rails_version.rb +42 -0
- data/spec/support/integration_example_group.rb +31 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +111 -0
- data/spec/support/rails_template_with_data.rb +59 -0
- data/spec/support/templates/admin/stores.rb +11 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/support/templates/cucumber_with_reloading.rb +5 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/post_decorator.rb +53 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +126 -0
- data/spec/unit/active_admin_spec.rb +11 -0
- data/spec/unit/application_spec.rb +141 -0
- data/spec/unit/asset_registration_spec.rb +52 -0
- data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
- data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
- data/spec/unit/auto_link_spec.rb +32 -0
- data/spec/unit/batch_actions/resource_spec.rb +91 -0
- data/spec/unit/batch_actions/settings_spec.rb +61 -0
- data/spec/unit/belongs_to_spec.rb +42 -0
- data/spec/unit/cancan_adapter_spec.rb +43 -0
- data/spec/unit/comments_spec.rb +106 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/config_shared_examples.rb +59 -0
- data/spec/unit/controller_filters_spec.rb +32 -0
- data/spec/unit/csv_builder_spec.rb +103 -0
- data/spec/unit/devise_spec.rb +116 -0
- data/spec/unit/dsl_spec.rb +61 -0
- data/spec/unit/event_spec.rb +47 -0
- data/spec/unit/filters/filter_form_builder_spec.rb +423 -0
- data/spec/unit/filters/resource_spec.rb +119 -0
- data/spec/unit/form_builder_spec.rb +514 -0
- data/spec/unit/generators/install_spec.rb +23 -0
- data/spec/unit/helpers/collection_spec.rb +65 -0
- data/spec/unit/helpers/scope_chain_spec.rb +36 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/menu_collection_spec.rb +62 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +71 -0
- data/spec/unit/namespace/authorization_spec.rb +27 -0
- data/spec/unit/namespace/register_page_spec.rb +74 -0
- data/spec/unit/namespace/register_resource_spec.rb +163 -0
- data/spec/unit/namespace_spec.rb +103 -0
- data/spec/unit/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +72 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/resource/action_items_spec.rb +62 -0
- data/spec/unit/resource/menu_spec.rb +18 -0
- data/spec/unit/resource/naming_spec.rb +122 -0
- data/spec/unit/resource/page_presenters_spec.rb +44 -0
- data/spec/unit/resource/pagination_spec.rb +38 -0
- data/spec/unit/resource/routes_spec.rb +73 -0
- data/spec/unit/resource/scopes_spec.rb +43 -0
- data/spec/unit/resource/sidebars_spec.rb +43 -0
- data/spec/unit/resource_collection_spec.rb +160 -0
- data/spec/unit/resource_controller/data_access_spec.rb +73 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
- data/spec/unit/resource_controller_spec.rb +265 -0
- data/spec/unit/resource_registration_spec.rb +56 -0
- data/spec/unit/resource_spec.rb +243 -0
- data/spec/unit/routing_spec.rb +172 -0
- data/spec/unit/scope_spec.rb +108 -0
- data/spec/unit/settings_spec.rb +88 -0
- data/spec/unit/view_factory_spec.rb +21 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +149 -0
- data/spec/unit/view_helpers/display_name_spec.rb +41 -0
- data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
- data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +56 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +101 -0
- data/spec/unit/views/components/action_list_popover_spec.rb +30 -0
- data/spec/unit/views/components/attributes_table_spec.rb +230 -0
- data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
- data/spec/unit/views/components/blank_slate_spec.rb +17 -0
- data/spec/unit/views/components/columns_spec.rb +142 -0
- data/spec/unit/views/components/index_list_spec.rb +32 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +227 -0
- data/spec/unit/views/components/panel_spec.rb +51 -0
- data/spec/unit/views/components/popover_spec.rb +33 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/views/components/site_title_spec.rb +78 -0
- data/spec/unit/views/components/status_tag_spec.rb +95 -0
- data/spec/unit/views/components/table_for_spec.rb +201 -0
- data/spec/unit/views/pages/form_spec.rb +35 -0
- data/spec/unit/views/pages/layout_spec.rb +63 -0
- data/spec/unit/views/pages/show_spec.rb +20 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
- data/tasks/docs.rake +37 -0
- data/tasks/js.rake +32 -0
- data/tasks/parallel_tests.rake +60 -0
- data/tasks/test.rake +79 -0
- data/tasks/yard.rake +7 -0
- metadata +896 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Inputs
|
|
3
|
+
class FilterCheckBoxesInput < ::Formtastic::Inputs::CheckBoxesInput
|
|
4
|
+
include FilterBase
|
|
5
|
+
|
|
6
|
+
def input_name
|
|
7
|
+
"#{object_name}[#{searchable_method_name}_in][]"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def selected_values
|
|
11
|
+
@object.send("#{searchable_method_name}_in") || []
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def searchable_method_name
|
|
15
|
+
# Deal with has_many :through relationships in filters
|
|
16
|
+
# If the relationship is a HMT, we set the search logic to be something
|
|
17
|
+
# like :#{through_association}_#{end_association_id}.
|
|
18
|
+
if searchable_through_association?
|
|
19
|
+
[reflection.through_reflection.name, reflection.foreign_key].join('_')
|
|
20
|
+
else
|
|
21
|
+
association_primary_key || method
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Add whitespace before label
|
|
26
|
+
def choice_label(choice)
|
|
27
|
+
' ' + super
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Don't wrap in UL tag
|
|
31
|
+
def choices_group_wrapping(&block)
|
|
32
|
+
template.capture(&block)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Don't wrap in LI tag
|
|
36
|
+
def choice_wrapping(html_options, &block)
|
|
37
|
+
template.capture(&block)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Don't render hidden fields
|
|
41
|
+
def hidden_field_for_all
|
|
42
|
+
""
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Don't render hidden fields
|
|
46
|
+
def hidden_fields?
|
|
47
|
+
false
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Inputs
|
|
3
|
+
class FilterDateRangeInput < ::Formtastic::Inputs::StringInput
|
|
4
|
+
include FilterBase
|
|
5
|
+
|
|
6
|
+
def to_html
|
|
7
|
+
input_wrapping do
|
|
8
|
+
[ label_html,
|
|
9
|
+
builder.text_field(gt_input_name, input_html_options(gt_input_name)),
|
|
10
|
+
template.content_tag(:span, "-", :class => "seperator"),
|
|
11
|
+
builder.text_field(lt_input_name, input_html_options(lt_input_name)),
|
|
12
|
+
].join("\n").html_safe
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def gt_input_name
|
|
17
|
+
"#{method}_gteq"
|
|
18
|
+
end
|
|
19
|
+
alias :input_name :gt_input_name
|
|
20
|
+
|
|
21
|
+
def lt_input_name
|
|
22
|
+
"#{method}_lteq"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def input_html_options(input_name = gt_input_name)
|
|
26
|
+
current_value = @object.send(input_name)
|
|
27
|
+
{ :size => 12,
|
|
28
|
+
:class => "datepicker",
|
|
29
|
+
:max => 10,
|
|
30
|
+
:value => current_value.respond_to?(:strftime) ? current_value.strftime("%Y-%m-%d") : "" }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Inputs
|
|
3
|
+
class FilterSelectInput < ::Formtastic::Inputs::SelectInput
|
|
4
|
+
include FilterBase
|
|
5
|
+
|
|
6
|
+
# If Ransack will likely respond to the given method, use it.
|
|
7
|
+
#
|
|
8
|
+
# Otherwise:
|
|
9
|
+
# When it's a HABTM or has_many association, Formtastic builds "object_ids".
|
|
10
|
+
# That doesn't fit our scenario, so we override it here.
|
|
11
|
+
def input_name
|
|
12
|
+
return method if seems_searchable?
|
|
13
|
+
|
|
14
|
+
searchable_method_name.concat multiple? ? '_in' : '_eq'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def searchable_method_name
|
|
18
|
+
# Deal with has_many :through relationships in filters
|
|
19
|
+
# If the relationship is a HMT, we set the search logic to be something
|
|
20
|
+
# like :#{through_association}_#{end_association_id}.
|
|
21
|
+
if searchable_through_association?
|
|
22
|
+
name = [reflection.through_reflection.name, reflection.foreign_key].join('_')
|
|
23
|
+
else
|
|
24
|
+
name = method.to_s
|
|
25
|
+
name.concat '_id' if reflection
|
|
26
|
+
end
|
|
27
|
+
name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Provide the AA translation to the blank input field.
|
|
31
|
+
def include_blank
|
|
32
|
+
I18n.t 'active_admin.any' if super
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# was "#{object_name}[#{association_primary_key}]"
|
|
36
|
+
def input_html_options_name
|
|
37
|
+
"#{object_name}[#{input_name}]"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Would normally return true for has_many and HABTM, which would subsequently
|
|
41
|
+
# cause the select field to be multi-select instead of a dropdown.
|
|
42
|
+
def multiple_by_association?
|
|
43
|
+
false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Provides an efficient default lookup query if the attribute is a DB column.
|
|
47
|
+
def collection
|
|
48
|
+
if !options[:collection] && column
|
|
49
|
+
pluck_column
|
|
50
|
+
else
|
|
51
|
+
super
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def pluck_column
|
|
56
|
+
klass.reorder("#{method} asc").uniq.pluck method
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Inputs
|
|
3
|
+
class FilterStringInput < ::Formtastic::Inputs::StringInput
|
|
4
|
+
include FilterBase
|
|
5
|
+
include FilterBase::SearchMethodSelect
|
|
6
|
+
|
|
7
|
+
filter :contains, :equals, :starts_with, :ends_with
|
|
8
|
+
|
|
9
|
+
# If the filter method includes a search condition, build a normal string search field.
|
|
10
|
+
# Else, build a search field with a companion dropdown to choose a search condition from.
|
|
11
|
+
def to_html
|
|
12
|
+
if seems_searchable?
|
|
13
|
+
input_wrapping do
|
|
14
|
+
label_html <<
|
|
15
|
+
builder.text_field(method, input_html_options)
|
|
16
|
+
end
|
|
17
|
+
else
|
|
18
|
+
super # SearchMethodSelect#to_html
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Inputs
|
|
3
|
+
extend ActiveSupport::Autoload
|
|
4
|
+
|
|
5
|
+
autoload :DatepickerInput
|
|
6
|
+
|
|
7
|
+
autoload :FilterBase
|
|
8
|
+
autoload :FilterStringInput
|
|
9
|
+
autoload :FilterDateRangeInput
|
|
10
|
+
autoload :FilterNumericInput
|
|
11
|
+
autoload :FilterSelectInput
|
|
12
|
+
autoload :FilterCheckBoxesInput
|
|
13
|
+
autoload :FilterBooleanInput
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
# Each Namespace builds up it's own menu as the global navigation
|
|
4
|
+
#
|
|
5
|
+
# To build a new menu:
|
|
6
|
+
#
|
|
7
|
+
# menu = Menu.new do |m|
|
|
8
|
+
# m.add label: 'Dashboard', url: '/'
|
|
9
|
+
# m.add label: 'Users', url: '/users'
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# If you're interested in configuring a menu item, take a look at the
|
|
13
|
+
# options available in `ActiveAdmin::MenuItem`
|
|
14
|
+
#
|
|
15
|
+
class Menu
|
|
16
|
+
|
|
17
|
+
def initialize
|
|
18
|
+
super # MenuNode
|
|
19
|
+
yield(self) if block_given?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
module MenuNode
|
|
23
|
+
def initialize
|
|
24
|
+
@children = {}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def [](id)
|
|
28
|
+
@children[normalize_id(id)]
|
|
29
|
+
end
|
|
30
|
+
def []=(id, child)
|
|
31
|
+
@children[normalize_id(id)] = child
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Recursively builds any given menu items. There are two syntaxes supported,
|
|
35
|
+
# as shown in the below examples. Both create an identical menu structure.
|
|
36
|
+
#
|
|
37
|
+
# Example 1:
|
|
38
|
+
# menu = Menu.new
|
|
39
|
+
# menu.add label: 'Dashboard' do |dash|
|
|
40
|
+
# dash.add label: 'My Child Dashboard'
|
|
41
|
+
# end
|
|
42
|
+
#
|
|
43
|
+
# Example 2:
|
|
44
|
+
# menu = Menu.new
|
|
45
|
+
# menu.add label: 'Dashboard'
|
|
46
|
+
# menu.add parent: 'Dashboard', label: 'My Child Dashboard'
|
|
47
|
+
#
|
|
48
|
+
def add(options)
|
|
49
|
+
item = if parent = options.delete(:parent)
|
|
50
|
+
(self[parent] || add(:label => parent)).add options
|
|
51
|
+
else
|
|
52
|
+
_add options.merge :parent => self
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
yield(item) if block_given?
|
|
56
|
+
|
|
57
|
+
item
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Whether any children match the given item.
|
|
61
|
+
def include?(item)
|
|
62
|
+
@children.values.include? item
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Used in the UI to visually distinguish which menu item is selected.
|
|
66
|
+
def current?(item)
|
|
67
|
+
self == item || include?(item)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Returns sorted array of menu items that should be displayed in this context.
|
|
71
|
+
# Sorts by priority first, then alphabetically by label if needed.
|
|
72
|
+
def items(context = nil)
|
|
73
|
+
@children.values.select{ |i| i.display?(context) }.sort do |a,b|
|
|
74
|
+
result = a.priority <=> b.priority
|
|
75
|
+
result = a.label(context) <=> b.label(context) if result == 0
|
|
76
|
+
result
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
attr_reader :children
|
|
81
|
+
private
|
|
82
|
+
attr_writer :children
|
|
83
|
+
|
|
84
|
+
# The method that actually adds new menu items. Called by the public method.
|
|
85
|
+
# If this ID is already taken, transfer the children of the existing item to the new item.
|
|
86
|
+
def _add(options)
|
|
87
|
+
item = ActiveAdmin::MenuItem.new(options)
|
|
88
|
+
item.send :children=, self[item.id].children if self[item.id]
|
|
89
|
+
self[item.id] = item
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def normalize_id(id)
|
|
93
|
+
case id
|
|
94
|
+
when String, Symbol, ActiveModel::Name
|
|
95
|
+
id.to_s.downcase.gsub ' ', '_'
|
|
96
|
+
when ActiveAdmin::Resource::Name
|
|
97
|
+
id.param_key
|
|
98
|
+
else
|
|
99
|
+
raise TypeError, "#{id.class} isn't supported as a Menu ID"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
include MenuNode
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
DEFAULT_MENU = :default
|
|
4
|
+
|
|
5
|
+
# A MenuCollection stores multiple menus for any given namespace. Namespaces delegate
|
|
6
|
+
# the addition of menu items to this class.
|
|
7
|
+
class MenuCollection
|
|
8
|
+
|
|
9
|
+
NoMenuError = Class.new(KeyError)
|
|
10
|
+
|
|
11
|
+
def initialize
|
|
12
|
+
@menus = {}
|
|
13
|
+
@build_callbacks = []
|
|
14
|
+
@built = false
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Add a new menu item to a menu in the collection
|
|
18
|
+
def add(menu_name, menu_item_options = {})
|
|
19
|
+
menu = find_or_create(menu_name)
|
|
20
|
+
|
|
21
|
+
menu.add menu_item_options
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def clear!
|
|
25
|
+
@menus = {}
|
|
26
|
+
@built = false
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def exists?(menu_name)
|
|
30
|
+
@menus.keys.include? menu_name
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def fetch(menu_name)
|
|
34
|
+
build_menus!
|
|
35
|
+
|
|
36
|
+
@menus[menu_name] or
|
|
37
|
+
raise NoMenuError, "No menu by the name of #{menu_name.inspect} in availble menus: #{@menus.keys.join(", ")}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Add callbacks that will be run when the menu is going to be built. This
|
|
41
|
+
# helps use with reloading and allows configurations to add items to menus.
|
|
42
|
+
#
|
|
43
|
+
# @param [Proc] block A block which will be ran when the menu is built. The
|
|
44
|
+
# will have the menu collection yielded.
|
|
45
|
+
def on_build(&block)
|
|
46
|
+
@build_callbacks << block
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Add callbacks that will be run before the menu is built
|
|
50
|
+
def before_build(&block)
|
|
51
|
+
@build_callbacks.unshift(block)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def menu(menu_name)
|
|
55
|
+
menu = find_or_create(menu_name)
|
|
56
|
+
|
|
57
|
+
yield(menu) if block_given?
|
|
58
|
+
|
|
59
|
+
menu
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def built?
|
|
65
|
+
@built
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def build_menus!
|
|
69
|
+
return if built?
|
|
70
|
+
|
|
71
|
+
build_default_menu
|
|
72
|
+
run_on_build_callbacks
|
|
73
|
+
|
|
74
|
+
@built = true
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def run_on_build_callbacks
|
|
78
|
+
@build_callbacks.each do |callback|
|
|
79
|
+
callback.call(self)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def build_default_menu
|
|
84
|
+
find_or_create DEFAULT_MENU
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def find_or_create(menu_name)
|
|
88
|
+
menu_name ||= DEFAULT_MENU
|
|
89
|
+
@menus[menu_name] ||= ActiveAdmin::Menu.new
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require 'active_admin/view_helpers/method_or_proc_helper'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
class MenuItem
|
|
5
|
+
include Menu::MenuNode
|
|
6
|
+
include MethodOrProcHelper
|
|
7
|
+
|
|
8
|
+
attr_reader :html_options, :parent, :priority
|
|
9
|
+
|
|
10
|
+
# Builds a new menu item
|
|
11
|
+
#
|
|
12
|
+
# @param [Hash] options The options for the menu
|
|
13
|
+
#
|
|
14
|
+
# @option options [String, Symbol, Proc] :label
|
|
15
|
+
# The label to display for this menu item.
|
|
16
|
+
# Default: Titleized Resource Name
|
|
17
|
+
#
|
|
18
|
+
# @option options [String] :id
|
|
19
|
+
# A custom id to reference this menu item with.
|
|
20
|
+
# Default: underscored_resource_name
|
|
21
|
+
#
|
|
22
|
+
# @option options [String, Symbol, Proc] :url
|
|
23
|
+
# The URL this item will link to.
|
|
24
|
+
#
|
|
25
|
+
# @option options [Integer] :priority
|
|
26
|
+
# The lower the priority, the earlier in the menu the item will be displayed.
|
|
27
|
+
# Default: 10
|
|
28
|
+
#
|
|
29
|
+
# @option options [Symbol, Proc] :if
|
|
30
|
+
# This decides whether the menu item will be displayed. Evaluated on each request.
|
|
31
|
+
#
|
|
32
|
+
# @option options [Hash] :html_options
|
|
33
|
+
# A hash of options to pass to `link_to` when rendering the item
|
|
34
|
+
#
|
|
35
|
+
# @option [ActiveAdmin::MenuItem] :parent
|
|
36
|
+
# This menu item's parent. It will be displayed nested below its parent.
|
|
37
|
+
#
|
|
38
|
+
# NOTE: for :label, :url, and :if
|
|
39
|
+
# These options are evaluated in the view context at render time. Symbols are called
|
|
40
|
+
# as methods on `self`, and Procs are exec'd within `self`.
|
|
41
|
+
# Here are some examples of what you can do:
|
|
42
|
+
#
|
|
43
|
+
# menu if: :admin?
|
|
44
|
+
# menu url: :new_book_path
|
|
45
|
+
# menu url: :awesome_helper_you_defined
|
|
46
|
+
# menu label: ->{ User.some_method }
|
|
47
|
+
# menu label: ->{ I18n.t 'menus.user' }
|
|
48
|
+
#
|
|
49
|
+
def initialize(options = {})
|
|
50
|
+
super() # MenuNode
|
|
51
|
+
@label = options[:label]
|
|
52
|
+
@dirty_id = options[:id] || options[:label]
|
|
53
|
+
@url = options[:url] || '#'
|
|
54
|
+
@priority = options[:priority] || 10
|
|
55
|
+
@html_options = options[:html_options] || {}
|
|
56
|
+
@should_display = options[:if] || proc{true}
|
|
57
|
+
@parent = options[:parent]
|
|
58
|
+
|
|
59
|
+
yield(self) if block_given? # Builder style syntax
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def id
|
|
63
|
+
@id ||= normalize_id @dirty_id
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def label(context = nil)
|
|
67
|
+
render_in_context context, @label
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def url(context = nil)
|
|
71
|
+
render_in_context context, @url
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Don't display if the :if option passed says so
|
|
75
|
+
# Don't display if the link isn't real, we have children, and none of the children are being displayed.
|
|
76
|
+
def display?(context = nil)
|
|
77
|
+
return false unless render_in_context(context, @should_display)
|
|
78
|
+
return false if !real_url?(context) && @children.any? && !items(context).any?
|
|
79
|
+
true
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Returns an array of the ancestory of this menu item.
|
|
83
|
+
# The first item is the immediate parent of the item.
|
|
84
|
+
def ancestors
|
|
85
|
+
parent ? [parent, parent.ancestors].flatten : []
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
# URL is not nil, empty, or '#'
|
|
91
|
+
def real_url?(context = nil)
|
|
92
|
+
url = url context
|
|
93
|
+
url.present? && url != '#'
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
end
|