rails_admin 2.0.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -7
  3. data/README.md +11 -3
  4. data/app/assets/javascripts/rails_admin/jquery.migrate.js +3 -0
  5. data/app/assets/javascripts/rails_admin/ra.filter-box.js +35 -16
  6. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +7 -7
  7. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.js +7 -5
  8. data/app/assets/javascripts/rails_admin/ra.widgets.js +11 -3
  9. data/app/assets/javascripts/rails_admin/rails_admin.js +2 -1
  10. data/app/assets/javascripts/rails_admin/ui.js +2 -2
  11. data/app/helpers/rails_admin/form_builder.rb +10 -9
  12. data/app/helpers/rails_admin/main_helper.rb +2 -1
  13. data/app/views/rails_admin/main/_form_enumeration.html.haml +4 -3
  14. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +7 -6
  15. data/app/views/rails_admin/main/index.html.haml +2 -2
  16. data/config/locales/rails_admin.en.yml +1 -1
  17. data/lib/rails_admin/adapters/active_record.rb +8 -2
  18. data/lib/rails_admin/adapters/active_record/abstract_object.rb +9 -3
  19. data/lib/rails_admin/config.rb +0 -4
  20. data/lib/rails_admin/config/fields/base.rb +4 -0
  21. data/lib/rails_admin/config/fields/types/active_storage.rb +5 -1
  22. data/lib/rails_admin/config/fields/types/file_upload.rb +5 -1
  23. data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +5 -1
  24. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +2 -1
  25. data/lib/rails_admin/config/fields/types/shrine.rb +13 -11
  26. data/lib/rails_admin/config/lazy_model.rb +4 -4
  27. data/lib/rails_admin/config/model.rb +2 -2
  28. data/lib/rails_admin/config/proxyable/proxy.rb +4 -4
  29. data/lib/rails_admin/extension.rb +1 -1
  30. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +1 -1
  31. data/lib/rails_admin/version.rb +2 -2
  32. data/lib/tasks/rails_admin.rake +16 -7
  33. data/vendor/assets/javascripts/rails_admin/bootstrap-datetimepicker.js +317 -150
  34. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-affix.js +50 -28
  35. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-alert.js +10 -7
  36. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-button.js +35 -20
  37. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-carousel.js +48 -25
  38. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-collapse.js +70 -28
  39. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-dropdown.js +56 -42
  40. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-modal.js +118 -40
  41. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-popover.js +26 -16
  42. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-scrollspy.js +29 -27
  43. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-tab.js +46 -19
  44. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-tooltip.js +280 -60
  45. data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-transition.js +5 -5
  46. data/vendor/assets/javascripts/rails_admin/jquery.pjax.js +317 -160
  47. data/vendor/assets/javascripts/rails_admin/moment-with-locales.js +11210 -9290
  48. metadata +4 -4
  49. data/config/initializers/devise_patch.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e762b5bdac4e8a36a97a7c202d8a44313d3bc832a52841fc23ffbf01fc585b0
4
- data.tar.gz: 9059efd9fba737bc94817e0613f62c276551ae37dfc14f79e8fb8def21bfbdcf
3
+ metadata.gz: 36b3499d6b3b8d89882cdd41af33bfd4e4bf97fd5b035664ea73fda237a62279
4
+ data.tar.gz: d842cfc1f2dd3ec81aebf7c0fcf49111a0945d27abf07465fdf80c178e21d410
5
5
  SHA512:
6
- metadata.gz: ca9f568f3c3e8e2a7b63ad2d64de0d89944db6f6735376714a2d019a60d592c7a80e8c3c0b2a9ce606f390dadc630d7478a1471b3e90b4283091b063b30001dd
7
- data.tar.gz: fc5afc47e02d74b54c868c77cbf4b45217e5d2f9396e2c9e5c34ed1d2b7c2e4dfd3040657e7d21930ed5ee61599dd5ccbbd128c464f7ff2cb228e9e712d73761
6
+ metadata.gz: 97579593acfe1b195682a979192b5c7436ba46ab4ba63c33ae9d4fa1f682b45f6a09fb80ecb66cc7aaac6ff23c744cbb2bf86b6ee22dc82e01d17a6edde24cd6
7
+ data.tar.gz: 2d4980005f040bebcccce89d734ed296d01ad0573b74dd8264af8cf308ff4b948766de73071c4762639058d40cefefbb33022f0acc1c650ad55aea70e314538f
data/Gemfile CHANGED
@@ -21,24 +21,22 @@ end
21
21
  group :test do
22
22
  gem 'cancancan', '~> 3.0'
23
23
  gem 'carrierwave', ['>= 2.0.0.rc', '< 3']
24
- gem 'coveralls'
25
- gem 'database_cleaner', ['>= 1.2', '!= 1.4.0', '!= 1.5.0']
24
+ gem 'database_cleaner', ['>= 1.2', '!= 1.4.0', '!= 1.5.0', '< 2.0']
26
25
  gem 'dragonfly', '~> 1.0'
27
26
  gem 'factory_bot', '>= 4.2'
28
27
  gem 'generator_spec', '>= 0.8'
29
28
  gem 'launchy', '>= 2.2'
30
29
  gem 'mini_magick', '>= 3.4'
31
- gem 'paperclip', ['>= 3.4', '!= 4.3.0']
32
30
  gem 'poltergeist', '~> 1.5'
33
31
  gem 'pundit'
34
32
  gem 'rack-cache', require: 'rack/cache'
