activeadmin-orac 1.0.0.pre4
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 +15 -0
- data/.gitignore +49 -0
- data/.hound.yml +14 -0
- data/.travis.yml +40 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +120 -0
- data/CODE_OF_CONDUCT.md +22 -0
- data/CONTRIBUTING.md +144 -0
- data/Gemfile +78 -0
- data/Guardfile +8 -0
- data/LICENSE +20 -0
- data/README.md +102 -0
- data/Rakefile +33 -0
- data/activeadmin.gemspec +31 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +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.coffee +9 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
- data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +7 -0
- data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +10 -0
- data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +22 -0
- data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +3 -0
- data/app/assets/javascripts/active_admin/jquery_ui.js.erb +11 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +44 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +101 -0
- data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +45 -0
- data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +42 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
- data/app/assets/stylesheets/active_admin/_base.scss +41 -0
- data/app/assets/stylesheets/active_admin/_forms.scss +333 -0
- data/app/assets/stylesheets/active_admin/_header.scss +156 -0
- data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -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/_modal_dialog.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +44 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
- data/app/assets/stylesheets/active_admin/components/_tables.scss +110 -0
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.scss +10 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.scss +288 -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 +41 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +15 -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 +18 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +22 -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 +15 -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.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 +39 -0
- data/config/locales/ar.yml +136 -0
- data/config/locales/bg.yml +121 -0
- data/config/locales/bs.yml +122 -0
- data/config/locales/ca.yml +107 -0
- data/config/locales/cs.yml +110 -0
- data/config/locales/da.yml +106 -0
- data/config/locales/de-CH.yml +102 -0
- data/config/locales/de.yml +135 -0
- data/config/locales/el.yml +127 -0
- data/config/locales/en-GB.yml +98 -0
- data/config/locales/en.yml +136 -0
- data/config/locales/es-MX.yml +94 -0
- data/config/locales/es.yml +136 -0
- data/config/locales/fa.yml +120 -0
- data/config/locales/fi.yml +113 -0
- data/config/locales/fr.yml +119 -0
- data/config/locales/he.yml +95 -0
- data/config/locales/hr.yml +124 -0
- data/config/locales/hu.yml +99 -0
- data/config/locales/id.yml +136 -0
- data/config/locales/it.yml +136 -0
- data/config/locales/ja.yml +136 -0
- data/config/locales/ko.yml +121 -0
- data/config/locales/lt.yml +121 -0
- data/config/locales/lv.yml +93 -0
- data/config/locales/nb.yml +121 -0
- data/config/locales/nl.yml +134 -0
- data/config/locales/pl.yml +98 -0
- data/config/locales/pt-BR.yml +136 -0
- data/config/locales/pt-PT.yml +93 -0
- data/config/locales/ro.yml +97 -0
- data/config/locales/ru.yml +140 -0
- data/config/locales/sv-SE.yml +134 -0
- data/config/locales/tr.yml +136 -0
- data/config/locales/uk.yml +137 -0
- data/config/locales/vi.yml +94 -0
- data/config/locales/zh-CN.yml +112 -0
- data/config/locales/zh-TW.yml +136 -0
- data/cucumber.yml +3 -0
- data/docs/0-installation.md +112 -0
- data/docs/1-general-configuration.md +171 -0
- data/docs/10-custom-pages.md +106 -0
- data/docs/11-decorators.md +55 -0
- data/docs/12-arbre-components.md +150 -0
- data/docs/13-authorization-adapter.md +248 -0
- data/docs/14-gotchas.md +116 -0
- data/docs/2-resource-customization.md +422 -0
- data/docs/3-index-pages.md +272 -0
- data/docs/3-index-pages/custom-index.md +31 -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 +213 -0
- data/docs/4-csv-format.md +58 -0
- data/docs/5-forms.md +172 -0
- data/docs/6-show-pages.md +105 -0
- data/docs/7-sidebars.md +71 -0
- data/docs/8-custom-actions.md +160 -0
- data/docs/9-batch-actions.md +233 -0
- data/docs/README.md +24 -0
- data/features/action_item.feature +73 -0
- data/features/authorization.feature +64 -0
- data/features/authorization_cancan.feature +52 -0
- data/features/authorization_pundit.feature +37 -0
- data/features/belongs_to.feature +66 -0
- data/features/breadcrumb.feature +75 -0
- data/features/comments/commenting.feature +171 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +16 -0
- data/features/decorators.feature +43 -0
- data/features/development_reloading.feature +30 -0
- data/features/edit_page.feature +117 -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 +43 -0
- data/features/index/batch_actions.feature +196 -0
- data/features/index/filters.feature +161 -0
- data/features/index/format_as_csv.feature +203 -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 +291 -0
- data/features/index/index_blank_slate.feature +83 -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 +42 -0
- data/features/index/pagination.feature +63 -0
- data/features/index/switch_index_view.feature +73 -0
- data/features/menu.feature +53 -0
- data/features/meta_tags.feature +21 -0
- data/features/new_page.feature +109 -0
- data/features/registering_assets.feature +34 -0
- data/features/registering_pages.feature +148 -0
- data/features/registering_resources.feature +33 -0
- data/features/renamed_resource.feature +32 -0
- data/features/root_to.feature +17 -0
- data/features/show/columns.feature +40 -0
- data/features/show/default_content.feature +44 -0
- data/features/show/page_title.feature +59 -0
- data/features/show/tabs.feature +27 -0
- data/features/sidebar_sections.feature +210 -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 +20 -0
- data/features/step_definitions/additional_web_steps.rb +81 -0
- data/features/step_definitions/asset_steps.rb +15 -0
- data/features/step_definitions/attribute_steps.rb +18 -0
- data/features/step_definitions/batch_action_steps.rb +81 -0
- data/features/step_definitions/blog_steps.rb +3 -0
- data/features/step_definitions/breadcrumb_steps.rb +3 -0
- data/features/step_definitions/column_steps.rb +8 -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 +35 -0
- data/features/step_definitions/filter_steps.rb +39 -0
- data/features/step_definitions/flash_steps.rb +11 -0
- data/features/step_definitions/format_steps.rb +52 -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/meta_tag_steps.rb +3 -0
- data/features/step_definitions/pagination_steps.rb +15 -0
- data/features/step_definitions/sidebar_steps.rb +13 -0
- data/features/step_definitions/site_title_steps.rb +17 -0
- data/features/step_definitions/symbol_leak_steps.rb +3 -0
- data/features/step_definitions/tab_steps.rb +8 -0
- data/features/step_definitions/table_steps.rb +116 -0
- data/features/step_definitions/user_steps.rb +52 -0
- data/features/step_definitions/web_steps.rb +85 -0
- data/features/sti_resource.feature +65 -0
- data/features/strong_parameters.feature +73 -0
- data/features/support/env.rb +162 -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 +36 -0
- data/features/users/logging_out.feature +13 -0
- data/features/users/resetting_password.feature +34 -0
- data/lib/active_admin.rb +130 -0
- data/lib/active_admin/abstract_view_factory.rb +85 -0
- data/lib/active_admin/application.rb +324 -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.rb +87 -0
- data/lib/active_admin/base_controller/authorization.rb +130 -0
- data/lib/active_admin/base_controller/menu.rb +38 -0
- data/lib/active_admin/batch_actions.rb +16 -0
- data/lib/active_admin/batch_actions/controller.rb +40 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +159 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
- data/lib/active_admin/callbacks.rb +88 -0
- data/lib/active_admin/cancan_adapter.rb +36 -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 +129 -0
- data/lib/active_admin/dependency.rb +168 -0
- data/lib/active_admin/deprecation.rb +35 -0
- data/lib/active_admin/devise.rb +80 -0
- data/lib/active_admin/dsl.rb +173 -0
- data/lib/active_admin/engine.rb +16 -0
- data/lib/active_admin/error.rb +62 -0
- data/lib/active_admin/event.rb +24 -0
- data/lib/active_admin/filters.rb +9 -0
- data/lib/active_admin/filters/active.rb +30 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +83 -0
- data/lib/active_admin/filters/formtastic_addons.rb +79 -0
- data/lib/active_admin/filters/humanized.rb +68 -0
- data/lib/active_admin/filters/resource_extension.rb +194 -0
- data/lib/active_admin/form_builder.rb +145 -0
- data/lib/active_admin/generators/boilerplate.rb +45 -0
- data/lib/active_admin/helpers/collection.rb +17 -0
- data/lib/active_admin/helpers/i18n.rb +7 -0
- data/lib/active_admin/helpers/optional_display.rb +38 -0
- data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +115 -0
- data/lib/active_admin/inputs.rb +20 -0
- data/lib/active_admin/inputs/datepicker_input.rb +20 -0
- data/lib/active_admin/inputs/filters/base.rb +44 -0
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
- data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
- data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
- data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
- data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
- data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
- data/lib/active_admin/inputs/filters/select_input.rb +55 -0
- data/lib/active_admin/inputs/filters/string_input.rb +26 -0
- data/lib/active_admin/menu.rb +108 -0
- data/lib/active_admin/menu_collection.rb +93 -0
- data/lib/active_admin/menu_item.rb +97 -0
- data/lib/active_admin/namespace.rb +247 -0
- data/lib/active_admin/order_clause.rb +26 -0
- data/lib/active_admin/orm/active_record.rb +5 -0
- data/lib/active_admin/orm/active_record/comments.rb +95 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +45 -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.rb +2 -0
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +88 -0
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/page.rb +92 -0
- data/lib/active_admin/page_controller.rb +33 -0
- data/lib/active_admin/page_dsl.rb +28 -0
- data/lib/active_admin/page_presenter.rb +32 -0
- data/lib/active_admin/pundit_adapter.rb +68 -0
- data/lib/active_admin/reloader.rb +25 -0
- data/lib/active_admin/resource.rb +168 -0
- data/lib/active_admin/resource/action_items.rb +108 -0
- data/lib/active_admin/resource/belongs_to.rb +44 -0
- data/lib/active_admin/resource/controllers.rb +19 -0
- data/lib/active_admin/resource/includes.rb +12 -0
- data/lib/active_admin/resource/menu.rb +64 -0
- data/lib/active_admin/resource/naming.rb +62 -0
- data/lib/active_admin/resource/page_presenters.rb +82 -0
- data/lib/active_admin/resource/pagination.rb +23 -0
- data/lib/active_admin/resource/routes.rb +115 -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 +28 -0
- data/lib/active_admin/resource_collection.rb +72 -0
- data/lib/active_admin/resource_controller.rb +51 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/data_access.rb +317 -0
- data/lib/active_admin/resource_controller/decorators.rb +102 -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/streaming.rb +43 -0
- data/lib/active_admin/resource_dsl.rb +190 -0
- data/lib/active_admin/router.rb +106 -0
- data/lib/active_admin/scope.rb +56 -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.rb +19 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
- data/lib/active_admin/view_helpers/display_helper.rb +97 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +46 -0
- data/lib/active_admin/view_helpers/fields_for.rb +51 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
- data/lib/active_admin/view_helpers/form_helper.rb +20 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -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/active_admin_form.rb +124 -0
- data/lib/active_admin/views/components/attributes_table.rb +94 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +161 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
- data/lib/active_admin/views/components/index_list.rb +68 -0
- data/lib/active_admin/views/components/paginated_collection.rb +163 -0
- data/lib/active_admin/views/components/panel.rb +38 -0
- data/lib/active_admin/views/components/scopes.rb +66 -0
- data/lib/active_admin/views/components/sidebar_section.rb +34 -0
- data/lib/active_admin/views/components/site_title.rb +55 -0
- data/lib/active_admin/views/components/status_tag.rb +80 -0
- data/lib/active_admin/views/components/table_for.rb +218 -0
- data/lib/active_admin/views/components/tabs.rb +28 -0
- data/lib/active_admin/views/components/unsupported_browser.rb +11 -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 +373 -0
- data/lib/active_admin/views/pages/base.rb +147 -0
- data/lib/active_admin/views/pages/form.rb +65 -0
- data/lib/active_admin/views/pages/index.rb +163 -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 +66 -0
- data/lib/active_admin/views/title_bar.rb +55 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
- data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +65 -0
- data/lib/generators/active_admin/install/install_generator.rb +45 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +272 -0
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -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/page/USAGE +8 -0
- data/lib/generators/active_admin/page/page_generator.rb +12 -0
- data/lib/generators/active_admin/page/templates/page.rb +5 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +45 -0
- data/lib/ransack_ext.rb +20 -0
- data/script/local +53 -0
- data/script/travis_cache +107 -0
- data/script/use_rails +53 -0
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
- data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
- data/spec/javascripts/fixtures/checkboxes.html +9 -0
- data/spec/javascripts/fixtures/flashes.html +2 -0
- data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
- data/spec/javascripts/helpers/SpecHelper.js +3 -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/rails_helper.rb +161 -0
- data/spec/requests/default_namespace_spec.rb +61 -0
- data/spec/requests/javascript_spec.rb +22 -0
- data/spec/requests/memory_spec.rb +21 -0
- data/spec/requests/stylesheets_spec.rb +18 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/active_admin_request_helpers.rb +27 -0
- data/spec/support/deferred_garbage_collection.rb +19 -0
- data/spec/support/detect_rails_version.rb +34 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +162 -0
- data/spec/support/rails_template_with_data.rb +74 -0
- data/spec/support/templates/admin/stores.rb +9 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/manifest.js +3 -0
- data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
- data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
- data/spec/support/templates/policies/admin_user_policy.rb +11 -0
- data/spec/support/templates/policies/application_policy.rb +45 -0
- data/spec/support/templates/policies/category_policy.rb +7 -0
- data/spec/support/templates/policies/post_policy.rb +15 -0
- data/spec/support/templates/policies/store_policy.rb +11 -0
- data/spec/support/templates/policies/user_policy.rb +11 -0
- data/spec/support/templates/post_decorator.rb +11 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +134 -0
- data/spec/unit/active_admin_spec.rb +11 -0
- data/spec/unit/application_spec.rb +165 -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/authorization/index_overriding_spec.rb +23 -0
- data/spec/unit/auto_link_spec.rb +69 -0
- data/spec/unit/batch_actions/resource_spec.rb +97 -0
- data/spec/unit/batch_actions/settings_spec.rb +61 -0
- data/spec/unit/belongs_to_spec.rb +65 -0
- data/spec/unit/cancan_adapter_spec.rb +43 -0
- data/spec/unit/comments_spec.rb +188 -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 +41 -0
- data/spec/unit/csv_builder_spec.rb +303 -0
- data/spec/unit/dependency_spec.rb +135 -0
- data/spec/unit/devise_spec.rb +96 -0
- data/spec/unit/dsl_spec.rb +122 -0
- data/spec/unit/filters/filter_form_builder_spec.rb +434 -0
- data/spec/unit/filters/humanized_spec.rb +64 -0
- data/spec/unit/filters/resource_spec.rb +128 -0
- data/spec/unit/form_builder_spec.rb +932 -0
- data/spec/unit/generators/install_spec.rb +24 -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/i18n_spec.rb +12 -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 +73 -0
- data/spec/unit/namespace/register_resource_spec.rb +160 -0
- data/spec/unit/namespace_spec.rb +103 -0
- data/spec/unit/order_clause_spec.rb +81 -0
- data/spec/unit/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +78 -0
- data/spec/unit/pretty_format_spec.rb +77 -0
- data/spec/unit/pundit_adapter_spec.rb +98 -0
- data/spec/unit/resource/action_items_spec.rb +65 -0
- data/spec/unit/resource/includes_spec.rb +21 -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 +77 -0
- data/spec/unit/resource/scopes_spec.rb +50 -0
- data/spec/unit/resource/sidebars_spec.rb +43 -0
- data/spec/unit/resource_collection_spec.rb +175 -0
- data/spec/unit/resource_controller/data_access_spec.rb +140 -0
- data/spec/unit/resource_controller/decorators_spec.rb +94 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +38 -0
- data/spec/unit/resource_controller_spec.rb +269 -0
- data/spec/unit/resource_registration_spec.rb +56 -0
- data/spec/unit/resource_spec.rb +337 -0
- data/spec/unit/routing_spec.rb +185 -0
- data/spec/unit/scope_spec.rb +185 -0
- data/spec/unit/settings_spec.rb +118 -0
- data/spec/unit/view_factory_spec.rb +19 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +217 -0
- data/spec/unit/view_helpers/display_helper_spec.rb +165 -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/flash_helper_spec.rb +25 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +43 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +139 -0
- data/spec/unit/views/components/attributes_table_spec.rb +272 -0
- data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
- data/spec/unit/views/components/blank_slate_spec.rb +27 -0
- data/spec/unit/views/components/columns_spec.rb +189 -0
- data/spec/unit/views/components/index_list_spec.rb +35 -0
- data/spec/unit/views/components/index_table_for_spec.rb +127 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
- data/spec/unit/views/components/panel_spec.rb +58 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
- data/spec/unit/views/components/site_title_spec.rb +78 -0
- data/spec/unit/views/components/status_tag_spec.rb +249 -0
- data/spec/unit/views/components/table_for_spec.rb +434 -0
- data/spec/unit/views/components/tabs_spec.rb +39 -0
- data/spec/unit/views/components/unsupported_browser_spec.rb +41 -0
- data/spec/unit/views/index_as_blog_spec.rb +76 -0
- data/spec/unit/views/pages/form_spec.rb +51 -0
- data/spec/unit/views/pages/index_spec.rb +60 -0
- data/spec/unit/views/pages/layout_spec.rb +59 -0
- data/spec/unit/views/pages/show_spec.rb +33 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +158 -0
- data/tasks/docs.rake +37 -0
- data/tasks/parallel_tests.rake +66 -0
- data/tasks/test.rake +91 -0
- data/tasks/yard.rake +9 -0
- metadata +974 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class Engine < ::Rails::Engine
|
|
3
|
+
initializer "active_admin.precompile", group: :all do |app|
|
|
4
|
+
ActiveAdmin.application.stylesheets.each do |path, _|
|
|
5
|
+
app.config.assets.precompile << path
|
|
6
|
+
end
|
|
7
|
+
ActiveAdmin.application.javascripts.each do |path|
|
|
8
|
+
app.config.assets.precompile << path
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
initializer 'active_admin.routes' do
|
|
13
|
+
require 'active_admin/helpers/routes/url_helpers'
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
# Exception class to raise when there is an authorized access
|
|
3
|
+
# exception thrown. The exception has a few goodies that may
|
|
4
|
+
# be useful for capturing / recognizing security issues.
|
|
5
|
+
class AccessDenied < StandardError
|
|
6
|
+
attr_reader :user, :action, :subject
|
|
7
|
+
|
|
8
|
+
def initialize(user, action, subject)
|
|
9
|
+
@user, @action, @subject = user, action, subject
|
|
10
|
+
|
|
11
|
+
super()
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def message
|
|
15
|
+
I18n.t("active_admin.access_denied.message")
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class Error < RuntimeError
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class ErrorLoading < Error
|
|
23
|
+
# Locates the most recent file and line from the caught exception's backtrace.
|
|
24
|
+
def find_cause(folder, backtrace)
|
|
25
|
+
backtrace.grep(/\/(#{folder}\/.*\.rb):(\d+)/){ [$1, $2] }.first
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class DatabaseHitDuringLoad < ErrorLoading
|
|
30
|
+
def initialize(exception)
|
|
31
|
+
file, line = find_cause(:app, exception.backtrace)
|
|
32
|
+
|
|
33
|
+
super "Your file, #{file} (line #{line}), caused a database error while Active Admin was loading. This " +
|
|
34
|
+
"is most common when your database is missing or doesn't have the latest migrations applied. To " +
|
|
35
|
+
"prevent this error, move the code to a place where it will only be run when a page is rendered. " +
|
|
36
|
+
"One solution can be, to wrap the query in a Proc. " +
|
|
37
|
+
"Original error message: #{exception.message}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.capture
|
|
41
|
+
yield
|
|
42
|
+
rescue *database_error_classes => exception
|
|
43
|
+
raise new exception
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def self.database_error_classes
|
|
49
|
+
@classes ||= []
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class DependencyError < ErrorLoading
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
class NoMenuError < KeyError
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class GeneratorError < Error
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
class EventDispatcher
|
|
4
|
+
def subscribe(*event_names, &block)
|
|
5
|
+
Deprecation.warn "`ActiveAdmin::Event.subscribe` is deprecated, use `ActiveSupport::Notifications.subscribe`"
|
|
6
|
+
event_names.each do |event|
|
|
7
|
+
ActiveSupport::Notifications.subscribe event,
|
|
8
|
+
&wrap_block_for_active_support_notifications(block)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def dispatch(event, *args)
|
|
13
|
+
Deprecation.warn "`ActiveAdmin::Event.dispatch` is deprecated, use `ActiveSupport::Notifications.publish`"
|
|
14
|
+
ActiveSupport::Notifications.publish event, *args
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def wrap_block_for_active_support_notifications block
|
|
18
|
+
proc { |event, *args| block.call *args }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# ActiveAdmin::Event is set to a dispatcher
|
|
23
|
+
Event = EventDispatcher.new
|
|
24
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
require 'active_admin/filters/dsl'
|
|
2
|
+
require 'active_admin/filters/resource_extension'
|
|
3
|
+
require 'active_admin/filters/formtastic_addons'
|
|
4
|
+
require 'active_admin/filters/forms'
|
|
5
|
+
|
|
6
|
+
# Add our Extensions
|
|
7
|
+
ActiveAdmin::ResourceDSL.send :include, ActiveAdmin::Filters::DSL
|
|
8
|
+
ActiveAdmin::Resource.send :include, ActiveAdmin::Filters::ResourceExtension
|
|
9
|
+
ActiveAdmin::ViewHelpers.send :include, ActiveAdmin::Filters::ViewHelper
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'active_admin/filters/humanized'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
module Filters
|
|
5
|
+
|
|
6
|
+
class Active
|
|
7
|
+
attr_accessor :filters, :scope
|
|
8
|
+
|
|
9
|
+
def initialize(resource_class, params)
|
|
10
|
+
@resource_class = resource_class
|
|
11
|
+
@params = params.respond_to?(:to_unsafe_h) ? params.to_unsafe_h : params
|
|
12
|
+
@scope = humanize_scope
|
|
13
|
+
@filters = build_filters
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def build_filters
|
|
19
|
+
filters = @params[:q] || []
|
|
20
|
+
filters.map{ |param| Humanized.new(param) }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def humanize_scope
|
|
24
|
+
scope = @params['scope']
|
|
25
|
+
scope ? scope.humanize : "All"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Filters
|
|
3
|
+
module DSL
|
|
4
|
+
|
|
5
|
+
# For docs, please see ActiveAdmin::Filters::ResourceExtension#add_filter
|
|
6
|
+
def filter(attribute, options = {})
|
|
7
|
+
config.add_filter(attribute, options)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# For docs, please see ActiveAdmin::Filters::ResourceExtension#remove_filter
|
|
11
|
+
def remove_filter(*attributes)
|
|
12
|
+
config.remove_filter(*attributes)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# For docs, please see ActiveAdmin::Filters::ResourceExtension#preserve_default_filters!
|
|
16
|
+
def preserve_default_filters!
|
|
17
|
+
config.preserve_default_filters!
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Filters
|
|
3
|
+
# This form builder defines methods to build filter forms such
|
|
4
|
+
# as the one found in the sidebar of the index page of a standard resource.
|
|
5
|
+
class FormBuilder < ::ActiveAdmin::FormBuilder
|
|
6
|
+
include ::ActiveAdmin::Filters::FormtasticAddons
|
|
7
|
+
self.input_namespaces = [::Object, ::ActiveAdmin::Inputs::Filters, ::ActiveAdmin::Inputs, ::Formtastic::Inputs]
|
|
8
|
+
|
|
9
|
+
# TODO: remove input class finders after formtastic 4 (where it will be default)
|
|
10
|
+
self.input_class_finder = ::Formtastic::InputClassFinder
|
|
11
|
+
|
|
12
|
+
def filter(method, options = {})
|
|
13
|
+
if method.present? && options[:as] ||= default_input_type(method)
|
|
14
|
+
template.concat input(method, options)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
# Returns the default filter type for a given attribute. If you want
|
|
21
|
+
# to use a custom search method, you have to specify the type yourself.
|
|
22
|
+
def default_input_type(method, options = {})
|
|
23
|
+
if method =~ /_(eq|equals|cont|contains|start|starts_with|end|ends_with)\z/
|
|
24
|
+
:string
|
|
25
|
+
elsif klass._ransackers.key?(method.to_s)
|
|
26
|
+
klass._ransackers[method.to_s].type
|
|
27
|
+
elsif reflection_for(method) || polymorphic_foreign_type?(method)
|
|
28
|
+
:select
|
|
29
|
+
elsif column = column_for(method)
|
|
30
|
+
case column.type
|
|
31
|
+
when :date, :datetime
|
|
32
|
+
:date_range
|
|
33
|
+
when :string, :text
|
|
34
|
+
:string
|
|
35
|
+
when :integer, :float, :decimal
|
|
36
|
+
:numeric
|
|
37
|
+
when :boolean
|
|
38
|
+
:boolean
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# This module is included into the view
|
|
46
|
+
module ViewHelper
|
|
47
|
+
|
|
48
|
+
# Helper method to render a filter form
|
|
49
|
+
def active_admin_filters_form_for(search, filters, options = {})
|
|
50
|
+
defaults = { builder: ActiveAdmin::Filters::FormBuilder,
|
|
51
|
+
url: collection_path,
|
|
52
|
+
html: {class: 'filter_form'} }
|
|
53
|
+
required = { html: {method: :get},
|
|
54
|
+
as: :q }
|
|
55
|
+
options = defaults.deep_merge(options).deep_merge(required)
|
|
56
|
+
|
|
57
|
+
form_for search, options do |f|
|
|
58
|
+
filters.each do |attribute, opts|
|
|
59
|
+
next if opts.key?(:if) && !call_method_or_proc_on(self, opts[:if])
|
|
60
|
+
next if opts.key?(:unless) && call_method_or_proc_on(self, opts[:unless])
|
|
61
|
+
|
|
62
|
+
f.filter attribute, opts.except(:if, :unless)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
buttons = content_tag :div, class: "buttons" do
|
|
66
|
+
f.submit(I18n.t('active_admin.filters.buttons.filter')) +
|
|
67
|
+
link_to(I18n.t('active_admin.filters.buttons.clear'), '#', class: 'clear_filters_btn') +
|
|
68
|
+
hidden_field_tags_for(params, except: except_hidden_fields)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
f.template.concat buttons
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
def except_hidden_fields
|
|
78
|
+
[:q, :page]
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Filters
|
|
3
|
+
module FormtasticAddons
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# The below are Formtastic method overrides that jump inside of the Ransack
|
|
7
|
+
# search object to get at the object being searched upon.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
def humanized_method_name
|
|
11
|
+
if klass.respond_to?(:human_attribute_name)
|
|
12
|
+
klass.human_attribute_name(method)
|
|
13
|
+
else
|
|
14
|
+
method.to_s.public_send(builder.label_str_method)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def reflection_for(method)
|
|
19
|
+
klass.reflect_on_association(method) if klass.respond_to? :reflect_on_association
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def column_for(method)
|
|
23
|
+
klass.columns_hash[method.to_s] if klass.respond_to? :columns_hash
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def column
|
|
27
|
+
column_for method
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# The below are custom methods that Formtastic does not provide.
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
# The resource class, unwrapped from Ransack
|
|
35
|
+
def klass
|
|
36
|
+
@object.object.klass
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def polymorphic_foreign_type?(method)
|
|
40
|
+
klass.reflect_on_all_associations.select{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
|
|
41
|
+
.map(&:foreign_type).include? method.to_s
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# These help figure out whether the given method or association will be recognized by Ransack.
|
|
46
|
+
#
|
|
47
|
+
|
|
48
|
+
def searchable_has_many_through?
|
|
49
|
+
if reflection && reflection.options[:through]
|
|
50
|
+
reflection.through_reflection.klass.ransackable_attributes.include? reflection.foreign_key
|
|
51
|
+
else
|
|
52
|
+
false
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def seems_searchable?
|
|
57
|
+
has_predicate? || ransacker? || scope?
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# If the given method has a predicate (like _eq or _lteq), it's pretty
|
|
61
|
+
# likely we're dealing with a valid search method.
|
|
62
|
+
def has_predicate?
|
|
63
|
+
!!Ransack::Predicate.detect_from_string(method.to_s)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Ransack lets you define custom search methods, called ransackers.
|
|
67
|
+
def ransacker?
|
|
68
|
+
klass._ransackers.key? method.to_s
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Ransack supports exposing selected scopes on your model for advanced searches.
|
|
72
|
+
def scope?
|
|
73
|
+
context = Ransack::Context.for klass
|
|
74
|
+
context.respond_to?(:ransackable_scope?) && context.ransackable_scope?(method.to_s, klass)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Filters
|
|
3
|
+
|
|
4
|
+
class Humanized
|
|
5
|
+
include ActiveAdmin::ViewHelpers
|
|
6
|
+
|
|
7
|
+
def initialize(param)
|
|
8
|
+
@body = param[0]
|
|
9
|
+
@value = param[1]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def value
|
|
13
|
+
@value.is_a?(::Array) ? @value.compact.join(', ') : @value
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def body
|
|
17
|
+
predicate = ransack_predicate_translation
|
|
18
|
+
|
|
19
|
+
if current_predicate.nil?
|
|
20
|
+
predicate = @body.titleize
|
|
21
|
+
elsif translation_missing?(predicate)
|
|
22
|
+
predicate = active_admin_predicate_translation
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
"#{parse_parameter_body} #{predicate}".strip
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def parse_parameter_body
|
|
31
|
+
return if current_predicate.nil?
|
|
32
|
+
|
|
33
|
+
# Accounting for strings that might contain other predicates. Example:
|
|
34
|
+
# 'requires_approval' contains the substring 'eq'
|
|
35
|
+
split_string = "_#{current_predicate}"
|
|
36
|
+
|
|
37
|
+
@body.split(split_string)
|
|
38
|
+
.first
|
|
39
|
+
.gsub('_', ' ')
|
|
40
|
+
.strip
|
|
41
|
+
.titleize
|
|
42
|
+
.gsub('Id', 'ID')
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def current_predicate
|
|
46
|
+
@current_predicate ||= predicates.detect { |p| @body.end_with?("_#{p}") }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def predicates
|
|
50
|
+
Ransack::Predicate.names_by_decreasing_length
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def ransack_predicate_translation
|
|
54
|
+
I18n.t("ransack.predicates.#{current_predicate}")
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def active_admin_predicate_translation
|
|
58
|
+
translation = I18n.t("active_admin.filters.predicates.#{current_predicate}").downcase
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def translation_missing?(predicate)
|
|
62
|
+
predicate.downcase.include?('translation missing')
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
require 'active_admin/filters/active'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
module Filters
|
|
5
|
+
|
|
6
|
+
class Disabled < RuntimeError
|
|
7
|
+
def initialize
|
|
8
|
+
super "Can't remove a filter when filters are disabled. Enable filters with 'config.filters = true'"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module ResourceExtension
|
|
13
|
+
|
|
14
|
+
def initialize(*)
|
|
15
|
+
super
|
|
16
|
+
add_filters_sidebar_section
|
|
17
|
+
add_search_status_sidebar_section
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Returns the filters for this resource. If filters are not enabled,
|
|
21
|
+
# it will always return an empty hash.
|
|
22
|
+
#
|
|
23
|
+
# @return [Hash] Filters that apply for this resource
|
|
24
|
+
def filters
|
|
25
|
+
filters_enabled? ? filter_lookup : {}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Setter to enable / disable filters on this resource.
|
|
29
|
+
#
|
|
30
|
+
# Set to `nil` to inherit the setting from the namespace
|
|
31
|
+
def filters=(bool)
|
|
32
|
+
@filters_enabled = bool
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Setter to enable/disable showing current filters on this resource.
|
|
36
|
+
#
|
|
37
|
+
# Set to `nil` to inherit the setting from the namespace
|
|
38
|
+
def current_filters=(bool)
|
|
39
|
+
@current_filters_enabled = bool
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @return [Boolean] If filters are enabled for this resource
|
|
43
|
+
def filters_enabled?
|
|
44
|
+
@filters_enabled.nil? ? namespace.filters : @filters_enabled
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @return [Boolean] If show current filters are enabled for this resource
|
|
48
|
+
def current_filters_enabled?
|
|
49
|
+
@current_filters_enabled.nil? ? namespace.current_filters : @current_filters_enabled
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def preserve_default_filters!
|
|
53
|
+
@preserve_default_filters = true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def preserve_default_filters?
|
|
57
|
+
@preserve_default_filters == true
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Remove a filter for this resource. If filters are not enabled, this method
|
|
61
|
+
# will raise a RuntimeError
|
|
62
|
+
#
|
|
63
|
+
# @param [Symbol] attributes The attributes to not filter on
|
|
64
|
+
def remove_filter(*attributes)
|
|
65
|
+
raise Disabled unless filters_enabled?
|
|
66
|
+
|
|
67
|
+
attributes.each { |attribute| (@filters_to_remove ||= []) << attribute.to_sym }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Add a filter for this resource. If filters are not enabled, this method
|
|
71
|
+
# will raise a RuntimeError
|
|
72
|
+
#
|
|
73
|
+
# @param [Symbol] attribute The attribute to filter on
|
|
74
|
+
# @param [Hash] options The set of options that are passed through to
|
|
75
|
+
# ransack for the field definition.
|
|
76
|
+
def add_filter(attribute, options = {})
|
|
77
|
+
raise Disabled unless filters_enabled?
|
|
78
|
+
|
|
79
|
+
(@filters ||= {})[attribute.to_sym] = options
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Reset the filters to use defaults
|
|
83
|
+
def reset_filters!
|
|
84
|
+
@filters = nil
|
|
85
|
+
@filters_to_remove = nil
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
# Collapses the waveform, if you will, of which filters should be displayed.
|
|
91
|
+
# Removes filters and adds in default filters as desired.
|
|
92
|
+
def filter_lookup
|
|
93
|
+
filters = @filters.try(:dup) || {}
|
|
94
|
+
|
|
95
|
+
if filters.empty? || preserve_default_filters?
|
|
96
|
+
default_filters.each do |f|
|
|
97
|
+
filters[f] ||= {}
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
if @filters_to_remove
|
|
102
|
+
@filters_to_remove.each &filters.method(:delete)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
filters
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# @return [Array] The array of default filters for this resource
|
|
109
|
+
def default_filters
|
|
110
|
+
result = []
|
|
111
|
+
result.concat default_association_filters if namespace.include_default_association_filters
|
|
112
|
+
result.concat default_content_filters
|
|
113
|
+
result.concat custom_ransack_filters
|
|
114
|
+
result
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def custom_ransack_filters
|
|
118
|
+
if resource_class.respond_to?(:_ransackers)
|
|
119
|
+
resource_class._ransackers.keys.map(&:to_sym)
|
|
120
|
+
else
|
|
121
|
+
[]
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Returns a default set of filters for the associations
|
|
126
|
+
def default_association_filters
|
|
127
|
+
if resource_class.respond_to?(:reflect_on_all_associations)
|
|
128
|
+
poly, not_poly = resource_class.reflect_on_all_associations.partition{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
|
|
129
|
+
|
|
130
|
+
# remove deeply nested associations
|
|
131
|
+
not_poly.reject!{ |r| r.chain.length > 2 }
|
|
132
|
+
|
|
133
|
+
filters = poly.map(&:foreign_type) + not_poly.map(&:name)
|
|
134
|
+
filters.map &:to_sym
|
|
135
|
+
else
|
|
136
|
+
[]
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Returns a default set of filters for the content columns
|
|
141
|
+
def default_content_filters
|
|
142
|
+
if resource_class.respond_to? :content_columns
|
|
143
|
+
resource_class.content_columns.map{ |c| c.name.to_sym }
|
|
144
|
+
else
|
|
145
|
+
[]
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def add_filters_sidebar_section
|
|
150
|
+
self.sidebar_sections << filters_sidebar_section
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def filters_sidebar_section
|
|
154
|
+
ActiveAdmin::SidebarSection.new :filters, only: :index, if: ->{ active_admin_config.filters.any? } do
|
|
155
|
+
active_admin_filters_form_for assigns[:search], active_admin_config.filters
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def add_search_status_sidebar_section
|
|
160
|
+
if current_filters_enabled?
|
|
161
|
+
self.sidebar_sections << search_status_section
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def search_status_section
|
|
166
|
+
ActiveAdmin::SidebarSection.new I18n.t("active_admin.search_status.headline"), only: :index, if: -> { params[:q] || params[:scope] } do
|
|
167
|
+
active = ActiveAdmin::Filters::Active.new(resource_class, params)
|
|
168
|
+
|
|
169
|
+
span do
|
|
170
|
+
h4 I18n.t("active_admin.search_status.current_scope"), style: 'display: inline'
|
|
171
|
+
b active.scope, style: "display: inline"
|
|
172
|
+
|
|
173
|
+
div style: "margin-top: 10px" do
|
|
174
|
+
h4 I18n.t("active_admin.search_status.current_filters"), style: 'margin-bottom: 10px'
|
|
175
|
+
ul do
|
|
176
|
+
if active.filters.blank?
|
|
177
|
+
li I18n.t("active_admin.search_status.no_current_filters")
|
|
178
|
+
else
|
|
179
|
+
active.filters.each do |filter|
|
|
180
|
+
li do
|
|
181
|
+
span filter.body
|
|
182
|
+
b filter.value
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
end
|