Video
En este video veremos cómo crear un cuadro de mando en una aplicación
de OpenXava.
¿Problemas con la lección? Pregunta
en el foro
Código
Puedes copiar el código que se usa en el video por aquí:
En el archivo
application.xml:
<module name="InvoiceDashboard">
<model name="InvoiceDashboard"/>
<controller name="InitModelWithNewInstance"/>
</module>
En el archivo
InvoiceDashboard.java:
import java.math.*;
import java.util.*;
import javax.persistence.*;
import org.openxava.annotations.*;
import org.openxava.jpa.*;
@View(members="numberOfCustomers, numberOfInvoices, totalInvoiced; invoicingEvolution; topMonth")
public class InvoiceDashboard {
@LargeDisplay(icon="cash")
@Money
public BigDecimal getTotalInvoiced() {
BigDecimal total = (BigDecimal) XPersistence.getManager()
.createQuery("select sum(totalAmount) from Invoice").getSingleResult();
return total;
}
@LargeDisplay(icon="account")
public String getNumberOfCustomers() {
return XPersistence.getManager()
.createQuery("select count(distinct customer.number) from Invoice "
+ "where deleted = false")
.getSingleResult().toString();
}
@LargeDisplay(icon="invoice")
public String getNumberOfInvoices() {
return XPersistence.getManager()
.createQuery("select count(number) from Invoice "
+ "where deleted = false")
.getSingleResult().toString();
}
@Chart
public Collection<InvoicedPerMonth> getInvoicingEvolution() {
String jpql = "select new com.yourcompany.invoicing.dashboards.InvoicedPerMonth("
+ "MONTH(date), sum(totalAmount), sum(vat)) "
+ "from Invoice "
+ "where deleted = false "
+ "group by MONTH(date) "
+ "order by MONTH(date) asc";
TypedQuery<InvoicedPerMonth> query = XPersistence.getManager()
.createQuery(jpql, InvoicedPerMonth.class);
return query.getResultList();
}
@SimpleList
@ListProperties("month, totalAmount")
public Collection<InvoicedPerMonth> getTopMonth() {
String jpql = "select new com.yourcompany.invoicing.dashboards.InvoicedPerMonth("
+ "MONTH(date), sum(totalAmount) as totalAmount, sum(vat)) "
+ "from Invoice "
+ "where deleted = false "
+ "group by MONTH(date) "
+ "order by totalAmount desc";
TypedQuery<InvoicedPerMonth> query = XPersistence.getManager()
.createQuery(jpql, InvoicedPerMonth.class)
.setMaxResults(5);
return query.getResultList();
}
}
En el archivo InvoicePerMonth.java:
import java.math.*;
import lombok.*;
@Getter @Setter @AllArgsConstructor
public class InvoicedPerMonth {
int month;
BigDecimal totalAmount;
BigDecimal vat;
}
En el archivo custom.css:
#ox_invoicing_InvoiceDashboard__editor_totalInvoiced .ox-large-display {
width: 505px;
margin-right: -5px;
padding-right: 0px;
}
#ox_invoicing_InvoiceDashboard__editor_numberOfCustomers .ox-large-display {
width: 300px;
}
#ox_invoicing_InvoiceDashboard__editor_numberOfInvoices .ox-large-display {
width: 300px;
}
#ox_invoicing_InvoiceDashboard__core .ox-view {
max-width: 1300px;
margin-top: 30px;
margin-left: auto;
margin-right: auto;
}
Transcripción
Hola, soy Mónica.
En este video aprenderás a añadir un cuadro de mando o dashboard a tu
aplicación OpenXava. Es muy fácil, porque sólo tienes que escribir una
simple clase Java con getters que devuelvan los datos que quieres
visualizar y unas pocas anotaciones. El primer paso será crear un
proyecto usando la plantilla de invoicing, que es similar a la última
lección del curso de OpenXava. Luego aprenderás a utilizar las
anotaciones Large Display, Chart y SimpleList. Finalmente ajustarás la
vista del cuadro de mandos usando CSS.
Creamos un nuevo proyecto en
OpenXava. bLe asignamos un nombre al proyecto. En template seleccionamos
invoicing. Finish. Nuestro primer paso es crear un módulo manualmente.
Así que creamos un paquete llamado com.yourcompany.invoicing.dashboards.
Y dentro creamos una clase llamada InvoiceDashboard. Vamos a
application.xml ubicado en la carpeta src/main/resources/xava. Y creamos
un módulo con el nombre de InvoiceDashboard, El cual usará como modelo
la clase transitoria que creamos recién. Como controlador, usaremos
InitModelWithNewInstance. Guardamos y listo. Hacemos maven install e
iniciamos la aplicación. Aquí hemos usado el nombre del módulo igual al
modelo, pero puedes usar otro nombre si deseas. El controlador que
usamos tiene una acción que instancia un objeto del modelo y lo asigna a
la vista, así se cargan los getters que vamos a crear luego. Ingresamos
con admin admin y vamos al módulo que creamos. Actualmente nuestro
módulo está vacío.
Vamos a crear un método getter que devuelva un valor estático y
mostrarlo en nuestro módulo. Le agregamos la anotación de @LargeDisplay
para decirle que se muestre de esta manera. Guardamos y reiniciamos la
aplicación. Así se visualiza un LargeDisplay. Si vamos a la anotación,
podemos ver que tiene varios atributos que podemos usar, por ejemplo
definirle un icono. También podemos agregarle un prefijo, pero en
nuestro caso no nos hace falta, ya que con la anotación @Money, lo hace
automáticamente. Guardamos y reiniciamos la aplicación. El icono de
dinero es por el atributo icon y en cuanto la anotación @Money, agrega
el símbolo de dinero. OpenXava usa Material Design Icons, por lo que de
allí provienen los nombres de los iconos. Vamos a mostrar un valor que
obtenemos a partir de una consulta JPA, Que sería la sumatoria del total
de todas las facturas. Lo probamos. Perfecto. Agregamos otros métodos
para obtener la cantidad de clientes que tuvieron factura y cantidad de
facturas creadas. A este punto podemos definir el orden de cómo se
muestran en la vista. En la anotación @View ponemos los nombres de las
propiedades con coma para que se ubiquen en la misma fila:
NumberOfCustomers, NumberOfInvoices y TotalInvoiced. Probamos el cambio.
Ahora vamos a mostrar un chart. Y para esto necesitamos crear una clase
auxiliar, lo llamaremos InvoicedPerMonth. Agregamos las anotaciones de
Lombok: @Getter, @Setter y @AllArgsConstructor. Luego declaramos las
propiedades que se van a usar: month, totalAmount y vat. Guardamos. Este
método devolverá una colección para que el Chart pueda trabajar con la
información. En la consulta JPA de este método, hay algo a tener en
cuenta: Debemos usar todas las propiedades de la clase auxiliar, en el
mismo orden que lo hemos declarado en la clase y los valores a obtener
deben ser del mismo tipo de dato. Leyendo la consulta, parece que
estuviéramos obteniendo valores para una colección de objetos
InvoicedPerMonth con su constructor. Por último, agregamos el miembro a
la anotación @View y probamos. Perfecto.
Ahora vamos a mostrar una lista no editable donde se muestren los meses
mejores facturados. La consulta es parecida a la que hicimos para el
Chart. Agregamos la anotación @SimpleList. Aquí podemos usar la
anotación @ListProperties para indicarle qué valores mostrar en la
lista. A pesar de que no usaremos vat, debe estar en la consulta. Por
último, agregamos el miembro al @View y probamos. Así es cómo se vería
un SimpleList.
Vamos a hacer unos cambios en la vista usando CSS. En el navegador
Chrome aprieto F12 para usar las herramientas de desarrollador. Haciendo
clic en este ícono, me permitirá ubicar automáticamente el elemento que
selecciono luego. Por ejemplo, este lugar vacío. Nos marca un elemento
cuyo class es ox-detail, pero este no nos interesa. Sino su padre, el
div cuyo class es ox-view. Este ox-view, está dentro de otro div, que
nos va a servir luego para ubicar el ox-view en CSS. Seleccionamos el
div ox-view y en style puedo simular el cambio de CSS. Probamos con
max-width. Agregamos un margen superior, que es para separar un poco
aquí. Y dejamos margen derecho e izquierdo en auto. Listo. Ahora vamos a
cambiar el ancho de los LargeDisplay. Vemos que aún queda un pequeño
espacio, este parece tener algo que ver con el margin o padding, así que
lo pondremos como 0px. Aún queda un poco, lo arreglaremos con un -5px.
Perfecto. Vamos al archivo custom.css ubicado en la carpeta
src/main/webapp/xava/style. Aquí es donde debemos poner nuestro CSS.
Como tenemos varios elementos que tienen la misma clase
ox-large-display, nos ayudaremos con el id del span padre para
identificarlo. En cuanto al ox-view, también nos ayudaremos con el id.
Listo. Hacemos un maven install y reiniciamos la aplicación. Puedes
tener más de un dashboard o tener muchos elementos, por eso cuando
necesitas ordenarlos, puedes usar CSS para lograrlo fácilmente.
Perfecto, así es como quedaría.
Hemos visto cómo crear tu propio dashboard, usar anotaciones como
LargeDisplay, Chart, SimpleList y luego personalizar la vista con CSS
para ajustarlos.
Si tienes alguna duda o problema puedes preguntarnos por el foro,
también puedes descargar el código de esta lección por el link del
repositorio, ambos enlaces se encuentran en la descripción del video.
Chao.