OpenXava 5.9 released: Plataforma Java Low Code de código abierto
miércoles, mayo 23, 2018 at 1:29PM
javierpaniza

OpenXava 5.9 permite copiar y pegar en las colecciones, el usuario puede seguir módulos para recibir notificaciones por correo electrónico de los cambios, registro de accesos personalizables, mejoras en las listas, gráficos y totales de colección, además de muchas cosas más.

Te invitamos a que descargues esta nueva versión y actualices tus aplicaciones OpenXava. Mira las instrucciones de migración.

Cortar y pegar en colecciones

Ahora hay botones para cortar y pegar en todas las colecciones. El usuario puede cortar y pegar entre colecciones del mismo tipo, incluso de diferentes módulos:



 

Seguir módulos

El usuario puede seguir cualquier módulo con sólo pulsar un icono en la esquina superior derecha:

Después de pulsarlo cualquier cambio que otros usuarios hagan en los datos de este módulo se le notificará vía correo electrónico. El usuario puede pulsar en cualquier momento en el mismo icono para anular la suscripción. Para que esto funcione el usuario necesita tener una cuenta de correo electrónico válida definida en su cuenta de usuario (XavaPro o Liferay) o bien usar un correo electrónico válido como nombre de usuario (algo disponible incluso en el OpenXava simple y llano mediante naviox-users.properties). Suscribirse a un módulo no está disponible para los módulos con @Tab en baseCondition por razones de seguridad.

Además, cuando un usuario crea un nuevo registro, todos los cambios a ese registro concreto por otros usuario le serán notificados por correo electrónico.

En cada mensaje el usuario tiene vínculos para quitar la suscripción.

Los cambios notificados son: creación de nuevos registros, modificación, borrado, añadir comentarios a una discusión, añadir/quitar imágenes de la galería, añadir/quitar archivos adjuntos y modificar colecciones. En el caso de la modificación el mensaje de correo informa sobre las propiedades que se han cambiado con su valor antiguo y nuevo.

Mira las instrucciones para activar esta característica en tus aplicaciones.

Registro de accesos

OpenXava tiene un mecanismo para registrar cualquier cambio hecho por los usuarios y también accesos de lectura. Este mecanismo es totalmente configurable y está desactivado por defecto.

Para registra el acceso a los datos necesitas un IAccessTrackerProvider (una interfaz de org.openxava.util). Crear una es fácil, simplemente crea una clase que implemente la interfaz, como la siguiente:

package org.openxava.util;

import java.io.*;
import java.util.*;

import org.apache.commons.logging.*;
import org.openxava.application.meta.*;


public class LogAccessTrackerProvider implements IAccessTrackerProvider {

    private static Log log = LogFactory.getLog(LogAccessTrackerProvider.class);

    private static String fileName;

    public void consulted(String modelName, Map key) {
        log("CONSULTED: user=" + Users.getCurrent() +    ", model="
            + modelName + ", key=" + key);
    }


    public void created(String modelName, Map key) {
        log("CREATED: user=" + Users.getCurrent() +    ", model="
            + modelName + ", key=" + key);
    }

    public void modified(String modelName, Map key,
        Map oldChangedValues,
        Map newChangedValues)
    {
        StringBuffer changes = new StringBuffer();
        for (String property: oldChangedValues.keySet()) {
            if (changes.length() > 0) changes.append(", ");
            changes.append(Labels.getQualified(property));
            changes.append(": ");
            changes.append(Strings.toString(oldChangedValues.get(property)));
            changes.append(" --> ");
            changes.append(Strings.toString(newChangedValues.get(property)));
        }
        log("MODIFIED: user=" + Users.getCurrent() +    ", model="
            + modelName + ", key=" + key + ", changes=" + changes);
    }

    public void removed(String modelName, Map key) {
        log("REMOVED: user=" + Users.getCurrent() +    ", model="
            + modelName + ", key=" + key);
    }

    private static void log(String line) {
        try {
            createFileIfNotExist();
            FileOutputStream f = new FileOutputStream(getFileName(), true);
            PrintStream p = new PrintStream(f);
            p.println(line);
            p.close();
            f.close();
        }
        catch (Exception ex) {
            log.warn(XavaResources.getString("log_tracker_log_failed"), ex);
        }
    }

    private static void createFileIfNotExist() throws Exception {
        Files.createFileIfNotExist(getFileName());
    }

