activeadmin 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activeadmin might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +546 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/CONTRIBUTING.md +217 -0
- data/LICENSE +20 -0
- data/README.md +110 -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.es6 +23 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
- data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
- data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
- data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
- data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
- data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +55 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
- data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
- data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
- data/app/assets/stylesheets/active_admin/_base.scss +41 -0
- data/app/assets/stylesheets/active_admin/_forms.scss +326 -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 +6 -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 +55 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
- data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -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 +8 -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/_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 +287 -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 +21 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
- data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/active_admin/devise/shared/_links.erb +33 -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/kaminari/active_admin/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
- data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -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 +135 -0
- data/config/locales/bg.yml +119 -0
- data/config/locales/bs.yml +121 -0
- data/config/locales/ca.yml +106 -0
- data/config/locales/cs.yml +109 -0
- data/config/locales/da.yml +137 -0
- data/config/locales/de-CH.yml +101 -0
- data/config/locales/de.yml +144 -0
- data/config/locales/el.yml +126 -0
- data/config/locales/en-CA.yml +139 -0
- data/config/locales/en-GB.yml +139 -0
- data/config/locales/en.yml +162 -0
- data/config/locales/eo.yml +145 -0
- data/config/locales/es-MX.yml +96 -0
- data/config/locales/es.yml +162 -0
- data/config/locales/fa.yml +119 -0
- data/config/locales/fi.yml +112 -0
- data/config/locales/fr.yml +141 -0
- data/config/locales/he.yml +141 -0
- data/config/locales/hr.yml +123 -0
- data/config/locales/hu.yml +102 -0
- data/config/locales/id.yml +135 -0
- data/config/locales/it.yml +144 -0
- data/config/locales/ja.yml +141 -0
- data/config/locales/ko.yml +120 -0
- data/config/locales/lt.yml +142 -0
- data/config/locales/lv.yml +92 -0
- data/config/locales/mk.yml +134 -0
- data/config/locales/nb.yml +130 -0
- data/config/locales/nl.yml +144 -0
- data/config/locales/pl.yml +168 -0
- data/config/locales/pt-BR.yml +143 -0
- data/config/locales/pt-PT.yml +92 -0
- data/config/locales/ro.yml +96 -0
- data/config/locales/ru.yml +141 -0
- data/config/locales/sk.yml +109 -0
- data/config/locales/sv-SE.yml +135 -0
- data/config/locales/tr.yml +144 -0
- data/config/locales/uk.yml +138 -0
- data/config/locales/vi.yml +134 -0
- data/config/locales/zh-CN.yml +143 -0
- data/config/locales/zh-TW.yml +135 -0
- data/docs/.gitignore +1 -0
- data/docs/0-installation.md +118 -0
- data/docs/1-general-configuration.md +204 -0
- data/docs/10-custom-pages.md +150 -0
- data/docs/11-decorators.md +59 -0
- data/docs/12-arbre-components.md +214 -0
- data/docs/13-authorization-adapter.md +285 -0
- data/docs/14-gotchas.md +138 -0
- data/docs/2-resource-customization.md +466 -0
- data/docs/3-index-pages.md +328 -0
- data/docs/3-index-pages/custom-index.md +35 -0
- data/docs/3-index-pages/index-as-block.md +19 -0
- data/docs/3-index-pages/index-as-blog.md +69 -0
- data/docs/3-index-pages/index-as-grid.md +27 -0
- data/docs/3-index-pages/index-as-table.md +227 -0
- data/docs/4-csv-format.md +74 -0
- data/docs/5-forms.md +232 -0
- data/docs/6-show-pages.md +81 -0
- data/docs/7-sidebars.md +75 -0
- data/docs/8-custom-actions.md +177 -0
- data/docs/9-batch-actions.md +237 -0
- data/docs/CNAME +1 -0
- data/docs/Gemfile +4 -0
- data/docs/Gemfile.lock +249 -0
- data/docs/README.md +24 -0
- data/docs/_config.yml +2 -0
- data/docs/_includes/footer.html +8 -0
- data/docs/_includes/google-analytics.html +16 -0
- data/docs/_includes/head.html +7 -0
- data/docs/_includes/toc.html +98 -0
- data/docs/_includes/top-menu.html +17 -0
- data/docs/_layouts/default.html +21 -0
- data/docs/documentation.md +60 -0
- data/docs/images/activeadmin.png +0 -0
- data/docs/images/code-header.png +0 -0
- data/docs/images/divider.png +0 -0
- data/docs/images/features.png +0 -0
- data/docs/images/tidelift.svg +14 -0
- data/docs/index.html +125 -0
- data/docs/stylesheets/main.css +1176 -0
- data/lib/active_admin.rb +134 -0
- data/lib/active_admin/abstract_view_factory.rb +47 -0
- data/lib/active_admin/application.rb +234 -0
- data/lib/active_admin/application_settings.rb +42 -0
- data/lib/active_admin/asset_registration.rb +29 -0
- data/lib/active_admin/authorization_adapter.rb +129 -0
- data/lib/active_admin/base_controller.rb +81 -0
- data/lib/active_admin/base_controller/authorization.rb +127 -0
- data/lib/active_admin/base_controller/menu.rb +34 -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 +155 -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 +38 -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 +13 -0
- data/lib/active_admin/csv_builder.rb +133 -0
- data/lib/active_admin/dependency.rb +100 -0
- data/lib/active_admin/deprecation.rb +10 -0
- data/lib/active_admin/devise.rb +80 -0
- data/lib/active_admin/dsl.rb +160 -0
- data/lib/active_admin/dynamic_setting.rb +38 -0
- data/lib/active_admin/dynamic_settings_node.rb +28 -0
- data/lib/active_admin/engine.rb +21 -0
- data/lib/active_admin/error.rb +64 -0
- data/lib/active_admin/filters.rb +11 -0
- data/lib/active_admin/filters/active.rb +29 -0
- data/lib/active_admin/filters/active_filter.rb +124 -0
- data/lib/active_admin/filters/active_sidebar.rb +54 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +85 -0
- data/lib/active_admin/filters/formtastic_addons.rb +79 -0
- data/lib/active_admin/filters/resource_extension.rb +155 -0
- data/lib/active_admin/form_builder.rb +182 -0
- data/lib/active_admin/generators/boilerplate.rb +45 -0
- data/lib/active_admin/helpers/collection.rb +19 -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 +24 -0
- data/lib/active_admin/inputs.rb +21 -0
- data/lib/active_admin/inputs/datepicker_input.rb +27 -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 +49 -0
- data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
- data/lib/active_admin/inputs/filters/select_input.rb +58 -0
- data/lib/active_admin/inputs/filters/string_input.rb +26 -0
- data/lib/active_admin/inputs/filters/text_input.rb +25 -0
- data/lib/active_admin/localizers.rb +11 -0
- data/lib/active_admin/localizers/resource_localizer.rb +35 -0
- data/lib/active_admin/menu.rb +102 -0
- data/lib/active_admin/menu_collection.rb +91 -0
- data/lib/active_admin/menu_item.rb +69 -0
- data/lib/active_admin/namespace.rb +266 -0
- data/lib/active_admin/namespace_settings.rb +110 -0
- data/lib/active_admin/order_clause.rb +48 -0
- data/lib/active_admin/orm/active_record.rb +5 -0
- data/lib/active_admin/orm/active_record/comments.rb +101 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +31 -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 +100 -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 +111 -0
- data/lib/active_admin/page_controller.rb +29 -0
- data/lib/active_admin/page_dsl.rb +32 -0
- data/lib/active_admin/page_presenter.rb +33 -0
- data/lib/active_admin/pundit_adapter.rb +81 -0
- data/lib/active_admin/resource.rb +207 -0
- data/lib/active_admin/resource/action_items.rb +120 -0
- data/lib/active_admin/resource/attributes.rb +47 -0
- data/lib/active_admin/resource/belongs_to.rb +50 -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 +67 -0
- data/lib/active_admin/resource/naming.rb +62 -0
- data/lib/active_admin/resource/ordering.rb +11 -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 +139 -0
- data/lib/active_admin/resource/scope_to.rb +74 -0
- data/lib/active_admin/resource/scopes.rb +52 -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 +64 -0
- data/lib/active_admin/resource_controller/action_builder.rb +31 -0
- data/lib/active_admin/resource_controller/data_access.rb +322 -0
- data/lib/active_admin/resource_controller/decorators.rb +102 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +26 -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 +224 -0
- data/lib/active_admin/router.rb +114 -0
- data/lib/active_admin/scope.rb +64 -0
- data/lib/active_admin/settings_node.rb +19 -0
- data/lib/active_admin/sidebar_section.rb +39 -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 +20 -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 +104 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +59 -0
- data/lib/active_admin/view_helpers/fields_for.rb +50 -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 +100 -0
- data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -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 +155 -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 +69 -0
- data/lib/active_admin/views/components/menu.rb +32 -0
- data/lib/active_admin/views/components/menu_item.rb +58 -0
- data/lib/active_admin/views/components/paginated_collection.rb +159 -0
- data/lib/active_admin/views/components/panel.rb +38 -0
- data/lib/active_admin/views/components/scopes.rb +72 -0
- data/lib/active_admin/views/components/sidebar.rb +13 -0
- data/lib/active_admin/views/components/sidebar_section.rb +34 -0
- data/lib/active_admin/views/components/site_title.rb +54 -0
- data/lib/active_admin/views/components/status_tag.rb +75 -0
- data/lib/active_admin/views/components/table_for.rb +209 -0
- data/lib/active_admin/views/components/tabs.rb +40 -0
- data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
- data/lib/active_admin/views/footer.rb +30 -0
- data/lib/active_admin/views/header.rb +19 -0
- data/lib/active_admin/views/index_as_block.rb +36 -0
- data/lib/active_admin/views/index_as_blog.rb +155 -0
- data/lib/active_admin/views/index_as_grid.rb +80 -0
- data/lib/active_admin/views/index_as_table.rb +392 -0
- data/lib/active_admin/views/pages/base.rb +126 -0
- data/lib/active_admin/views/pages/form.rb +64 -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 +65 -0
- data/lib/active_admin/views/tabbed_navigation.rb +11 -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 +1 -0
- data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
- data/lib/generators/active_admin/install/install_generator.rb +49 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +315 -0
- data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
- data/lib/generators/active_admin/install/templates/dashboard.rb +32 -0
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +16 -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.erb +44 -0
- data/lib/ransack_ext.rb +20 -0
- data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
- data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
- data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
- data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
- data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
- data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
- data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
- data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
- data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
- data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
- data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
- data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
- data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
- data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
- data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
- data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
- data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
- data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +291 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
- data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
- metadata +616 -0
@@ -0,0 +1,11 @@
|
|
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
|
+
require 'active_admin/helpers/optional_display'
|
6
|
+
require 'active_admin/filters/active_sidebar'
|
7
|
+
|
8
|
+
# Add our Extensions
|
9
|
+
ActiveAdmin::ResourceDSL.send :include, ActiveAdmin::Filters::DSL
|
10
|
+
ActiveAdmin::Resource.send :include, ActiveAdmin::Filters::ResourceExtension
|
11
|
+
ActiveAdmin::ViewHelpers.send :include, ActiveAdmin::Filters::ViewHelper
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'active_admin/filters/active_filter'
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module Filters
|
5
|
+
|
6
|
+
class Active
|
7
|
+
attr_accessor :filters, :resource
|
8
|
+
|
9
|
+
# Instantiate a `Active` object containing collection of current active filters
|
10
|
+
|
11
|
+
# @param resource [ActiveAdmin::Resource] current resource
|
12
|
+
# @param search [Ransack::Search] search object
|
13
|
+
#
|
14
|
+
# @see ActiveAdmin::ResourceController::DataAcces#apply_filtering
|
15
|
+
def initialize(resource, search)
|
16
|
+
@resource = resource
|
17
|
+
@filters = build_filters(search.conditions)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def build_filters(conditions)
|
23
|
+
conditions.map { |condition| ActiveFilter.new(resource, condition.dup) }
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module Filters
|
3
|
+
|
4
|
+
class ActiveFilter
|
5
|
+
include ActiveAdmin::ViewHelpers
|
6
|
+
|
7
|
+
attr_reader :resource, :condition, :related_class
|
8
|
+
|
9
|
+
# Instantiate a `ActiveFilter`
|
10
|
+
#
|
11
|
+
# @param resource [ActiveAdmin::Resource] current resource
|
12
|
+
# @param condition [Ransack::Nodes::Condition] applied ransack condition
|
13
|
+
def initialize(resource, condition)
|
14
|
+
@resource = resource
|
15
|
+
@condition = condition
|
16
|
+
@related_class = find_class if find_class?
|
17
|
+
end
|
18
|
+
|
19
|
+
def values
|
20
|
+
condition_values = condition.values.map(&:value)
|
21
|
+
if related_class
|
22
|
+
related_class.where(related_primary_key => condition_values)
|
23
|
+
else
|
24
|
+
condition_values
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def label
|
29
|
+
translated_predicate = predicate_name.downcase
|
30
|
+
if filter_label && filter_label.is_a?(Proc)
|
31
|
+
"#{filter_label.call} #{translated_predicate}"
|
32
|
+
elsif filter_label
|
33
|
+
"#{filter_label} #{translated_predicate}"
|
34
|
+
elsif related_class
|
35
|
+
"#{related_class_name} #{translated_predicate}"
|
36
|
+
else
|
37
|
+
"#{attribute_name} #{translated_predicate}"
|
38
|
+
end.strip
|
39
|
+
end
|
40
|
+
|
41
|
+
def predicate_name
|
42
|
+
I18n.t("active_admin.filters.predicates.#{condition.predicate.name}",
|
43
|
+
default: ransack_predicate_name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def html_options
|
47
|
+
{ class: "current_filter current_filter_#{condition.key}" }
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def resource_class
|
53
|
+
resource.resource_class
|
54
|
+
end
|
55
|
+
|
56
|
+
def attribute_name
|
57
|
+
resource_class.human_attribute_name(name)
|
58
|
+
end
|
59
|
+
|
60
|
+
def related_class_name
|
61
|
+
return unless related_class
|
62
|
+
|
63
|
+
related_class.model_name.human
|
64
|
+
end
|
65
|
+
|
66
|
+
def filter_label
|
67
|
+
return unless filter
|
68
|
+
|
69
|
+
filter[:label] || I18n.t(name, scope: ['formtastic', 'labels'], default: nil)
|
70
|
+
end
|
71
|
+
|
72
|
+
#@return Ransack::Nodes::Attribute
|
73
|
+
def condition_attribute
|
74
|
+
condition.attributes[0]
|
75
|
+
end
|
76
|
+
|
77
|
+
def name
|
78
|
+
condition_attribute.attr_name
|
79
|
+
end
|
80
|
+
|
81
|
+
def ransack_predicate_name
|
82
|
+
Ransack::Translate.predicate(condition.predicate.name)
|
83
|
+
end
|
84
|
+
|
85
|
+
def find_class?
|
86
|
+
['eq', 'in'].include? condition.predicate.arel_predicate
|
87
|
+
end
|
88
|
+
|
89
|
+
# detect related class for Ransack::Nodes::Attribute
|
90
|
+
def find_class
|
91
|
+
if condition_attribute.klass != resource_class && condition_attribute.klass.primary_key == name.to_s
|
92
|
+
condition_attribute.klass
|
93
|
+
elsif predicate_association
|
94
|
+
predicate_association.klass
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def filter
|
99
|
+
resource.filters[name.to_sym]
|
100
|
+
end
|
101
|
+
|
102
|
+
def related_primary_key
|
103
|
+
if predicate_association
|
104
|
+
predicate_association.association_primary_key
|
105
|
+
elsif related_class
|
106
|
+
related_class.primary_key
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def predicate_association
|
111
|
+
@predicate_association = find_predicate_association unless defined?(@predicate_association)
|
112
|
+
@predicate_association
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def find_predicate_association
|
118
|
+
condition_attribute.klass.reflect_on_all_associations.
|
119
|
+
reject { |r| r.options[:polymorphic] }. #skip polymorphic
|
120
|
+
detect { |r| r.foreign_key.to_s == name.to_s }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'active_admin/filters/active'
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module Filters
|
5
|
+
class ActiveSidebar < ActiveAdmin::SidebarSection
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super 'search_status', sidebar_options
|
9
|
+
end
|
10
|
+
|
11
|
+
def block
|
12
|
+
-> do
|
13
|
+
active_filters = ActiveAdmin::Filters::Active.new(active_admin_config, assigns[:search])
|
14
|
+
span do
|
15
|
+
if current_scope
|
16
|
+
h4 I18n.t("active_admin.search_status.current_scope"), style: 'display: inline'
|
17
|
+
b scope_name(current_scope), class: 'current_scope_name', style: "display: inline"
|
18
|
+
end
|
19
|
+
div style: "margin-top: 10px" do
|
20
|
+
h4 I18n.t("active_admin.search_status.current_filters"), style: 'margin-bottom: 10px'
|
21
|
+
ul do
|
22
|
+
if active_filters.filters.blank?
|
23
|
+
li I18n.t("active_admin.search_status.no_current_filters")
|
24
|
+
else
|
25
|
+
active_filters.filters.each do |filter|
|
26
|
+
li filter.html_options do
|
27
|
+
span do
|
28
|
+
text_node filter.label
|
29
|
+
end
|
30
|
+
b do
|
31
|
+
text_node to_sentence(filter.values.map { |v| pretty_format(v) })
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def title
|
43
|
+
I18n.t("active_admin.search_status.headline")
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
def sidebar_options
|
49
|
+
{ only: :index, if: -> { active_admin_config.current_filters_enabled? && (params[:q] || params[:scope]) } }
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
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,85 @@
|
|
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
|
+
# This module is included into the view
|
45
|
+
module ViewHelper
|
46
|
+
|
47
|
+
# Helper method to render a filter form
|
48
|
+
def active_admin_filters_form_for(search, filters, options = {})
|
49
|
+
defaults = { builder: ActiveAdmin::Filters::FormBuilder,
|
50
|
+
url: collection_path,
|
51
|
+
html: { class: 'filter_form' } }
|
52
|
+
required = { html: { method: :get },
|
53
|
+
as: :q }
|
54
|
+
options = defaults.deep_merge(options).deep_merge(required)
|
55
|
+
|
56
|
+
form_for search, options do |f|
|
57
|
+
filters.each do |attribute, opts|
|
58
|
+
next if opts.key?(:if) && !call_method_or_proc_on(self, opts[:if])
|
59
|
+
next if opts.key?(:unless) && call_method_or_proc_on(self, opts[:unless])
|
60
|
+
|
61
|
+
filter_opts = opts.except(:if, :unless)
|
62
|
+
filter_opts[:input_html] = instance_exec(&filter_opts[:input_html]) if filter_opts[:input_html].is_a?(Proc)
|
63
|
+
|
64
|
+
f.filter attribute, filter_opts
|
65
|
+
end
|
66
|
+
|
67
|
+
buttons = content_tag :div, class: "buttons" do
|
68
|
+
f.submit(I18n.t('active_admin.filters.buttons.filter')) +
|
69
|
+
link_to(I18n.t('active_admin.filters.buttons.clear'), '#', class: 'clear_filters_btn') +
|
70
|
+
hidden_field_tags_for(params, except: except_hidden_fields)
|
71
|
+
end
|
72
|
+
|
73
|
+
f.template.concat buttons
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def except_hidden_fields
|
80
|
+
[:q, :page]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
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? || 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,155 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module Filters
|
3
|
+
|
4
|
+
class Disabled < RuntimeError
|
5
|
+
def initialize
|
6
|
+
super "Can't remove a filter when filters are disabled. Enable filters with 'config.filters = true'"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ResourceExtension
|
11
|
+
|
12
|
+
def initialize(*)
|
13
|
+
super
|
14
|
+
add_filters_sidebar_section
|
15
|
+
add_search_status_sidebar_section
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the filters for this resource. If filters are not enabled,
|
19
|
+
# it will always return an empty hash.
|
20
|
+
#
|
21
|
+
# @return [Hash] Filters that apply for this resource
|
22
|
+
def filters
|
23
|
+
filters_enabled? ? filter_lookup : {}
|
24
|
+
end
|
25
|
+
|
26
|
+
# Setter to enable / disable filters on this resource.
|
27
|
+
#
|
28
|
+
# Set to `nil` to inherit the setting from the namespace
|
29
|
+
def filters=(bool)
|
30
|
+
@filters_enabled = bool
|
31
|
+
end
|
32
|
+
|
33
|
+
# Setter to enable/disable showing current filters on this resource.
|
34
|
+
#
|
35
|
+
# Set to `nil` to inherit the setting from the namespace
|
36
|
+
def current_filters=(bool)
|
37
|
+
@current_filters_enabled = bool
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Boolean] If filters are enabled for this resource
|
41
|
+
def filters_enabled?
|
42
|
+
@filters_enabled.nil? ? namespace.filters : @filters_enabled
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Boolean] If show current filters are enabled for this resource
|
46
|
+
def current_filters_enabled?
|
47
|
+
@current_filters_enabled.nil? ? namespace.current_filters : @current_filters_enabled
|
48
|
+
end
|
49
|
+
|
50
|
+
def preserve_default_filters!
|
51
|
+
@preserve_default_filters = true
|
52
|
+
end
|
53
|
+
|
54
|
+
def preserve_default_filters?
|
55
|
+
@preserve_default_filters == true
|
56
|
+
end
|
57
|
+
|
58
|
+
# Remove a filter for this resource. If filters are not enabled, this method
|
59
|
+
# will raise a RuntimeError
|
60
|
+
#
|
61
|
+
# @param [Symbol] attributes The attributes to not filter on
|
62
|
+
def remove_filter(*attributes)
|
63
|
+
raise Disabled unless filters_enabled?
|
64
|
+
|
65
|
+
attributes.each { |attribute| (@filters_to_remove ||= []) << attribute.to_sym }
|
66
|
+
end
|
67
|
+
|
68
|
+
# Add a filter for this resource. If filters are not enabled, this method
|
69
|
+
# will raise a RuntimeError
|
70
|
+
#
|
71
|
+
# @param [Symbol] attribute The attribute to filter on
|
72
|
+
# @param [Hash] options The set of options that are passed through to
|
73
|
+
# ransack for the field definition.
|
74
|
+
def add_filter(attribute, options = {})
|
75
|
+
raise Disabled unless filters_enabled?
|
76
|
+
|
77
|
+
(@filters ||= {})[attribute.to_sym] = options
|
78
|
+
end
|
79
|
+
|
80
|
+
# Reset the filters to use defaults
|
81
|
+
def reset_filters!
|
82
|
+
@filters = nil
|
83
|
+
@filters_to_remove = nil
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
# Collapses the waveform, if you will, of which filters should be displayed.
|
89
|
+
# Removes filters and adds in default filters as desired.
|
90
|
+
def filter_lookup
|
91
|
+
filters = @filters.try(:dup) || {}
|
92
|
+
|
93
|
+
if filters.empty? || preserve_default_filters?
|
94
|
+
default_filters.each do |f|
|
95
|
+
filters[f] ||= {}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
if @filters_to_remove
|
100
|
+
@filters_to_remove.each &filters.method(:delete)
|
101
|
+
end
|
102
|
+
|
103
|
+
filters
|
104
|
+
end
|
105
|
+
|
106
|
+
# @return [Array] The array of default filters for this resource
|
107
|
+
def default_filters
|
108
|
+
result = []
|
109
|
+
result.concat default_association_filters if namespace.include_default_association_filters
|
110
|
+
result.concat content_columns
|
111
|
+
result.concat custom_ransack_filters
|
112
|
+
result
|
113
|
+
end
|
114
|
+
|
115
|
+
def custom_ransack_filters
|
116
|
+
if resource_class.respond_to?(:_ransackers)
|
117
|
+
resource_class._ransackers.keys.map(&:to_sym)
|
118
|
+
else
|
119
|
+
[]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Returns a default set of filters for the associations
|
124
|
+
def default_association_filters
|
125
|
+
if resource_class.respond_to?(:reflect_on_all_associations)
|
126
|
+
poly, not_poly = resource_class.reflect_on_all_associations.partition { |r| r.macro == :belongs_to && r.options[:polymorphic] }
|
127
|
+
|
128
|
+
# remove deeply nested associations
|
129
|
+
not_poly.reject! { |r| r.chain.length > 2 }
|
130
|
+
|
131
|
+
filters = poly.map(&:foreign_type) + not_poly.map(&:name)
|
132
|
+
filters.map &:to_sym
|
133
|
+
else
|
134
|
+
[]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def add_filters_sidebar_section
|
139
|
+
self.sidebar_sections << filters_sidebar_section
|
140
|
+
end
|
141
|
+
|
142
|
+
def filters_sidebar_section
|
143
|
+
ActiveAdmin::SidebarSection.new :filters, only: :index, if: -> { active_admin_config.filters.any? } do
|
144
|
+
active_admin_filters_form_for assigns[:search], active_admin_config.filters
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def add_search_status_sidebar_section
|
149
|
+
self.sidebar_sections << ActiveAdmin::Filters::ActiveSidebar.new
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|