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,576 @@
|
|
|
1
|
+
# XOne XML — asfilter, visibilidad, event handlers y macros del sistema
|
|
2
|
+
|
|
3
|
+
> Fuente: `xone/v2/xone-project-generator/references/xone-xml-ui-c-contents-eventos.md` §7b–§10. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
|
|
4
|
+
|
|
5
|
+
Contenido: §7b nodo asfilter (filtros de búsqueda) · §8 event handlers detallados · §9 sistema de visibilidad · §10 macros del sistema
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 7b. Nodo asfilter - Filtros de Busqueda
|
|
10
|
+
|
|
11
|
+
El nodo `<asfilter>` define filtros de busqueda que permiten al usuario filtrar registros dentro de una coleccion de tipo lista. Se coloca como hijo directo de `<coll>`.
|
|
12
|
+
|
|
13
|
+
### Sintaxis
|
|
14
|
+
|
|
15
|
+
```xml
|
|
16
|
+
<asfilter fontsize="8" left="12" sort="false">
|
|
17
|
+
<field name="NOMBRE" fldname="NOMBRE"
|
|
18
|
+
oper="##FLD## LIKE '##VAL##%'" width="15"
|
|
19
|
+
tooltip="Nombre" newline="false">NOMBRE</field>
|
|
20
|
+
<field name="FECHA" fldname="FECHA"
|
|
21
|
+
oper="##FLD## >= '##VAL##'" width="10"
|
|
22
|
+
tooltip="Fecha desde">FECHA DESDE</field>
|
|
23
|
+
</asfilter>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Atributos de `<asfilter>`
|
|
27
|
+
|
|
28
|
+
| Atributo | Tipo | Descripción | Ejemplo |
|
|
29
|
+
|----------|------|-------------|---------|
|
|
30
|
+
| `fontsize` | int | Tamaño de fuente de los campos del filtro | `fontsize="8"` |
|
|
31
|
+
| `left` | int | Margen izquierdo del panel de filtros | `left="12"` |
|
|
32
|
+
| `sort` | bool | Habilita ordenamiento en el filtro | `sort="false"` |
|
|
33
|
+
|
|
34
|
+
### Atributos de `<field>` dentro de asfilter
|
|
35
|
+
|
|
36
|
+
| Atributo | Tipo | Descripción | Ejemplo |
|
|
37
|
+
|----------|------|-------------|---------|
|
|
38
|
+
| `name` | string | Nombre del campo de filtro | `name="NUMCOMPLETO"` |
|
|
39
|
+
| `fldname` | string | Nombre del campo real en la tabla de BD | `fldname="NUMCOMPLETO"` |
|
|
40
|
+
| `oper` | string | Operador SQL. Usa `##FLD##` para el nombre del campo y `##VAL##` para el valor ingresado por el usuario | `oper="##FLD## LIKE '##VAL##%'"` |
|
|
41
|
+
| `width` | int | Ancho del campo de filtro | `width="15"` |
|
|
42
|
+
| `tooltip` | string | Texto de ayuda / placeholder del campo de filtro | `tooltip="Albaran"` |
|
|
43
|
+
| `newline` | bool | Si es `false`, se coloca en la misma linea que el anterior | `newline="false"` |
|
|
44
|
+
|
|
45
|
+
### Operadores SQL Comunes en asfilter
|
|
46
|
+
|
|
47
|
+
| Operador | Descripción | Ejemplo |
|
|
48
|
+
|----------|-------------|---------|
|
|
49
|
+
| `##FLD## LIKE '##VAL##%'` | Comienza con el valor ingresado | Busqueda por inicio de texto |
|
|
50
|
+
| `##FLD## LIKE '%##VAL##%'` | Contiene el valor ingresado | Busqueda parcial |
|
|
51
|
+
| `##FLD## = '##VAL##'` | Igual exacto | Busqueda exacta |
|
|
52
|
+
| `##FLD## >= '##VAL##'` | Mayor o igual | Filtro desde fecha/valor |
|
|
53
|
+
| `##FLD## <= '##VAL##'` | Menor o igual | Filtro hasta fecha/valor |
|
|
54
|
+
|
|
55
|
+
### Ejemplo: Lista con asfilter
|
|
56
|
+
|
|
57
|
+
```xml
|
|
58
|
+
<coll name="ListaAlbaranes"
|
|
59
|
+
sql="SELECT * FROM ##PREF##Albaranes"
|
|
60
|
+
objname="Albaranes" loadall="true"
|
|
61
|
+
notab="true" show-toolbar="false">
|
|
62
|
+
|
|
63
|
+
<asfilter fontsize="8" left="12" sort="false">
|
|
64
|
+
<field name="NUMCOMPLETO" fldname="NUMCOMPLETO"
|
|
65
|
+
oper="##FLD## LIKE '##VAL##%'" width="15"
|
|
66
|
+
tooltip="Albaran" newline="false">ALBARAN</field>
|
|
67
|
+
<field name="FECHA_DESDE" fldname="FECHA"
|
|
68
|
+
oper="##FLD## >= '##VAL##'" width="10"
|
|
69
|
+
tooltip="Fecha desde">FECHA DESDE</field>
|
|
70
|
+
<field name="FECHA_HASTA" fldname="FECHA"
|
|
71
|
+
oper="##FLD## <= '##VAL##'" width="10"
|
|
72
|
+
tooltip="Fecha hasta" newline="false">FECHA HASTA</field>
|
|
73
|
+
</asfilter>
|
|
74
|
+
|
|
75
|
+
<group name="Lista" id="1">
|
|
76
|
+
<!-- Campos de la lista -->
|
|
77
|
+
</group>
|
|
78
|
+
</coll>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 8. Event Handlers Detallados
|
|
84
|
+
|
|
85
|
+
### Estructura General de un Handler
|
|
86
|
+
|
|
87
|
+
```xml
|
|
88
|
+
<nombreEvento show-wait-dialog="false" refresh="false">
|
|
89
|
+
<action name="runscript">
|
|
90
|
+
<param name="parametro1" />
|
|
91
|
+
<param name="parametro2" />
|
|
92
|
+
<script language="javascript">
|
|
93
|
+
// Código JavaScript
|
|
94
|
+
</script>
|
|
95
|
+
</action>
|
|
96
|
+
</nombreEvento>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Atributos del Handler
|
|
100
|
+
|
|
101
|
+
| Atributo | Tipo | Descripción | Ejemplo |
|
|
102
|
+
|----------|------|-------------|---------|
|
|
103
|
+
| `show-wait-dialog` | bool | Mostrar dialogo de espera mientras ejecuta | `show-wait-dialog="false"` |
|
|
104
|
+
| `refresh` | bool | Refrescar la UI después de ejecutar | `refresh="false"` |
|
|
105
|
+
|
|
106
|
+
### Tipos de Acciones
|
|
107
|
+
|
|
108
|
+
| Action name | Descripción | Ejemplo |
|
|
109
|
+
|-------------|-------------|---------|
|
|
110
|
+
| `runscript` | Ejecutar código JavaScript | `<action name="runscript">` |
|
|
111
|
+
| `setval` | Establecer valor de un campo | `<action name="setval" field="CAMPO" value="valor" />` |
|
|
112
|
+
|
|
113
|
+
### Handler: create
|
|
114
|
+
|
|
115
|
+
Se ejecuta UNA SOLA VEZ cuando se crea el objeto. Ideal para inicialización.
|
|
116
|
+
|
|
117
|
+
```xml
|
|
118
|
+
<create>
|
|
119
|
+
<action name="setval" field="MAP_VERSION"
|
|
120
|
+
value="Versión ##VERSION## - Framework ##FRAME_VERSION##" />
|
|
121
|
+
<action name="runscript">
|
|
122
|
+
<script language="javascript">
|
|
123
|
+
self.MAP_HUELLA = 0;
|
|
124
|
+
if (fingerprintManager.isHardwareAvailable()) {
|
|
125
|
+
if (fingerprintManager.hasEnrolledFingerprints()) {
|
|
126
|
+
self.MAP_HUELLA = 1;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
</script>
|
|
130
|
+
</action>
|
|
131
|
+
</create>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Handler: load
|
|
135
|
+
|
|
136
|
+
Se ejecuta cuando se cargan los datos de un `<contents>` embebido. **No es el evento que se dispara al mostrar la pantalla** — para eso usar `before-edit`. El uso de `load` es infrecuente y especifico para reaccionar a la carga de un contents.
|
|
137
|
+
|
|
138
|
+
```xml
|
|
139
|
+
<load>
|
|
140
|
+
<action name="runscript">
|
|
141
|
+
<script language="javascript">
|
|
142
|
+
// Código que se ejecuta cuando un contents carga sus datos
|
|
143
|
+
</script>
|
|
144
|
+
</action>
|
|
145
|
+
</load>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Handler: onchange
|
|
149
|
+
|
|
150
|
+
Se ejecuta cuando cambia el valor de cualquier campo.
|
|
151
|
+
|
|
152
|
+
```xml
|
|
153
|
+
<onchange>
|
|
154
|
+
<!-- Handler para un campo específico -->
|
|
155
|
+
<field name="MAP_CANTIDAD">
|
|
156
|
+
<action name="runscript">
|
|
157
|
+
<script language="javascript">
|
|
158
|
+
self.MAP_TOTAL = self.MAP_CANTIDAD * self.MAP_PRECIO;
|
|
159
|
+
ui.refresh("MAP_TOTAL");
|
|
160
|
+
</script>
|
|
161
|
+
</action>
|
|
162
|
+
</field>
|
|
163
|
+
|
|
164
|
+
<!-- Handler generico para CUALQUIER campo (##ANY##) -->
|
|
165
|
+
<field name="##ANY##">
|
|
166
|
+
<action name="runscript">
|
|
167
|
+
<param name="ChgField" />
|
|
168
|
+
<script language="javascript">
|
|
169
|
+
console.log("Campo modificado: " + ChgField);
|
|
170
|
+
</script>
|
|
171
|
+
</action>
|
|
172
|
+
</field>
|
|
173
|
+
</onchange>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Handler: onback
|
|
177
|
+
|
|
178
|
+
Se ejecuta al pulsar el botón atrás del dispositivo.
|
|
179
|
+
|
|
180
|
+
```xml
|
|
181
|
+
<onback show-wait-dialog="false" refresh="false">
|
|
182
|
+
<action name="runscript">
|
|
183
|
+
<script language="javascript">
|
|
184
|
+
let window = ui.getView(self);
|
|
185
|
+
if (window) {
|
|
186
|
+
window.exit();
|
|
187
|
+
}
|
|
188
|
+
</script>
|
|
189
|
+
</action>
|
|
190
|
+
</onback>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Para la pantalla de entrada (salir de la app):
|
|
194
|
+
|
|
195
|
+
```xml
|
|
196
|
+
<onback show-wait-dialog="false" refresh="false">
|
|
197
|
+
<action name="runscript">
|
|
198
|
+
<script language="javascript">
|
|
199
|
+
appData.exit();
|
|
200
|
+
</script>
|
|
201
|
+
</action>
|
|
202
|
+
</onback>
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Handler: selecteditem
|
|
206
|
+
|
|
207
|
+
Se ejecuta al seleccionar un elemento en una lista.
|
|
208
|
+
|
|
209
|
+
```xml
|
|
210
|
+
<selecteditem show-wait-dialog="false" refresh="false">
|
|
211
|
+
<action name="runscript">
|
|
212
|
+
<param name="view" />
|
|
213
|
+
<script language="javascript">
|
|
214
|
+
ui.openEditView(self);
|
|
215
|
+
</script>
|
|
216
|
+
</action>
|
|
217
|
+
</selecteditem>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Handler: before-edit
|
|
221
|
+
|
|
222
|
+
Se ejecuta ANTES de entrar en modo edición de un registro. Ideal para preparar datos, vincular eventos y configurar la vista.
|
|
223
|
+
|
|
224
|
+
```xml
|
|
225
|
+
<before-edit refresh="false" show-wait-dialog="false">
|
|
226
|
+
<action name="runscript">
|
|
227
|
+
<script language="javascript">
|
|
228
|
+
self.MAP_LOADING = 0;
|
|
229
|
+
var vista = ui.getView(self);
|
|
230
|
+
vista.bind("BTN_ACCION", "onclick", manejarClick);
|
|
231
|
+
</script>
|
|
232
|
+
</action>
|
|
233
|
+
</before-edit>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Handler: after-edit
|
|
237
|
+
|
|
238
|
+
Se ejecuta DESPUES de entrar en modo edición. Útil para cargar datos adicionales o actualizar la interfaz.
|
|
239
|
+
|
|
240
|
+
```xml
|
|
241
|
+
<after-edit refresh="false" show-wait-dialog="false">
|
|
242
|
+
<action name="runscript">
|
|
243
|
+
<script language="javascript">
|
|
244
|
+
self.MAP_VERSION = "Versión: " + appData.getGlobalMacro("##VERSION##");
|
|
245
|
+
ui.refresh("MAP_VERSION");
|
|
246
|
+
</script>
|
|
247
|
+
</action>
|
|
248
|
+
</after-edit>
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Handler: update
|
|
252
|
+
|
|
253
|
+
Se ejecuta al actualizar un registro existente en la base de datos.
|
|
254
|
+
|
|
255
|
+
```xml
|
|
256
|
+
<update>
|
|
257
|
+
<action name="setval" field="FECHAMOD" value="##NOW##" />
|
|
258
|
+
<action name="setval" field="USUARIO_MOD" value="##USERID##" />
|
|
259
|
+
</update>
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Handler: insert
|
|
263
|
+
|
|
264
|
+
Se ejecuta después de insertar un nuevo registro en la base de datos.
|
|
265
|
+
|
|
266
|
+
```xml
|
|
267
|
+
<insert refresh="true" show-wait-dialog="false">
|
|
268
|
+
<action name="runscript">
|
|
269
|
+
<script language="javascript">
|
|
270
|
+
ui.showToast("Registro creado exitosamente");
|
|
271
|
+
</script>
|
|
272
|
+
</action>
|
|
273
|
+
</insert>
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Handler: delete
|
|
277
|
+
|
|
278
|
+
Se ejecuta al eliminar un registro. Se puede cancelar la eliminación lanzando un error.
|
|
279
|
+
|
|
280
|
+
```xml
|
|
281
|
+
<delete refresh="true" show-wait-dialog="false">
|
|
282
|
+
<action name="runscript">
|
|
283
|
+
<script language="javascript">
|
|
284
|
+
if (self.TIENE_DEPENDENCIAS == 1) {
|
|
285
|
+
throw new Error("No se puede eliminar: existen registros dependientes");
|
|
286
|
+
}
|
|
287
|
+
</script>
|
|
288
|
+
</action>
|
|
289
|
+
</delete>
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Handlers Personalizados (Custom)
|
|
293
|
+
|
|
294
|
+
Se definen con nombres propios y se invocan con `ExecuteNode()`.
|
|
295
|
+
|
|
296
|
+
**Definición:**
|
|
297
|
+
|
|
298
|
+
```xml
|
|
299
|
+
<aceptarLogin refresh="false">
|
|
300
|
+
<action name="runscript">
|
|
301
|
+
<script language="javascript">
|
|
302
|
+
hacerLogin(self.MAP_USUARIO, self.MAP_PASSWORD);
|
|
303
|
+
</script>
|
|
304
|
+
</action>
|
|
305
|
+
</aceptarLogin>
|
|
306
|
+
|
|
307
|
+
<!-- Handler con parametros -->
|
|
308
|
+
<irGrupo show-wait-dialog="false">
|
|
309
|
+
<action name="runscript">
|
|
310
|
+
<param name="grupo" />
|
|
311
|
+
<script language="javascript">
|
|
312
|
+
ui.showGroup(parseInt(grupo));
|
|
313
|
+
</script>
|
|
314
|
+
</action>
|
|
315
|
+
</irGrupo>
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Invocación desde prop (3 formas):**
|
|
319
|
+
|
|
320
|
+
```xml
|
|
321
|
+
<!-- Forma 1: method con executenode -->
|
|
322
|
+
<prop name="MAP_BTN" type="B"
|
|
323
|
+
method="executenode(aceptarLogin)" />
|
|
324
|
+
|
|
325
|
+
<!-- Forma 2: Con parametros -->
|
|
326
|
+
<prop name="MAP_BTN2" type="B"
|
|
327
|
+
method="executenode(irGrupo(2))" />
|
|
328
|
+
|
|
329
|
+
<!-- Forma 3: onclick con self.executeNode (script JS inline, requiere ';' al final) -->
|
|
330
|
+
<!-- IMPORTANTE: el nombre del nodo va como STRING LITERAL, no como llamada a función. -->
|
|
331
|
+
<!-- MAL: onclick="ExecuteNode(loginHuella());" (ExecuteNode no es global y loginHuella() se evaluaría) -->
|
|
332
|
+
<!-- BIEN: usar self.executeNode con el nombre del nodo entre comillas. -->
|
|
333
|
+
<prop name="MAP_BTN3" type="B"
|
|
334
|
+
onclick="self.executeNode('loginHuella');" />
|
|
335
|
+
|
|
336
|
+
<!-- Con parámetros (se pasan después del nombre del nodo): -->
|
|
337
|
+
<prop name="MAP_BTN4" type="B"
|
|
338
|
+
onclick="self.executeNode('irGrupo', 2);" />
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 9. Sistema de Visibilidad
|
|
344
|
+
|
|
345
|
+
### Mapa de Bits (Bitmask)
|
|
346
|
+
|
|
347
|
+
El atributo `visible` es un **mapa de bits** que controla en que contextos se muestra una propiedad.
|
|
348
|
+
|
|
349
|
+
| Bit | Valor | Contexto |
|
|
350
|
+
|-----|-------|----------|
|
|
351
|
+
| 0 | 1 | Visible en **modo edición** (formulario individual) |
|
|
352
|
+
| 1 | 2 | Visible en **modo lista** (fila de la lista) |
|
|
353
|
+
| 2 | 4 | Visible en **lista contenida** (content/embebida) |
|
|
354
|
+
| 3 | 8 | Visible en **desplegable** (combo) |
|
|
355
|
+
|
|
356
|
+
### Combinaciones Comunes
|
|
357
|
+
|
|
358
|
+
| Valor | Bits Activos | Significado | Uso Típico |
|
|
359
|
+
|-------|-------------|-------------|------------|
|
|
360
|
+
| `0` | ninguno | **Oculto** en todos los modos | Campos internos, IDs, calculos ocultos |
|
|
361
|
+
| `1` | bit 0 | Solo en **edición** | Campos de formulario, botones de acción |
|
|
362
|
+
| `2` | bit 1 | Solo en **lista** | Resumen, campos visibles en la fila |
|
|
363
|
+
| `3` | bits 0,1 | **Edición y lista** | Campos principales que se ven siempre |
|
|
364
|
+
| `4` | bit 2 | Solo en **content** | Campos visibles solo en listas embebidas |
|
|
365
|
+
| `7` | bits 0,1,2 | **Todos los modos** (excepto combo) | Campos universales, la mayoría de campos visibles |
|
|
366
|
+
|
|
367
|
+
### Visibilidad Condicional (disablevisible)
|
|
368
|
+
|
|
369
|
+
El atributo `disablevisible` permite ocultar/mostrar campos dinámicamente según el valor de otros campos.
|
|
370
|
+
|
|
371
|
+
**Sintaxis:** `disablevisible="CAMPO_CONDICION=VALOR_QUE_OCULTA"`
|
|
372
|
+
|
|
373
|
+
Cuando la condición se cumple, el campo SE OCULTA.
|
|
374
|
+
|
|
375
|
+
```xml
|
|
376
|
+
<!-- Se OCULTA cuando MAP_TIPO vale 0 -->
|
|
377
|
+
<prop name="MAP_DETALLE" type="T" visible="7"
|
|
378
|
+
disablevisible="MAP_TIPO=0" />
|
|
379
|
+
|
|
380
|
+
<!-- Se OCULTA cuando MAP_ERROR esta vacio -->
|
|
381
|
+
<frame name="frmError"
|
|
382
|
+
disablevisible="MAP_ERROR=''"
|
|
383
|
+
floating="true">
|
|
384
|
+
<prop name="MAP_ERROR" type="L" visible="1"
|
|
385
|
+
forecolor="#F44336" />
|
|
386
|
+
</frame>
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## 10. Macros del Sistema
|
|
392
|
+
|
|
393
|
+
Las macros son tokens que XOne resuelve en tiempo de ejecución. Se usan en atributos XML con formato `##NOMBRE##`.
|
|
394
|
+
|
|
395
|
+
### Macros de Base de Datos
|
|
396
|
+
|
|
397
|
+
| Macro | Descripción | Uso Típico |
|
|
398
|
+
|-------|-------------|------------|
|
|
399
|
+
| `##PREF##` | Prefijo de tablas en BD (definido en `<app prefix="...">`) | `SELECT * FROM ##PREF##Usuarios` |
|
|
400
|
+
| `##ENTID##` | ID de la empresa/entidad actual | `WHERE IDEMPRESA = ##ENTID##` |
|
|
401
|
+
| `##USERID##` | ID del usuario actualmente logueado | `WHERE ID_USUARIO = ##USERID##` |
|
|
402
|
+
|
|
403
|
+
### Macros de Fecha y Hora
|
|
404
|
+
|
|
405
|
+
| Macro | Descripción | Uso Típico |
|
|
406
|
+
|-------|-------------|------------|
|
|
407
|
+
| `##NOW##` | Fecha y hora actual del sistema | `<action name="setval" field="FECHA" value="##NOW##" />` |
|
|
408
|
+
| `##NOW_TIME##` | Hora actual del sistema | `<action name="setval" field="HORA" value="##NOW_TIME##" />` |
|
|
409
|
+
|
|
410
|
+
### Macros de Aplicación
|
|
411
|
+
|
|
412
|
+
| Macro | Descripción | Uso Típico |
|
|
413
|
+
|-------|-------------|------------|
|
|
414
|
+
| `##VERSION##` | Versión de la aplicación (definida en `<app versión="...">`) | `title="Versión ##VERSION##"` |
|
|
415
|
+
| `##FRAME_VERSION##` | Versión del framework XOne | `title="Framework ##FRAME_VERSION##"` |
|
|
416
|
+
| `##FRAME_VERSION_CODE##` | Código de versión numérico del framework | Consola técnica |
|
|
417
|
+
| `##LIVEUPDATE_VERSION##` | Versión del módulo XOneLive (actualización OTA). Si no esta instalado, la macro no se sustituye | Consola técnica |
|
|
418
|
+
| `##APP##` | Ruta de la carpeta de la aplicación en el dispositivo | `path="##APP##\icons\imagen.png"` |
|
|
419
|
+
|
|
420
|
+
### Macros de Dispositivo
|
|
421
|
+
|
|
422
|
+
| Macro | Descripción | Uso Típico |
|
|
423
|
+
|-------|-------------|------------|
|
|
424
|
+
| `##DEVICEID##` | Identificador único del dispositivo (IMEI o equivalente) | `filter="DEVICE=##DEVICEID##"` |
|
|
425
|
+
| `##MID##` | Machine ID del dispositivo (identificador interno XOne) | `title="MID: ##MID##"` |
|
|
426
|
+
| `##DEVICE_MODEL##` | Modelo del dispositivo (ej. "Samsung Galaxy S21") | `title="Modelo: ##DEVICE_MODEL##"` |
|
|
427
|
+
| `##DEVICE_OS##` | Sistema operativo: `android` o `ios` | `disablevisible="MAP_OS='ios'"` |
|
|
428
|
+
| `##DEVICE_OSVERSION##` | Versión del sistema operativo | `title="SO: ##DEVICE_OSVERSION##"` |
|
|
429
|
+
| `##DEVICE_MANUFACTURER##` | Fabricante del dispositivo | `title="Fabricante: ##DEVICE_MANUFACTURER##"` |
|
|
430
|
+
| `##DEVICE_TYPE##` | Tipo de dispositivo (phone, tablet...) | `title="Tipo: ##DEVICE_TYPE##"` |
|
|
431
|
+
| `##CURRENT_ORIENTATION##` | Orientación actual: `portrait` o `landscape` | Lógica de layout |
|
|
432
|
+
| `##CURRENT_DENSITY##` | Tipo de densidad de pantalla (ldpi, mdpi, hdpi...) | Consola técnica |
|
|
433
|
+
| `##CURRENT_DENSITY_VALUE##` | Valor numérico de la densidad de pantalla | Consola técnica |
|
|
434
|
+
| `##SCREEN_RESOLUTION_WIDTH##` | Ancho de pantalla en pixels | Consola técnica |
|
|
435
|
+
| `##SCREEN_RESOLUTION_HEIGHT##` | Alto de pantalla en pixels | Consola técnica |
|
|
436
|
+
|
|
437
|
+
### Cerrar pantalla / cerrar aplicación
|
|
438
|
+
|
|
439
|
+
Formas correctas desde JavaScript:
|
|
440
|
+
|
|
441
|
+
```javascript
|
|
442
|
+
// Cerrar la ventana/pantalla actual
|
|
443
|
+
ui.getView(self).exit();
|
|
444
|
+
|
|
445
|
+
// Cerrar toda la aplicación
|
|
446
|
+
appData.exit();
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
**Código heredado:** En proyectos antiguos puede aparecer `appData.failWithMessage(-11888, "##EXIT##")` (con la macro `##EXIT##`) para cerrar la pantalla. Sigue funcionando, pero las formas de arriba son preferidas.
|
|
450
|
+
|
|
451
|
+
### Macros de Campos Dinámicas (`##FLD_CAMPO##`)
|
|
452
|
+
|
|
453
|
+
Las macros `##FLD_CAMPO##` se resuelven al valor actual del campo especificado. Son fundamentales para:
|
|
454
|
+
- Filtros de contents (relaciones maestro-detalle)
|
|
455
|
+
- Colores dinámicos basados en datos
|
|
456
|
+
- Textos e imágenes dinámicas en atributos
|
|
457
|
+
- Cualquier atributo XML que necesite un valor del registro actual
|
|
458
|
+
|
|
459
|
+
| Macro | Descripción |
|
|
460
|
+
|-------|-------------|
|
|
461
|
+
| `##FLD_NOMBRE_CAMPO##` | Se reemplaza por el valor actual del campo `NOMBRE_CAMPO` |
|
|
462
|
+
|
|
463
|
+
```xml
|
|
464
|
+
<!-- Color de fondo dinámico basado en un campo -->
|
|
465
|
+
<prop name="MAP_LABEL" type="L"
|
|
466
|
+
bgcolor="##FLD_MAP_COLOR##" />
|
|
467
|
+
|
|
468
|
+
<!-- Imagen dinámica basada en un campo -->
|
|
469
|
+
<prop name="BTN_ORDENAR" type="B"
|
|
470
|
+
img="##FLD_MAP_ICONO_ORDEN##" />
|
|
471
|
+
|
|
472
|
+
<!-- Filtro de contents con campo del padre -->
|
|
473
|
+
<contents name="@Detalles" src="LineasDetalle"
|
|
474
|
+
filter="ID_PADRE=##FLD_ID##" />
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### Macros de Coleccion — Nodo XML `<macro>` + `setMacro`/`getMacro`
|
|
478
|
+
|
|
479
|
+
Las macros de coleccion son **distintas** de las macros del sistema y de las `##FLD_CAMPO##`. Son tokens definidos por el desarrollador en el XML de una `<coll>` que se sustituyen en su SQL/filter en tiempo de ejecución, y cuyo valor se cambia desde JavaScript con `setMacro` / `getMacro`. Es la herramienta principal para **filtros dinámicos por interaccion del usuario** (ej. cambiar el filtro de una lista cuando se elige un combo).
|
|
480
|
+
|
|
481
|
+
#### Declaración en XML — nodo `<macro>`
|
|
482
|
+
|
|
483
|
+
El nodo `<macro>` se coloca **al mismo nivel que los nodos `<group>`** (hijo directo de `<coll>`, no anidado dentro de un `<group>` ni de un `<frame>`).
|
|
484
|
+
|
|
485
|
+
```xml
|
|
486
|
+
<macro name="##NOMBRE##" value="valor por defecto" default="true" />
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
| Atributo | Descripción |
|
|
490
|
+
|----------|-------------|
|
|
491
|
+
| `name` | Nombre con `##...##`. Libre (`##TIPO##`, `##FILTRO##`, `##MACRO1##`...). |
|
|
492
|
+
| `value` | Valor por defecto. Puede ser un literal o un fragmento SQL completo (ej. `"1=1"`, `"FILTRO='A'"`, una subconsulta entera). Se inyecta tal cual donde aparezca el token en el SQL. |
|
|
493
|
+
| `default`| `true`/`false`. Indica si la macro se aplica por defecto. **Convencion: poner siempre `default="true"`** salvo que tengas razón explicita para lo contrario. |
|
|
494
|
+
|
|
495
|
+
#### Ejemplo end-to-end (XML + JS)
|
|
496
|
+
|
|
497
|
+
```xml
|
|
498
|
+
<?xml version="1.0" encoding="iso-8859-15"?>
|
|
499
|
+
<coll name="ListaControles"
|
|
500
|
+
progid="ASData.CASBasicDataObj"
|
|
501
|
+
sql="SELECT ID, TITULO, FILTRO FROM ##PREF##CONTROLES WHERE ##TIPO##"
|
|
502
|
+
objname="Controles"
|
|
503
|
+
loadall="true">
|
|
504
|
+
|
|
505
|
+
<!-- Declaracion de la macro: al mismo nivel que <group> -->
|
|
506
|
+
<macro name="##TIPO##" value="1=1" default="true" />
|
|
507
|
+
|
|
508
|
+
<group name="General" id="1">
|
|
509
|
+
<prop name="TITULO" type="T" visible="7" />
|
|
510
|
+
<prop name="FILTRO" type="T" visible="7" />
|
|
511
|
+
</group>
|
|
512
|
+
</coll>
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
```javascript
|
|
516
|
+
// Cambio del filtro desde un onchange de un combo en la pantalla padre
|
|
517
|
+
var coll = self.getContents("content1");
|
|
518
|
+
if (self.TIPO == "TODOS") {
|
|
519
|
+
coll.setMacro("##TIPO##", "1=1"); // No filtra (todo)
|
|
520
|
+
} else {
|
|
521
|
+
coll.setMacro("##TIPO##", "FILTRO='" + self.TIPO.toString() + "'");
|
|
522
|
+
}
|
|
523
|
+
ui.refresh();
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
> **API correcta:** `setMacro("##NOMBRE##", valor)` y `getMacro("##NOMBRE##")`. **NUNCA** `coll.macro(...)` — esa forma no existe en XOne y produce error.
|
|
527
|
+
|
|
528
|
+
> **Diferencia con `setGlobalMacro`:** `coll.setMacro` afecta SOLO al SQL de esa coleccion. `appData.setGlobalMacro` guarda un valor en una macro **global** accesible desde cualquier punto del código (equivalente XOne a una variable global / a `localStorage` del navegador).
|
|
529
|
+
|
|
530
|
+
### Macros de Animación
|
|
531
|
+
|
|
532
|
+
| Macro | Descripción |
|
|
533
|
+
|-------|-------------|
|
|
534
|
+
| `##ALPHA_IN##` | Fade in |
|
|
535
|
+
| `##ALPHA_OUT##` | Fade out |
|
|
536
|
+
| `##ZOOM_IN##` | Zoom de entrada |
|
|
537
|
+
| `##ZOOM_OUT##` | Zoom de salida |
|
|
538
|
+
| `##LEFT_IN##` | Entrada desde la izquierda |
|
|
539
|
+
| `##LEFT_OUT##` | Salida hacia la izquierda |
|
|
540
|
+
| `##RIGHT_IN##` | Entrada desde la derecha |
|
|
541
|
+
| `##RIGHT_OUT##` | Salida hacia la derecha |
|
|
542
|
+
| `##TOP_IN##` | Entrada desde arriba |
|
|
543
|
+
| `##BOTTOM_IN##` | Entrada desde abajo |
|
|
544
|
+
| `##PUSH_IN##` | Push desde abajo |
|
|
545
|
+
| `##PUSH_OUT##` | Push hacia arriba |
|
|
546
|
+
| `##PUSH_DOWN_IN##` | Push desde arriba |
|
|
547
|
+
| `##PUSH_DOWN_OUT##` | Push hacia abajo |
|
|
548
|
+
| `##SLIDE_DOWN_IN##` | Deslizamiento hacia abajo de entrada |
|
|
549
|
+
| `##SLIDE_UP_OUT##` | Deslizamiento hacia arriba de salida |
|
|
550
|
+
| `##ROTATE3D_IN##` | Rotación 3D entrada |
|
|
551
|
+
| `##ROTATE3D_OUT##` | Rotación 3D salida |
|
|
552
|
+
|
|
553
|
+
Las macros de animación se usan en tres contextos:
|
|
554
|
+
|
|
555
|
+
```xml
|
|
556
|
+
<!-- 1. En colecciones (transiciones de pantalla) -->
|
|
557
|
+
<coll name="MiPantalla" animation-in="##RIGHT_IN##" animation-out="##LEFT_OUT##">
|
|
558
|
+
|
|
559
|
+
<!-- 2. En frames (animaciones de elementos) -->
|
|
560
|
+
<frame name="frmPanel" animation-in="##ALPHA_IN##" animation-in-delay="250"
|
|
561
|
+
animation-out="##ALPHA_OUT##" animation-out-delay="250" />
|
|
562
|
+
|
|
563
|
+
<!-- 3. En JavaScript (navegacion programatica) -->
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
```javascript
|
|
567
|
+
// Navegacion entre grupos con animacion
|
|
568
|
+
ui.showGroup(2, "##ALPHA_IN##", 500, "##ALPHA_OUT##", 500);
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### Macros Adicionales
|
|
572
|
+
|
|
573
|
+
| Macro | Descripción |
|
|
574
|
+
|-------|-------------|
|
|
575
|
+
| `##ANY##` | Comodin para onchange (cualquier campo). Captura cambios en todos los campos |
|
|
576
|
+
|