Fixes #16158: Fix multiple select validation was trigged on other fields blur event

This commit is contained in:
Nikolay Poryadin
2019-03-20 20:09:34 +03:00
committed by Alexander Makarov
parent a3b6d227ba
commit dafaff0a02
2 changed files with 74 additions and 1 deletions

View File

@ -539,7 +539,7 @@
attribute.status = 2;
}
$.each(data.attributes, function () {
if (this.value !== getValue($form, this)) {
if (!isEqual(this.value, getValue($form, this))) {
this.status = 2;
forceValidate = true;
}
@ -565,6 +565,78 @@
}, validationDelay ? validationDelay : 200);
};
/**
* Compares two value whatever it objects, arrays or simple types
* @param val1
* @param val2
* @returns boolean
*/
var isEqual = function(val1, val2) {
// objects
if (val1 instanceof Object) {
return isObjectsEqual(val1, val2)
}
// arrays
if (Array.isArray(val1)) {
return isArraysEqual(val1, val2);
}
// simple types
return val1 === val2;
};
/**
* Compares two objects
* @param obj1
* @param obj2
* @returns boolean
*/
var isObjectsEqual = function(obj1, obj2) {
if (!(obj1 instanceof Object) || !(obj2 instanceof Object)) {
return false;
}
var keys1 = Object.keys(obj1);
var keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) {
return false;
}
for (var i = 0; i < keys1.length; i += 1) {
if (!obj2.hasOwnProperty(keys1[i])) {
return false;
}
if (obj1[keys1[i]] !== obj2[keys1[i]]) {
return false;
}
}
return true;
};
/**
* Compares two arrays
* @param arr1
* @param arr2
* @returns boolean
*/
var isArraysEqual = function(arr1, arr2) {
if (!Array.isArray(arr1) || !Array.isArray(arr2)) {
return false;
}
if (arr1.length !== arr2.length) {
return false;
}
for (var i = 0; i < arr1.length; i += 1) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
};
/**
* Returns an array prototype with a shortcut method for adding a new deferred.
* The context of the callback will be the deferred object so it can be resolved like ```this.resolve()```