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,155 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
|
3
|
+
module BatchActions
|
4
|
+
module ResourceExtension
|
5
|
+
def initialize(*)
|
6
|
+
super
|
7
|
+
@batch_actions = {}
|
8
|
+
add_default_batch_action
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [Array] The set of batch actions for this resource
|
12
|
+
def batch_actions
|
13
|
+
batch_actions_enabled? ? @batch_actions.values.sort : []
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Boolean] If batch actions are enabled for this resource
|
17
|
+
def batch_actions_enabled?
|
18
|
+
# If the resource config has been set, use it. Otherwise
|
19
|
+
# return the namespace setting
|
20
|
+
@batch_actions_enabled.nil? ? namespace.batch_actions : @batch_actions_enabled
|
21
|
+
end
|
22
|
+
|
23
|
+
# Disable or Enable batch actions for this resource
|
24
|
+
# Set to `nil` to inherit the setting from the namespace
|
25
|
+
def batch_actions=(bool)
|
26
|
+
@batch_actions_enabled = bool
|
27
|
+
end
|
28
|
+
|
29
|
+
# Add a new batch item to a resource
|
30
|
+
# @param [String] title
|
31
|
+
# @param [Hash] options
|
32
|
+
# => :if is a proc that will be called to determine if the BatchAction should be displayed
|
33
|
+
# => :sort_order is used to sort the batch actions ascending
|
34
|
+
# => :confirm is a string to prompt the user with (or a boolean to use the default message)
|
35
|
+
# => :form is a Hash of form fields you want the user to fill out
|
36
|
+
#
|
37
|
+
def add_batch_action(sym, title, options = {}, &block)
|
38
|
+
@batch_actions[sym] = ActiveAdmin::BatchAction.new(sym, title, options, &block)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Remove a batch action
|
42
|
+
# @param [Symbol] sym
|
43
|
+
# @return [ActiveAdmin::BatchAction] the batch action, if it was present
|
44
|
+
#
|
45
|
+
def remove_batch_action(sym)
|
46
|
+
@batch_actions.delete(sym.to_sym)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Clears all the existing batch actions for this resource
|
50
|
+
def clear_batch_actions!
|
51
|
+
@batch_actions = {}
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
# @return [ActiveAdmin::BatchAction] The default "delete" action
|
57
|
+
def add_default_batch_action
|
58
|
+
destroy_options = {
|
59
|
+
priority: 100,
|
60
|
+
confirm: proc { I18n.t('active_admin.batch_actions.delete_confirmation', plural_model: active_admin_config.plural_resource_label.downcase) },
|
61
|
+
if: proc { controller.action_methods.include?('destroy') && authorized?(ActiveAdmin::Auth::DESTROY, active_admin_config.resource_class) }
|
62
|
+
}
|
63
|
+
|
64
|
+
add_batch_action :destroy, proc { I18n.t('active_admin.delete') }, destroy_options do |selected_ids|
|
65
|
+
batch_action_collection.find(selected_ids).each do |record|
|
66
|
+
authorize! ActiveAdmin::Auth::DESTROY, record
|
67
|
+
destroy_resource(record)
|
68
|
+
end
|
69
|
+
|
70
|
+
redirect_to active_admin_config.route_collection_path(params),
|
71
|
+
notice: I18n.t("active_admin.batch_actions.succesfully_destroyed",
|
72
|
+
count: selected_ids.count,
|
73
|
+
model: active_admin_config.resource_label.downcase,
|
74
|
+
plural_model: active_admin_config.plural_resource_label(count: selected_ids.count).downcase)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class BatchAction
|
82
|
+
|
83
|
+
include Comparable
|
84
|
+
|
85
|
+
attr_reader :block, :title, :sym
|
86
|
+
|
87
|
+
DEFAULT_CONFIRM_MESSAGE = proc { I18n.t 'active_admin.batch_actions.default_confirmation' }
|
88
|
+
|
89
|
+
# Create a Batch Action
|
90
|
+
#
|
91
|
+
# Examples:
|
92
|
+
#
|
93
|
+
# BatchAction.new :flag
|
94
|
+
# => Will create an action that appears in the action list popover
|
95
|
+
#
|
96
|
+
# BatchAction.new(:flag) { |selection| redirect_to collection_path, notice: "#{selection.length} users flagged" }
|
97
|
+
# => Will create an action that uses a block to process the request (which receives one paramater of the selected objects)
|
98
|
+
#
|
99
|
+
# BatchAction.new("Perform Long Operation on") { |selection| }
|
100
|
+
# => You can create batch actions with a title instead of a Symbol
|
101
|
+
#
|
102
|
+
# BatchAction.new(:flag, if: proc{ can? :flag, AdminUser }) { |selection| }
|
103
|
+
# => You can provide an `:if` proc to choose when the batch action should be displayed
|
104
|
+
#
|
105
|
+
# BatchAction.new :flag, confirm: true
|
106
|
+
# => You can pass `true` to `:confirm` to use the default confirm message.
|
107
|
+
#
|
108
|
+
# BatchAction.new(:flag, confirm: "Are you sure?") { |selection| }
|
109
|
+
# => You can pass a custom confirmation message through `:confirm`
|
110
|
+
#
|
111
|
+
# BatchAction.new(:flag, form: {foo: :text, bar: :checkbox}) { |selection, inputs| }
|
112
|
+
# => You can pass a hash of options to `:form` that will be rendered as form input fields for the user to fill out.
|
113
|
+
#
|
114
|
+
def initialize(sym, title, options = {}, &block)
|
115
|
+
@sym = sym
|
116
|
+
@title = title
|
117
|
+
@options = options
|
118
|
+
@block = block
|
119
|
+
@confirm = options[:confirm]
|
120
|
+
@block ||= proc {}
|
121
|
+
end
|
122
|
+
|
123
|
+
def confirm
|
124
|
+
if @confirm == true
|
125
|
+
DEFAULT_CONFIRM_MESSAGE
|
126
|
+
elsif !@confirm && @options[:form]
|
127
|
+
DEFAULT_CONFIRM_MESSAGE
|
128
|
+
else
|
129
|
+
@confirm
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def inputs
|
134
|
+
@options[:form]
|
135
|
+
end
|
136
|
+
|
137
|
+
# Returns the display if block. If the block was not explicitly defined
|
138
|
+
# a default block always returning true will be returned.
|
139
|
+
def display_if_block
|
140
|
+
@options[:if] || proc { true }
|
141
|
+
end
|
142
|
+
|
143
|
+
# Used for sorting
|
144
|
+
def priority
|
145
|
+
@options[:priority] || 10
|
146
|
+
end
|
147
|
+
|
148
|
+
# sort operator
|
149
|
+
def <=>(other)
|
150
|
+
self.priority <=> other.priority
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'active_admin/component'
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module BatchActions
|
5
|
+
|
6
|
+
# Build a BatchActionForm
|
7
|
+
class BatchActionForm < ActiveAdmin::Component
|
8
|
+
builder_method :batch_action_form
|
9
|
+
|
10
|
+
attr_reader :prefix_html
|
11
|
+
|
12
|
+
def build(options = {}, &block)
|
13
|
+
options[:id] ||= "collection_selection"
|
14
|
+
|
15
|
+
# Open a form with two hidden input fields:
|
16
|
+
# batch_action => name of the specific action called
|
17
|
+
# batch_action_inputs => a JSON string of any requested confirmation values
|
18
|
+
text_node form_tag active_admin_config.route_batch_action_path(params, url_options), id: options[:id]
|
19
|
+
input name: :batch_action, id: :batch_action, type: :hidden
|
20
|
+
input name: :batch_action_inputs, id: :batch_action_inputs, type: :hidden
|
21
|
+
|
22
|
+
super(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Override the default to_s to include a closing form tag
|
26
|
+
def to_s
|
27
|
+
content + closing_form_tag
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def closing_form_tag
|
33
|
+
'</form>'.html_safe
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'active_admin/component'
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module BatchActions
|
5
|
+
|
6
|
+
class BatchActionSelector < ActiveAdmin::Component
|
7
|
+
builder_method :batch_action_selector
|
8
|
+
|
9
|
+
# Build a new batch actions selector
|
10
|
+
#
|
11
|
+
# @param [Array] batch_actions An array of batch actions
|
12
|
+
def build(batch_actions)
|
13
|
+
@batch_actions = Array(batch_actions)
|
14
|
+
@drop_down = build_drop_down
|
15
|
+
end
|
16
|
+
|
17
|
+
# We don't want to wrap the action list (or any other children) in
|
18
|
+
# an unnecessary div, so instead we just return the children
|
19
|
+
def to_s
|
20
|
+
children.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def build_drop_down
|
26
|
+
return if batch_actions_to_display.empty?
|
27
|
+
dropdown_menu I18n.t("active_admin.batch_actions.button_label"),
|
28
|
+
class: "batch_actions_selector dropdown_menu",
|
29
|
+
button: { class: "disabled" } do
|
30
|
+
batch_actions_to_display.each do |batch_action|
|
31
|
+
confirmation_text = render_or_call_method_or_proc_on(self, batch_action.confirm)
|
32
|
+
|
33
|
+
options = {
|
34
|
+
:class => "batch_action",
|
35
|
+
"data-action" => batch_action.sym,
|
36
|
+
"data-confirm" => confirmation_text,
|
37
|
+
"data-inputs" => render_in_context(self, batch_action.inputs).to_json
|
38
|
+
}
|
39
|
+
|
40
|
+
default_title = render_or_call_method_or_proc_on(self, batch_action.title)
|
41
|
+
title = I18n.t("active_admin.batch_actions.labels.#{batch_action.sym}", default: default_title)
|
42
|
+
label = I18n.t("active_admin.batch_actions.action_label", title: title)
|
43
|
+
|
44
|
+
item label, "#", options
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Return the set of batch actions that should be displayed
|
50
|
+
def batch_actions_to_display
|
51
|
+
@batch_actions.select do |batch_action|
|
52
|
+
call_method_or_proc_on(self, batch_action.display_if_block)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'active_admin/component'
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module BatchActions
|
5
|
+
|
6
|
+
# Creates the toggle checkbox used to toggle the collection selection on/off
|
7
|
+
class ResourceSelectionToggleCell < ActiveAdmin::Component
|
8
|
+
builder_method :resource_selection_toggle_cell
|
9
|
+
|
10
|
+
def build(label_text = '')
|
11
|
+
label do
|
12
|
+
input type: "checkbox", id: "collection_selection_toggle_all", name: "collection_selection_toggle_all", class: "toggle_all"
|
13
|
+
text_node label_text if label_text.present?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Creates the checkbox used to select a resource in the collection selection
|
19
|
+
class ResourceSelectionCell < ActiveAdmin::Component
|
20
|
+
builder_method :resource_selection_cell
|
21
|
+
|
22
|
+
def build(resource)
|
23
|
+
input type: "checkbox", id: "batch_action_item_#{resource.id}", value: resource.id, class: "collection_selection", name: "collection_selection[]"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Creates a wrapper panel for all index pages, except for the table, as the table has the checkbox in the thead
|
28
|
+
class ResourceSelectionTogglePanel < ActiveAdmin::Component
|
29
|
+
builder_method :resource_selection_toggle_panel
|
30
|
+
|
31
|
+
def build
|
32
|
+
super(id: "collection_selection_toggle_panel")
|
33
|
+
resource_selection_toggle_cell(I18n.t('active_admin.batch_actions.selection_toggle_explanation', default: "(Toggle Selection)"))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module Callbacks
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
# Simple callback system. Implements before and after callbacks for
|
8
|
+
# use within the controllers.
|
9
|
+
#
|
10
|
+
# We didn't use the ActiveSupport callbacks because they do not support
|
11
|
+
# passing in any arbitrary object into the callback method (which we
|
12
|
+
# need to do)
|
13
|
+
|
14
|
+
def run_callback(method, *args)
|
15
|
+
case method
|
16
|
+
when Symbol
|
17
|
+
send(method, *args)
|
18
|
+
when Proc
|
19
|
+
instance_exec(*args, &method)
|
20
|
+
else
|
21
|
+
raise "Please register with callbacks using a symbol or a block/proc."
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# Define a new callback.
|
30
|
+
#
|
31
|
+
# Example:
|
32
|
+
#
|
33
|
+
# class MyClassWithCallbacks
|
34
|
+
# include ActiveAdmin::Callbacks
|
35
|
+
#
|
36
|
+
# define_active_admin_callbacks :save
|
37
|
+
#
|
38
|
+
# before_save do |arg1, arg2|
|
39
|
+
# # runs before save
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# after_save :call_after_save
|
43
|
+
#
|
44
|
+
# def save
|
45
|
+
# # Will run before, yield, then after
|
46
|
+
# run_save_callbacks :arg1, :arg2 do
|
47
|
+
# save!
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# protected
|
52
|
+
#
|
53
|
+
# def call_after_save(arg1, arg2)
|
54
|
+
# # runs after save
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
def define_active_admin_callbacks(*names)
|
59
|
+
names.each do |name|
|
60
|
+
[:before, :after].each do |type|
|
61
|
+
callback_name = "#{type}_#{name}_callbacks"
|
62
|
+
callback_ivar = "@#{callback_name}"
|
63
|
+
|
64
|
+
# def self.before_create_callbacks
|
65
|
+
singleton_class.send :define_method, callback_name do
|
66
|
+
instance_variable_get(callback_ivar) || instance_variable_set(callback_ivar, [])
|
67
|
+
end
|
68
|
+
singleton_class.send :private, callback_name
|
69
|
+
|
70
|
+
# def self.before_create
|
71
|
+
singleton_class.send :define_method, "#{type}_#{name}" do |method = nil, &block|
|
72
|
+
send(callback_name).push method || block
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# def run_create_callbacks
|
77
|
+
define_method "run_#{name}_callbacks" do |*args, &block|
|
78
|
+
self.class.send("before_#{name}_callbacks").each { |cbk| run_callback(cbk, *args) }
|
79
|
+
value = block.try :call
|
80
|
+
self.class.send("after_#{name}_callbacks").each { |cbk| run_callback(cbk, *args) }
|
81
|
+
return value
|
82
|
+
end
|
83
|
+
send :private, "run_#{name}_callbacks"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
unless ActiveAdmin::Dependency.cancan? || ActiveAdmin::Dependency.cancancan?
|
2
|
+
ActiveAdmin::Dependency.cancan!
|
3
|
+
end
|
4
|
+
|
5
|
+
require 'cancan'
|
6
|
+
|
7
|
+
# Add a setting to the application to configure the ability
|
8
|
+
ActiveAdmin::Application.inheritable_setting :cancan_ability_class, "Ability"
|
9
|
+
|
10
|
+
module ActiveAdmin
|
11
|
+
|
12
|
+
class CanCanAdapter < AuthorizationAdapter
|
13
|
+
|
14
|
+
def authorized?(action, subject = nil)
|
15
|
+
cancan_ability.can?(action, subject)
|
16
|
+
end
|
17
|
+
|
18
|
+
def cancan_ability
|
19
|
+
@cancan_ability ||= initialize_cancan_ability
|
20
|
+
end
|
21
|
+
|
22
|
+
def scope_collection(collection, action = ActiveAdmin::Auth::READ)
|
23
|
+
collection.accessible_by(cancan_ability, action)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def initialize_cancan_ability
|
29
|
+
klass = resource.namespace.cancan_ability_class
|
30
|
+
klass = klass.constantize if klass.is_a? String
|
31
|
+
klass.new user
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
# CSVBuilder stores CSV configuration
|
3
|
+
#
|
4
|
+
# Usage example:
|
5
|
+
#
|
6
|
+
# csv_builder = CSVBuilder.new
|
7
|
+
# csv_builder.column :id
|
8
|
+
# csv_builder.column("Name") { |resource| resource.full_name }
|
9
|
+
# csv_builder.column(:name, humanize_name: false)
|
10
|
+
# csv_builder.column("name", humanize_name: false) { |resource| resource.full_name }
|
11
|
+
#
|
12
|
+
# csv_builder = CSVBuilder.new col_sep: ";"
|
13
|
+
# csv_builder = CSVBuilder.new humanize_name: false
|
14
|
+
# csv_builder.column :id
|
15
|
+
#
|
16
|
+
#
|
17
|
+
class CSVBuilder
|
18
|
+
|
19
|
+
# Return a default CSVBuilder for a resource
|
20
|
+
# The CSVBuilder's columns would be Id followed by this
|
21
|
+
# resource's content columns
|
22
|
+
def self.default_for_resource(resource)
|
23
|
+
new resource: resource do
|
24
|
+
column :id
|
25
|
+
resource.content_columns.each { |c| column c }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_reader :columns, :options, :view_context
|
30
|
+
|
31
|
+
COLUMN_TRANSITIVE_OPTIONS = [:humanize_name].freeze
|
32
|
+
|
33
|
+
def initialize(options = {}, &block)
|
34
|
+
@resource = options.delete(:resource)
|
35
|
+
@columns = []
|
36
|
+
@options = options
|
37
|
+
@block = block
|
38
|
+
end
|
39
|
+
|
40
|
+
def column(name, options = {}, &block)
|
41
|
+
@columns << Column.new(name, @resource, column_transitive_options.merge(options), block)
|
42
|
+
end
|
43
|
+
|
44
|
+
def build(controller, csv)
|
45
|
+
@collection = controller.send :find_collection, except: :pagination
|
46
|
+
columns = exec_columns controller.view_context
|
47
|
+
options = ActiveAdmin.application.csv_options.merge self.options
|
48
|
+
bom = options.delete :byte_order_mark
|
49
|
+
column_names = options.delete(:column_names) { true }
|
50
|
+
csv_options = options.except :encoding_options, :humanize_name
|
51
|
+
|
52
|
+
csv << bom if bom
|
53
|
+
|
54
|
+
if column_names
|
55
|
+
csv << CSV.generate_line(columns.map { |c| encode c.name, options }, csv_options)
|
56
|
+
end
|
57
|
+
|
58
|
+
ActiveRecord::Base.uncached do
|
59
|
+
(1..paginated_collection.total_pages).each do |page|
|
60
|
+
paginated_collection(page).each do |resource|
|
61
|
+
resource = controller.send :apply_decorator, resource
|
62
|
+
csv << CSV.generate_line(build_row(resource, columns, options), csv_options)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
csv
|
68
|
+
end
|
69
|
+
|
70
|
+
def exec_columns(view_context = nil)
|
71
|
+
@view_context = view_context
|
72
|
+
@columns = [] # we want to re-render these every instance
|
73
|
+
instance_exec &@block if @block.present?
|
74
|
+
columns
|
75
|
+
end
|
76
|
+
|
77
|
+
def build_row(resource, columns, options)
|
78
|
+
columns.map do |column|
|
79
|
+
encode call_method_or_proc_on(resource, column.data), options
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def encode(content, options)
|
84
|
+
if options[:encoding]
|
85
|
+
content.to_s.encode options[:encoding], options[:encoding_options]
|
86
|
+
else
|
87
|
+
content
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def method_missing(method, *args, &block)
|
92
|
+
if @view_context.respond_to? method
|
93
|
+
@view_context.public_send method, *args, &block
|
94
|
+
else
|
95
|
+
super
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class Column
|
100
|
+
attr_reader :name, :data, :options
|
101
|
+
|
102
|
+
DEFAULT_OPTIONS = { humanize_name: true }
|
103
|
+
|
104
|
+
def initialize(name, resource = nil, options = {}, block = nil)
|
105
|
+
@options = options.reverse_merge(DEFAULT_OPTIONS)
|
106
|
+
@name = humanize_name(name, resource, @options[:humanize_name])
|
107
|
+
@data = block || name.to_sym
|
108
|
+
end
|
109
|
+
|
110
|
+
def humanize_name(name, resource, humanize_name_option)
|
111
|
+
if humanize_name_option
|
112
|
+
name.is_a?(Symbol) && resource ? resource.resource_class.human_attribute_name(name) : name.to_s.humanize
|
113
|
+
else
|
114
|
+
name.to_s
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
def column_transitive_options
|
122
|
+
@column_transitive_options ||= @options.slice(*COLUMN_TRANSITIVE_OPTIONS)
|
123
|
+
end
|
124
|
+
|
125
|
+
def paginated_collection(page_no = 1)
|
126
|
+
@collection.public_send(Kaminari.config.page_method_name, page_no).per(batch_size)
|
127
|
+
end
|
128
|
+
|
129
|
+
def batch_size
|
130
|
+
1000
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|