IBM BPM y ECM - Personalización del componente 'Document List'

...

Este artículo detalla como personalizar el componente 'Document List' que está incluido en el toolkit 'Content Management' y se utiliza para consultar, crear y actualizar documentos en el sistema de gestión de contenidos (Enterprise Content Management o ECM). El objetivo es simplificar la carga de propiedades del documento a través de la asignación de valores por defecto.

Introducción

Los procesos de negocio generalmente requieren que se maneje información no estructurada como documentos escaneados o imágenes. Para esto IBM BPM 8 (y versiones posteriores) incorpora una serie de componentes capaces de conectarse con gestores de contenido utilizando un estándar abierto llamado "Servicios de Interoperabilidad de Gestión de Contenidos" o en inglés "Content Management Interoperability Services (CMIS)".

El componente principal a través del cual se lleva a cabo la conexión con el gestor de contenido es el Document List. Este componente se utiliza en coaches y presenta al usuario: a) una lista de documentos obtenidos del gestor de contenido, b) una lista de revisiones de dichos documentos si existieran, c) un diálogo modal para la creación y actualización de documentos. El componente requiere que se especifique un servicio de búsqueda en donde se aplican los criterios de selección de los documentos y, a su vez, este último requiere que exista una configuración de conexión con el gestor de contenido a nivel de aplicación de proceso.

Para ver más información sobre como se lleva a cabo la configuración inicial de estos componentes se puede consultar el siguiente artículo: http://www.ibm.com/developerworks/bpm/bpmjournal/1212_ramos/1212_ramos

Nosotros nos centraremos en el diálogo de creación y actualización de documentos. Por defecto, este diálogo presenta una sección con campos para que se completen los valores de todas aquellas propiedades que se hayan definido a nivel de gestor de contenido para el tipo de documento seleccionado. Podemos observarlo en la siguiente imagen:

Diálogo de alta y edición de documentos

Este diálogo permite que el usuario que realiza la carga del documento complete estas propiedades, siendo algunas de ellas requeridas para poder completar la acción.

Es muy común que varias de estas propiedades deban completarse por defecto con información relacionada al proceso, y por ello es que se cree conveniente contar con un mecanismo que permita simplificar el ingreso de datos que debe hacer el usuario.

A continuación vamos a mostrar como llevar a cabo las modificaciones para que, durante la creación de un documento se pueda completar algunas o todas estas propiedades con información del proceso.

Paso 1 - Copiar el componente 'Document List'

Realizar la copia del componente incluido en el toolkit 'Content Management' a otro toolkit o a una aplicación de procesos.

En nuestro caso nombraremos a esta copia del component como Custom Document List.

Paso 2 - Configuración de variables

Editaremos este nuevo componente para agregar una nueva variable a las opciones de configuración.

En la solapa "Variables", dentro del panel "Variable Declarations" se debe hacer click en el signo + que se encuentra al costado de "Configuration Options".

Nueva variable de configuración

En nuestro caso, llamaremos a esta variable "external_defaultValues" y será del tipo lista de NameValuePair. Este tipo de dato del sistema nos permite definir un nombre (name) y un valor (value) para cada elemento de la lista.

Paso 3 - Modificaciones al diálogo de alta y edición de documentos

Este diálogo es construido dinámicamente a través de una serie de funciones JavaScript que utilizan Dojo.

Para modificar el comportamiento del componente deberemos modificar una de las librerías JavaScript provistas con el componente original. Para esto, desde la solapa "Behavior" copiaremos el código de la librería "documentList.js" que se muestra al hacer click sobre el elemento de la lista.

Copiar el código del componente original

Este código lo pegaremos en un nuevo archivo que llamaremos "documentList-extended.js" y luego llevaremos a cabo los siguientes cambios. Al finalizar el bloque "try...catch" de la función "populateDocumentPropertiesForm" incluiremos el siguiente bloque de código:

// Extension: Set values
if (this.context.options.external_defaultValues != undefined && this.context.options.external_defaultValues.get("value") != "") {
	var defaultValuesList = this.context.options.external_defaultValues.get("value");
	for (var i=0; i<defaultValuesList.items.length; i++) {
		var objectTypeId = defaultValuesList.items[i].name;
		var value = defaultValuesList.items[i].value;
		var field = dijit.byId(objectTypeId);
		if (field != null) {
			var currentValue = field.get("value");
			if (currentValue == null || currentValue == "") {
				field.set("value", value);
			}
			field.attr("readonly", true);
		}
	}
}

