Commit 48d0859f authored by Pedro Eduardo Trujillo's avatar Pedro Eduardo Trujillo
Browse files

Refina mezcla profunda para evitar romper objetos

Algunos objetos especiales (como por ejemplo una instancia de SVG de D3
usada en la capa del mapa para seguimiento) se rompían al mezclar en
profundidad las propiedades de los componentes. Se ha aplicado un método
de filtrado para no actuar así sobre objetos que no sean planos,
evitando este tipo de problemas.
parent 57aa7511
Loading
Loading
Loading
Loading
+22 −16
Original line number Diff line number Diff line
@@ -1183,37 +1183,43 @@ define([
			//		Mezcla dos o más objetos y devuelve el resultado, sin alterar los objetos originales.
			//	description:
			//		Realiza la mezcla desde la derecha (final del array) hacia la izquierda (principio del array), por
			//		lo que las propiedades de los últimos objetos se impondrán a las de los primeros.
			//
			//		Acepta opciones adicionales para concretar su funcionamiento.
			//		lo que las propiedades de los últimos objetos se impondrán sobre las de los primeros.
			//		Acepta opciones adicionales para concretar su funcionamiento, pasándolas directamente hacia
			// 		deepmerge. También acepta dos opciones propias para personalizar su funcionamiento:
			//		Con 'cloneDescendants' se puede forzar el clonado recursivo de los objetos a mezclar (por defecto,
			//		se usan los anidados originales para disminuir la carga).
			//		Con 'arrayMergingStrategy' se puede alterar el comportamiento de mezclado para los arrays. Permite
			//		elegir entre 'combine' (se combinan todos los elementos de los arrays coincidentes) y 'overwrite'
			//		(por defecto, se sobreescribe cualquier array coincidente).
			//		elegir entre 'combine' (se combinan todos los elementos de los arrays coincidentes), 'overwrite'
			//		(por defecto, se sobreescribe cualquier array coincidente) y 'concatenate' (acumula todos los
			//		elementos de los arrays coincidentes).

			options = options || {};
			const clone = options?.cloneDescendants ?? false,
				arrayMergingStrategy = options?.arrayMergingStrategy ?? 'overwrite',
				isMergeableObject = this._isMergeableObject,
				deepmergeOptions = {clone, isMergeableObject};

			var cloneDescendants = options.cloneDescendants || false,
				arrayMergingStrategy = options.arrayMergingStrategy || "overwrite",

				deepmergeOptions = {
					clone: cloneDescendants
				};

			if (arrayMergingStrategy === "combine") {
			if (arrayMergingStrategy === 'combine') {
				// comportamiento por defecto de deepmerge, no se define
			} else if (arrayMergingStrategy === "overwrite") {
			} else if (arrayMergingStrategy === 'overwrite') {
				deepmergeOptions.arrayMerge = lang.hitch(this, this._overwritingArrayMerge);
			} else if (arrayMergingStrategy === "concatenate") {
			} else if (arrayMergingStrategy === 'concatenate') {
				deepmergeOptions.arrayMerge = lang.hitch(this, this._concatenateArrayMerge);
			}

			delete options?.cloneDescendants;
			delete options?.arrayMergingStrategy;

			lang.mixin(deepmergeOptions, options);

			return deepmerge.all(objects, deepmergeOptions);
		},

		_isMergeableObject: function(value) {

			// Inspirado por https://github.com/jonschlinkert/is-plain-object
			return !!value?.constructor?.prototype?.hasOwnProperty('isPrototypeOf');
		},

		_overwritingArrayMerge: function(destinationArray, sourceArray, options) {

			return sourceArray;