rails_admin 0.8.1 → 2.2.1
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 +5 -5
- data/Gemfile +17 -34
- data/LICENSE.md +1 -1
- data/README.md +34 -26
- data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
- data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
- data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
- data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/rails_admin/bullet_black.png +0 -0
- data/app/assets/images/rails_admin/bullet_white.png +0 -0
- data/app/assets/images/rails_admin/calendar.png +0 -0
- data/app/assets/images/rails_admin/clock.png +0 -0
- data/app/assets/images/rails_admin/magnifier.png +0 -0
- data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
- data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
- data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
- data/app/assets/javascripts/rails_admin/custom/ui.js +1 -0
- data/app/assets/javascripts/rails_admin/jquery-ui.js.erb +8 -0
- data/app/assets/javascripts/rails_admin/jquery.migrate.js +3 -0
- data/app/assets/javascripts/rails_admin/ra.filter-box.js +148 -60
- data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +31 -26
- data/app/assets/javascripts/rails_admin/ra.filtering-select.js +211 -110
- data/app/assets/javascripts/rails_admin/ra.i18n.js +28 -0
- data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.js +59 -0
- data/app/assets/javascripts/rails_admin/ra.sidescroll.js +31 -0
- data/app/assets/javascripts/rails_admin/ra.widgets.js +379 -0
- data/app/assets/javascripts/rails_admin/rails_admin.js +5 -5
- data/app/assets/javascripts/rails_admin/ui.js +135 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss +5 -5
- data/app/assets/stylesheets/rails_admin/ra.sidescroll.scss +29 -0
- data/app/assets/stylesheets/rails_admin/ra.widgets.scss +9 -1
- data/app/assets/stylesheets/rails_admin/rails_admin.scss.erb +2 -1
- data/app/controllers/rails_admin/application_controller.rb +14 -8
- data/app/controllers/rails_admin/main_controller.rb +9 -9
- data/app/helpers/rails_admin/application_helper.rb +26 -11
- data/app/helpers/rails_admin/form_builder.rb +20 -12
- data/app/helpers/rails_admin/main_helper.rb +8 -7
- data/app/views/kaminari/{twitter-bootstrap → ra-twitter-bootstrap}/_gap.html.haml +0 -0
- data/app/views/kaminari/{twitter-bootstrap → ra-twitter-bootstrap}/_next_page.html.haml +0 -0
- data/app/views/kaminari/{twitter-bootstrap → ra-twitter-bootstrap}/_page.html.haml +0 -0
- data/app/views/kaminari/{twitter-bootstrap → ra-twitter-bootstrap}/_paginator.html.haml +0 -0
- data/app/views/kaminari/{twitter-bootstrap → ra-twitter-bootstrap}/_prev_page.html.haml +0 -0
- data/app/views/kaminari/ra-twitter-bootstrap/without_count/_next_page.html.haml +4 -0
- data/app/views/kaminari/ra-twitter-bootstrap/without_count/_paginator.html.haml +4 -0
- data/app/views/kaminari/ra-twitter-bootstrap/without_count/_prev_page.html.haml +4 -0
- data/app/views/layouts/rails_admin/_head.html.haml +7 -0
- data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +2 -2
- data/app/views/layouts/rails_admin/_sidebar_navigation.html.haml +2 -1
- data/app/views/layouts/rails_admin/application.html.haml +4 -10
- data/app/views/layouts/rails_admin/pjax.html.haml +1 -5
- data/app/views/rails_admin/main/_delete_notice.html.haml +14 -9
- data/app/views/rails_admin/main/_form_action_text.html.haml +7 -0
- data/app/views/rails_admin/main/_form_colorpicker.html.haml +1 -1
- data/app/views/rails_admin/main/_form_enumeration.html.haml +4 -3
- data/app/views/rails_admin/main/_form_file_upload.html.haml +5 -5
- data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +7 -6
- data/app/views/rails_admin/main/_form_filtering_select.html.haml +1 -1
- data/app/views/rails_admin/main/_form_multiple_file_upload.html.haml +16 -0
- data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +18 -3
- data/app/views/rails_admin/main/_form_simple_mde.haml +8 -0
- data/app/views/rails_admin/main/dashboard.html.haml +5 -6
- data/app/views/rails_admin/main/export.html.haml +45 -36
- data/app/views/rails_admin/main/history.html.haml +3 -3
- data/app/views/rails_admin/main/index.html.haml +37 -26
- data/app/views/rails_admin/main/show.html.haml +6 -7
- data/config/initializers/active_record_extensions.rb +3 -3
- data/config/initializers/haml.rb +4 -1
- data/config/locales/rails_admin.en.yml +5 -2
- data/lib/generators/rails_admin/templates/initializer.erb +6 -2
- data/lib/rails_admin/abstract_model.rb +9 -10
- data/lib/rails_admin/adapters/active_record/abstract_object.rb +9 -3
- data/lib/rails_admin/adapters/active_record/property.rb +1 -5
- data/lib/rails_admin/adapters/active_record.rb +83 -28
- data/lib/rails_admin/adapters/mongoid/abstract_object.rb +3 -3
- data/lib/rails_admin/adapters/mongoid/association.rb +18 -6
- data/lib/rails_admin/adapters/mongoid/bson.rb +29 -0
- data/lib/rails_admin/adapters/mongoid/extension.rb +4 -2
- data/lib/rails_admin/adapters/mongoid/property.rb +3 -3
- data/lib/rails_admin/adapters/mongoid.rb +40 -26
- data/lib/rails_admin/bootstrap-sass/compass_functions.rb +1 -1
- data/lib/rails_admin/bootstrap-sass/sass_functions.rb +1 -3
- data/lib/rails_admin/bootstrap-sass.rb +8 -6
- data/lib/rails_admin/config/actions/base.rb +20 -5
- data/lib/rails_admin/config/actions/bulk_delete.rb +2 -4
- data/lib/rails_admin/config/actions/dashboard.rb +9 -5
- data/lib/rails_admin/config/actions/edit.rb +1 -3
- data/lib/rails_admin/config/actions/export.rb +1 -1
- data/lib/rails_admin/config/actions/index.rb +5 -3
- data/lib/rails_admin/config/actions/new.rb +4 -5
- data/lib/rails_admin/config/actions.rb +1 -1
- data/lib/rails_admin/config/configurable.rb +25 -18
- data/lib/rails_admin/config/fields/association.rb +11 -3
- data/lib/rails_admin/config/fields/base.rb +20 -27
- data/lib/rails_admin/config/fields/factories/action_text.rb +12 -0
- data/lib/rails_admin/config/fields/factories/active_storage.rb +30 -0
- data/lib/rails_admin/config/fields/factories/carrierwave.rb +4 -2
- data/lib/rails_admin/config/fields/factories/dragonfly.rb +1 -1
- data/lib/rails_admin/config/fields/factories/shrine.rb +27 -0
- data/lib/rails_admin/config/fields/types/action_text.rb +30 -0
- data/lib/rails_admin/config/fields/types/active_record_enum.rb +19 -2
- data/lib/rails_admin/config/fields/types/active_storage.rb +49 -0
- data/lib/rails_admin/config/fields/types/all.rb +7 -1
- data/lib/rails_admin/config/fields/types/belongs_to_association.rb +8 -0
- data/lib/rails_admin/config/fields/types/bson_object_id.rb +1 -15
- data/lib/rails_admin/config/fields/types/ck_editor.rb +7 -7
- data/lib/rails_admin/config/fields/types/code_mirror.rb +10 -12
- data/lib/rails_admin/config/fields/types/color.rb +2 -2
- data/lib/rails_admin/config/fields/types/datetime.rb +6 -3
- data/lib/rails_admin/config/fields/types/file_upload.rb +12 -4
- data/lib/rails_admin/config/fields/types/froala.rb +9 -11
- data/lib/rails_admin/config/fields/types/has_many_association.rb +1 -1
- data/lib/rails_admin/config/fields/types/hidden.rb +2 -2
- data/lib/rails_admin/config/fields/types/json.rb +9 -1
- data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +53 -0
- data/lib/rails_admin/config/fields/types/multiple_carrierwave.rb +56 -0
- data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +125 -0
- data/lib/rails_admin/config/fields/types/password.rb +5 -1
- data/lib/rails_admin/config/fields/types/polymorphic_association.rb +12 -1
- data/lib/rails_admin/config/fields/types/serialized.rb +2 -2
- data/lib/rails_admin/config/fields/types/shrine.rb +54 -0
- data/lib/rails_admin/config/fields/types/simple_mde.rb +36 -0
- data/lib/rails_admin/config/fields/types/string.rb +8 -7
- data/lib/rails_admin/config/fields/types/string_like.rb +19 -0
- data/lib/rails_admin/config/fields/types/text.rb +2 -20
- data/lib/rails_admin/config/fields/types/wysihtml5.rb +14 -10
- data/lib/rails_admin/config/fields/types.rb +1 -1
- data/lib/rails_admin/config/fields.rb +3 -1
- data/lib/rails_admin/config/has_fields.rb +1 -1
- data/lib/rails_admin/config/has_groups.rb +1 -1
- data/lib/rails_admin/config/hideable.rb +1 -1
- data/lib/rails_admin/config/inspectable.rb +39 -0
- data/lib/rails_admin/config/lazy_model.rb +48 -8
- data/lib/rails_admin/config/model.rb +10 -22
- data/lib/rails_admin/config/proxyable/proxy.rb +7 -9
- data/lib/rails_admin/config/proxyable.rb +13 -1
- data/lib/rails_admin/config/sections/base.rb +4 -17
- data/lib/rails_admin/config/sections/list.rb +37 -0
- data/lib/rails_admin/config.rb +46 -25
- data/lib/rails_admin/engine.rb +37 -4
- data/lib/rails_admin/extension.rb +16 -4
- data/lib/rails_admin/extensions/cancancan/authorization_adapter.rb +23 -7
- data/lib/rails_admin/extensions/cancancan.rb +1 -1
- data/lib/rails_admin/extensions/controller_extension.rb +6 -0
- data/lib/rails_admin/extensions/history/auditing_adapter.rb +2 -2
- data/lib/rails_admin/extensions/history/history.rb +2 -2
- data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +59 -17
- data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +11 -3
- data/lib/rails_admin/support/csv_converter.rb +20 -14
- data/lib/rails_admin/support/datetime.rb +7 -6
- data/lib/rails_admin/support/i18n.rb +7 -5
- data/lib/rails_admin/version.rb +2 -2
- data/lib/rails_admin.rb +23 -1
- data/lib/tasks/rails_admin.rake +16 -7
- data/vendor/assets/fonts/rails_admin/FontAwesome.otf +0 -0
- data/vendor/assets/fonts/rails_admin/fontawesome-webfont.eot +0 -0
- data/vendor/assets/fonts/rails_admin/fontawesome-webfont.svg +2671 -0
- data/vendor/assets/fonts/rails_admin/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/fonts/rails_admin/fontawesome-webfont.woff +0 -0
- data/vendor/assets/fonts/rails_admin/fontawesome-webfont.woff2 +0 -0
- data/vendor/assets/images/rails_admin/bootstrap/glyphicons-halflings-white.png +0 -0
- data/vendor/assets/images/rails_admin/bootstrap/glyphicons-halflings.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
- data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
- data/{app → vendor}/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
- data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
- data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
- data/{app → vendor}/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/select.png +0 -0
- data/{app → vendor}/assets/images/rails_admin/colorpicker/select2.png +0 -0
- data/vendor/assets/images/rails_admin/colorpicker/slider.png +0 -0
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-affix.js +50 -28
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-alert.js +10 -7
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-button.js +35 -20
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-carousel.js +48 -25
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-collapse.js +70 -28
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-dropdown.js +56 -42
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-modal.js +118 -40
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-popover.js +26 -16
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-scrollspy.js +29 -27
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-tab.js +46 -19
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-tooltip.js +280 -60
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-transition.js +5 -5
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap-typeahead.js +0 -0
- data/{app → vendor}/assets/javascripts/rails_admin/bootstrap/bootstrap.js +0 -0
- data/vendor/assets/javascripts/rails_admin/bootstrap-datetimepicker.js +317 -150
- data/{app → vendor}/assets/javascripts/rails_admin/jquery.colorpicker.js +0 -0
- data/{app → vendor}/assets/javascripts/rails_admin/jquery.pjax.js +316 -161
- data/vendor/assets/javascripts/rails_admin/moment-with-locales.js +16528 -8420
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_alerts.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_badges.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_breadcrumbs.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_button-groups.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_buttons.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_carousel.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_close.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_code.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_component-animations.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_dropdowns.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_forms.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_glyphicons.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_grid.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_input-groups.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_jumbotron.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_labels.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_list-group.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_media.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_mixins.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_modals.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_navbar.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_navs.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_normalize.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_pager.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_pagination.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_panels.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_popovers.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_print.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_progress-bars.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_responsive-embed.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_responsive-utilities.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_scaffolding.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_tables.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_theme.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_thumbnails.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_tooltip.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_type.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_utilities.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_variables.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/_wells.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/bootstrap.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_alerts.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_background-variant.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_border-radius.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_buttons.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_center-block.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_clearfix.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_forms.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_gradients.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_grid-framework.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_grid.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_hide-text.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_image.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_labels.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_list-group.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_nav-divider.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_nav-vertical-align.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_opacity.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_pagination.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_panels.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_progress-bar.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_reset-filter.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_resize.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_responsive-visibility.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_size.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_tab-focus.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_table-row.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_text-emphasis.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_text-overflow.scss +0 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/bootstrap/mixins/_vendor-prefixes.scss +0 -0
- data/vendor/assets/stylesheets/rails_admin/font-awesome.scss +2342 -0
- data/{app → vendor}/assets/stylesheets/rails_admin/jquery.colorpicker.scss +0 -0
- metadata +214 -199
- data/app/assets/images/rails_admin/bootstrap/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/rails_admin/bootstrap/glyphicons-halflings.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/select.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/slider.png +0 -0
- data/app/assets/javascripts/rails_admin/custom/ui.coffee +0 -1
- data/app/assets/javascripts/rails_admin/jquery.remotipart.fixed.js +0 -72
- data/app/assets/javascripts/rails_admin/ra.i18n.coffee +0 -8
- data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.coffee +0 -52
- data/app/assets/javascripts/rails_admin/ra.widgets.coffee +0 -308
- data/app/assets/javascripts/rails_admin/ui.coffee +0 -102
- data/config/initializers/devise_patch.rb +0 -9
- data/lib/rails_admin/config/fields/factories/refile.rb +0 -25
- data/lib/rails_admin/config/fields/types/refile.rb +0 -27
- data/lib/rails_admin/extensions/cancan/authorization_adapter.rb +0 -57
- data/lib/rails_admin/extensions/cancan.rb +0 -3
data/lib/rails_admin/engine.rb
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
require 'font-awesome-rails'
|
|
2
1
|
require 'jquery-rails'
|
|
3
2
|
require 'jquery-ui-rails'
|
|
4
3
|
require 'kaminari'
|
|
@@ -7,13 +6,12 @@ require 'rack-pjax'
|
|
|
7
6
|
require 'rails'
|
|
8
7
|
require 'rails_admin'
|
|
9
8
|
require 'remotipart'
|
|
10
|
-
require 'safe_yaml/load'
|
|
11
9
|
|
|
12
10
|
module RailsAdmin
|
|
13
11
|
class Engine < Rails::Engine
|
|
14
12
|
isolate_namespace RailsAdmin
|
|
15
13
|
|
|
16
|
-
config.action_dispatch.rescue_responses
|
|
14
|
+
config.action_dispatch.rescue_responses['RailsAdmin::ActionNotAllowed'] = :forbidden
|
|
17
15
|
|
|
18
16
|
initializer 'RailsAdmin precompile hook', group: :all do |app|
|
|
19
17
|
app.config.assets.precompile += %w(
|
|
@@ -24,12 +22,47 @@ module RailsAdmin
|
|
|
24
22
|
)
|
|
25
23
|
end
|
|
26
24
|
|
|
27
|
-
initializer 'RailsAdmin
|
|
25
|
+
initializer 'RailsAdmin setup middlewares' do |app|
|
|
28
26
|
app.config.middleware.use Rack::Pjax
|
|
29
27
|
end
|
|
30
28
|
|
|
29
|
+
initializer 'RailsAdmin reload config in development' do
|
|
30
|
+
if Rails.application.config.cache_classes
|
|
31
|
+
if defined?(ActiveSupport::Reloader)
|
|
32
|
+
ActiveSupport::Reloader.before_class_unload do
|
|
33
|
+
RailsAdmin::Config.reset_all_models
|
|
34
|
+
end
|
|
35
|
+
# else
|
|
36
|
+
# For Rails 4 not implemented
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
31
41
|
rake_tasks do
|
|
32
42
|
Dir[File.join(File.dirname(__FILE__), '../tasks/*.rake')].each { |f| load f }
|
|
33
43
|
end
|
|
44
|
+
|
|
45
|
+
# Check for required middlewares, users may forget to use them in Rails API mode
|
|
46
|
+
config.after_initialize do |app|
|
|
47
|
+
has_session_store = app.config.middleware.to_a.any? do |m|
|
|
48
|
+
m.klass.try(:<=, ActionDispatch::Session::AbstractStore) ||
|
|
49
|
+
m.klass.name =~ /^ActionDispatch::Session::/
|
|
50
|
+
end
|
|
51
|
+
loaded = app.config.middleware.to_a.map(&:name)
|
|
52
|
+
required = %w(ActionDispatch::Cookies ActionDispatch::Flash Rack::MethodOverride)
|
|
53
|
+
missing = required - loaded
|
|
54
|
+
unless missing.empty? && has_session_store
|
|
55
|
+
configs = missing.map { |m| "config.middleware.use #{m}" }
|
|
56
|
+
configs << "config.middleware.use #{app.config.session_store.try(:name) || 'ActionDispatch::Session::CookieStore'}, #{app.config.session_options}" unless has_session_store
|
|
57
|
+
raise <<-EOM
|
|
58
|
+
Required middlewares for RailsAdmin are not added
|
|
59
|
+
To fix this, add
|
|
60
|
+
|
|
61
|
+
#{configs.join("\n ")}
|
|
62
|
+
|
|
63
|
+
to config/application.rb.
|
|
64
|
+
EOM
|
|
65
|
+
end
|
|
66
|
+
end
|
|
34
67
|
end
|
|
35
68
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
require 'rails_admin/extensions/controller_extension'
|
|
1
2
|
|
|
2
3
|
module RailsAdmin
|
|
3
|
-
EXTENSIONS = []
|
|
4
|
-
AUTHORIZATION_ADAPTERS = {}
|
|
5
|
-
AUDITING_ADAPTERS = {}
|
|
6
|
-
CONFIGURATION_ADAPTERS = {}
|
|
4
|
+
EXTENSIONS = [] # rubocop:disable Style/MutableConstant
|
|
5
|
+
AUTHORIZATION_ADAPTERS = {} # rubocop:disable Style/MutableConstant
|
|
6
|
+
AUDITING_ADAPTERS = {} # rubocop:disable Style/MutableConstant
|
|
7
|
+
CONFIGURATION_ADAPTERS = {} # rubocop:disable Style/MutableConstant
|
|
7
8
|
|
|
8
9
|
# Extend RailsAdmin
|
|
9
10
|
#
|
|
@@ -26,4 +27,15 @@ module RailsAdmin
|
|
|
26
27
|
AUDITING_ADAPTERS[extension_key] = extension_definition::AuditingAdapter
|
|
27
28
|
end
|
|
28
29
|
end
|
|
30
|
+
|
|
31
|
+
# Setup all extensions for testing
|
|
32
|
+
def self.setup_all_extensions
|
|
33
|
+
(AUTHORIZATION_ADAPTERS.values + AUDITING_ADAPTERS.values).each do |klass|
|
|
34
|
+
begin
|
|
35
|
+
klass.setup if klass.respond_to? :setup
|
|
36
|
+
rescue # rubocop:disable Lint/HandleExceptions, Style/RescueStandardError
|
|
37
|
+
# ignore errors
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
29
41
|
end
|
|
@@ -3,6 +3,14 @@ module RailsAdmin
|
|
|
3
3
|
module CanCanCan
|
|
4
4
|
# This adapter is for the CanCanCan[https://github.com/CanCanCommunity/cancancan] authorization library.
|
|
5
5
|
class AuthorizationAdapter
|
|
6
|
+
module ControllerExtension
|
|
7
|
+
def current_ability
|
|
8
|
+
# use _current_user instead of default current_user so it works with
|
|
9
|
+
# whatever current user method is defined with RailsAdmin
|
|
10
|
+
@current_ability ||= @ability.new(_current_user)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
6
14
|
# See the +authorize_with+ config method for where the initialization happens.
|
|
7
15
|
def initialize(controller, ability = ::Ability)
|
|
8
16
|
@controller = controller
|
|
@@ -17,7 +25,9 @@ module RailsAdmin
|
|
|
17
25
|
# AbstractModel instance that applies. The third argument is the actual model
|
|
18
26
|
# instance if it is available.
|
|
19
27
|
def authorize(action, abstract_model = nil, model_object = nil)
|
|
20
|
-
|
|
28
|
+
return unless action
|
|
29
|
+
action, subject = resolve_action_and_subject(action, abstract_model, model_object)
|
|
30
|
+
@controller.current_ability.authorize!(action, subject)
|
|
21
31
|
end
|
|
22
32
|
|
|
23
33
|
# This method is called primarily from the view to determine whether the given user
|
|
@@ -25,7 +35,9 @@ module RailsAdmin
|
|
|
25
35
|
# This takes the same arguments as +authorize+. The difference is that this will
|
|
26
36
|
# return a boolean whereas +authorize+ will raise an exception when not authorized.
|
|
27
37
|
def authorized?(action, abstract_model = nil, model_object = nil)
|
|
28
|
-
|
|
38
|
+
return unless action
|
|
39
|
+
action, subject = resolve_action_and_subject(action, abstract_model, model_object)
|
|
40
|
+
@controller.current_ability.can?(action, subject)
|
|
29
41
|
end
|
|
30
42
|
|
|
31
43
|
# This is called when needing to scope a database query. It is called within the list
|
|
@@ -42,11 +54,15 @@ module RailsAdmin
|
|
|
42
54
|
@controller.current_ability.attributes_for(action, abstract_model && abstract_model.model)
|
|
43
55
|
end
|
|
44
56
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def resolve_action_and_subject(action, abstract_model, model_object)
|
|
60
|
+
subject = model_object || abstract_model && abstract_model.model
|
|
61
|
+
if subject
|
|
62
|
+
[action, subject]
|
|
63
|
+
else
|
|
64
|
+
# For :dashboard compatibility
|
|
65
|
+
[:read, action]
|
|
50
66
|
end
|
|
51
67
|
end
|
|
52
68
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'active_support/core_ext/string/strip'
|
|
2
|
+
|
|
1
3
|
module RailsAdmin
|
|
2
4
|
module Extensions
|
|
3
5
|
module PaperTrail
|
|
@@ -21,7 +23,7 @@ module RailsAdmin
|
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
def username
|
|
24
|
-
@user_class.find(@version.whodunnit).try(:email) rescue nil || @version.whodunnit
|
|
26
|
+
(@user_class.find(@version.whodunnit).try(:email) rescue nil) || @version.whodunnit
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
def item
|
|
@@ -29,6 +31,12 @@ module RailsAdmin
|
|
|
29
31
|
end
|
|
30
32
|
end
|
|
31
33
|
|
|
34
|
+
module ControllerExtension
|
|
35
|
+
def user_for_paper_trail
|
|
36
|
+
_current_user.try(:id) || _current_user
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
32
40
|
class AuditingAdapter
|
|
33
41
|
COLUMN_MAPPING = {
|
|
34
42
|
table: :item_type,
|
|
@@ -36,11 +44,26 @@ module RailsAdmin
|
|
|
36
44
|
item: :item_id,
|
|
37
45
|
created_at: :created_at,
|
|
38
46
|
message: :event,
|
|
39
|
-
}
|
|
47
|
+
}.freeze
|
|
48
|
+
E_VERSION_MODEL_NOT_SET = <<-EOS.strip_heredoc.freeze
|
|
49
|
+
Please set up PaperTrail's version model explicitly.
|
|
50
|
+
|
|
51
|
+
config.audit_with :paper_trail, 'User', 'PaperTrail::Version'
|
|
52
|
+
|
|
53
|
+
If you have configured a model to use a custom version class
|
|
54
|
+
(https://github.com/paper-trail-gem/paper_trail#6a-custom-version-classes)
|
|
55
|
+
that configuration will take precedence over what you specify in
|
|
56
|
+
`audit_with`.
|
|
57
|
+
EOS
|
|
58
|
+
|
|
59
|
+
def self.setup
|
|
60
|
+
raise('PaperTrail not found') unless defined?(::PaperTrail)
|
|
61
|
+
RailsAdmin::Extensions::ControllerExtension.send(:include, ControllerExtension)
|
|
62
|
+
end
|
|
40
63
|
|
|
41
64
|
def initialize(controller, user_class = 'User', version_class = '::Version')
|
|
42
|
-
fail('PaperTrail not found') unless defined?(PaperTrail)
|
|
43
65
|
@controller = controller
|
|
66
|
+
@controller.send(:set_paper_trail_whodunnit) if @controller
|
|
44
67
|
begin
|
|
45
68
|
@user_class = user_class.to_s.constantize
|
|
46
69
|
rescue NameError
|
|
@@ -50,12 +73,14 @@ module RailsAdmin
|
|
|
50
73
|
begin
|
|
51
74
|
@version_class = version_class.to_s.constantize
|
|
52
75
|
rescue NameError
|
|
53
|
-
raise
|
|
76
|
+
raise E_VERSION_MODEL_NOT_SET
|
|
54
77
|
end
|
|
55
78
|
end
|
|
56
79
|
|
|
57
|
-
def latest
|
|
58
|
-
@version_class.
|
|
80
|
+
def latest(count = 100)
|
|
81
|
+
@version_class.
|
|
82
|
+
order(id: :desc).includes(:item).limit(count).
|
|
83
|
+
collect { |version| VersionProxy.new(version, @user_class) }
|
|
59
84
|
end
|
|
60
85
|
|
|
61
86
|
def delete_object(_object, _model, _user)
|
|
@@ -80,6 +105,7 @@ module RailsAdmin
|
|
|
80
105
|
|
|
81
106
|
protected
|
|
82
107
|
|
|
108
|
+
# - model - a RailsAdmin::AbstractModel
|
|
83
109
|
def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, page, per_page)
|
|
84
110
|
if sort.present?
|
|
85
111
|
sort = COLUMN_MAPPING[sort.to_sym]
|
|
@@ -88,29 +114,45 @@ module RailsAdmin
|
|
|
88
114
|
sort_reverse = 'true'
|
|
89
115
|
end
|
|
90
116
|
|
|
91
|
-
model_name = model.model.name
|
|
92
|
-
|
|
93
117
|
current_page = page.presence || '1'
|
|
94
118
|
|
|
95
|
-
versions =
|
|
96
|
-
versions = versions.where item_id: object.id if object
|
|
119
|
+
versions = object.nil? ? versions_for_model(model) : object.public_send(model.model.versions_association_name)
|
|
97
120
|
versions = versions.where('event LIKE ?', "%#{query}%") if query.present?
|
|
98
121
|
versions = versions.order(sort_reverse == 'true' ? "#{sort} DESC" : sort)
|
|
99
122
|
versions = all ? versions : versions.send(Kaminari.config.page_method_name, current_page).per(per_page)
|
|
100
|
-
paginated_proxies = Kaminari.paginate_array([], total_count: versions.total_count)
|
|
101
|
-
paginated_proxies = paginated_proxies.
|
|
123
|
+
paginated_proxies = Kaminari.paginate_array([], total_count: versions.try(:total_count) || versions.count)
|
|
124
|
+
paginated_proxies = paginated_proxies.send(
|
|
125
|
+
paginated_proxies.respond_to?(Kaminari.config.page_method_name) ? Kaminari.config.page_method_name : :page,
|
|
126
|
+
current_page,
|
|
127
|
+
).per(per_page)
|
|
102
128
|
versions.each do |version|
|
|
103
129
|
paginated_proxies << VersionProxy.new(version, @user_class)
|
|
104
130
|
end
|
|
105
131
|
paginated_proxies
|
|
106
132
|
end
|
|
107
133
|
|
|
108
|
-
def
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
134
|
+
def versions_for_model(model)
|
|
135
|
+
model_name = model.model.name
|
|
136
|
+
base_class_name = model.model.base_class.name
|
|
137
|
+
|
|
138
|
+
options =
|
|
139
|
+
if base_class_name == model_name
|
|
140
|
+
{item_type: model_name}
|
|
141
|
+
else
|
|
142
|
+
{item_type: base_class_name, item_id: model.model.all}
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
version_class_for(model.model).where(options)
|
|
146
|
+
end
|
|
112
147
|
|
|
113
|
-
|
|
148
|
+
# PT can be configured to use [custom version
|
|
149
|
+
# classes](https://github.com/paper-trail-gem/paper_trail#6a-custom-version-classes)
|
|
150
|
+
#
|
|
151
|
+
# ```ruby
|
|
152
|
+
# has_paper_trail class_name: 'MyVersion'
|
|
153
|
+
# ```
|
|
154
|
+
def version_class_for(model)
|
|
155
|
+
model.paper_trail_options[:class_name].try(:constantize) || @version_class
|
|
114
156
|
end
|
|
115
157
|
end
|
|
116
158
|
end
|
|
@@ -5,6 +5,11 @@ module RailsAdmin
|
|
|
5
5
|
# You can create another adapter for different authorization behavior, just be certain it
|
|
6
6
|
# responds to each of the public methods here.
|
|
7
7
|
class AuthorizationAdapter
|
|
8
|
+
# This method is called first time only and used for setup
|
|
9
|
+
def self.setup
|
|
10
|
+
RailsAdmin::Extensions::ControllerExtension.send(:include, ::Pundit)
|
|
11
|
+
end
|
|
12
|
+
|
|
8
13
|
# See the +authorize_with+ config method for where the initialization happens.
|
|
9
14
|
def initialize(controller)
|
|
10
15
|
@controller = controller
|
|
@@ -17,7 +22,10 @@ module RailsAdmin
|
|
|
17
22
|
# instance if it is available.
|
|
18
23
|
def authorize(action, abstract_model = nil, model_object = nil)
|
|
19
24
|
record = model_object || abstract_model && abstract_model.model
|
|
20
|
-
|
|
25
|
+
if action && !policy(record).send(action_for_pundit(action))
|
|
26
|
+
raise ::Pundit::NotAuthorizedError.new("not allowed to #{action} this #{record}")
|
|
27
|
+
end
|
|
28
|
+
@controller.instance_variable_set(:@_pundit_policy_authorized, true)
|
|
21
29
|
end
|
|
22
30
|
|
|
23
31
|
# This method is called primarily from the view to determine whether the given user
|
|
@@ -33,7 +41,7 @@ module RailsAdmin
|
|
|
33
41
|
# and bulk_delete/destroy actions and should return a scope which limits the records
|
|
34
42
|
# to those which the user can perform the given action on.
|
|
35
43
|
def query(_action, abstract_model)
|
|
36
|
-
@controller.policy_scope
|
|
44
|
+
@controller.send(:policy_scope, abstract_model.model.all)
|
|
37
45
|
rescue ::Pundit::NotDefinedError
|
|
38
46
|
abstract_model.model.all
|
|
39
47
|
end
|
|
@@ -49,7 +57,7 @@ module RailsAdmin
|
|
|
49
57
|
private
|
|
50
58
|
|
|
51
59
|
def policy(record)
|
|
52
|
-
@controller.policy
|
|
60
|
+
@controller.send(:policy, record)
|
|
53
61
|
rescue ::Pundit::NotDefinedError
|
|
54
62
|
::ApplicationPolicy.new(@controller.send(:pundit_user), record)
|
|
55
63
|
end
|
|
@@ -3,9 +3,10 @@ require 'csv'
|
|
|
3
3
|
|
|
4
4
|
module RailsAdmin
|
|
5
5
|
class CSVConverter
|
|
6
|
-
UTF8_ENCODINGS = [nil, '', 'utf8', 'utf-8', 'unicode', 'UTF8', 'UTF-8', 'UNICODE', 'utf8mb4']
|
|
7
|
-
TARGET_ENCODINGS = %w(UTF-8 UTF-16LE UTF-16BE UTF-32LE UTF-32BE UTF-7 ISO-8859-1 ISO-8859-15 IBM850 MacRoman Windows-1252 ISO-8859-3 IBM852 ISO-8859-2 Windows-1250 IBM855 ISO-8859-5 KOI8-R MacCyrillic Windows-1251 IBM866 GB2312 GBK GB18030 Big5 Big5-HKSCS EUC-TW EUC-JP ISO-2022-JP Shift_JIS EUC-KR)
|
|
8
6
|
def initialize(objects = [], schema = {})
|
|
7
|
+
@fields = []
|
|
8
|
+
@associations = []
|
|
9
|
+
|
|
9
10
|
return self if (@objects = objects).blank?
|
|
10
11
|
|
|
11
12
|
@model = objects.dup.first.class
|
|
@@ -34,24 +35,28 @@ module RailsAdmin
|
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
def to_csv(options = {})
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
if CSV::VERSION == '3.0.2'
|
|
39
|
+
raise <<-MSG.gsub(/^\s+/, '')
|
|
40
|
+
CSV library bundled with Ruby 2.6.0 has encoding issue, please upgrade Ruby to 2.6.1 or later.
|
|
41
|
+
https://github.com/ruby/csv/issues/62
|
|
42
|
+
MSG
|
|
43
|
+
end
|
|
44
|
+
options = HashWithIndifferentAccess.new(options)
|
|
45
|
+
encoding_to = Encoding.find(options[:encoding_to]) if options[:encoding_to].present?
|
|
40
46
|
|
|
41
47
|
csv_string = generate_csv_string(options)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
csv_string = csv_string.encode(@encoding_to, @encoding_from, invalid: :replace, undef: :replace, replace: '?')
|
|
48
|
+
if encoding_to
|
|
49
|
+
csv_string = csv_string.encode(encoding_to, invalid: :replace, undef: :replace, replace: '?')
|
|
45
50
|
end
|
|
51
|
+
|
|
46
52
|
# Add a BOM for utf8 encodings, helps with utf8 auto-detect for some versions of Excel.
|
|
47
53
|
# Don't add if utf8 but user don't want to touch input encoding:
|
|
48
54
|
# If user chooses utf8, they will open it in utf8 and BOM will disappear at reading.
|
|
49
55
|
# But that way "English" users who don't bother and chooses to let utf8 by default won't get BOM added
|
|
50
56
|
# and will not see it if Excel opens the file with a different encoding.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
[!options[:skip_header], @encoding_to.to_s, csv_string]
|
|
57
|
+
csv_string = "\xEF\xBB\xBF#{csv_string}" if encoding_to == Encoding::UTF_8
|
|
58
|
+
|
|
59
|
+
[!options[:skip_header], (encoding_to || csv_string.encoding).to_s, csv_string]
|
|
55
60
|
end
|
|
56
61
|
|
|
57
62
|
private
|
|
@@ -66,10 +71,11 @@ module RailsAdmin
|
|
|
66
71
|
|
|
67
72
|
def generate_csv_string(options)
|
|
68
73
|
generator_options = (options[:generator] || {}).symbolize_keys.delete_if { |_, value| value.blank? }
|
|
69
|
-
|
|
74
|
+
method = @objects.respond_to?(:find_each) ? :find_each : :each
|
|
75
|
+
|
|
76
|
+
CSV.generate(**generator_options) do |csv|
|
|
70
77
|
csv << generate_csv_header unless options[:skip_header]
|
|
71
78
|
|
|
72
|
-
method = @objects.respond_to?(:find_each) ? :find_each : :each
|
|
73
79
|
@objects.send(method) do |object|
|
|
74
80
|
csv << generate_csv_row(object)
|
|
75
81
|
end
|
|
@@ -10,6 +10,7 @@ module RailsAdmin
|
|
|
10
10
|
'%b' => 'MMM', # The abbreviated month name ("Jan")
|
|
11
11
|
'%B' => 'MMMM', # The full month name ("January")
|
|
12
12
|
'%d' => 'DD', # Day of the month (01..31)
|
|
13
|
+
'%-d' => 'D', # Day of the month (1..31)
|
|
13
14
|
'%D' => 'MM/DD/YY', # American date format mm/dd/yy
|
|
14
15
|
'%e' => 'D', # Day of the month (1..31)
|
|
15
16
|
'%F' => 'YY-MM-DD', # ISO 8601 date format
|
|
@@ -22,7 +23,7 @@ module RailsAdmin
|
|
|
22
23
|
'%S' => 'ss', # Second of the minute (00..60)
|
|
23
24
|
'%Y' => 'YYYY', # Year with century
|
|
24
25
|
'%y' => 'YY', # Year without a century (00..99)
|
|
25
|
-
}
|
|
26
|
+
}.freeze
|
|
26
27
|
|
|
27
28
|
class << self
|
|
28
29
|
include RailsAdmin::Support::I18n
|
|
@@ -32,16 +33,16 @@ module RailsAdmin
|
|
|
32
33
|
format.to_s.scan(/%[AaBbp]/) do |match|
|
|
33
34
|
case match
|
|
34
35
|
when '%A'
|
|
35
|
-
english =
|
|
36
|
+
english = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
|
|
36
37
|
day_names.each_with_index { |d, i| date_string = date_string.gsub(/#{d}/, english[i]) }
|
|
37
38
|
when '%a'
|
|
38
|
-
english =
|
|
39
|
+
english = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
|
|
39
40
|
abbr_day_names.each_with_index { |d, i| date_string = date_string.gsub(/#{d}/, english[i]) }
|
|
40
41
|
when '%B'
|
|
41
|
-
english =
|
|
42
|
+
english = [nil, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][1..-1]
|
|
42
43
|
month_names.each_with_index { |m, i| date_string = date_string.gsub(/#{m}/, english[i]) }
|
|
43
44
|
when '%b'
|
|
44
|
-
english =
|
|
45
|
+
english = [nil, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][1..-1]
|
|
45
46
|
abbr_month_names.each_with_index { |m, i| date_string = date_string.gsub(/#{m}/, english[i]) }
|
|
46
47
|
when '%p'
|
|
47
48
|
date_string = date_string.gsub(/#{::I18n.t('date.time.am', default: "am")}/, 'am')
|
|
@@ -88,7 +89,7 @@ module RailsAdmin
|
|
|
88
89
|
|
|
89
90
|
begin
|
|
90
91
|
# Adjust with the correct timezone and daylight savint time
|
|
91
|
-
datetime_with_wrong_tz = ::DateTime.strptime(delocalized_value, strftime_format)
|
|
92
|
+
datetime_with_wrong_tz = ::DateTime.strptime(delocalized_value, strftime_format.gsub('%-d', '%d'))
|
|
92
93
|
Time.zone.parse(datetime_with_wrong_tz.strftime('%Y-%m-%d %H:%M:%S'))
|
|
93
94
|
rescue ArgumentError
|
|
94
95
|
nil
|
|
@@ -6,33 +6,35 @@ module RailsAdmin
|
|
|
6
6
|
def abbr_day_names
|
|
7
7
|
::I18n.t('date.abbr_day_names', raise: true)
|
|
8
8
|
rescue ::I18n::ArgumentError
|
|
9
|
-
|
|
9
|
+
["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def abbr_month_names
|
|
13
13
|
begin
|
|
14
14
|
names = ::I18n.t('date.abbr_month_names', raise: true)
|
|
15
15
|
rescue ::I18n::ArgumentError
|
|
16
|
-
names =
|
|
16
|
+
names = [nil, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
|
17
17
|
end
|
|
18
18
|
names[1..-1]
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def date_format
|
|
22
|
-
::I18n.t('date.formats.default',
|
|
22
|
+
::I18n.t('date.formats.default', raise: true)
|
|
23
|
+
rescue
|
|
24
|
+
"%Y-%m-%d"
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
def day_names
|
|
26
28
|
::I18n.t('date.day_names', raise: true)
|
|
27
29
|
rescue ::I18n::ArgumentError
|
|
28
|
-
|
|
30
|
+
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
|
|
29
31
|
end
|
|
30
32
|
|
|
31
33
|
def month_names
|
|
32
34
|
begin
|
|
33
35
|
names = ::I18n.t('date.month_names', raise: true)
|
|
34
36
|
rescue ::I18n::ArgumentError
|
|
35
|
-
names =
|
|
37
|
+
names = [nil, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
|
36
38
|
end
|
|
37
39
|
names[1..-1]
|
|
38
40
|
end
|
data/lib/rails_admin/version.rb
CHANGED
data/lib/rails_admin.rb
CHANGED
|
@@ -2,13 +2,13 @@ require 'rails_admin/engine'
|
|
|
2
2
|
require 'rails_admin/abstract_model'
|
|
3
3
|
require 'rails_admin/config'
|
|
4
4
|
require 'rails_admin/extension'
|
|
5
|
-
require 'rails_admin/extensions/cancan'
|
|
6
5
|
require 'rails_admin/extensions/cancancan'
|
|
7
6
|
require 'rails_admin/extensions/pundit'
|
|
8
7
|
require 'rails_admin/extensions/paper_trail'
|
|
9
8
|
require 'rails_admin/extensions/history'
|
|
10
9
|
require 'rails_admin/support/csv_converter'
|
|
11
10
|
require 'rails_admin/support/hash_helper'
|
|
11
|
+
require 'yaml'
|
|
12
12
|
|
|
13
13
|
module RailsAdmin
|
|
14
14
|
# Setup RailsAdmin
|
|
@@ -33,6 +33,28 @@ module RailsAdmin
|
|
|
33
33
|
RailsAdmin::Config
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
|
+
|
|
37
|
+
# Backwards-compatible with safe_yaml/load when SafeYAML isn't available.
|
|
38
|
+
# Evaluates available YAML loaders at boot and creates appropriate method,
|
|
39
|
+
# so no conditionals are required at runtime.
|
|
40
|
+
begin
|
|
41
|
+
require 'safe_yaml/load'
|
|
42
|
+
def self.yaml_load(yaml)
|
|
43
|
+
SafeYAML.load(yaml)
|
|
44
|
+
end
|
|
45
|
+
rescue LoadError
|
|
46
|
+
if YAML.respond_to?(:safe_load)
|
|
47
|
+
def self.yaml_load(yaml)
|
|
48
|
+
YAML.safe_load(yaml)
|
|
49
|
+
end
|
|
50
|
+
else
|
|
51
|
+
raise LoadError.new "Safe-loading of YAML is not available. Please install 'safe_yaml' or install Psych 2.0+"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def self.yaml_dump(object)
|
|
56
|
+
YAML.dump(object)
|
|
57
|
+
end
|
|
36
58
|
end
|
|
37
59
|
|
|
38
60
|
require 'rails_admin/bootstrap-sass' unless defined? Bootstrap
|
data/lib/tasks/rails_admin.rake
CHANGED
|
@@ -12,18 +12,27 @@ namespace :rails_admin do
|
|
|
12
12
|
desc 'CI env for Travis'
|
|
13
13
|
task :prepare_ci_env do
|
|
14
14
|
adapter = ENV['CI_DB_ADAPTER'] || 'sqlite3'
|
|
15
|
-
database =
|
|
15
|
+
database = ('sqlite3' == adapter ? 'db/development.sqlite3' : 'ci_rails_admin')
|
|
16
|
+
username =
|
|
17
|
+
case adapter
|
|
18
|
+
when 'postgresql'
|
|
19
|
+
'postgres'
|
|
20
|
+
when 'mysql2'
|
|
21
|
+
'root'
|
|
22
|
+
else
|
|
23
|
+
''
|
|
24
|
+
end
|
|
16
25
|
|
|
17
26
|
configuration = {
|
|
18
27
|
'test' => {
|
|
19
28
|
'adapter' => adapter,
|
|
20
29
|
'database' => database,
|
|
21
|
-
'username' =>
|
|
22
|
-
'password' =>
|
|
23
|
-
'host' =>
|
|
24
|
-
'encoding' =>
|
|
25
|
-
'pool' =>
|
|
26
|
-
'timeout' =>
|
|
30
|
+
'username' => username,
|
|
31
|
+
'password' => ('postgresql' == adapter ? 'postgres' : ''),
|
|
32
|
+
'host' => '127.0.0.1',
|
|
33
|
+
'encoding' => 'utf8',
|
|
34
|
+
'pool' => 5,
|
|
35
|
+
'timeout' => 5000,
|
|
27
36
|
},
|
|
28
37
|
}
|
|
29
38
|
|
|
Binary file
|
|
Binary file
|