35
33
  gem 'rspec-rails', '>= 2.14'
36
34
  gem 'rspec-expectations', '!= 3.8.3'
37
- gem 'rubocop', '~> 0.68.1'
38
- gem 'rubocop-performance'
35
+ gem 'rspec-retry'
36
+ gem 'rubocop', '~> 0.68.1', require: false
37
+ gem 'rubocop-performance', require: false
39
38
  gem 'simplecov', '>= 0.9', require: false
40
- gem 'shrine', '~> 2.0'
41
- gem 'shrine-memory'
39
+ gem 'simplecov-lcov', require: false
42
40
  gem 'timecop', '>= 0.5'
43
41
 
44
42
  platforms :ruby_19 do
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # RailsAdmin
2
2
 
3
3
  [![Gem Version](https://img.shields.io/gem/v/rails_admin.svg)][gem]
4
- [![Build Status](https://img.shields.io/travis/sferik/rails_admin.svg)][travis]
4
+ [![Build Status](https://img.shields.io/github/workflow/status/sferik/rails_admin/Test)][ghactions]
5
5
  [![Coverage Status](https://img.shields.io/coveralls/sferik/rails_admin.svg)][coveralls]
6
6
  [![Inline docs](http://inch-ci.org/github/sferik/rails_admin.svg)][inch]
7
7
  [![Code Climate](https://codeclimate.com/github/sferik/rails_admin.svg)][codeclimate]
8
8
  [![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=rails_admin&package-manager=bundler&version-scheme=semver)][semver]
9
9
 
10
10
  [gem]: https://rubygems.org/gems/rails_admin
11
- [travis]: https://travis-ci.org/sferik/rails_admin
11
+ [ghactions]: https://github.com/sferik/rails_admin/actions
12
12
  [coveralls]: https://coveralls.io/r/sferik/rails_admin
13
13
  [inch]: http://inch-ci.org/github/sferik/rails_admin
14
14
  [codeclimate]: https://codeclimate.com/github/sferik/rails_admin
@@ -16,6 +16,12 @@
16
16
 
17
17
  RailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data.
18
18
 
19
+ ## Announcements
20
+
21
+ ### [Action required] Security issue
22
+
23
+ **RailsAdmin 2.0.1, 2.0.0 and up to 1.4.2 have been reported to have XSS vulnerability.** We strongly recommend that you upgrade RailsAdmin to 2.0.2 (and higher) or 1.4.3 as soon as possible, if you are on those versions. See [d72090ec](https://github.com/sferik/rails_admin/commit/d72090ec6a07c3b9b7b48ab50f3d405f91ff4375) for the detail.
24
+
19
25
  ## Getting started
20
26
 
21
27
  * Check out [the docs][docs].
@@ -86,13 +92,15 @@ list][list].
86
92
  If you think you found a bug in RailsAdmin, you can [submit an issue](https://github.com/sferik/rails_admin/issues/new).
87
93
 
88
94
  ## Supported Ruby Versions
89
- This library aims to support and is [tested against][travis] the following Ruby implementations:
95
+ This library aims to support and is [tested against][ghactions] the following Ruby implementations:
90
96
 
91
97
  * Ruby 2.2
92
98
  * Ruby 2.3
93
99
  * Ruby 2.4
94
100
  * Ruby 2.5
95
101
  * Ruby 2.6
102
+ * Ruby 2.7
103
+ * Ruby 3.0
96
104
  * [JRuby][]
97
105
 
98
106
  [jruby]: http://jruby.org/
@@ -0,0 +1,3 @@
1
+ /*! jQuery Migrate v3.3.3-pre | (c) OpenJS Foundation and other contributors | jquery.org/license */
2
+ "undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e,window)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery"),window):t(jQuery,window)}(function(s,n){"use strict";function e(e){return 0<=function(e,t){for(var r=/^(\d+)\.(\d+)\.(\d+)/,n=r.exec(e)||[],o=r.exec(t)||[],i=1;i<=3;i++){if(+o[i]<+n[i])return 1;if(+n[i]<+o[i])return-1}return 0}(s.fn.jquery,e)}s.migrateVersion="3.3.3-pre",n.console&&n.console.log&&(s&&e("3.0.0")||n.console.log("JQMIGRATE: jQuery 3.0.0+ REQUIRED"),s.migrateWarnings&&n.console.log("JQMIGRATE: Migrate plugin loaded multiple times"),n.console.log("JQMIGRATE: Migrate is installed"+(s.migrateMute?"":" with logging active")+", version "+s.migrateVersion));var r={};function u(e){var t=n.console;s.migrateDeduplicateWarnings&&r[e]||(r[e]=!0,s.migrateWarnings.push(e),t&&t.warn&&!s.migrateMute&&(t.warn("JQMIGRATE: "+e),s.migrateTrace&&t.trace&&t.trace()))}function t(e,t,r,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return u(n),r},set:function(e){u(n),r=e}})}function o(e,t,r,n){e[t]=function(){return u(n),r.apply(this,arguments)}}s.migrateDeduplicateWarnings=!0,s.migrateWarnings=[],void 0===s.migrateTrace&&(s.migrateTrace=!0),s.migrateReset=function(){r={},s.migrateWarnings.length=0},"BackCompat"===n.document.compatMode&&u("jQuery is not compatible with Quirks Mode");var i,a,c,d={},l=s.fn.init,p=s.find,f=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,y=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,m=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;for(i in s.fn.init=function(e){var t=Array.prototype.slice.call(arguments);return"string"==typeof e&&"#"===e&&(u("jQuery( '#' ) is not a valid selector"),t[0]=[]),l.apply(this,t)},s.fn.init.prototype=s.fn,s.find=function(t){var r=Array.prototype.slice.call(arguments);if("string"==typeof t&&f.test(t))try{n.document.querySelector(t)}catch(e){t=t.replace(y,function(e,t,r,n){return"["+t+r+'"'+n+'"]'});try{n.document.querySelector(t),u("Attribute selector with '#' must be quoted: "+r[0]),r[0]=t}catch(e){u("Attribute selector with '#' was not fixed: "+r[0])}}return p.apply(this,r)},p)Object.prototype.hasOwnProperty.call(p,i)&&(s.find[i]=p[i]);o(s.fn,"size",function(){return this.length},"jQuery.fn.size() is deprecated and removed; use the .length property"),o(s,"parseJSON",function(){return JSON.parse.apply(null,arguments)},"jQuery.parseJSON is deprecated; use JSON.parse"),o(s,"holdReady",s.holdReady,"jQuery.holdReady is deprecated"),o(s,"unique",s.uniqueSort,"jQuery.unique is deprecated; use jQuery.uniqueSort"),t(s.expr,"filters",s.expr.pseudos,"jQuery.expr.filters is deprecated; use jQuery.expr.pseudos"),t(s.expr,":",s.expr.pseudos,"jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos"),e("3.1.1")&&o(s,"trim",function(e){return null==e?"":(e+"").replace(m,"")},"jQuery.trim is deprecated; use String.prototype.trim"),e("3.2.0")&&(o(s,"nodeName",function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},"jQuery.nodeName is deprecated"),o(s,"isArray",Array.isArray,"jQuery.isArray is deprecated; use Array.isArray")),e("3.3.0")&&(o(s,"isNumeric",function(e){var t=typeof e;return("number"==t||"string"==t)&&!isNaN(e-parseFloat(e))},"jQuery.isNumeric() is deprecated"),s.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){d["[object "+t+"]"]=t.toLowerCase()}),o(s,"type",function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?d[Object.prototype.toString.call(e)]||"object":typeof e},"jQuery.type is deprecated"),o(s,"isFunction",function(e){return"function"==typeof e},"jQuery.isFunction() is deprecated"),o(s,"isWindow",function(e){return null!=e&&e===e.window},"jQuery.isWindow() is deprecated")),s.ajax&&(a=s.ajax,c=/(=)\?(?=&|$)|\?\?/,s.ajax=function(){var e=a.apply(this,arguments);return e.promise&&(o(e,"success",e.done,"jQXHR.success is deprecated and removed"),o(e,"error",e.fail,"jQXHR.error is deprecated and removed"),o(e,"complete",e.always,"jQXHR.complete is deprecated and removed")),e},e("4.0.0")||s.ajaxPrefilter("+json",function(e){!1!==e.jsonp&&(c.test(e.url)||"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&c.test(e.data))&&u("JSON-to-JSONP auto-promotion is deprecated")}));var g=s.fn.removeAttr,h=s.fn.toggleClass,v=/\S+/g;function j(e){return e.replace(/-([a-z])/g,function(e,t){return t.toUpperCase()})}s.fn.removeAttr=function(e){var r=this;return s.each(e.match(v),function(e,t){s.expr.match.bool.test(t)&&(u("jQuery.fn.removeAttr no longer sets boolean properties: "+t),r.prop(t,!1))}),g.apply(this,arguments)};var Q,b=!(s.fn.toggleClass=function(t){return void 0!==t&&"boolean"!=typeof t?h.apply(this,arguments):(u("jQuery.fn.toggleClass( boolean ) is deprecated"),this.each(function(){var e=this.getAttribute&&this.getAttribute("class")||"";e&&s.data(this,"__className__",e),this.setAttribute&&this.setAttribute("class",!e&&!1!==t&&s.data(this,"__className__")||"")}))}),w=/^[a-z]/,x=/^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;s.swap&&s.each(["height","width","reliableMarginRight"],function(e,t){var r=s.cssHooks[t]&&s.cssHooks[t].get;r&&(s.cssHooks[t].get=function(){var e;return b=!0,e=r.apply(this,arguments),b=!1,e})}),s.swap=function(e,t,r,n){var o,i,a={};for(i in b||u("jQuery.swap() is undocumented and deprecated"),t)a[i]=e.style[i],e.style[i]=t[i];for(i in o=r.apply(e,n||[]),t)e.style[i]=a[i];return o},e("3.4.0")&&"undefined"!=typeof Proxy&&(s.cssProps=new Proxy(s.cssProps||{},{set:function(){return u("JQMIGRATE: jQuery.cssProps is deprecated"),Reflect.set.apply(this,arguments)}})),s.cssNumber||(s.cssNumber={}),Q=s.fn.css,s.fn.css=function(e,t){var r,n,o=this;return e&&"object"==typeof e&&!Array.isArray(e)?(s.each(e,function(e,t){s.fn.css.call(o,e,t)}),this):("number"==typeof t&&(r=j(e),n=r,w.test(n)&&x.test(n[0].toUpperCase()+n.slice(1))||s.cssNumber[r]||u('Number-typed values are deprecated for jQuery.fn.css( "'+e+'", value )')),Q.apply(this,arguments))};var A,k,S,M,N=s.data;s.data=function(e,t,r){var n,o,i;if(t&&"object"==typeof t&&2===arguments.length){for(i in n=s.hasData(e)&&N.call(this,e),o={},t)i!==j(i)?(u("jQuery.data() always sets/gets camelCased names: "+i),n[i]=t[i]):o[i]=t[i];return N.call(this,e,o),t}return t&&"string"==typeof t&&t!==j(t)&&(n=s.hasData(e)&&N.call(this,e))&&t in n?(u("jQuery.data() always sets/gets camelCased names: "+t),2<arguments.length&&(n[t]=r),n[t]):N.apply(this,arguments)},s.fx&&(S=s.Tween.prototype.run,M=function(e){return e},s.Tween.prototype.run=function(){1<s.easing[this.easing].length&&(u("'jQuery.easing."+this.easing.toString()+"' should use only one argument"),s.easing[this.easing]=M),S.apply(this,arguments)},A=s.fx.interval||13,k="jQuery.fx.interval is deprecated",n.requestAnimationFrame&&Object.defineProperty(s.fx,"interval",{configurable:!0,enumerable:!0,get:function(){return n.document.hidden||u(k),A},set:function(e){u(k),A=e}}));var R=s.fn.load,H=s.event.add,C=s.event.fix;s.event.props=[],s.event.fixHooks={},t(s.event.props,"concat",s.event.props.concat,"jQuery.event.props.concat() is deprecated and removed"),s.event.fix=function(e){var t,r=e.type,n=this.fixHooks[r],o=s.event.props;if(o.length){u("jQuery.event.props are deprecated and removed: "+o.join());while(o.length)s.event.addProp(o.pop())}if(n&&!n._migrated_&&(n._migrated_=!0,u("jQuery.event.fixHooks are deprecated and removed: "+r),(o=n.props)&&o.length))while(o.length)s.event.addProp(o.pop());return t=C.call(this,e),n&&n.filter?n.filter(t,e):t},s.event.add=function(e,t){return e===n&&"load"===t&&"complete"===n.document.readyState&&u("jQuery(window).on('load'...) called after load event occurred"),H.apply(this,arguments)},s.each(["load","unload","error"],function(e,t){s.fn[t]=function(){var e=Array.prototype.slice.call(arguments,0);return"load"===t&&"string"==typeof e[0]?R.apply(this,e):(u("jQuery.fn."+t+"() is deprecated"),e.splice(0,0,t),arguments.length?this.on.apply(this,e):(this.triggerHandler.apply(this,e),this))}}),s.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,r){s.fn[r]=function(e,t){return u("jQuery.fn."+r+"() event shorthand is deprecated"),0<arguments.length?this.on(r,null,e,t):this.trigger(r)}}),s(function(){s(n.document).triggerHandler("ready")}),s.event.special.ready={setup:function(){this===n.document&&u("'ready' event is deprecated")}},s.fn.extend({bind:function(e,t,r){return u("jQuery.fn.bind() is deprecated"),this.on(e,null,t,r)},unbind:function(e,t){return u("jQuery.fn.unbind() is deprecated"),this.off(e,null,t)},delegate:function(e,t,r,n){return u("jQuery.fn.delegate() is deprecated"),this.on(t,e,r,n)},undelegate:function(e,t,r){return u("jQuery.fn.undelegate() is deprecated"),1===arguments.length?this.off(e,"**"):this.off(t,e||"**",r)},hover:function(e,t){return u("jQuery.fn.hover() is deprecated"),this.on("mouseenter",e).on("mouseleave",t||e)}});function T(e){var t=n.document.implementation.createHTMLDocument("");return t.body.innerHTML=e,t.body&&t.body.innerHTML}function P(e){var t=e.replace(O,"<$1></$2>");t!==e&&T(e)!==T(t)&&u("HTML tags must be properly nested and closed: "+e)}var O=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,q=s.htmlPrefilter;s.UNSAFE_restoreLegacyHtmlPrefilter=function(){s.htmlPrefilter=function(e){return P(e),e.replace(O,"<$1></$2>")}},s.htmlPrefilter=function(e){return P(e),q(e)};var D,_=s.fn.offset;s.fn.offset=function(){var e=this[0];return!e||e.nodeType&&e.getBoundingClientRect?_.apply(this,arguments):(u("jQuery.fn.offset() requires a valid DOM element"),arguments.length?this:void 0)},s.ajax&&(D=s.param,s.param=function(e,t){var r=s.ajaxSettings&&s.ajaxSettings.traditional;return void 0===t&&r&&(u("jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),t=r),D.call(this,e,t)});var E,F,J=s.fn.andSelf||s.fn.addBack;return s.fn.andSelf=function(){return u("jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),J.apply(this,arguments)},s.Deferred&&(E=s.Deferred,F=[["resolve","done",s.Callbacks("once memory"),s.Callbacks("once memory"),"resolved"],["reject","fail",s.Callbacks("once memory"),s.Callbacks("once memory"),"rejected"],["notify","progress",s.Callbacks("memory"),s.Callbacks("memory")]],s.Deferred=function(e){var i=E(),a=i.promise();return i.pipe=a.pipe=function(){var o=arguments;return u("deferred.pipe() is deprecated"),s.Deferred(function(n){s.each(F,function(e,t){var r="function"==typeof o[e]&&o[e];i[t[1]](function(){var e=r&&r.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[t[0]+"With"](this===a?n.promise():this,r?[e]:arguments)})}),o=null}).promise()},e&&e.call(i,i),i},s.Deferred.exceptionHook=E.exceptionHook),s});
3
+ //# sourceMappingURL=jquery-migrate.min.map
@@ -11,6 +11,7 @@
11
11
  var field_value = options['value'];
12
12
  var field_operator = options['operator'];
13
13
  var select_options = options['select_options'];
14
+ var required = options['required'];
14
15
  var index = options['index'];
15
16
  var value_name = 'f[' + field_name + '][' + index + '][v]';
16
17
  var operator_name = 'f[' + field_name + '][' + index + '][o]';
@@ -24,9 +25,13 @@
24
25
  .append('<option value="_discard">...</option>')
25
26
  .append($('<option value="true"></option>').prop('selected', field_value == "true").text(RailsAdmin.I18n.t("true")))
26
27
  .append($('<option value="false"></option>').prop('selected', field_value == "false").text(RailsAdmin.I18n.t("false")))
27
- .append('<option disabled="disabled">---------</option>')
28
- .append($('<option value="_present"></option>').prop('selected', field_value == "_present").text(RailsAdmin.I18n.t("is_present")))
29
- .append($('<option value="_blank"></option>').prop('selected', field_value == "_blank").text(RailsAdmin.I18n.t("is_blank")));
28
+ if (!required) {
29
+ control.append([
30
+ '<option disabled="disabled">---------</option>',
31
+ $('<option value="_present"></option>').prop('selected', field_value == "_present").text(RailsAdmin.I18n.t("is_present")),
32
+ $('<option value="_blank"></option>').prop('selected', field_value == "_blank").text(RailsAdmin.I18n.t("is_blank"))
33
+ ])
34
+ }
30
35
  break;
31
36
  case 'date':
32
37
  additional_control =
@@ -56,9 +61,13 @@
56
61
  .append($('<option value="yesterday"></option>').prop('selected', field_operator == "yesterday").text(RailsAdmin.I18n.t("yesterday")))
57
62
  .append($('<option value="this_week"></option>').prop('selected', field_operator == "this_week").text(RailsAdmin.I18n.t("this_week")))
58
63
  .append($('<option value="last_week"></option>').prop('selected', field_operator == "last_week").text(RailsAdmin.I18n.t("last_week")))
59
- .append('<option disabled="disabled">---------</option>')
60
- .append($('<option value="_not_null"></option>').prop('selected', field_operator == "_not_null").text(RailsAdmin.I18n.t("is_present")))
61
- .append($('<option value="_null"></option>').prop('selected', field_operator == "_null").text(RailsAdmin.I18n.t("is_blank")));
64
+ if (!required) {
65
+ control.append([
66
+ '<option disabled="disabled">---------</option>',
67
+ $('<option value="_not_null"></option>').prop('selected', field_operator == "_not_null").text(RailsAdmin.I18n.t("is_present")),
68
+ $('<option value="_null"></option>').prop('selected', field_operator == "_null").text(RailsAdmin.I18n.t("is_blank"))
69
+ ])
70
+ }
62
71
  additional_control = additional_control ||
63
72
  $('<input size="25" class="datetime additional-fieldset default input-sm form-control" type="text" />')
64
73
  .css('display', (!field_operator || field_operator == "default") ? 'inline-block' : 'none')
@@ -84,10 +93,11 @@
84
93
  .prop('name', multiple_values ? undefined : value_name)
85
94
  .data('name', value_name)
86
95
  .append('<option value="_discard">...</option>')
87
- .append($('<option value="_present"></option>').prop('selected', field_value == "_present").text(RailsAdmin.I18n.t("is_present")))
88
- .append($('<option value="_blank"></option>').prop('selected', field_value == "_blank").text(RailsAdmin.I18n.t("is_blank")))
89
- .append('<option disabled="disabled">---------</option>')
90
- .append(select_options)
96
+ .append(required ? [] : [
97
+ $('<option value="_present"></option>').prop('selected', field_value == "_present").text(RailsAdmin.I18n.t("is_present")),
98
+ $('<option value="_blank"></option>').prop('selected', field_value == "_blank").text(RailsAdmin.I18n.t("is_blank")),
99
+ '<option disabled="disabled">---------</option>'
100
+ ])
91
101
  .add(
92
102
  $('<select multiple="multiple" class="select-multiple input-sm form-control"></select>')
93
103
  .css('display', multiple_values ? 'inline-block' : 'none')
@@ -111,9 +121,13 @@
111
121
  .append($('<option data-additional-fieldset="additional-fieldset" value="is"></option>').prop('selected', field_operator == "is").text(RailsAdmin.I18n.t("is_exactly")))
112
122
  .append($('<option data-additional-fieldset="additional-fieldset" value="starts_with"></option>').prop('selected', field_operator == "starts_with").text(RailsAdmin.I18n.t("starts_with")))
113
123
  .append($('<option data-additional-fieldset="additional-fieldset" value="ends_with"></option>').prop('selected', field_operator == "ends_with").text(RailsAdmin.I18n.t("ends_with")))
114
- .append('<option disabled="disabled">---------</option>')
115
- .append($('<option value="_present"></option>').prop('selected', field_operator == "_present").text(RailsAdmin.I18n.t("is_present")))
116
- .append($('<option value="_blank"></option>').prop('selected', field_operator == "_blank").text(RailsAdmin.I18n.t("is_blank")));
124
+ if (!required) {
125
+ control.append([
126
+ '<option disabled="disabled">---------</option>',
127
+ $('<option value="_present"></option>').prop('selected', field_operator == "_present").text(RailsAdmin.I18n.t("is_present")),
128
+ $('<option value="_blank"></option>').prop('selected', field_operator == "_blank").text(RailsAdmin.I18n.t("is_blank"))
129
+ ])
130
+ }
117
131
  additional_control = $('<input class="additional-fieldset input-sm form-control" type="text" />')
118
132
  .css('display', field_operator == "_present" || field_operator == "_blank" ? 'none' : 'inline-block')
119
133
  .prop('name', value_name)
@@ -126,9 +140,13 @@
126
140
  .prop('name', operator_name)
127
141
  .append($('<option data-additional-fieldset="default" value="default"></option>').prop('selected', field_operator == "default").text(RailsAdmin.I18n.t("number")))
128
142
  .append($('<option data-additional-fieldset="between" value="between"></option>').prop('selected', field_operator == "between").text(RailsAdmin.I18n.t("between_and_")))
129
- .append('<option disabled="disabled">---------</option>')
130
- .append($('<option value="_not_null"></option>').prop('selected', field_operator == "_not_null").text(RailsAdmin.I18n.t("is_present")))
131
- .append($('<option value="_null"></option>').prop('selected', field_operator == "_null").text(RailsAdmin.I18n.t("is_blank")));
143
+ if (!required) {
144
+ control.append([
145
+ '<option disabled="disabled">---------</option>',
146
+ $('<option value="_not_null"></option>').prop('selected', field_operator == "_not_null").text(RailsAdmin.I18n.t("is_present")),
147
+ $('<option value="_null"></option>').prop('selected', field_operator == "_null").text(RailsAdmin.I18n.t("is_blank"))
148
+ ])
149
+ }
132
150
  additional_control =
133
151
  $('<input class="additional-fieldset default input-sm form-control" type="text" />')
134
152
  .css('display', (!field_operator || field_operator == "default") ? 'inline-block' : 'none')
@@ -193,6 +211,7 @@
193
211
  value: $(this).data('field-value'),
194
212
  operator: $(this).data('field-operator'),
195
213
  select_options: $(this).data('field-options'),
214
+ required: $(this).data('field-required'),
196
215
  index: $.now().toString().slice(6,11),
197
216
  datetimepicker_format: $(this).data('field-datetimepicker-format')
198
217
  });
@@ -19,13 +19,13 @@
19
19
  sortable: false,
20
20
  removable: true,
21
21
  regional: {
22
- up: "Up",
23
- down: "Down",
24
- add: "Add",
25
- chooseAll: "Choose all",
26
- chosen: "Chosen records",
27
- clearAll: "Clear all",
28
- remove: "Remove"
22
+ add: 'Add',
23
+ chooseAll: 'Choose all',
24
+ clearAll: 'Clear all',
25
+ down: 'Down',
26
+ remove: 'Remove',
27
+ search: 'Search',
28
+ up: 'Up'
29
29
  },
30
30
  searchDelay: 400,
31
31
  remote_source: null,
@@ -11,7 +11,9 @@
11
11
  $(document).on('nested:fieldAdded', 'form', function(content) {
12
12
  var controls, field, nav, new_tab, one_to_one, parent_group, toggler;
13
13
  field = content.field.addClass('tab-pane').attr('id', 'unique-id-' + (new Date().getTime()));
14
- new_tab = $('<li><a data-toggle="tab" href="#' + field.attr('id') + '">' + field.children('.object-infos').data('object-label') + '</a></li>');
14
+ new_tab = $('<li></li>').append(
15
+ $('<a></a>').attr('data-toggle', 'tab').attr('href', '#' + field.attr('id')).text(field.children('.object-infos').data('object-label'))
16
+ )
15
17
  parent_group = field.closest('.control-group');
16
18
  controls = parent_group.children('.controls');
17
19
  one_to_one = controls.data('nestedone') !== void 0;
@@ -22,12 +24,12 @@
22
24
  $(window.document).trigger('rails_admin.dom_ready', [field, parent_group]);
23
25
  new_tab.children('a').tab('show');
24
26
  if (!one_to_one) {
25
- nav.select(':hidden').show('slow');
27
+ nav.filter(':hidden').show('slow');
26
28
  }
27
- content.select(':hidden').show('slow');
29
+ content.filter(':hidden').show('slow');
28
30
  toggler.addClass('active').removeClass('disabled').children('i').addClass('icon-chevron-down').removeClass('icon-chevron-right');
29
31
  if (one_to_one) {
30
- controls.find('.add_nested_fields').removeClass('add_nested_fields').html(field.children('.object-infos').data('object-label'));
32
+ controls.find('.add_nested_fields').removeClass('add_nested_fields').text(field.children('.object-infos').data('object-label'));
31
33
  }
32
34
  });
33
35
 
@@ -43,7 +45,7 @@
43
45
  (current_li.next().length ? current_li.next() : current_li.prev()).children('a:first').tab('show');
44
46
  current_li.remove();
45
47
  if (nav.children().length === 0) {
46
- nav.select(':visible').hide('slow');
48
+ nav.filter(':visible').hide('slow');
47
49
  toggler.removeClass('active').addClass('disabled').children('i').removeClass('icon-chevron-down').addClass('icon-chevron-right');
48
50
  }
49
51
  if (one_to_one) {
@@ -137,7 +137,11 @@
137
137
  toggler = field.find('> .controls > .btn-group > .toggler');
138
138
  tab_content.children('.fields:not(.tab-pane)').addClass('tab-pane').each(function() {
139
139
  $(this).attr('id', 'unique-id-' + (new Date().getTime()) + Math.floor(Math.random() * 100000));
140
- nav.append('<li><a data-toggle="tab" href="#' + this.id + '">' + $(this).children('.object-infos').data('object-label') + '</a></li>');
140
+ nav.append(
141
+ $('<li></li>').append(
142
+ $('<a></a>').attr('data-toggle', 'tab').attr('href', '#' + this.id).text($(this).children('.object-infos').data('object-label'))
143
+ )
144
+ );
141
145
  });
142
146
  if (nav.find("> li.active").length === 0) {
143
147
  nav.find("> li > a[data-toggle='tab']:first").tab('show');
@@ -165,8 +169,12 @@
165
169
  tab_content = field.find("> .tab-content");
166
170
  toggler = field.find('> .controls > .btn-group > .toggler');
167
171
  tab_content.children(".fields:not(.tab-pane)").addClass('tab-pane active').each(function() {
168
- field.find('> .controls .add_nested_fields').removeClass('add_nested_fields').html($(this).children('.object-infos').data('object-label'));
169
- nav.append('<li><a data-toggle="tab" href="#' + this.id + '">' + $(this).children('.object-infos').data('object-label') + '</a></li>');
172
+ field.find('> .controls .add_nested_fields').removeClass('add_nested_fields').text($(this).children('.object-infos').data('object-label'));
173
+ nav.append(
174
+ $('<li></li>').append(
175
+ $('<a></a>').attr('data-toggle', 'tab').attr('href', '#' + $(this).id).text($(this).children('.object-infos').data('object-label'))
176
+ )
177
+ );
170
178
  });
171
179
  first_tab = nav.find("> li > a[data-toggle='tab']:first");
172
180
  first_tab.tab('show');
@@ -1,4 +1,5 @@
1
- //= require 'jquery'
1
+ //= require 'jquery3'
2
+ //= require 'rails_admin/jquery.migrate'
2
3
  //= require 'jquery_ujs'
3
4
  //= require 'jquery.remotipart'
4
5
  //= require 'rails_admin/jquery-ui'
@@ -44,11 +44,11 @@
44
44
  if (!$(this).hasClass('disabled')) {
45
45
  if ($(this).has('i.icon-chevron-down').length) {
46
46
  $(this).removeClass('active').children('i').toggleClass('icon-chevron-down icon-chevron-right');
47
- $($(this).data('target')).select(':visible').hide('slow');
47
+ $($(this).data('target')).filter(':visible').hide('slow');
48
48
  } else {
49
49
  if ($(this).has('i.icon-chevron-right').length) {
50
50
  $(this).addClass('active').children('i').toggleClass('icon-chevron-down icon-chevron-right');
51
- $($(this).data('target')).select(':hidden').show('slow');
51
+ $($(this).data('target')).filter(':hidden').show('slow');
52
52
  }
53
53
  }
54
54
  }
@@ -1,3 +1,5 @@
1
+ require 'nested_form/builder_mixin'
2
+
1
3
  module RailsAdmin
2
4
  class FormBuilder < ::ActionView::Helpers::FormBuilder
3
5
  include ::NestedForm::BuilderMixin
@@ -38,16 +40,15 @@ module RailsAdmin
38
40
  end
39
41
 
40
42
  def field_wrapper_for(field, nested_in)
41
- if field.label
42
- # do not show nested field if the target is the origin
43
- unless nested_field_association?(field, nested_in)
44
- @template.content_tag(:div, class: "form-group control-group #{field.type_css_class} #{field.css_class} #{'error' if field.errors.present?}", id: "#{dom_id(field)}_field") do
45
- label(field.method_name, capitalize_first_letter(field.label), class: 'col-sm-2 control-label') +
46
- (field.nested_form ? field_for(field) : input_for(field))
47
- end
43
+ # do not show nested field if the target is the origin
44
+ return if nested_field_association?(field, nested_in)
45
+ @template.content_tag(:div, class: "form-group control-group #{field.type_css_class} #{field.css_class} #{'error' if field.errors.present?}", id: "#{dom_id(field)}_field") do
46
+ if field.label
47
+ label(field.method_name, capitalize_first_letter(field.label), class: 'col-sm-2 control-label') +
48
+ (field.nested_form ? field_for(field) : input_for(field))
49
+ else
50
+ field.nested_form ? field_for(field) : input_for(field)
48
51
  end
49
- else
50
- field.nested_form ? field_for(field) : input_for(field)
51
52
  end
52
53
  end
53
54
 
@@ -76,7 +76,8 @@ module RailsAdmin
76
76
  options[:type] = field.type
77
77
  options[:value] = filter_hash['v']
78
78
  options[:label] = field.label
79
- options[:operator] = filter_hash['o']
79
+ options[:operator] = filter_hash['o'] || field.default_filter_operator
80
+ options[:required] = field.required
80
81
  options
81
82
  end if ordered_filters
82
83
  end
@@ -7,12 +7,13 @@
7
7
  sortable: false,
8
8
  cacheAll: true,
9
9
  regional: {
10
+ add: t("admin.misc.add_new"),
10
11
  chooseAll: t("admin.misc.chose_all"),
11
- chosen: t("admin.misc.chosen", name: config.label_plural),
12
12
  clearAll: t("admin.misc.clear_all"),
13
+ down: t("admin.misc.down"),
14
+ remove: t("admin.misc.remove"),
13
15
  search: t("admin.misc.search"),
14
- up: t("admin.misc.up"),
15
- down: t("admin.misc.down")
16
+ up: t("admin.misc.up")
16
17
  }
17
18
  }
18
19
  = form.select field.method_name, field.enum, { selected: field.form_value, object: form.object }, field.html_attributes.reverse_merge({data: { filteringmultiselect: true, options: js_data.to_json }, multiple: true})
@@ -29,12 +29,13 @@
29
29
  removable: !!field.removable,
30
30
  cacheAll: !!field.associated_collection_cache_all,
31
31
  regional: {
32
- chooseAll: t("admin.misc.chose_all"),
33
- chosen: t("admin.misc.chosen", name: config.label_plural),
34
- clearAll: t("admin.misc.clear_all"),
35
- search: t("admin.misc.search"),
36
- up: t("admin.misc.up"),
37
- down: t("admin.misc.down")
32
+ add: t('admin.misc.add_new'),
33
+ chooseAll: t('admin.misc.chose_all'),
34
+ clearAll: t('admin.misc.clear_all'),
35
+ down: t('admin.misc.down'),
36
+ remove: t('admin.misc.remove'),
37
+ search: t('admin.misc.search'),
38
+ up: t('admin.misc.up')
38
39
  }
39
40
  }
40
41
 
@@ -35,7 +35,7 @@
35
35
  - else
36
36
  - ''
37
37
  %li
38
- %a{href: '#', :"data-field-label" => field.label, :"data-field-name" => field.name, :"data-field-options" => field_options.html_safe, :"data-field-type" => field.type, :"data-field-value" => "", :"data-field-datetimepicker-format" => (field.try(:parser) && field.parser.to_momentjs)}= capitalize_first_letter(field.label)
38
+ %a{href: '#', :"data-field-label" => field.label, :"data-field-name" => field.name, :"data-field-operator" => field.default_filter_operator, :"data-field-options" => field_options.html_safe, :"data-field-required" => field.required.to_s, :"data-field-type" => field.type, :"data-field-value" => "", :"data-field-datetimepicker-format" => (field.try(:parser) && field.parser.to_momentjs)}= capitalize_first_letter(field.label)
39
39
 
40
40
  %style
41
41
  - properties.select{ |p| p.column_width.present? }.each do |property|
@@ -53,7 +53,7 @@
53
53
  %button.btn.btn-primary{type: 'submit', :'data-disable-with' => '<i class="icon-white icon-refresh"></i> '.html_safe + t('admin.misc.refresh')}
54
54
  %i.icon-white.icon-refresh
55
55
  = t('admin.misc.refresh')
56
- %button#remove_filter.btn.btn-info{title: "Reset filters"}
56
+ %button#remove_filter.btn.btn-info{title: t('admin.misc.reset_filters')}
57
57
  %i.icon-white.icon-remove
58
58
  - if export_action
59
59
  %span{style: 'float:right'}= link_to wording_for(:link, export_action), export_path(params.except('set').except('page')), class: 'btn btn-info'
@@ -29,13 +29,13 @@ en:
29
29
  misc:
30
30
  search: "Search"
31
31
  filter: "Filter"
32
+ reset_filters: "Reset filters"
32
33
  refresh: "Refresh"
33
34
  show_all: "Show all"
34
35
  add_filter: "Add filter"
35
36
  bulk_menu_title: "Selected items"
36
37
  remove: "Remove"
37
38
  add_new: "Add new"
38
- chosen: "Chosen %{name}"
39
39
  chose_all: "Choose all"
40
40
  clear_all: "Clear all"
41
41
  up: "Up"
@@ -71,11 +71,17 @@ module RailsAdmin
71
71
  delegate :primary_key, :table_name, to: :model, prefix: false
72
72
 
73
73
  def encoding
74
- case ::ActiveRecord::Base.connection_config[:adapter]
74
+ adapter =
75
+ if ::ActiveRecord::Base.respond_to?(:connection_db_config)
76
+ ::ActiveRecord::Base.connection_db_config.configuration_hash[:adapter]
77
+ else
78
+ ::ActiveRecord::Base.connection_config[:adapter]
79
+ end
80
+ case adapter
75
81
  when 'postgresql'
76
82
  ::ActiveRecord::Base.connection.select_one("SELECT ''::text AS str;").values.first.encoding
77
83
  when 'mysql2'
78
- ::ActiveRecord::Base.connection.instance_variable_get(:@connection).encoding
84
+ ::ActiveRecord::Base.connection.raw_connection.encoding
79
85
  when 'oracle_enhanced'
80
86
  ::ActiveRecord::Base.connection.select_one("SELECT dummy FROM DUAL").values.first.encoding
81
87
  else
@@ -20,11 +20,17 @@ module RailsAdmin
20
20
  end
21
21
 
22
22
  def save(options = {validate: true})
23
- object.save(options)
23
+ object.save(**options)
24
24
  end
25
25
 
26
- def method_missing(name, *args, &block)
27
- object.send(name, *args, &block)
26
+ if RUBY_VERSION >= '2.7'
27
+ def method_missing(method_name, *args, **kwargs, &block)
28
+ object.send(method_name, *args, **kwargs, &block)
29
+ end
30
+ else
31
+ def method_missing(method_name, *args, &block)
32
+ object.send(method_name, *args, &block)
33
+ end
28
34
  end
29
35
  end
30
36
  end