Commit 6bb4cbc8 authored by Pedro Eduardo Trujillo's avatar Pedro Eduardo Trujillo
Browse files

Mejora base de nuevos diseños

Implementa en los nuevos diseños un método de mezcla de atributos
propios, de manera que se tienen en cuenta valores recibidos desde
fuera, valores definidos en configuración por defecto y valores ya
presentes en los atributos actuales (siguiendo este orden de
precedencia).

Implementa en los nuevos diseños un nuevo método, a definir en cada
caso, que es llamado desde el que se encarga de mezclar valores de
atributos. Su cometido es aportar la configuración por defecto, para que
pueda ser usada sin necesidad de establecerla en constructores, como se
hacía antes.

Incluye una nueva fase del ciclo de vida de widgets Dijit, previa a
buildRendering, desde donde se emplean los nuevos métodos descritos
anteriormente para conformar la configuración final de los componentes
de los diseños.

Simplifica aplicación de clases en base de layout de diseños.

Comprueba si una extensión se ha definido correctamente antes de
aplicarla desde la base de controladores de diseños.

Actualiza fragmentos de documentación de los mixin base de los nuevos
diseños.
parent 32eda32d
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ define([
	return declare(null, {
		// summary:
		//   Base común para los controladores de diseño.
		// description:
		//   Reúne funciones básicas usadas por todos los controladores de diseño.

		prepareComponentDefinition: function(/*Array*/ baseDefinitionArray, /*Object*/ extensionEnableFlags,
@@ -18,7 +19,8 @@ define([

			for (let enabledProp in extensionEnableFlags) {
				if (extensionEnableFlags[enabledProp]) {
					baseDefinitionArray.push(extensionDefinitions[enabledProp]);
					const extensionDefinition = extensionDefinitions?.[enabledProp];
					extensionDefinition && baseDefinitionArray.push(extensionDefinition);
				}
			}

+39 −8
Original line number Diff line number Diff line
define([
	'dojo/_base/declare'
	, 'dojo/_base/lang'
], function (
	declare
	, lang
) {

	return declare(null, {
		// summary:
		//   Base común para las maquetaciones de diseño.
		//   Reúne funciones básicas usadas por todas las maquetaciones de diseño.
		// description:
		//   Reúne funciones básicas usadas por todas las maquetaciones de diseño. Se acopla al ciclo de vida de los
		//   widgets Dijit de Dojo, aprovechando algunas fases. Las fases disponibles son:
		//     constructor -> postMixInProperties -> buildRendering -> postCreate -> startup

		postMixInProperties: function() {
			// Método perteneciente al ciclo de vida de un widget Dijit.

			this.inherited(arguments);

			this._mergeOwnAttributes(this.params || {});
		},

		_mergeOwnAttributes: function(/*Object*/ args) {
			// summary:
			//   Recibe atributos definidos desde fuera para mezclarlos en profundidad dentro de la instancia.
			// description:
			//   Es importante que este método se llame desde la fase de postMixInProperties del componente, ya que
			//   justo antes Dijit hace una primera mezcla de args en this, que no tiene en cuenta los cambios. Por
			//   tanto, si se ejecuta antes, los cambios serán sobreescritos, y si se ejecuta después, puede ser
			//   demasiado tarde para asignar algunos valores necesarios en otras fases tempranas.
			//   Respetar siempre en la definición del método los posibles valores devueltos en llamadas heredadas,
			//   para poder ir acumulando la configuración que aporta cada nivel.

			const defaultConfig = this._getDesignDefaultConfig?.() || {};

			lang.mixin(this, this._merge([this, defaultConfig, args]));
		},

		buildRendering: function() {
			// Método perteneciente al ciclo de vida de un widget Dojo.
			// Método perteneciente al ciclo de vida de un widget Dijit.

			this.inherited(arguments);

			this.layoutClasses?.length && this._setLayoutClass(this.layoutClasses);
			this._setLayoutClass(this.layoutClasses);
		},

		_setLayoutClass: function(/*String*/ classNames) {
			// summary:
			//   Recibe un string con una o más clases CSS para aplicarlas al nodo principal de la maquetación.
			//   Es importante que este método se llame antes de terminar la fase de buildRendering del componente,
			//   en postCreate ya será demasiado tarde para que se apliquen los cambios.
			// description:
			//   Es importante que este método se llame desde la fase de buildRendering del componente, en postCreate
			//   ya será demasiado tarde para que se apliquen los cambios.

			if (!classNames?.length) {
				return;
			}

			this.class = classNames.includes('.') ? classNames.replace(/\./g, ' ') : classNames;
			this.class = classNames.split('.').join(' ');
		},

		postCreate: function() {
			// Método perteneciente al ciclo de vida de un widget Dojo.
			// Método perteneciente al ciclo de vida de un widget Dijit.

			this.inherited(arguments);

@@ -48,7 +78,8 @@ define([
		_setLayoutNode: function(/*Object*/ node, /*String*/ nodePropName) {
			// summary:
			//   Recibe un nodo de maquetación y un nombre de propiedad para referenciarlo.
			//   Almacena el nodo para poder recuperarlo más adelante si no existía uno con ese nombre.
			// description:
			//   Almacena el nodo (si no existía uno con ese nombre) para poder recuperarlo más adelante.

			if (!this._designLayoutNodes) {
				this._designLayoutNodes = {};