Dependencies
Cada componente (criterio, grilla, gráfico, etc) puede tener algunas dependencias dentro de su comportamiento y contenido. Una dependencia puede ser lanzada dependiendo de las condiciones o eventos de los componentes.
The element must have the component attribute to make it work. Si el elemento no tiene el atributo del componente, el sistema de dependencias ganó ́t funcionar correctamente.
Esqueleto de XML
<dependency initial="[initial]" source-type="[source-type]" target-type="[target-type]"
server-action="[server-action]" target-action="[target-action]"
label="[label-to-update]" value="[value]" formule="[formule]"
type="[type]" invert="[invert]" async="[async]" silent="[silent]">
<dependency-element ... />
...
<dependency-action .../>
...
</dependency>
Estructura de dependencias
Elemento | Uso | Varias instancias | Descripción |
---|---|---|---|
dependency | Obligatorio | No | Nodo global de la dependencia. Define los atributos de dependencia |
dependency-element | Obligatorio | Si | Condición para lanzar la dependencia |
dependency-action | Opcional | Si | Acción que se iniciará si las condiciones de dependencia son válidas |
Atributos de dependencias
Atributo | Uso | Tipo | Descripción | Valores |
---|---|---|---|---|
initial | Opcional | Boolean | Dependencia se lanzará al cargar la página | El valor predeterminado es falso |
source-type | Opcional | String | Fuente de dependencias (donde se tomarán los datos) | Ver tipos de fuente. El valor predeterminado no es ninguno |
target-type | Opcional | String | Destino de dependencias (donde se aplicará la dependencia) | Ver tipos de destino. El valor predeterminado no es ninguno |
server-action | Opcional | String | Llamada de acción del servidor (cuando el tipo de fuente es consulta ) | Ver lista de acciones del servidor |
target-action | Opcional | String | Objetivo para llamar al servidor / Nombre del criterio, para obtener su valor, cuando el tipo de fuente es launcher | |
label | Opcional | String | Etiqueta a aplicar al objetivo | Note: You can use i18n files (locales) |
value | Opcional | String | Valor a aplicar al objetivo | |
formule | Opcional | String | Formular para obtener el valor que se aplicará al objetivo | |
type | Opcional | String | Cómo evaluar las condiciones | Los valores posibles son y (por defecto) y o . |
invert | Opcional | Boolean | Invierte la evaluación de la condición | El valor predeterminado es falso |
async | Opcional | Boolean | Ejecutar la acción del servidor de forma asincrónica | El valor predeterminado es falso |
silent | Opcional | Boolean | Ejecutar la acción del servidor sin mostrar la barra de carga | El valor predeterminado es falso |
Tipo de fuente
El atributo tipo fuente
se refiere al lugar de que estamos recuperando los datos para aplicar al componente.
Value | Descripción |
---|---|
none | No hacer nada (no recuperar valores) |
query | Ejecutar una consulta para recuperar valores |
launcher | Obtener los valores del alias almacenado definido en target-action |
value | Obtener los valores del atributo value definido en la dependencia |
label | Obtener los valores del atributo label definido en la dependencia (puede ser un i18n local) |
formule | Obtener los valores de un formulario evaluado en el atributo formule definido en la dependencia |
reset | Borrar el valor de destino |
Nota:
source-type="action"
no es más necesario. Simplemente añada algunas acciones de dependencia a su dependencia y se lanzarán cuando las condiciones sean válidas.
Target type
El atributo target-type
se refiere al lugar donde estamos aplicando los datos recuperados del tipo fuente
o lo que queramos hacer con el componente donde está la dependencia.
Action | Necesita datos | Acción inversa | Descripción |
---|---|---|---|
none | No | none | Se aplica a nada (valor predeterminado) |
label | Si | none | Se aplica el valor recuperado del tipo de fuente `` a la etiqueta del componente |
unit | Si | none | Se aplica el valor recuperado del tipo de fuente `` a la etiqueta de unidad de componente |
icon | Si | none | Se aplica el valor recuperado del tipo de fuente `` al icono del componente |
input | Si | none | Se aplica el valor recuperado del tipo de fuente `` al valor del componente |
format-number | Si | restaurar formato de número | Se aplica el valor de tipo fuente al formato de número de criterio (para criterios numéricos solamente) |
validate | Si | none | Se aplica el valor recuperado del tipo de fuente `` al criterio de validación |
atributo | Si | none | Establece un atributo definido en target-action con el valor recuperado del tipo de fuente |
ver | No | ocultar | Mostrar el componente |
ocultar | No | ver | Ocultar el componente |
mostrar columna | No | ocultar-columna | Mostrar la columna (sólo en columnas) |
ocultar-columna | No | mostrar columna | Ocultar la columna (aplicable sólo en columnas) |
habilitar | No | desactivar | Activar el componente |
desactivar | No | habilitar | Desactivar el componente |
set-requerido | No | establecer-opcional | Establecer el criterio como requerido |
establecer-opcional | No | set-requerido | Eliminar el criterio de validación requerido |
set-solo lectura | No | set-editable | Establecer el criterio como sólo lectura |
set-editable | No | set-solo lectura | Permite editar el criterio |
configurar-visible | No | set-invisible | Establecer el componente como visible |
set-invisible | No | configurar-visible | Establece el componente como invisible (similar a ocultar pero manteniendo el criterio oculto) |
activar-autorefrescar | Si | desactivar-autorefresh | Habilita la autorefresh y establece el temporizador automático con el valor recuperado del tipo de fuente `` |
desactivar-autorefresh | Si | activar-autorefrescar | Deshabilita la autorefresca y establece el temporizador automático con el valor recuperado del tipo de fuente `` |
Note: Some
target-type
actions have an inverse action, which is executed when dependency conditions are not accomplished. En este caso, NO es necesario añadir otra dependencia con la acción inversa.
Elemento de dependencias
Los elementos de dependencia son la definición de las condiciones necesarias para lanzar una dependencia.
Esqueleto del elemento de dependencia
<dependency-element id="[id]" column="[column]" attribute="[attribute]" condition="[condition]" row="[row]"
id2="[id2]" column2="[column2]" attribute2="[attribute2]" event="[event]" value="[value]"
optional="[optional]" cancel="[cancel]" view="[view]" alias="[alias]"/>
Dependency element attributes
Attribute | Use | Type | Description | Values |
---|---|---|---|---|
id | Required | String | Component identifier | |
column | Optional | String | Column identifier of the component (applicable on grids) | |
attribute | Optional | String | Attribute to check. | See attributes below. Default value is selected |
condition | Optional | String | Compare condition | See dependency element conditions. Default value is is not empty |
row | Optional | String | Row number from the grid to check the attribute | |
id2 | Optional | String | Component identifier to compare | |
column2 | Optional | String | Column identifier of the component (appliable on grids) | |
attribute2 | Optional | String | Attribute to check. | |
event | Optional | String | Event to check | See events below. |
value | Optional | String | Value to check | |
optional | Optional | Boolean | Mark the element as optional. It is useful to use its values even if they are empty | Default value is false |
cancel | Optional | Boolean | Cancel the dependency if this element has not been checked (useful for mandatory events) | Default value is false |
view | Optional | String | Name of view where element is placed. Used when you need specify in what context the element on which you want to act is located. | Ex.: view = "base" |
alias | Optional | String | Name to apply to the dependency element. Useful for launcher dependency targets | |
check-value | Optional | Boolean | Check this element values (launch the dependency if this element changes) | Default value is true |
Dependency element conditions
eq
Values are equalne
Values are not equalcontains
Value1 contains value2not contains
Value1 doesn't contain value2ge
Value1 is greater than or equal than value2le
Value1 is less than or equal than value2gt
Value1 is greater than value2lt
Value1 is less than value2in
Value1 is in value2 listnot in
Value1 is not in value2 listis empty
Value1 is emptyis not empty
Value1 is not empty
Attributes
The attributes are all the data you can retrieve from an AWE component. Depending on the component, you can retrieve distinct information of each one:
Action | Apply to | Description |
---|---|---|
visible | All components | true if component is visible |
value | Criteria | Gets criterion value. This is the default attribute |
text | Criteria | Gets component visible value |
label | Criteria | Gets component label |
unit | Criteria | Gets component edit label |
editable | Criteria | true if component is editable |
required | Criteria | true if component is required |
selectedValues | Select and Suggest Multiple | Gets select criterion selected values number |
totalValues | Select | Gets select criterion total values number |
currentRow | Grid | Gets current row identifier |
currentRowValue | Grid | Gets column value of the current row (not the selected one). This is useful to update row values without a selection |
prevCurrentRow | Grid | Gets previous row to the current row |
prevCurrentRowValue | Grid | Gets column value of the previous row to the current row |
nextCurrentRow | Grid | Gets next row to the current row |
nextCurrentRowValue | Grid | Gets column value of the next row to the current row |
selectedRow | Grid | Gets selected row identifier |
selectedRowValue | Grid | Gets column value of the selected row. |
prevRow | Grid | Gets previous row to the selected one identifier |
prevRowValue | Grid | Gets column value of the previous row to the selected one |
nextRow | Grid | Gets next row to the selected one identifier |
nextRowValue | Grid | Gets column value of the next row to the selected one |
selected | Grid | Number of selected rows of the grid |
selectedRows | Grid | Number of selected rows of the grid |
modifiedRows | Grid | Number of modified rows of the grid (on multioperation grids) |
totalRows | Grid | Number of total rows of the grid (records) |
hasDataColumn | Grid | true if the column defined has any data |
emptyDataColumn | Grid | true if the column defined is empty |
fullDataColumn | Grid | true if the column defined is full of data |
Note: If you want to retrieve a
selectedRowValue
from a grid column which isn't editable, you must add an event launcher to make sure the dependency is being launched when selecting a row (i.e.event="select-row"
)
Events
Some components launch events in some cases. You can capture those events with a dependency element to make them launch the dependency:
Event | Apply to | Description |
---|---|---|
click | Button, Context option and Charts | Launched on element click |
select-row | Grid | Launched when a row has been selected |
before-save-row | Grid | Launched before saving a row |
save-row | Grid | Launched when saving a row |
after-save-row | Grid | Launched after saving a row |
before-cancel-row | Grid | Launched before cancel saving a row |
cancel-row | Grid | Launched when cancel saving a row |
after-cancel-row | Grid | Launched after cancel saving a row |
delete-row | Grid | Launched when deleting a row |
after-delete-row | Grid | Launched after deleting a row |
add-row | Grid | Launched when adding a row |
after-add-row | Grid | Launched after adding a row |
check-records-saved | Grid | Launched when checking if records have been saved |
check-records-generated | Grid | Launched when checking if any records have been generated |
check-one-selected | Grid | Launched when checking if there is one row selected |
check-some-selected | Grid | Launched when checking if there is at least one row selected |
double-click | Charts | Launched when clicking twice on a chart point |
context-menu | Charts | Launched when right clicking on a chart point |
zoom | Charts | Launched when selecting a range (zooming) in a chart |
Dependency action
Dependency actions are actions launched when a dependency has been activated and the dependency source-type
is action
. See actions for more information.
Examples
When a button is clicked, update a criterion with a formule
<dependency initial="true" source-type="formule" target-type="input"
formule="'Valor' + (parseInt('[ButSetVa1]'.substr(5,1),10) + parseInt('[ButSetVa2]'.substr(5,1),10))">
<dependency-element id="ButSetVa3" event="click" />
<dependency-element id="ButSetVa2" />
<dependency-element id="ButSetVa1" />
</dependency>
Validar si un valor de columna ya está en la base de datos
<dependency source-type="query" server-action="unique" target-action="AweKeyUni">
<dependency-element id="GrdKeyLst" column="KeyNam" attribute="currentRowValue" />
</dependency>
Activar un botón cuando hay una fila seleccionada en una cuadrícula
<dependency target-type="enable" initial="true">
<dependency-element id="GrdKeyLst" attribute="selectedRows" condition="eq" value="1" />
</dependency>
Cambia el formato numérico cuando un valor de criterio es 4decimales
<dependency source-type="formule" target-type="format-number" initial="true"
formule="{vMin: '-999999', mDec: [NumHid], aSign:' JPY', pSign:'s', aPad:true}">
<dependency-element id="Txt" condition="eq" value="4decimales" />
</dependency>
Cambiar la validación de un criterio de tiempo
<dependency source-type="value" target-type="validate" value="{textLE:['TimReq']}">
<dependency-element id="CalReq" condition="eq" name="Cal" />
<dependency-element id="Cal" condition="eq" name="CalReq" />
</dependency>
Iniciar dos acciones cuando un valor de criterio cambia
<dependency initial="true">
<dependency-element id="CalReq" />
<dependency-action type="server" server-action="data" target-action="ProAllLst" target="SelReq" />
<dependency-action type="server" server-action="data" target-action="ProAllLst" target="SelMulReq" />
</dependency>
Hacer que un criterio no sea visible (pero manteniendo el lugar) cuando un valor de criterio es oculta
<dependency target-type="set-invisible" initial="true">
<dependency-element id="Txt" condition="eq" value="oculta" />
</dependency>
Hacer un criterio editable (no solo lectura) cuando un valor de criterio es edita
<dependency target-type="set-editable" initial="true">
<dependency-element id="Txt" condition="eq" value="edita" />
</dependency>
Rellena una etiqueta unitaria de criterio con el resultado de una consulta cuando se comprueba una casilla de verificación
<dependency source-type="query" target-type="unit" server-action="data" target-action="ModSel">
<dependency-element id="ChkBoxVa2" condition="eq" value="1" />
</dependency>
Mostrar un componente cuando el valor de la columna de la fila seleccionada de una cuadrícula no es igual a awemadora02
<dependency target-type="show" initial="true">
<dependency-element id="GrdSta" column="Als" attribute="selectedRowValue" condition="ne" value="awemadora02"/>
<dependency-element id="GrdSta" event="select-row"/>
</dependency>
Usar una dependencia sólo en la fila seleccionada
<dependency initial="true" target-type="enable">
<dependency-element id="GridName" attribute="selectedRow" condition="eq" id2="GridName" attribute2="currentRow"/>
</dependency>
Nota: Si desea recuperar un valor de fila seleccionado de una columna de cuadrícula que no es editable, debe añadir un lanzador de eventos para asegurarse de que la dependencia está siendo lanzada al seleccionar una fila (i. .
event="select-row"
)
Validar un criterio utilizando un método Java
Dependencia
<criteria label="PARAMETER_TEXT" id="TxtVal" variable="TxtVal" component="text">
<dependency source-type="query" server-action="validate" target-action="ValidateBankAccount">
<dependency-element id="TxtVal"/>
</dependency>
</criteria>
Query
<query id="ValidateBankAccount" service="ValidateBankAccount">
<variable id="BankAccount" type="STRING" name="TxtVal" />
</query>
Service
<service id="ValidateBankAccount">
<java classname="com.almis.awe.test.Validation" method="validateBankAccount">
<service-parameter type="STRING" name="BankAccount" />
</java>
</service>
Método Java
public class Validation {
// PATTERNS
private static final String BANK_ACOUNT = "^[0-9]{4}\\-[0-9]{4}\\-[0-9]{2}\\-[0-9]{10}$";
private static final Pattern BANK_ACCOUNT_PATTERN = Pattern.compile(BANK_ACOUNT, 0);
public ServiceData validateBankAccount(String bankAccount) throws AWException {
ServiceData check = new ServiceData();
Matcher matchAccount = BANK_ACCOUNT_PATTERN.matcher(bankAccount);
if (!matchAccount.matches()) {
check.setType(AnswerType.WARNING);
check.setMessage(LocalSingleton.getInstance().getLocal("ERROR_MESSAGE_WRONG_BANK_ACCOUNT", bankAccount));
}
return check;
}
}
Añadir una clase a un elemento HTML cuando ocurre un evento
A veces necesitamos mostrar un consejo en la pantalla para notar a los usuarios que algo ha sucedido en el back-end como una nueva entrada en la base de datos o similar. Vamos a explicar cómo agregar dos nombres de clase ("animado" y "faa-slow" para ajustar la velocidad animada) a un elemento HTML para animar un icono de campana y mostrar un número sobre el icono que representa una serie de errores en la aplicación. Al pulsar este botón, la campana detiene la animación y muestra un diálogo con una cuadrícula que muestra los detalles del error.
Definición de los elementos de la pantalla
Primero debemos definir el elemento HTML en la pantalla xml, en este caso un elemento "info-button" con un atributo "icon" con un valor "bello" y un atributo "unit". Este último atributo representará el número de errores en la aplicación.
<info-button style="nav-icon-btn-danger" title="BUTTON_NOTIFICATIONS" icon="bell" id="Warnings" unit="">
...
</info-button>
El siguiente paso es agregar la acción para detener la animación de la campana (quitar el nombre de la clase) y mostrar el diálogo.
<info-button style="nav-icon-btn-danger" title="BUTTON_NOTIFICATIONS" icon="bell" id="Warnings" unit="">
<button-action type="remove-class" target-action="animated faa-slow" target="#Warnings .fa-bell" />
<button-action type="dialog" target="MessageWarnings" />
</info-button>
La primera acción del botón elimina los nombres de las clases "animadas" y "faa-slow" del elemento HTML apuntado en el atributo "target", en este caso el elemento con el nombre de clase "fa-bell" dentro del elemento con el id "Advertencias".
La segunda acción del botón abre el diálogo con el id "MessageWarnings".
Estas acciones se activan cuando el usuario hace clic en el botón.
Ahora debemos agregar las dependencias requeridas para mostrar los números de errores y agregar los nombres de clase "animados" y "faa-slow". Estas acciones deben ejecutarse cuando los usuarios entren en la pantalla o inicien sesión en la aplicación para que podamos añadir una acción aditiva.
<info-button style="nav-icon-btn-danger" title="BUTTON_NOTIFICATIONS" icon="bell" id="Warnings" unit="">
<button-action type="remove-class" target-action="animated faa-slow" target="#Warnings .fa-bell" />
<button-action type="dialog" target="MessageWarnings" />
<dependency source-type="launcher" target-type="unit" target-action="notification" initial="true">
<dependency-element id="NotificationNumber" alias="notification"/>
</dependency>
<dependency>
<dependency-element id="NotificationNumber" attribute="value" condition="ne" value="0" />
<dependency-action type="add-class" target-action="animated faa-slow" target="#Warnings .fa-bell" />
</dependency>
</info-button>
La primera dependencia es un tipo de "lanzador" que se ejecuta cuando el usuario entra en la pantalla donde este elemento se define gracias al atributo "inicial" establecido en "verdadero". La dependencia, apunta al atributo "unit" del botón info-button y depende de un elemento con un id "NotificationNumber" representado en la etiqueta "dependency-element". Este nuevo elemento se creará en los siguientes pasos.
La segunda dependencia es un tipo de "acción". Esta acción se activará cuando el valor del "elemento de dependencia" (el elemento con un identificador de "NotificationNumber") no sea igual (ne) a cero. Esto se representa con los siguientes atributos: attribute="value" condition="ne" value="0". La acción para esta dependencia es un tipo "add-class", así que cuando se ejecuta esta acción, se añadirá un nombre de clase a un elemento. Esta acción apunta al elemento con el nombre de la clase "fa-bell" dentro del elemento con el id "Advertencias" (atributo "target" en la etiqueta de dependencia-acción), por lo que este elemento recibirá el nombre de la clase descrito en el atributo "target-action" ("animado faa-slow").
Ahora vamos a definir el elemento de dependencia "NotificationNumber". Este elemento será un criterio oculto y tiene un atributo de "carga inicial" definido a "valor" y una "acción objetiva" que apunta a una consulta que debe definirse en "Consultas. ml" en AWE.
<criteria id="NotificationNumber" component="hidden" initial-load="value" target-action="getNotificationErrors" />
Y por último, pero no menos importante, la definición del diálogo.
<dialog id="MessageWarnings" modal="true" style="modal-lg" label="SCREEN_TEXT_WARNINGS" icon="exclamation-triangle" help="HELP_SCREEN_TEXT_PRINT_EMAIL">
<tag type="div" style="modal-body row">
<window label="BUTTON_NOTIFICATIONS" icon="bell" expandible="vertical">
<grid id="GridMessageWarning" style="height-lg" max="50" server-action="data-silent" target-action="getErrorMessageInfo" autoload="true" autorefresh="30">
...
columns definition
...
</grid>
</window>
</tag>
</dialog>
En este punto hemos creado todos los elementos necesarios en la pantalla. El siguiente paso es definir las consultas que extraen los datos de la base de datos.
Queries
En el archivo "Queries.xml" debemos definir las siguientes etiquetas:
<query id="getErrorMessageInfo" service="getErrorMessageInfo"/>
<query id="getNotificationErrors" service="getErrorMessageInfo">
<field id="errors" alias="value" />
<field id="errors" alias="label" />
</query>
La primera consulta apunta a un servicio llamado "getErrorMessageInfo" definido en el archivo "Services.xml" en AWE. Esta consulta será lanzada por la cuadrícula creada en el diálogo.
La segunda consulta apunta al mismo servicio y espera dos valores uno para un campo "valor" y otro para un campo "etiqueta". Esta consulta será lanzada por los criterios ocultos.
Service
Una vez que las consultas están definidas y apuntan a un servicio, debemos crear este servicio. En el archivo "Services.xml" debemos definir las siguientes etiquetas:
<service id="getErrorMessageInfo">
<java classname="com.isban.smgmi.web.controller.ErrorMessageController" method="getErrorMessageInfo">
</java>
</service>
Este servicio ejecuta el método "getErrorMessageInfo" en la clase "com.isban.smgmi.web.controller.ErrorMessageController".
Java
En el Controlador debemos crear el método "getErrorMessageInfo" y devolver un objeto ServiceData. Este controlador debe llamar a una clase Manager.
public class ErrorMessageController extends AWEController {
public ServiceData getErrorMessageInfo() throws AWException {
// Get event manager
ErrorMessageManager errorMessageManager = new ErrorMessageManager();
return errorMessageManager.getErrorMessageInfo();
}
}
En la definición de Gestor debemos crear una acción de llenado del cliente para cargar datos en la cuadrícula de diálogo y una acción de cliente seleccionada para cargar datos en criterios ocultos.
public class ErrorMessageManager extends AWEManager {
/**
* Get error info
*
* @return
* @throws AWException
*/
public ServiceData getErrorMessageInfo() throws AWException {
...
ClientAction fillErrorGrdAction = new ClientAction("fill");
fillErrorGrdAction.setSilent("true");
fillErrorGrdAction.setTarget("GridMessageWarning");
DataList errorGrdParametersDatalist = new DataList();
Integer rowIndex = 0;
for (ErrorBean error : errorList) {
HashMap<String, CellData> parametersRow = new HashMap<String, CellData>();
parametersRow.put("id", new CellData(rowIndex));
...
// add columns data
...
errorGrdParametersDatalist.getRows().add(parametersRow);
rowIndex++;
}
// Set records
errorGrdParametersDatalist.setRecords(rowIndex);
fillErrorGrdAction.addParameter("datalist", errorGrdParametersDatalist);
// Notification Number
ClientAction selectCrtNotificationNumberAction = new ClientAction("select");
selectCrtNotificationNumberAction.setTarget("NotificationNumber");
selectCrtNotificationNumberAction.setSilent("true");
errorListSize = errorList.size();
ArrayNode notifNumberArrayNode = JsonNodeFactory.instance.arrayNode();
notifNumberArrayNode.add(String.valueOf(errorListSize));
selectCrtNotificationNumberAction.addParameter("values", new CellData(notifNumberArrayNode));
// Adds clients actions
serviceData.addClientAction(selectCrtNotificationNumberAction);
serviceData.addClientAction(fillErrorGrdAction);
...
}