    private static String getFileName() {
        if (fileName == null) {
            Collection applicationNames = MetaApplications.getApplicationsNames();
            String app = "openxava-app";
            if (!applicationNames.isEmpty()) {
                app = applicationNames.iterator().next().toString().toLowerCase();
            }
            fileName = Files.getOpenXavaBaseDir() + app + "-access.log";
        }
        return fileName;
    }

}


Esta es la implementación más simple posible, simplemente registra los accesos en un archivo log. Fíjate que has de implementar cuatro simples métodos: consulted(), created(), modified() y removed(). Puedes escribir tu propia implementación para grabar los acceso a la base de datos, por ejemplo. El proveedor de registro de arriba, LogTrackerAccessProvider, se incluye en OpenXava, en el paquete org.openxava.util, por lo que puedes usarlo tal cual si no necesitas más.

Para que tu proveedor de registro funcione lo has de declarar en el xava.properties de tu proyecto, usando la entrada accessTrackerProvidersClasses:

accessTrackerProvidersClasses=org.openxava.util.LogTrackerAccessProvider


Puedes definir varios proveedores de registros separados por comas. Ahora, todos los cambios y lecturas hechos por los usuarios añadirán una línea en .openxava/yourapplication-accesss.log.

Mejoras en las listas

Cantidad de registros en la lista cuando se usa "Agrupado por":

Fíjate en la columna "Cantidad registros", ahora disponible en todas las listas cuando agrupes.

Seleccionar una configuración de filtro/ordenación y agrupar está disponible en todos los formatos de listas, incluido las tarjetas y los gráficos:



Así el usuario puede seleccionar un filtro en tarjetas o gráficos, además el filtro seleccionado se recuerda de sesión a sesión. Sin embargo, ahora sólo el filtro seleccionado con el combo se recuerda, si el usuario hace un filtro introduciendo los valores y pulsando en filtrar no se establece por defecto para la siguiente vez, esto es una mejora de experiencia de usuario sobre la 5.8.

Mejoras en los gráficos

Hemos hecho un esfuerzo especial para que los gráficos sean útiles de una vez por todas:

Fíjate como puedes agrupas en gráficos, que la tarta muestra la cantidad en vez del porcentaje, que no puedes añadir más columnas en la tarta, que puedes cambiar los filtros, etc. Muchas mejoras, aquí está la lista completa:

Totales en colecciones

Ahora las propiedades de total pueden ser editables, no sólo calculadas. También puedes anotar una propiedad de total con @Calculation. Por tanto puedes definir @ListProperties de esta forma:

@ListProperties("cantidad, importe[factura.sumaImportes, factura.porcentajeIVA, factura.iva, factura.total]")


Donde porcentajeIVA es una propiedad persistente. Esta propiedad se mostrará en totales, será editable y funcionará como una propiedad normal en cualquier otro sitio. Además, iva y total también son propiedades persistentes, pero anotadas con @ReadOnly y @Calculation. El resultado sería:

En la v5.9 es posible combinar el sumatorio de las columnas (el + en la propiedad) con las propiedades de total, lo que te permite escribir una @ListProperties como esta:

@ListProperties("porcentajeIVA, total+[costeTrabajo.porcentajeBeneficio, costeTrabajo.beneficio, costeTrabajo.total]")


Fíjate en el + después de total y a continuación las propiedades de total entre corchetes. Esto produce el siguiente efecto:

Donde el 131,08 es el sumatorio de la columna, por causa del total+. Debajo tienes porcentajeBeneficio, beneficio y total, las propiedades de total convencionales. Se puede referenciar el sumatorio de la columna (es decir total+, el 131,08) desde una propiedad @Calculation usando sum(nombreColumna). Por ejemplo, en este caso podrías definir la propiedad beneficio de esta manera:

@Calculation("sum(facturas.total) * porcentajeBeneficio / 100")
@ReadOnly
private BigDecimal beneficio;


En este caso el sum(facturas.total) dentro de @Calculation es la suma de las propiedades total de todos los elementos de la colección facturas, es decir lo mismo que total+ en @ListProperties, es decir el 131,08 que ves en la imagen.

Otras mejoras

Hemos hechos muchas mejoras en otras áreas:

Arreglos

Aunque esta no es una versión de mantenimiento hemos arreglado algunas cosas:

Descarga OpenXava 5.9

Article originally appeared on javaHispano (http://www.javahispano.org/).
See website for complete article licensing information.