xonecode 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -0
- package/dist/agent/authEnDisco.js +56 -0
- package/dist/agent/authEnDisco.js.map +1 -0
- package/dist/agent/configEnDisco.js +109 -0
- package/dist/agent/configEnDisco.js.map +1 -0
- package/dist/agent/crearProyecto.js +34 -0
- package/dist/agent/crearProyecto.js.map +1 -0
- package/dist/agent/entorno.js +124 -0
- package/dist/agent/entorno.js.map +1 -0
- package/dist/agent/guionizado.js +53 -0
- package/dist/agent/guionizado.js.map +1 -0
- package/dist/agent/instantanea.js +129 -0
- package/dist/agent/instantanea.js.map +1 -0
- package/dist/agent/interrupts.js +83 -0
- package/dist/agent/interrupts.js.map +1 -0
- package/dist/agent/mensajes.js +24 -0
- package/dist/agent/mensajes.js.map +1 -0
- package/dist/agent/modelos.js +42 -0
- package/dist/agent/modelos.js.map +1 -0
- package/dist/agent/normalizar.js +20 -0
- package/dist/agent/normalizar.js.map +1 -0
- package/dist/agent/perfiles.js +103 -0
- package/dist/agent/perfiles.js.map +1 -0
- package/dist/agent/proyecto.js +107 -0
- package/dist/agent/proyecto.js.map +1 -0
- package/dist/agent/puente.js +142 -0
- package/dist/agent/puente.js.map +1 -0
- package/dist/agent/resumenDeTool.js +48 -0
- package/dist/agent/resumenDeTool.js.map +1 -0
- package/dist/agent/skills.js +65 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/textoDeTool.js +113 -0
- package/dist/agent/textoDeTool.js.map +1 -0
- package/dist/agent/turnoReal.js +173 -0
- package/dist/agent/turnoReal.js.map +1 -0
- package/dist/agent/verificador.js +65 -0
- package/dist/agent/verificador.js.map +1 -0
- package/dist/agent/xoneAgent.js +106 -0
- package/dist/agent/xoneAgent.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/aprobar.js +82 -0
- package/dist/cli/aprobar.js.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/consola.js +346 -0
- package/dist/cli/consola.js.map +1 -0
- package/dist/cli/describe.js +53 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/doctor.js +45 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/main.js +520 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/markdown.js +90 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/run.js +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spinner.js +89 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/stdio.js +193 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/tema.js +40 -0
- package/dist/cli/tema.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/core/bitacora.js +30 -0
- package/dist/core/bitacora.js.map +1 -0
- package/dist/core/config.js +236 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextos.js +56 -0
- package/dist/core/contextos.js.map +1 -0
- package/dist/core/deps.js +51 -0
- package/dist/core/deps.js.map +1 -0
- package/dist/core/diff.js +79 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/esqueleto.js +366 -0
- package/dist/core/esqueleto.js.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/modelos.js +85 -0
- package/dist/core/modelos.js.map +1 -0
- package/dist/core/notify.js +106 -0
- package/dist/core/notify.js.map +1 -0
- package/dist/core/ports.js +114 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/turno.js +127 -0
- package/dist/core/turno.js.map +1 -0
- package/dist/vendor/hitl.js +103 -0
- package/dist/vendor/hitl.js.map +1 -0
- package/dist/vendor/skillLoaders/catalog.js +74 -0
- package/dist/vendor/skillLoaders/catalog.js.map +1 -0
- package/dist/vendor/tokenTracking.js +58 -0
- package/dist/vendor/tokenTracking.js.map +1 -0
- package/package.json +41 -0
- package/skills/xone-debugging/SKILL.md +52 -0
- package/skills/xone-debugging/references/faq.md +561 -0
- package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
- package/skills/xone-development/SKILL.md +105 -0
- package/skills/xone-development/references/anti-patrones.md +94 -0
- package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
- package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
- package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
- package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
- package/skills/xone-development/references/datos/appdata.md +611 -0
- package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
- package/skills/xone-development/references/datos/http.md +366 -0
- package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
- package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
- package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
- package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
- package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
- package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
- package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
- package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
- package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
- package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
- package/skills/xone-development/references/indice-completo.md +77 -0
- package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
- package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
- package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
- package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
- package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
- package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
- package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
- package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
- package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
- package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
- package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
- package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
- package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
- package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
- package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
- package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
- package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
- package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
- package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
- package/skills/xone-development/references/tipos-de-prop.md +28 -0
- package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
- package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
- package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
- package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
- package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
- package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
- package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
- package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
- package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
- package/skills/xone-development/references/xml-ui/mapas.md +685 -0
- package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
- package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
- package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
- package/skills/xone-plan-builder/SKILL.md +183 -0
- package/skills/xone-plan-builder/agents/openai.yaml +5 -0
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
- package/skills/xone-project-generator/SKILL.md +111 -0
- package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
- package/skills/xone-project-generator/references/colecciones-base.md +16 -0
- package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
- package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
- package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
- package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
- package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
- package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
- package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
- package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
- package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
- package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
- package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
- package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
- package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
- package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
- package/skills/xone-review/SKILL.md +189 -0
- package/skills/xone-spec-builder/SKILL.md +235 -0
- package/skills/xone-spec-builder/agents/openai.yaml +5 -0
- package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
- package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
- package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
# XOne XML — Props por tipo: combos, web y controles especiales
|
|
2
|
+
|
|
3
|
+
> Fuente: `xone/v2/xone-help-docs/topics/02b-xml-prop-tipos.md` L1123–1778. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
|
|
4
|
+
|
|
5
|
+
Contenido: §5.9.13-14 combo con mapcol/mapfld y con mapcol-values · §5.9.15 web · §5.9.17 slider y progress · §5.9.17b stepper · §5.9.17c OTP · §5.9.17d markdown · §5.9.17e navbar · §5.9.18 password X · §5.9.20 adjunto AT · §5.9.21 THTML · §5.9.22 firma DR · §5.9.23 enlace a colección · §5.9.24 búsqueda contextual · §5.9.25 onchange y refresco · §5.9.26 updates y formula
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
#### 5.9.13 Combo (`type="T"` + `mapcol`/`mapfld`) - Selector desplegable
|
|
10
|
+
|
|
11
|
+
> **No existe un `type="C"` propio en XOne.** Los combos/selectores se implementan con `type="T"` (o `type="N"`) más los atributos `mapcol` y `mapfld` que apuntan a la coleccion de origen y al campo de enlace.
|
|
12
|
+
|
|
13
|
+
El combo en XOne funciona con dos props vinculados: uno oculto que almacena el ID (con `mapcol`/`mapfld`) y otro visible que muestra la descripción (con `linkedto`/`linkedfield`).
|
|
14
|
+
|
|
15
|
+
```xml
|
|
16
|
+
<!-- Campo oculto que almacena el valor -->
|
|
17
|
+
<prop name="ID_TIPO" type="N" visible="0"
|
|
18
|
+
mapcol="TiposProducto"
|
|
19
|
+
mapfld="ID" />
|
|
20
|
+
|
|
21
|
+
<!-- Campo visible que muestra la descripción -->
|
|
22
|
+
<prop name="TIPO_DESC" type="T" visible="1"
|
|
23
|
+
title="Tipo de producto"
|
|
24
|
+
linkedto="ID_TIPO"
|
|
25
|
+
linkedfield="DESCRIPCION"
|
|
26
|
+
showinline="true" />
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
| Atributo | En prop oculto | Descripción |
|
|
30
|
+
|----------|---------------|-------------|
|
|
31
|
+
| `mapcol` | Si | Coleccion de donde obtener las opciones |
|
|
32
|
+
| `mapfld` | Si | Campo clave de la coleccion mapeada |
|
|
33
|
+
| `linkedto` | No (en visible) | Nombre del prop oculto vinculado |
|
|
34
|
+
| `linkedfield` | No (en visible) | Campo a mostrar de la coleccion mapeada |
|
|
35
|
+
| `showinline` | No (en visible) | Muestra las opciones en un panel de selección inferior |
|
|
36
|
+
| `showinline-keyboard` | No (en visible) | Añade una caja de búsqueda en la cabecera del panel para filtrar las opciones |
|
|
37
|
+
| `viewmode` | No (en visible) | `spinner` (desplegable) o `dialog` (dialogo) |
|
|
38
|
+
| `bgcolor-dialog` / `forecolor-dialog` / `fontsize-dialog` | No (en visible) | Color de fondo, color del texto de las opciones y tamaño del texto del panel |
|
|
39
|
+
|
|
40
|
+
> **Panel de selección (`showinline`).** Al pulsar el campo se abre un panel inferior con la lista de opciones. Con `showinline-keyboard="true"` la cabecera incluye una caja de búsqueda que filtra las opciones según se escribe. Se puede personalizar con `bgcolor-dialog`, `forecolor-dialog` (color del texto) y `fontsize-dialog`.
|
|
41
|
+
|
|
42
|
+
> **Nota sobre el prefijo `MAP_`:** por defecto, el prop visible de un combo (el que tiene `linkedto`) se nombra con prefijo `MAP_` (por ejemplo `MAP_TIPO_DESC`), porque su valor proviene del lookup y NO se persiste en la tabla de la coll. El prop oculto con el ID (el que tiene `mapcol`/`mapfld`) NO lleva `MAP_` cuando ese ID SI es columna de la tabla (es la FK). Ver concepto completo de campos `MAP_` en 01-xone-fundamentals.md.
|
|
43
|
+
|
|
44
|
+
#### 5.9.14 Combo con valores inline (mapcol-values)
|
|
45
|
+
|
|
46
|
+
Para combos simples con valores predefinidos (sin tabla de BD):
|
|
47
|
+
|
|
48
|
+
```xml
|
|
49
|
+
<!-- Campo oculto con valores inline -->
|
|
50
|
+
<prop name="MAP_IDTIPOIDEN" type="T" visible="0"
|
|
51
|
+
mapcol-values="CC, TI, CE, Otro, Varios"
|
|
52
|
+
mapfld="DATA" />
|
|
53
|
+
|
|
54
|
+
<!-- Campo visible -->
|
|
55
|
+
<prop name="TIPOIDENTIFICADOR" type="T" visible="1"
|
|
56
|
+
title="Tipo Documento"
|
|
57
|
+
showinline="true"
|
|
58
|
+
linkedto="MAP_IDTIPOIDEN"
|
|
59
|
+
linkedfield="DATA" />
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Con `mapcol-values`, los valores se definen separados por comas directamente en el XML, sin necesidad de una coleccion en la BD.
|
|
63
|
+
|
|
64
|
+
> **Nota sobre el prefijo `MAP_`:** en combos con `mapcol-values`, el prop oculto lleva `MAP_` porque no existe ninguna tabla de la que leer/guardar sus opciones — solo existen en el XML. El prop visible lleva `MAP_` si el código seleccionado no se persiste como columna, o va sin `MAP_` si el código SI es columna propia de la tabla.
|
|
65
|
+
|
|
66
|
+
#### 5.9.15 Web (WEB)
|
|
67
|
+
|
|
68
|
+
> **⚠️ El control `WEB` es SOLO para contenido web remoto:** URLs `http://`/`https://`, vídeos embebidos, HTML servido. **NUNCA lo uses para mostrar una imagen local en formato SVG, PNG o JPG.** XOne renderiza SVG de forma nativa, exactamente igual que PNG y JPG. Para mostrar una imagen (incluida una `.svg`) usa `type="IMG"` con `path="dibujo.svg"`, o el atributo `img`/`imgbk` en cualquier control. No hace falta WebView ni convertir el SVG a otro formato.
|
|
69
|
+
|
|
70
|
+
```xml
|
|
71
|
+
<!-- Contenido web -->
|
|
72
|
+
<prop name="MAP_WEB" type="WEB" visible="1"
|
|
73
|
+
height="40%"
|
|
74
|
+
title="Página Web"
|
|
75
|
+
onconsolemessage="handleError(e);" />
|
|
76
|
+
|
|
77
|
+
<!-- Video de YouTube -->
|
|
78
|
+
<prop name="MAP_VIDEO_ONLINE" type="WEB" visible="1"
|
|
79
|
+
readonly="true"
|
|
80
|
+
height="40%" />
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Se establece la URL programaticamente:
|
|
84
|
+
```javascript
|
|
85
|
+
self.MAP_WEB = "http://ejemplo.com";
|
|
86
|
+
self.MAP_VIDEO_ONLINE = "https://www.youtube.com/watch?v=VIDEO_ID";
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Evento `onconsolemessage`** (atributo del `<prop type="WEB">`). Se dispara con cada mensaje de la consola del WebView (errores JS, `console.log`, etc.). Recibe un objeto `e` con:
|
|
90
|
+
|
|
91
|
+
| Propiedad | Tipo | Descripción |
|
|
92
|
+
|-----------|------|-------------|
|
|
93
|
+
| `e.target` | string | Nombre del prop que disparo el evento |
|
|
94
|
+
| `e.objItem` | object | DataObject que contiene el prop |
|
|
95
|
+
| `e.messageLevel` | string | Nivel del mensaje: `"LOG"`, `"DEBUG"`, `"WARNING"`, `"ERROR"`, `"TIP"` |
|
|
96
|
+
| `e.message` | string | Texto del mensaje |
|
|
97
|
+
| `e.lineNumber` | number | Linea del fuente donde se origino el mensaje |
|
|
98
|
+
| `e.sourceId` | string | URL/identificador del fuente que origino el mensaje |
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
function handleError(e) {
|
|
102
|
+
if (e.messageLevel === "ERROR") {
|
|
103
|
+
ui.msgBox("Nivel: " + e.messageLevel +
|
|
104
|
+
"\nMensaje: " + e.message +
|
|
105
|
+
"\nLinea: " + e.lineNumber +
|
|
106
|
+
"\nFuente: " + e.sourceId, "Error WebView", 0);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
#### 5.9.16 Firma con `type="IMG" readonly="false"` — OBSOLETO
|
|
112
|
+
|
|
113
|
+
> **OBSOLETO.** Este patron de firma (imagen editable con `readonly="false"`) esta deprecado. Para captura de firmas o dibujos a mano alzada usar siempre `type="DR"` (ver §5.9.22). Esta sección se mantiene solo para reconocer código legacy en proyectos antiguos.
|
|
114
|
+
|
|
115
|
+
#### 5.9.17 Slider (N con viewmode) y Progress
|
|
116
|
+
|
|
117
|
+
Los campos numéricos (`type="N"`) pueden mostrar controles visuales especiales mediante `viewmode`:
|
|
118
|
+
|
|
119
|
+
**ViewModes numéricos disponibles:**
|
|
120
|
+
|
|
121
|
+
| ViewMode | Descripción |
|
|
122
|
+
|----------|-------------|
|
|
123
|
+
| `seekbar` | Barra deslizante clasica con pulgar arrastrabe |
|
|
124
|
+
| `slider` | Control deslizante (variante moderna del seekbar) |
|
|
125
|
+
| `progress-bar` | Barra de progreso horizontal (solo lectura o indeterminada) |
|
|
126
|
+
| `circular-progress-bar` | Indicador de progreso circular |
|
|
127
|
+
| `range-slider` | Selector de rango con dos pulgares (valor mínimo y máximo) |
|
|
128
|
+
| `stepper` | Control compacto con dos botones `−` / `+` a los lados de un valor entero central (auto-repite al mantener pulsado). Ver sección 5.9.17b |
|
|
129
|
+
| `navbar` | Barra de navegación Material 3 con indicador "pill" deslizante; el valor es el índice del destino activo. Ver sección 5.9.17e |
|
|
130
|
+
|
|
131
|
+
```xml
|
|
132
|
+
<!-- Slider horizontal -->
|
|
133
|
+
<prop name="MAP_SLIDER" type="N" visible="1"
|
|
134
|
+
viewmode="slider"
|
|
135
|
+
orientation="horizontal"
|
|
136
|
+
min="0" max="100"
|
|
137
|
+
thumb-color="#FF00FF"
|
|
138
|
+
bar-color="#FF0000"
|
|
139
|
+
track-color="#00FF00"
|
|
140
|
+
notify-only-when-dropped="false" />
|
|
141
|
+
|
|
142
|
+
<!-- Barra de progreso -->
|
|
143
|
+
<prop name="MAP_PROGRESS" type="N" visible="1"
|
|
144
|
+
viewmode="progress-bar"
|
|
145
|
+
indeterminate="true"
|
|
146
|
+
bar-color="#FF0000"
|
|
147
|
+
track-color="#00FF00" />
|
|
148
|
+
|
|
149
|
+
<!-- Progreso circular -->
|
|
150
|
+
<prop name="MAP_CIRCULAR" type="N" visible="1"
|
|
151
|
+
viewmode="circular-progress-bar"
|
|
152
|
+
bar-color="#1565C0" />
|
|
153
|
+
|
|
154
|
+
<!-- Rango (Range Slider) -->
|
|
155
|
+
<prop name="MAP_RANGE" type="N" visible="1"
|
|
156
|
+
viewmode="range-slider"
|
|
157
|
+
min="0" max="100" />
|
|
158
|
+
|
|
159
|
+
<!-- Seekbar con imagenes personalizadas -->
|
|
160
|
+
<prop name="MAP_SEEK" type="N" visible="1"
|
|
161
|
+
viewmode="seekbar"
|
|
162
|
+
min="0" max="100"
|
|
163
|
+
img-thumb="thumb.png"
|
|
164
|
+
img-progress-left="progress_left.png"
|
|
165
|
+
notify-only-when-dropped="true" />
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
#### 5.9.17b Stepper numérico (viewmode="stepper")
|
|
169
|
+
|
|
170
|
+
Control numérico compacto con dos botones `−` / `+` a los lados de un valor central. Aplica a `<prop type="N">` y maneja **valores enteros**. Cada pulsacion aplica `±step-size`; al mantener pulsado un botón, se aplica el primer paso al instante y luego **auto-repite cada 80 ms** hasta soltar o alcanzar el limite.
|
|
171
|
+
|
|
172
|
+
```xml
|
|
173
|
+
<!-- Stepper básico de cantidad (0..99, paso 1) -->
|
|
174
|
+
<prop name="CANTIDAD" type="N" visible="1"
|
|
175
|
+
viewmode="stepper"
|
|
176
|
+
min="0" max="99"
|
|
177
|
+
step-size="1"
|
|
178
|
+
title="Cantidad" />
|
|
179
|
+
|
|
180
|
+
<!-- Stepper con colores personalizados -->
|
|
181
|
+
<prop name="PERSONAS" type="N" visible="1"
|
|
182
|
+
viewmode="stepper"
|
|
183
|
+
min="1" max="20"
|
|
184
|
+
step-size="1"
|
|
185
|
+
bar-color="#2196F3"
|
|
186
|
+
forecolor="#212121"
|
|
187
|
+
title="Personas" />
|
|
188
|
+
|
|
189
|
+
<!-- Stepper ciclico (al llegar al max, vuelve al min) -->
|
|
190
|
+
<prop name="HORA" type="N" visible="1"
|
|
191
|
+
viewmode="stepper"
|
|
192
|
+
min="0" max="23"
|
|
193
|
+
step-size="1"
|
|
194
|
+
wrap="true"
|
|
195
|
+
title="Hora" />
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Atributos:**
|
|
199
|
+
|
|
200
|
+
| Atributo | Default | Descripción |
|
|
201
|
+
|----------|---------|-------------|
|
|
202
|
+
| `min` | `0` | Valor mínimo (entero). Si el valor actual es menor, se clampa al cargar |
|
|
203
|
+
| `max` | `100` | Valor máximo (entero). Debe ser `>= min` (si no, lanza `IllegalArgumentException`) |
|
|
204
|
+
| `step-size` | `1` | Incremento por pulsacion. Debe ser `> 0` |
|
|
205
|
+
| `wrap` | `false` | Si `true`, al sobrepasar `max` vuelve a `min` y viceversa (selector ciclico). Si `false`, se queda fijo en el limite |
|
|
206
|
+
| `bar-color` | — | Color de fondo de los botones `−` / `+`. Acepta `#RRGGBB` y `#AARRGGBB` |
|
|
207
|
+
| `forecolor` | — | Color del número del centro |
|
|
208
|
+
| `disableedit` | `false` | Formula o literal; si evalua a `true`, los botones quedan deshabilitados |
|
|
209
|
+
|
|
210
|
+
**Comportamiento:**
|
|
211
|
+
|
|
212
|
+
- **Pulsacion corta:** aplica una vez `±step-size`.
|
|
213
|
+
- **Pulsacion larga (long-press):** aplica el primer paso al instante y luego auto-repite cada **80 ms** hasta soltar (`ACTION_UP` / `ACTION_CANCEL` / `ACTION_OUTSIDE`).
|
|
214
|
+
- **Sin `wrap`:** el valor se clampa al rango `[min, max]`. Los botones quedan clicables aunque se llegue al limite (no producen cambio).
|
|
215
|
+
- **Con `wrap="true"`:** wrap ciclico — útil para hora (0–23), día de la semana (0–6).
|
|
216
|
+
- **Propagacion:** cada cambio dispara `dataObject.put(sProp, nValue)` y re-evalua los triggers (`<onchange>` y propagaciones).
|
|
217
|
+
|
|
218
|
+
**API JavaScript:**
|
|
219
|
+
|
|
220
|
+
| Método | Efecto |
|
|
221
|
+
|--------|--------|
|
|
222
|
+
| `control.getValue()` | Devuelve el valor actual como entero |
|
|
223
|
+
| `control.setValue(n)` | Asigna el valor (se clampa al rango). Si cambia, dispara callback de cambio |
|
|
224
|
+
| `control.setMin(n)` | Cambia el mínimo en runtime. Si `max` queda por debajo, también se ajusta; si el valor actual queda por debajo del nuevo `min`, se sube |
|
|
225
|
+
| `control.setMax(n)` | Cambia el máximo en runtime. Misma lógica de ajuste cruzado |
|
|
226
|
+
| `control.setStepSize(n)` | Cambia el incremento. Debe ser `> 0` (si no, lanza error) |
|
|
227
|
+
|
|
228
|
+
```javascript
|
|
229
|
+
// Ajustar el rango dinamicamente según otro campo
|
|
230
|
+
function onTipoChange() {
|
|
231
|
+
var ctrl = getControl("CANTIDAD");
|
|
232
|
+
if (self.TIPO === "PACK_GRANDE") {
|
|
233
|
+
ctrl.setMin(10);
|
|
234
|
+
ctrl.setMax(500);
|
|
235
|
+
ctrl.setStepSize(10);
|
|
236
|
+
} else {
|
|
237
|
+
ctrl.setMin(1);
|
|
238
|
+
ctrl.setMax(99);
|
|
239
|
+
ctrl.setStepSize(1);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Casos de uso típicos:** cantidades en carritos, spinners de configuración (zoom, volumen discreto), selectores ciclicos (hora, día semana), pasos de wizard.
|
|
245
|
+
|
|
246
|
+
**Notas:**
|
|
247
|
+
|
|
248
|
+
- Solo maneja **valores enteros**. Para incrementos decimales, usar `slider` o `seekbar`.
|
|
249
|
+
- El valor se persiste como entero en el campo del prop.
|
|
250
|
+
- Si `max < min`, el framework lanza `IllegalArgumentException`. Si `step-size <= 0`, igualmente.
|
|
251
|
+
- Los botones se renderizan con caracteres Unicode (`−` U+2212 para el menos, `+` para el más) sobre fondos coloreados con `bar-color`.
|
|
252
|
+
|
|
253
|
+
#### 5.9.17c OTP — Entrada de códigos (viewmode="otp")
|
|
254
|
+
|
|
255
|
+
Campo de introduccion de códigos de un solo uso (One-Time Password) con **cajas individuales por digito**, auto-avance al escribir, backspace inverso y soporte de paste. Aplica a `<prop type="T">` (alfanumerico) o `<prop type="N">` (solo numérico). El valor combinado de todas las cajas se persiste en el campo del prop como un **string concatenado sin separadores**.
|
|
256
|
+
|
|
257
|
+
```xml
|
|
258
|
+
<!-- OTP numerico de 6 digitos (SMS) -->
|
|
259
|
+
<prop name="CODIGO_VERIFICACION" type="N" visible="1"
|
|
260
|
+
viewmode="otp"
|
|
261
|
+
digits="6"
|
|
262
|
+
box-size="44p"
|
|
263
|
+
box-spacing="8p"
|
|
264
|
+
box-color="#FFFFFF"
|
|
265
|
+
box-color-focus="#E3F2FD"
|
|
266
|
+
forecolor="#000000"
|
|
267
|
+
auto-submit="true"
|
|
268
|
+
title="Introduce el código" />
|
|
269
|
+
|
|
270
|
+
<!-- OTP alfanumerico de 4 caracteres con caracteres ocultos -->
|
|
271
|
+
<prop name="MAP_PIN" type="T" visible="1"
|
|
272
|
+
viewmode="otp"
|
|
273
|
+
digits="4"
|
|
274
|
+
allow-letters="true"
|
|
275
|
+
secret="true"
|
|
276
|
+
auto-submit="true" />
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Atributos:**
|
|
280
|
+
|
|
281
|
+
| Atributo | Default | Descripción |
|
|
282
|
+
|----------|---------|-------------|
|
|
283
|
+
| `digits` | `6` | Número de cajas (debe ser positivo). Cada caja contiene un único carácter |
|
|
284
|
+
| `secret` | `false` | Si `true`, muestra los caracteres ocultos (modo password). Útil para PINs |
|
|
285
|
+
| `auto-submit` | `true` | Si `true`, al rellenar la última caja se oculta el teclado automáticamente |
|
|
286
|
+
| `allow-letters` | `false` | Si `true`, acepta letras además de digitos. Si `false`, solo digitos numéricos |
|
|
287
|
+
| `box-size` | `44p` | Tamaño (ancho y alto) de cada caja |
|
|
288
|
+
| `box-spacing` | `8p` | Separación horizontal entre cajas |
|
|
289
|
+
| `box-color` | — | Color de fondo de las cajas en estado normal |
|
|
290
|
+
| `box-color-focus` | usa `box-color` | Color de fondo de la caja con foco |
|
|
291
|
+
| `forecolor` | — | Color del texto dentro de las cajas |
|
|
292
|
+
| `disableedit` | `false` | Formula o literal; si evalua a `true`, el control queda en solo lectura |
|
|
293
|
+
|
|
294
|
+
**Comportamiento:**
|
|
295
|
+
|
|
296
|
+
- **Auto-avance:** al escribir un carácter, el foco salta automáticamente a la caja siguiente.
|
|
297
|
+
- **Backspace inverso:** al pulsar borrar sobre una caja **vacia**, el foco retrocede a la anterior y la borra. Funciona incluso con teclados virtuales que no envian `KEYCODE_DEL` cuando no hay texto que borrar.
|
|
298
|
+
- **Paste distribuido:** si se pega texto, los caracteres se reparten entre las cajas siguientes (filtrando los no permitidos según `allow-letters`). El foco queda en la última caja rellenada.
|
|
299
|
+
- **Filtro de caracteres:** los no permitidos (letras cuando `allow-letters="false"`, símbolos, etc.) se descartan sin escribirse.
|
|
300
|
+
- **Auto-submit:** al rellenar la última caja, el teclado se oculta. El framework re-evalua los triggers del campo (por ejemplo, un `<onchange>` que llame al servidor).
|
|
301
|
+
|
|
302
|
+
**API JavaScript:**
|
|
303
|
+
|
|
304
|
+
| Método | Efecto |
|
|
305
|
+
|--------|--------|
|
|
306
|
+
| `control.getOtpValue()` | Devuelve el valor combinado de todas las cajas como string |
|
|
307
|
+
| `control.clearOtp()` | Limpia todas las cajas y pone el foco en la primera |
|
|
308
|
+
| `control.focusOtp()` | Pone el foco en la primera caja vacia. Si todas están llenas, enfoca la última |
|
|
309
|
+
|
|
310
|
+
```javascript
|
|
311
|
+
// Validar el OTP desde el onchange del prop
|
|
312
|
+
function onOtpChange() {
|
|
313
|
+
var sCode = getControl("CODIGO_VERIFICACION").getOtpValue();
|
|
314
|
+
if (sCode.length !== 6) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (sCode === self.CODIGO_ESPERADO) {
|
|
318
|
+
ui.showToast("Código correcto");
|
|
319
|
+
ui.openEditView("PantallaPrincipal");
|
|
320
|
+
} else {
|
|
321
|
+
ui.showToast("Código incorrecto");
|
|
322
|
+
getControl("CODIGO_VERIFICACION").clearOtp();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Casos de uso típicos:** verificación SMS, 2FA con apps de autenticación, PIN de aplicación (con `secret="true"`), códigos de invitacion / cupones (con `allow-letters="true"`).
|
|
328
|
+
|
|
329
|
+
**Notas:**
|
|
330
|
+
|
|
331
|
+
- El valor en el `dataObject` se persiste como **string concatenado sin separadores** (ej. `"123456"` para 6 digitos).
|
|
332
|
+
- Si el campo tenía un valor previo, las cajas se rellenan al cargar mostrando carácter a carácter.
|
|
333
|
+
- El `title` del prop se sigue mostrando como label encima de las cajas.
|
|
334
|
+
- Para validar el código sin esperar a `auto-submit`, usar `<onchange>` y comprobar `getOtpValue().length === digits`.
|
|
335
|
+
|
|
336
|
+
#### 5.9.17d Texto Markdown (viewmode="markdown")
|
|
337
|
+
|
|
338
|
+
Renderiza el contenido del campo como **Markdown formateado** en lugar de texto plano. Aplica a `<prop type="T">` (texto editable / readonly). El framework parsea el valor del campo cada vez que se refresca la vista y aplica el formato visual (negritas, cabeceras, listas, etc.).
|
|
339
|
+
|
|
340
|
+
Soporta el dialecto **CommonMark base** (sin extensiones): cabeceras, enfasis, listas, enlaces, imágenes, blockquotes, código inline / en bloque y reglas horizontales. **No soportado por defecto:** tablas, strikethrough (`~~tachado~~`), task lists (`- [x]`), HTML embebido, syntax highlighting.
|
|
341
|
+
|
|
342
|
+
```xml
|
|
343
|
+
<!-- Campo readonly con contenido Markdown -->
|
|
344
|
+
<prop name="MAP_DESCRIPCION" type="T" visible="1"
|
|
345
|
+
viewmode="markdown"
|
|
346
|
+
readonly="true"
|
|
347
|
+
width="100%" />
|
|
348
|
+
|
|
349
|
+
<!-- Campo de texto editable con render Markdown -->
|
|
350
|
+
<prop name="NOTAS" type="T" visible="1"
|
|
351
|
+
viewmode="markdown"
|
|
352
|
+
width="100%" height="200p" />
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Asignacion desde JavaScript:
|
|
356
|
+
|
|
357
|
+
```javascript
|
|
358
|
+
self.MAP_DESCRIPCION =
|
|
359
|
+
"## Bienvenido\n\n" +
|
|
360
|
+
"Este es un texto **importante** con _enfasis_ y un [enlace](https://xone.es).\n\n" +
|
|
361
|
+
"### Pasos:\n" +
|
|
362
|
+
"1. Iniciar sesion\n" +
|
|
363
|
+
"2. Seleccionar proyecto\n" +
|
|
364
|
+
"3. Confirmar\n\n" +
|
|
365
|
+
"> Nota: revisa tus credenciales antes de continuar.";
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Atributos:** el viewmode `markdown` **no introduce atributos propios**. Aplican los atributos comunes de `type="T"` (`fontsize`, `forecolor`, `align`, `width`, `height`, margenes, etc.).
|
|
369
|
+
|
|
370
|
+
**Sintaxis Markdown soportada (CommonMark base):**
|
|
371
|
+
|
|
372
|
+
| Elemento | Sintaxis |
|
|
373
|
+
|----------|----------|
|
|
374
|
+
| Cabeceras | `# H1`, `## H2` ... `###### H6` |
|
|
375
|
+
| Negrita | `**texto**` o `__texto__` |
|
|
376
|
+
| Cursiva | `*texto*` o `_texto_` |
|
|
377
|
+
| Negrita + cursiva | `***texto***` |
|
|
378
|
+
| Listas no ordenadas | `-`, `*` o `+` al inicio de linea |
|
|
379
|
+
| Listas ordenadas | `1.`, `2.`, `3.` ... |
|
|
380
|
+
| Enlaces | `[texto](url)` |
|
|
381
|
+
| Imágenes | `` |
|
|
382
|
+
| Blockquotes | `> texto` |
|
|
383
|
+
| Código inline | `` `código` `` |
|
|
384
|
+
| Bloques de código | Tres backticks abriendo y cerrando |
|
|
385
|
+
| Salto de linea | Doble espacio al final o linea en blanco |
|
|
386
|
+
| Regla horizontal | `---`, `***` o `___` |
|
|
387
|
+
|
|
388
|
+
**Comportamiento:**
|
|
389
|
+
|
|
390
|
+
- **Refresco:** cada vez que la vista se refresca desde el `dataObject` (carga, `Refresh`, `refreshValue`, asignacion desde JS), el contenido se reparsea y se vuelve a renderizar.
|
|
391
|
+
- **Edición:** mientras el usuario edita el campo, las plantillas Android muestran el texto en su forma cruda (markdown sin renderizar); al perder el foco y refrescar, vuelve al estado renderizado. Si el campo debe ser decorativo, usar `readonly="true"` o `locked="true"` para evitar el modo edición accidental.
|
|
392
|
+
- **Encoding de saltos de linea:** los saltos en el string Markdown deben ser `\n` reales (no `<br>` ni `\\n` escapado). En XML, usar ` ` si el valor esta embebido como atributo.
|
|
393
|
+
- **Imágenes:** los URLs deben ser accesibles desde el dispositivo (HTTP/HTTPS o ruta local). Carga sincrona por defecto.
|
|
394
|
+
|
|
395
|
+
**Casos de uso típicos:** mensajes formateados (instrucciones, avisos, FAQ), descripciones de productos servidas desde backend en Markdown, plantillas dinámicas, cabeceras ricas en pantallas de detalle, renderizado de respuestas de IA / chatbots.
|
|
396
|
+
|
|
397
|
+
**Notas:**
|
|
398
|
+
|
|
399
|
+
- Si el contenido viene de una API y puede contener sintaxis desconocida, los caracteres no reconocidos por el parser CommonMark se muestran tal cual (no rompen el render).
|
|
400
|
+
- El campo se persiste y se lee como **texto Markdown crudo** (no como HTML ni texto plano sin marcas). Solo cambia la presentación visual.
|
|
401
|
+
- Combinable con `autolink`: si Markdown no detecta un URL como link explicito (`[]()`), `autolink="url"` lo puede capturar; aunque normalmente la sintaxis Markdown estándar es suficiente.
|
|
402
|
+
|
|
403
|
+
#### 5.9.17e NavigationBar pill animada (viewmode="navbar")
|
|
404
|
+
|
|
405
|
+
Barra de navegación estilo **Material 3** con un indicador **"pill" deslizante** que marca el destino activo. Aplica a `<prop type="N">`: el valor numérico del campo es el **índice del destino seleccionado** (0..N−1). Al tocar un destino se escribe su índice en el campo (dispara el `<onchange>` del prop) y la pill se desliza animadamente hasta él; si el valor cambia por código y se refresca la vista, la pill también se desliza sola.
|
|
406
|
+
|
|
407
|
+
Los destinos se declaran **inline** en el propio `<prop>` (no desde un `<contents>`): títulos e iconos separados por el carácter barra vertical (`|`).
|
|
408
|
+
|
|
409
|
+
```xml
|
|
410
|
+
<!-- Barra de 3 destinos con icono y texto -->
|
|
411
|
+
<prop name="SECCION" type="N" visible="1"
|
|
412
|
+
viewmode="navbar"
|
|
413
|
+
nav-titles="Inicio|Buscar|Perfil"
|
|
414
|
+
nav-icons="ic_home.png|ic_search.png|ic_user.png"
|
|
415
|
+
pill-color="#6750A4"
|
|
416
|
+
pill-text-color="#FFFFFF"
|
|
417
|
+
nav-text-color="#49454F"
|
|
418
|
+
bgcolor="#FEF7FF"
|
|
419
|
+
width="100%" height="80p" />
|
|
420
|
+
|
|
421
|
+
<!-- Solo texto, con la etiqueta visible únicamente en el destino activo -->
|
|
422
|
+
<prop name="PASO" type="N" visible="1"
|
|
423
|
+
viewmode="navbar"
|
|
424
|
+
nav-titles="Datos|Pago|Resumen"
|
|
425
|
+
label-visibility="selected"
|
|
426
|
+
animation-duration="350" />
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**Atributos:**
|
|
430
|
+
|
|
431
|
+
| Atributo | Default | Descripción |
|
|
432
|
+
|----------|---------|-------------|
|
|
433
|
+
| `nav-titles` | — | Títulos de los destinos separados por barra vertical. Determina el número de destinos |
|
|
434
|
+
| `nav-icons` | — | Iconos (nombre de recurso, igual que los `img` de un botón) separados por barra vertical, emparejados por posición con los títulos. Conviene que sean monocromos: se tiñen con el color activo / inactivo |
|
|
435
|
+
| `pill-color` | `#E8DEF8` | Color de la pill deslizante |
|
|
436
|
+
| `pill-text-color` (o `forecolor`) | `#1D192B` | Color de icono + texto del destino activo |
|
|
437
|
+
| `nav-text-color` | `#49454F` | Color de icono + texto de los destinos inactivos |
|
|
438
|
+
| `bar-color` / `bgcolor` | transparente | Color de fondo de la barra |
|
|
439
|
+
| `label-visibility` | `always` | `always` (siempre), `selected` (solo el activo) o `never` (sin etiquetas) |
|
|
440
|
+
| `animation-duration` | `300` | Duración del deslizamiento en milisegundos |
|
|
441
|
+
| `pill-corner-radius` | mitad de la altura | Radio de las esquinas de la pill (totalmente redondeada si se omite) |
|
|
442
|
+
| `nav-icon-size` | `24` | Tamaño del icono en dp |
|
|
443
|
+
| `disableedit` / `locked` | `false` | Fórmula o literal; si evalúa a `true`, la barra deja de ser tocable y no muestra efecto al pulsar (queda como indicador) |
|
|
444
|
+
|
|
445
|
+
**Comportamiento:**
|
|
446
|
+
|
|
447
|
+
- **Valor = índice:** `0` selecciona el primer destino, `1` el segundo, etc.
|
|
448
|
+
- **Toque:** escribe el índice en el campo y desliza la pill; dispara el `<onchange>` del prop.
|
|
449
|
+
- **Cambio por código:** asignar el campo y refrescar la vista desliza la pill al nuevo destino.
|
|
450
|
+
- **Guarda de rango:** un valor negativo se ajusta a `0` y uno mayor que el último destino al máximo; si el valor guardado estaba fuera de rango, se corrige también en el campo (sin disparar `onchange` en datos válidos).
|
|
451
|
+
- **`disableedit` / `locked`:** la barra ignora los toques y no muestra efecto al pulsar, pero sigue animando ante cambios de valor por código (indicador puro).
|
|
452
|
+
|
|
453
|
+
**API JavaScript:**
|
|
454
|
+
|
|
455
|
+
| Método | Efecto |
|
|
456
|
+
|--------|--------|
|
|
457
|
+
| `control.getValue()` | Devuelve el índice del destino seleccionado |
|
|
458
|
+
| `control.setValue(n)` | Selecciona el destino `n` (se ajusta al rango), anima y persiste el valor |
|
|
459
|
+
| `control.getItemCount()` | Número de destinos |
|
|
460
|
+
|
|
461
|
+
```javascript
|
|
462
|
+
// Reaccionar al cambio de seccion desde el onchange del prop SECCION
|
|
463
|
+
function onSeccionChange() {
|
|
464
|
+
var idx = self.SECCION; // indice del destino activo
|
|
465
|
+
if (idx === 0) { /* mostrar inicio */ }
|
|
466
|
+
else if (idx === 1) { /* mostrar busqueda */ }
|
|
467
|
+
else { /* mostrar perfil */ }
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Mover la barra por codigo (la pill se desliza al refrescar)
|
|
471
|
+
function irAPerfil() {
|
|
472
|
+
var ctrl = getControl("SECCION");
|
|
473
|
+
ctrl.setValue(2);
|
|
474
|
+
}
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
**Casos de uso típicos:** barra de navegación inferior entre secciones de la app, indicador de paso en asistentes (wizard), conmutador de pestañas con feedback animado.
|
|
478
|
+
|
|
479
|
+
**Notas:**
|
|
480
|
+
|
|
481
|
+
- El campo se persiste como **entero** (el índice del destino).
|
|
482
|
+
- Los iconos deben existir en los recursos del proyecto (misma resolución que los `img` de botón).
|
|
483
|
+
- Si solo se indican `nav-icons` sin `nav-titles` (o al revés), los destinos se muestran solo con icono o solo con texto.
|
|
484
|
+
- Por defecto la barra ocupa todo el ancho disponible; ajusta `width` / `height` si necesitas otro tamaño.
|
|
485
|
+
|
|
486
|
+
#### 5.9.18 Password (X)
|
|
487
|
+
|
|
488
|
+
```xml
|
|
489
|
+
<prop name="MAP_PASSWORD" type="X" visible="1"
|
|
490
|
+
floating-tooltip="true"
|
|
491
|
+
tooltip="Contraseña"
|
|
492
|
+
show-password-visibility-toggle="true"
|
|
493
|
+
text-border-bottom="true" />
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
| Atributo | Descripción |
|
|
497
|
+
|----------|-------------|
|
|
498
|
+
| `show-password-visibility-toggle` | Muestra botón para ver/ocultar la contrasena |
|
|
499
|
+
|
|
500
|
+
#### 5.9.19 Selector con lookup (`type="T"` + `mapcol`/`mapfld`)
|
|
501
|
+
|
|
502
|
+
> **No existe un `type="A"` (autocomplete) propio en XOne.** Los selectores con autocompletado/lookup se implementan con `type="T"` (o `type="N"`) y los atributos `mapcol`/`mapfld`/`linkedfield`. Es la misma mecanica que el combo de §5.9.13.
|
|
503
|
+
|
|
504
|
+
```xml
|
|
505
|
+
<prop name="CIUDAD" type="T" visible="1"
|
|
506
|
+
title="Ciudad"
|
|
507
|
+
mapcol="Ciudades"
|
|
508
|
+
mapfld="ID"
|
|
509
|
+
linkedfield="NOMBRE" />
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
#### 5.9.20 Adjunto (AT)
|
|
513
|
+
|
|
514
|
+
```xml
|
|
515
|
+
<prop name="MAP_ADJUNTO" type="AT" visible="1"
|
|
516
|
+
title="Adjuntar archivo"
|
|
517
|
+
img-width="48p" img-height="48p" />
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
#### 5.9.21 THTML (Texto HTML enriquecido)
|
|
521
|
+
|
|
522
|
+
Muestra contenido HTML formateado directamente en el prop. Útil para mostrar textos con negrita, colores, enlaces, etc.
|
|
523
|
+
|
|
524
|
+
```xml
|
|
525
|
+
<prop name="MAP_TEXTO_RICH" type="THTML" visible="1"
|
|
526
|
+
locked="true"
|
|
527
|
+
width="100%" height="-2"
|
|
528
|
+
labelwidth="0" />
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
```javascript
|
|
532
|
+
// Asignar contenido HTML por código
|
|
533
|
+
self.MAP_TEXTO_RICH = "<b>Importante:</b> El plazo vence el <span style='color:red'>31/12</span>";
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
#### 5.9.22 DR — Firma / Dibujo moderno
|
|
537
|
+
|
|
538
|
+
El tipo `DR` es el modo moderno para capturar firmas y dibujos a mano alzada. Sustituye al método antiguo (`type="IMG"` con `readonly="false"`).
|
|
539
|
+
|
|
540
|
+
```xml
|
|
541
|
+
<prop name="FIRMA" type="DR" visible="1"
|
|
542
|
+
width="90%"
|
|
543
|
+
height="300p"
|
|
544
|
+
labelwidth="0" />
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
> **Nota:** El tipo `DR` guarda la firma como imagen en la BD (campo `Varchar(100)` con ruta al fichero).
|
|
548
|
+
|
|
549
|
+
#### 5.9.23 Enlace a coleccion (mapcol / mapfld)
|
|
550
|
+
|
|
551
|
+
Para crear un desplegable vinculado a una coleccion de la BD se usan dos props: uno oculto que almacena la clave foranea, y uno visible que muestra la descripción.
|
|
552
|
+
|
|
553
|
+
```xml
|
|
554
|
+
<!-- Prop oculto: almacena el ID del cliente seleccionado -->
|
|
555
|
+
<prop name="IDCLIENTE" type="N" visible="0"
|
|
556
|
+
mapcol="Clientes"
|
|
557
|
+
mapfld="ID" />
|
|
558
|
+
|
|
559
|
+
<!-- Prop visible: muestra el nombre del cliente -->
|
|
560
|
+
<prop name="MAP_NOMBRE_CLIENTE" type="T" visible="1"
|
|
561
|
+
title="Cliente"
|
|
562
|
+
linkedto="IDCLIENTE"
|
|
563
|
+
linkedfield="NOMBRE"
|
|
564
|
+
showinline="true" />
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
| Atributo | Donde va | Descripción |
|
|
568
|
+
|----------|----------|-------------|
|
|
569
|
+
| `mapcol` | Prop oculto | Nombre de la coleccion de donde se obtienen las opciones |
|
|
570
|
+
| `mapfld` | Prop oculto | Campo clave de esa coleccion (normalmente `ID`) |
|
|
571
|
+
| `filter` | Prop oculto | Filtro opcional para las opciones del combo |
|
|
572
|
+
| `linkedto` | Prop visible | Nombre del prop oculto al que esta vinculado |
|
|
573
|
+
| `linkedfield` | Prop visible | Campo de la coleccion a mostrar como texto |
|
|
574
|
+
| `showinline` | Prop visible | `true` abre las opciones en un panel de selección inferior (con `showinline-keyboard="true"` incluye buscador); `false` abre un diálogo |
|
|
575
|
+
|
|
576
|
+
#### 5.9.24 Busqueda contextual (contextual-search)
|
|
577
|
+
|
|
578
|
+
Permite filtrar un contents en tiempo real mientras el usuario escribe en un campo de texto.
|
|
579
|
+
|
|
580
|
+
```xml
|
|
581
|
+
<!-- Campo de busqueda -->
|
|
582
|
+
<prop name="MAP_BUSCAR" type="T" visible="1"
|
|
583
|
+
tooltip="Escriba para buscar..."
|
|
584
|
+
contextual-search="true"
|
|
585
|
+
contextual-target="MAP_LISTADO"
|
|
586
|
+
contextual-filter="NOMBRE LIKE '%##VAL##%' OR CODIGO LIKE '%##VAL##%'"
|
|
587
|
+
labelwidth="0" width="100%" height="100p" />
|
|
588
|
+
|
|
589
|
+
<!-- Contents que se filtra automaticamente -->
|
|
590
|
+
<prop name="MAP_LISTADO" type="Z" visible="1"
|
|
591
|
+
contents="@ListadoClientes"
|
|
592
|
+
width="100%" height="600p" />
|
|
593
|
+
<contents name="@ListadoClientes" src="Clientes" />
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
| Atributo | Descripción |
|
|
597
|
+
|----------|-------------|
|
|
598
|
+
| `contextual-search` | `"true"` activa la busqueda contextual |
|
|
599
|
+
| `contextual-target` | Nombre del prop `type="Z"` que se va a filtrar |
|
|
600
|
+
| `contextual-filter` | Clausula WHERE que se aplica al contents. `##VAL##` se sustituye por el texto introducido |
|
|
601
|
+
|
|
602
|
+
#### 5.9.25 onchange y refresco
|
|
603
|
+
|
|
604
|
+
El atributo `onchange` indica que debe ocurrir cuando el valor del campo cambia. En proyectos modernos (Android/iOS) basta con `onchange="refresh"` para refrescar toda la pantalla.
|
|
605
|
+
|
|
606
|
+
```xml
|
|
607
|
+
<!-- Refresco simple al cambiar -->
|
|
608
|
+
<prop name="ESTADO" type="N" visible="1"
|
|
609
|
+
onchange="refresh" />
|
|
610
|
+
|
|
611
|
+
<!-- Refresco de un prop específico -->
|
|
612
|
+
<prop name="FECHA" type="D" visible="1"
|
|
613
|
+
onchange="refresh(MAP_DIAS_RESTANTES)" />
|
|
614
|
+
|
|
615
|
+
<!-- Ejecutar un nodo custom al cambiar -->
|
|
616
|
+
<prop name="TIPO" type="T" visible="1"
|
|
617
|
+
onchange="ExecuteNode(calcularTotal)" />
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
> **Nota historica:** En versiones antiguas (PDA/PocketPC) se usaban valores numéricos como `onchange="refresh255"` (bitmask que indicaba que partes refrescar). En proyectos modernos siempre usar `onchange="refresh"`.
|
|
621
|
+
|
|
622
|
+
**`onvaluechanged`** — evento para **lógica de datos**. Su valor es **JavaScript inline normal** (como `onclick`) y se dispara desde la capa de datos, por lo que se ejecuta siempre que el campo cambie de valor **aunque no haya pantalla abierta** (cambios por script de fondo, réplica, etc.). Recibe un objeto `e` con `e.value`, `e.oldValue`, `e.target` (campo), `e.objItem` (objeto) y `e.data`. Solo JavaScript.
|
|
623
|
+
|
|
624
|
+
```xml
|
|
625
|
+
<prop name="CANTIDAD" type="N" visible="1"
|
|
626
|
+
onvaluechanged="self.TOTAL = e.value * self.PRECIO;" />
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
> Útil para lógica que debe ejecutarse siempre que el dato cambie, haya o no pantalla abierta. Detalle completo en topics/05-events-patterns-faq.md §3.2.
|
|
630
|
+
|
|
631
|
+
#### 5.9.26 Propagacion de cambios (updates) y formula
|
|
632
|
+
|
|
633
|
+
**`updates`** — propaga el valor de este campo hacia un campo de una coleccion contents cuando cambia:
|
|
634
|
+
|
|
635
|
+
```xml
|
|
636
|
+
<!-- Al cambiar MAP_ARTICULO, su valor se copia al campo DESCRIPCION del objeto padre -->
|
|
637
|
+
<prop name="MAP_ARTICULO" type="T" visible="7"
|
|
638
|
+
linkedto="IDARTICULO"
|
|
639
|
+
linkedfield="ETIQUETA"
|
|
640
|
+
updates="DESCRIPCION" />
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
**`formula`** — calcula el valor del prop mediante una consulta SQL externa:
|
|
644
|
+
|
|
645
|
+
```xml
|
|
646
|
+
<!-- El valor se calcula con una SQL definida en <ext-formula> -->
|
|
647
|
+
<prop name="MAP_TOTAL_PEDIDOS" type="N"
|
|
648
|
+
formula="ext.[TOTAL_PEDIDOS]"
|
|
649
|
+
onchange="refresh"
|
|
650
|
+
visible="3" />
|
|
651
|
+
|
|
652
|
+
<!-- Definición de la formula en el nodo coll -->
|
|
653
|
+
<ext-formula>
|
|
654
|
+
<param name="TOTAL_PEDIDOS"
|
|
655
|
+
sql="SELECT COUNT(*) AS N FROM ##PREF##Pedidos WHERE IDCLIENTE=##ID##"
|
|
656
|
+
field="N" type="N" cache="true" />
|
|
657
|
+
</ext-formula>
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
| Atributo | Descripción |
|
|
661
|
+
|----------|-------------|
|
|
662
|
+
| `formula` | Referencia a una formula definida en `<ext-formula>`. Formato: `ext.[NOMBRE_FORMULA]` |
|
|
663
|
+
| `cache` | En `<ext-formula>`: `true` cachea el resultado para no recalcular en cada refresco |
|
|
664
|
+
|