Este cambio nos permitirá obtener los valores de la variable "external_defaultValues" y asignarlos a los campos del diálogo dejándolos en modo de lectura para que el usuario no pueda editarlos luego. Para que la asignación funcione correctamente, la variable "name" deberá contener el nombre de la propiedad tal como fue nombrada en el gestor de contenido (tener en cuenta que el nombre que se muestra puede diferir del nombre que utiliza el sistema).

El otro cambio que realizaremos en esta librería será para completar dos propiedades particulares de esta implementación llamadas "cmis:name" que representa el nombre del documento y "Process" que, en este caso, se utiliza para registrar el tipo de documento. Para la primera obtendremos el nombre del archivo seleccionado y para la segunda únicamente la extensión. El código para manejar el evento de selección de un archivo lo colocaremos antes del return de la función "createDocumentDialog".

// Extension: Handle fileContent onChange event
var field_fileContent = dojo.query("input[type=file]", dojo.query("#fileContent")[0])[0];
field_fileContent.on change = function(evt) {
	if (this.value != undefined && this.value != "") {
		//Set content property 'Name'
		var start = this.value.lastIndexOf("\\") + 1;
		var fileName = this.value.substring(start, this.value.length);
		var field = dijit.byId("cmis:name");
		if (field != null) {
			field.set("value", fileName);
			field.attr("readonly", true);
		}
		//Set content property 'Document Type'
		var start = fileName.lastIndexOf(".") + 1;
		var fileExtension = fileName.substring(start, fileName.length);
		fileExtension = (fileExtension != "") ? fileExtension : "UNKNOWN";
		var field = dijit.byId("Process");
		if (field != null) { 
			field.set("value", fileExtension.toUpperCase());
			field.attr("readonly", true);
		}
	}
};

Este cambio nos permite asociar una función al evento de selección del archivo, y obtener el nombre del archivo y su extensión.

Paso 4 - Preparación de los valores por defecto

Para pasar los valores por defecto al nuevo componente, declararemos una variable privada del tipo lista de NameValuePair y agregaremos los items necesarios para cada una de las propiedades deseadas.

// Function to add item to list
function insertObject(list, name, value) {
    var prop = new tw.object.NameValuePair();
    prop.name = name;
    prop.value = value;
    list.insertIntoList(list.listLength, prop);
}
// Create new NameValuePair list
tw.local.propertiesValues = new tw.object.listOf.NameValuePair();
// Set NameValuePair items
insertObject(tw.local.propertiesValues, "Title", "0");
insertObject(tw.local.propertiesValues, "Code", "999");
insertObject(tw.local.propertiesValues, "User", tw.system.user_fullName);
insertObject(tw.local.propertiesValues, "cmis:name", "");
insertObject(tw.local.propertiesValues, "Process", "");
insertObject(tw.local.propertiesValues, "Status", "In Progress");
insertObject(tw.local.propertiesValues, "Date", "2014-03-31");

Tip: Para los campos de tipo DateTime el formato del valor por defecto a utilizar será 'yyyy-mm-dd'.

Luego, finalizaremos la configuración de nuestro 'Custom Document List' asociando esta variable a la propiedad del componente, desde la solapa "Properties" en el panel "Configuration".

Configuración del componente 'Custom Document List'

De este modo, el nuevo diálogo mostrará valores por defecto para aquellas propiedades del documento incluidas en la variable, quedando los campos en modo de lectura, y campos editables para el resto de las propiedades. El usuario deberá completar únicamente aquellos campos sin valores por defecto.

Se adjunta el archivo "documentList-extended.js" con la versión del código con las modificaciones propuestas.

Conclusión

En este artículo hemos visto como simplificar las tareas de carga de datos en la integración entre IBM BPM y un sistema de gestión de contenidos a través de la personalización del componente 'Document List'. Del mismos modo en que llevamos a cabo estos cambios, otros pueden ser aplicados para cubrir distintas necesidades. Lo destacable es que no es necesario comenzar de cero, sino que se puede partir de la base existente para incorporar nuevas funcionalidades y de este modo disminuir el esfuerzo del desarrollo.


Modificado por última vez en Viernes, 04 Abril 2014 23:02

Acerca del autor

Andrés Sommariva

Andrés cuenta con más de diez años de experiencia liderando proyectos en diversas tecnologías, actualmente se desempeña como Gerente de Operaciones de MicroGestion Software.