5. Contextos
El framework utiliza un sistema de "contextos" para acceder de forma uniforme a la información procedente de diferentes fuentes (base de datos, ficheros, apis REST, información del dispositivo, etc...) y soporta binding automático entre las entidades recuperadas del repositorio y los componetes de pantalla, de forma similar a lo que se puede encontrar en otros framework como Angular, JSF, etc.
El mecanismo de refresco entre componentes se basa en un mecanismo reactivo, implementado a partir de las dependencias entre componentes de la pantalla o entre componentes y contextos.
Existe un contexto global en el que se darán de alta contextos a utilizar por todas las pantallas (date, location, ... ), y un contexto por cada formulario de la pantalla actual.
Cada contexto global tiene un prefijo (date, location,...) y cada contexto de formulario irá identificado por el id del formulario.
El contexto del formulario contiene otros cuatro contextos:
- Contexto de entidad: da acceso a la propiedad actual, no almacena los datos, directamente obtiene la información de la entidad cargada actual. Este contexto está disponible al inicio de la carga del formulario.
- Contexto de vista: da acceso a los componentes de pantalla del formulario. No almacena datos, directamente busca el elemento indicado en la vista de Android enlazada. Este contexto está disponible en el momento del renderizado de la pantalla.
- Contexto de mensajes: se utiliza para almacenar mensajes de los validadores.
- Contexto de estado: se utiliza para almacenar el estado de la vista para poder recuperarlo en caso de que falle una validación y haya que re-renderizar un componente.
Además, el contexto del formulario es accesible de forma relativa y absoluta. Los elementos de un formulario pueden utilizar expresiones ${entity|view.property} o ${formId.entity|view.property}, de esta forma se abre la posibilidad a acceder a datos de un formulario desde otro, o desde los scripts js.
Cuando desde un widget se evalúa una expresión jextl ej (${entity.id}) esto se hace contra un contexto, este contexto en realidad es un conjunto de contextos comunes (date, user, …) y contextos específicos de la vista (entity y view). En determinados casos, en una misma vista pueden existir múltiples contextos para poder evaluar expresiones contra diferentes entidades, por ejemplo cuando estamos en un datalist y queremos que la expresión (${entity.name}) tome un valor diferente para cada elemento de la lista. Para solucionar esto, determinados widgets pueden mantener un contexto diferente para sus elementos anidados, de forma que cuando se evalúa la expresión, se evalúa localmente pero se sigue teniendo acceso a los contextos comunes.
Los widgets asociados a form, dataListItem y dataTableItem mantienen un contexto propio y cuando se evalúa una expresión de entidad o vista (${view.field1.value} o ${entity.name}) se hace únicamente respecto a los elementos anidados.
5.1 Location
El contexto Location en la aplicación está diseñado para manejar información relacionada con la ubicación, proporcionando acceso a las coordenadas geográficas del usuario y funcionalidades adicionales.
| Propiedad/método | Tipo | Descripción |
|---|---|---|
| lastLocation | android.location.Location | Devuelve la última ubicación válida del usuario. Este método proporciona acceso a las coordenadas geográficas más recientes y precisas del usuario. |
| asString | String | Devuelve la representación en cadena de la ubicación utilizando el método Location.toString(). Esto puede incluir varios detalles sobre la ubicación. |
| asLatLong | String | Devuelve los valores de latitud y longitud de la ubicación en el formato latitud, longitud. |
| asWKT | String | Devuelve la representación en cadena de la ubicación en formato POINT(X, Y). |
| asWKT3D | String | Devuelve la representación en cadena de la ubicación en formato POINT(X, Y, Z). |
<textarea label="Location lastLocation" placeHolder="${location.lastLocation}" value="${entity.d_prueba}"/>
<textarea label="Location asString" placeHolder="${location.asString}" value="${entity.d_prueba}"/>
<textarea label="Location asLatLong" placeHolder="${location.asLatLong}" value="${entity.d_prueba}"/>
<textarea label="Location asWKT" placeHolder="${location.asWKT}" value="${entity.d_prueba}"/>
<textarea label="Location asWKT3D" placeHolder="${location.asWKT3D}" value="${entity.d_prueba}"/>

5.2 Date
El contexto Date en la aplicación se ha diseñado para gestionar información relacionada con la fecha y la hora, proporcionando acceso a funcionalidades específicas.
| Propiedad/método | Tipo | Descripción |
|---|---|---|
| now | Date | Representa la fecha y hora actuales del sistema. |
<textarea label="Date now" placeHolder="${date.now}" value="${entity.d_prueba}"/>

5.3 Params
El contexto Params en la aplicación está diseñado para acceder a los parámetros pasados a la vista actual como ${params.myparam}.
<edit id="editParam1">
<form>
<input id="param1" label="Parámetro 1: " value="Uno"/>
<input id="param2" label="Parámetro 2: " value="Dos"/>
<button label="Nav Edit Param 2" route="formParam-editParam2">
<param name="nameParam1" value="${view.param1}"/>
<param name="nameParam2" value="${view.param2}"/>
</button>
</form>
</edit>
<edit id="editParam2">
<form>
<input label="Parametro 1: " value="${params.nameParam1}"/>
<input label="Parametro 2: " value="${params.nameParam2}"/>
</form>
</edit>
| 
5.4 Entity
El contexto Entity da acceso a la propiedad actual, no almacena los datos, directamente obtiene la información de la entidad cargada actual.
<input label="Description" value="${entity.d_prueba}"/>

5.5 View
El contexto View da acceso a los componentes de pantalla del formulario. No almacena datos, directamente busca el elemento indicado en la vista de Android enlazada.
<input id="input1" label="View 1: " value="Uno"/>
<input id="input2" label="View 2: " value="${view.input1}"/>

5.6 This
El contexto This hace referencia al componente actual.
<datatable id="datatableProvincia" repo="provinciaRepo" numVisibleRows="5">
<column id="column_c_provincia_id" headerText="Cod. Provincia" filtering="true" ordering="true" value="${entity.c_provincia_id}">
<filter property="c_provincia_id" matching="contains" valueExpression="${this.column_c_provincia_id}"/>
<order property="c_provincia_id"/>
</column>
<column id="column_d_provincia" headerText="Provincia" filtering="true" ordering="true" value="${entity.d_provincia}">
<filter property="d_provincia" matching="contains" valueExpression="${this.column_d_provincia}"/>
<order property="d_provincia"/>
</column>
</datatable>
| 
5.7 Application Context (“app”)
El contexto App contiene información sobre la aplicación.
| Propiedad/método | Tipo | Descripción |
|---|---|---|
| workingFolder | String | Ruta absoluta a la carpeta de trabajo de la aplicación. |
<textarea label="App" value="${app.workingFolder}"/>

5.8 Project Context (“project”)
El contexto Project contiene información sobre el proyecto actual.
| Propiedad/método | Tipo | Descripción |
|---|---|---|
| folder | String | Ruta absoluta a la carpeta del proyecto actual. |
| dataFolder | String | Ruta absoluta a la carpeta que contiene archivos de base de datos. |
| formsFolder | String | Ruta absoluta a la carpeta que contiene archivos de formulario. |
| picturesFolder | String | Ruta absoluta a la carpeta que contiene archivos de imágenes. |
<textarea label="Folder: " value="${project.folder}"/>
<textarea label="Forms folder: " value="${project.formsFolder}"/>
<textarea label="Data folder: " value="${project.dataFolder}"/>
<textarea label="Pictures folder: " value="${project.picturesFolder}"/>
