rails_admin 2.0.1 → 2.2.0
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 +4 -4
- data/Gemfile +5 -7
- data/README.md +11 -3
- data/app/assets/javascripts/rails_admin/jquery.migrate.js +3 -0
- data/app/assets/javascripts/rails_admin/ra.filter-box.js +35 -16
- data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +7 -7
- data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.js +7 -5
- data/app/assets/javascripts/rails_admin/ra.widgets.js +11 -3
- data/app/assets/javascripts/rails_admin/rails_admin.js +2 -1
- data/app/assets/javascripts/rails_admin/ui.js +2 -2
- data/app/helpers/rails_admin/form_builder.rb +10 -9
- data/app/helpers/rails_admin/main_helper.rb +2 -1
- data/app/views/rails_admin/main/_form_enumeration.html.haml +4 -3
- data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +7 -6
- data/app/views/rails_admin/main/index.html.haml +2 -2
- data/config/locales/rails_admin.en.yml +1 -1
- data/lib/rails_admin/adapters/active_record.rb +8 -2
- data/lib/rails_admin/adapters/active_record/abstract_object.rb +9 -3
- data/lib/rails_admin/config.rb +0 -4
- data/lib/rails_admin/config/fields/base.rb +4 -0
- data/lib/rails_admin/config/fields/types/active_storage.rb +5 -1
- data/lib/rails_admin/config/fields/types/file_upload.rb +5 -1
- data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +5 -1
- data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +2 -1
- data/lib/rails_admin/config/fields/types/shrine.rb +13 -11
- data/lib/rails_admin/config/lazy_model.rb +4 -4
- data/lib/rails_admin/config/model.rb +2 -2
- data/lib/rails_admin/config/proxyable/proxy.rb +4 -4
- data/lib/rails_admin/extension.rb +1 -1
- data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +1 -1
- data/lib/rails_admin/version.rb +2 -2
- data/lib/tasks/rails_admin.rake +16 -7
- data/vendor/assets/javascripts/rails_admin/bootstrap-datetimepicker.js +317 -150
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-affix.js +50 -28
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-alert.js +10 -7
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-button.js +35 -20
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-carousel.js +48 -25
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-collapse.js +70 -28
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-dropdown.js +56 -42
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-modal.js +118 -40
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-popover.js +26 -16
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-scrollspy.js +29 -27
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-tab.js +46 -19
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-tooltip.js +280 -60
- data/vendor/assets/javascripts/rails_admin/bootstrap/bootstrap-transition.js +5 -5
- data/vendor/assets/javascripts/rails_admin/jquery.pjax.js +317 -160
- data/vendor/assets/javascripts/rails_admin/moment-with-locales.js +11210 -9290
- metadata +4 -4
- data/config/initializers/devise_patch.rb +0 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 36b3499d6b3b8d89882cdd41af33bfd4e4bf97fd5b035664ea73fda237a62279
|
|
4
|
+
data.tar.gz: d842cfc1f2dd3ec81aebf7c0fcf49111a0945d27abf07465fdf80c178e21d410
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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 '
|
|
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 '
|
|
38
|
-
gem 'rubocop
|
|
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 '
|
|
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]
|
|
4
|
-
[][ghactions]
|
|
5
5
|
[][coveralls]
|
|
6
6
|
[][inch]
|
|
7
7
|
[][codeclimate]
|
|
8
8
|
[][semver]
|
|
9
9
|
|
|
10
10
|
[gem]: https://rubygems.org/gems/rails_admin
|
|
11
|
-
[
|
|
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][
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
60
|
-
.append(
|
|
61
|
-
|
|
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(
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
115
|
-
.append(
|
|
116
|
-
|
|
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
|
-
|
|
130
|
-
.append(
|
|
131
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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.
|
|
27
|
+
nav.filter(':hidden').show('slow');
|
|
26
28
|
}
|
|
27
|
-
content.
|
|
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').
|
|
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.
|
|
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(
|
|
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').
|
|
169
|
-
nav.append(
|
|
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');
|
|
@@ -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')).
|
|
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')).
|
|
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
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
clearAll: t(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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:
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
27
|
-
|
|
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
|