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,561 @@
|
|
|
1
|
+
# XOne — FAQ por área
|
|
2
|
+
|
|
3
|
+
> Fuente: `xone/v2/xone-help-docs/topics/05-events-patterns-faq.md` §14–§18. Referencia de la skill; el índice está en [../SKILL.md](../SKILL.md).
|
|
4
|
+
|
|
5
|
+
Contenido: §14 FAQ general · §15 FAQ XML/UI · §16 FAQ JavaScript · §17 FAQ CSS · §18 FAQ estructura de proyecto
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 14. FAQ General
|
|
10
|
+
|
|
11
|
+
### Que es XOne?
|
|
12
|
+
|
|
13
|
+
XOne es una plataforma de desarrollo de aplicaciones móviles que permite crear apps nativas para Android e iOS desde un único código base. Utiliza archivos XML (.xne) para definir la interfaz, JavaScript para la lógica de negocio y un CSS propietario para los estilos.
|
|
14
|
+
|
|
15
|
+
### Es XOne multiplataforma?
|
|
16
|
+
|
|
17
|
+
Si. XOne genera aplicaciones nativas para Android e iOS a partir del mismo código XML, JavaScript y CSS. No es una solución hibrida basada en WebView - genera UIs nativas.
|
|
18
|
+
|
|
19
|
+
### Necesito saber Java/Swift?
|
|
20
|
+
|
|
21
|
+
No. XOne abstrae la capa nativa mediante su propio sistema de XML + JavaScript + CSS. Solo necesitas conocer estos tres lenguajes en su variante XOne. Sin embargo, se pueden crear extensiones nativas en la carpeta `native/` si se necesita funcionalidad especifica de la plataforma.
|
|
22
|
+
|
|
23
|
+
### Como funciona la sincronización?
|
|
24
|
+
|
|
25
|
+
XOne incluye un sistema de replica integrado que sincroniza datos entre el dispositivo móvil y un servidor. Se configura en el nodo `<maintenance>` de la coleccion `Empresas` en `mappings.xne`. Los datos locales se almacenan en SQLite y se sincronizan según la frecuencia configurada.
|
|
26
|
+
|
|
27
|
+
### Que base de datos usa XOne?
|
|
28
|
+
|
|
29
|
+
XOne usa SQLite como base de datos local en el dispositivo. El archivo de base de datos (`gestion.db`) se almacena en la carpeta `bd/` del proyecto. Las tablas se generan automáticamente a partir de las definiciones en los archivos `.xne`.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 15. FAQ XML/UI
|
|
34
|
+
|
|
35
|
+
### Como hago un layout responsive?
|
|
36
|
+
|
|
37
|
+
Usa porcentajes para anchos y altos, y puntos (`p`) para margenes y tamaños fijos:
|
|
38
|
+
|
|
39
|
+
```xml
|
|
40
|
+
<frame name="frmResponsive" width="100%" height="auto">
|
|
41
|
+
<prop name="campo1" type="T" width="48%" height="56p"/>
|
|
42
|
+
<prop name="campo2" type="T" width="48%" height="56p" newline="false"/>
|
|
43
|
+
</frame>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Como creo un menu con tarjetas?
|
|
47
|
+
|
|
48
|
+
Ver la sección [9.3 Menu con tarjetas](#93-menu-con-tarjetas) en los patrones de navegación.
|
|
49
|
+
|
|
50
|
+
### Como oculto/muestro elementos condicionalmente?
|
|
51
|
+
|
|
52
|
+
Usa el atributo `disablevisible`:
|
|
53
|
+
|
|
54
|
+
```xml
|
|
55
|
+
<!-- Se oculta cuando MAP_MOSTRAR vale 0 -->
|
|
56
|
+
<prop name="lblInfo" type="L" disablevisible="MAP_MOSTRAR=0" title="Info"/>
|
|
57
|
+
|
|
58
|
+
<!-- Se oculta cuando MAP_ESTADO no es ACTIVO -->
|
|
59
|
+
<frame name="frmActivo" disablevisible="MAP_ESTADO<>'ACTIVO'">
|
|
60
|
+
<!-- contenido -->
|
|
61
|
+
</frame>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Como creo una lista con recyclerview?
|
|
65
|
+
|
|
66
|
+
```xml
|
|
67
|
+
<prop name="@miLista" type="Z" contents="miLista"
|
|
68
|
+
viewmode="recyclerview" width="100%" height="70%"/>
|
|
69
|
+
<contents name="miLista" src="MiColeccionDatos"/>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Como hago un combo/selector?
|
|
73
|
+
|
|
74
|
+
```xml
|
|
75
|
+
<!-- Con valores estaticos -->
|
|
76
|
+
<prop name="MAP_COMBO_ID" type="T" visible="0"
|
|
77
|
+
mapcol-values="Opcion1, Opcion2, Opcion3" mapfld="DATA"/>
|
|
78
|
+
<prop name="COMBO" type="T" visible="1" title="Seleccionar"
|
|
79
|
+
showinline="true" linkedto="MAP_COMBO_ID" linkedfield="DATA"/>
|
|
80
|
+
|
|
81
|
+
<!-- Con datos de coleccion -->
|
|
82
|
+
<prop name="MAP_COMBO_ID2" type="N" visible="0"
|
|
83
|
+
mapcol="MiColeccion" mapfld="ID"/>
|
|
84
|
+
<prop name="COMBO2" type="T" visible="1" title="Seleccionar"
|
|
85
|
+
linkedto="MAP_COMBO_ID2" linkedfield="NOMBRE"/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
> **Referencia cruzada:** Para más detalles sobre combos y selectores, consultar el tópico 02 sobre estructura XML.
|
|
89
|
+
|
|
90
|
+
### Como pongo dos elementos en la misma linea?
|
|
91
|
+
|
|
92
|
+
Usa `newline="false"` en el segundo elemento:
|
|
93
|
+
|
|
94
|
+
```xml
|
|
95
|
+
<prop name="campo1" type="T" width="48%" height="56p"/>
|
|
96
|
+
<prop name="campo2" type="T" width="48%" height="56p" newline="false"/>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Como creo un header fijo?
|
|
100
|
+
|
|
101
|
+
Usa un `<group>` con `class="groupfixed_header"` y `id="10"` (o un id alto):
|
|
102
|
+
|
|
103
|
+
```xml
|
|
104
|
+
<group name="HEADER" id="10" class="groupfixed_header">
|
|
105
|
+
<frame name="frmtitulo" class="frmsuperior">
|
|
106
|
+
<prop name="SALIR" type="B" class="btvolversuper"/>
|
|
107
|
+
<prop name="MENU" type="L" class="tlsuper" title="MI PANTALLA"/>
|
|
108
|
+
</frame>
|
|
109
|
+
</group>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Que es visible="7" y por que no visible="true"?
|
|
113
|
+
|
|
114
|
+
El atributo `visible` usa un bitmask (mascara de bits):
|
|
115
|
+
|
|
116
|
+
| Valor | Significado |
|
|
117
|
+
|-------|-------------|
|
|
118
|
+
| `0` | Oculto en todos los modos |
|
|
119
|
+
| `1` | Solo en modo edición |
|
|
120
|
+
| `2` | Solo en modo lista |
|
|
121
|
+
| `4` | Solo en contents (filas) |
|
|
122
|
+
| `7` | Visible en todos los modos (1+2+4) |
|
|
123
|
+
|
|
124
|
+
Por eso `visible="7"` equivale a "siempre visible" y no se usa `true`/`false`.
|
|
125
|
+
|
|
126
|
+
> **Referencia cruzada:** Para la tabla completa de visibilidad, consultar el tópico 02.
|
|
127
|
+
|
|
128
|
+
### Como hago un campo de solo lectura?
|
|
129
|
+
|
|
130
|
+
```xml
|
|
131
|
+
<prop name="MAP_NOMBRE" type="T" locked="true" title="Nombre"/>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Diferencia entre onclick y method?
|
|
135
|
+
|
|
136
|
+
- **`onclick`**: Ejecuta JavaScript directamente. Accede al objeto evento `e`.
|
|
137
|
+
- **`method`**: Invoca un nodo de evento definido en la coleccion mediante `ExecuteNode()`.
|
|
138
|
+
|
|
139
|
+
```xml
|
|
140
|
+
<!-- onclick: JS directo -->
|
|
141
|
+
<prop name="btn1" type="B" onclick="javascript:miFuncion();"/>
|
|
142
|
+
|
|
143
|
+
<!-- method: invoca nodo -->
|
|
144
|
+
<prop name="btn2" type="B" method="ExecuteNode(miNodo)"/>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 16. FAQ JavaScript
|
|
150
|
+
|
|
151
|
+
### Como accedo a un campo del formulario?
|
|
152
|
+
|
|
153
|
+
```javascript
|
|
154
|
+
// Leer
|
|
155
|
+
var nombre = self.MAP_NOMBRE;
|
|
156
|
+
var precio = self.MAP_PRECIO;
|
|
157
|
+
|
|
158
|
+
// Escribir
|
|
159
|
+
self.MAP_NOMBRE = "Nuevo valor";
|
|
160
|
+
self.MAP_PRECIO = 29.99;
|
|
161
|
+
|
|
162
|
+
// Acceso dinámico
|
|
163
|
+
var campo = "MAP_NOMBRE";
|
|
164
|
+
var valor = self[campo];
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Como navego a otra pantalla?
|
|
168
|
+
|
|
169
|
+
```javascript
|
|
170
|
+
// Abrir una pantalla (la forma habitual — abre el EditView de un objeto nuevo
|
|
171
|
+
// de la coll destino: XOne hace createObject + addItem internamente)
|
|
172
|
+
ui.openEditView("NombreColeccion");
|
|
173
|
+
|
|
174
|
+
// Abrir un objeto EXISTENTE (o uno preparado con propiedades) en edicion
|
|
175
|
+
ui.openEditView(objeto);
|
|
176
|
+
|
|
177
|
+
// Cerrar pantalla actual
|
|
178
|
+
ui.getView(self).exit();
|
|
179
|
+
|
|
180
|
+
// Salir de la app
|
|
181
|
+
appData.exit();
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Como paso datos entre pantallas?
|
|
185
|
+
|
|
186
|
+
**Patrón canónico — dataObject + `ui.openEditView()`:** preparar el objeto de la coll destino con los valores deseados y abrirlo en edición.
|
|
187
|
+
|
|
188
|
+
```javascript
|
|
189
|
+
var coll = appData.getCollection("OtraPantalla");
|
|
190
|
+
var obj = new OtraPantalla({ MAP_DATO_RECIBIDO: "valor" });
|
|
191
|
+
coll.addItem(obj);
|
|
192
|
+
ui.openEditView(obj);
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Alternativas para datos globales / de sesión** (no para "abrir pantalla con datos"):
|
|
196
|
+
|
|
197
|
+
```javascript
|
|
198
|
+
// Variables en la empresa actual
|
|
199
|
+
appData.getCurrentEnterprise().setVariable("MI_DATO", "valor");
|
|
200
|
+
var dato = appData.getCurrentEnterprise().getVariable("MI_DATO");
|
|
201
|
+
|
|
202
|
+
// Macros globales (clave-valor de toda la app)
|
|
203
|
+
appData.setGlobalMacro("##MI_MACRO##", "valor");
|
|
204
|
+
var dato = appData.getGlobalMacro("##MI_MACRO##");
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
> **Referencia cruzada:** Para la API completa de navegación, consultar el tópico 03.
|
|
208
|
+
|
|
209
|
+
### Como filtro una coleccion?
|
|
210
|
+
|
|
211
|
+
```javascript
|
|
212
|
+
var coll = self.getContents("miContent");
|
|
213
|
+
coll.setFilter("ACTIVO = 1 AND TIPO = 'A'");
|
|
214
|
+
coll.clear();
|
|
215
|
+
coll.loadAll();
|
|
216
|
+
ui.refresh("@miContent");
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Como recorro los items de una coleccion?
|
|
220
|
+
|
|
221
|
+
```javascript
|
|
222
|
+
var coll = appData.getCollection("MiColeccion");
|
|
223
|
+
coll.loadAll();
|
|
224
|
+
var total = coll.getCount();
|
|
225
|
+
for (var i = 0; i < total; i++) {
|
|
226
|
+
var item = coll.get(i);
|
|
227
|
+
console.log(item.NOMBRE + " - " + item.PRECIO);
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Como hago una llamada HTTP?
|
|
232
|
+
|
|
233
|
+
```javascript
|
|
234
|
+
var miObjeto = self; // Guardar contexto
|
|
235
|
+
var request = {
|
|
236
|
+
headers: {
|
|
237
|
+
"Content-Type": "application/json",
|
|
238
|
+
"Authorization": "Bearer " + token
|
|
239
|
+
},
|
|
240
|
+
data: {
|
|
241
|
+
nombre: "Juan",
|
|
242
|
+
email: "juan@ejemplo.com"
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
$http.post("https://api.ejemplo.com/usuarios", request,
|
|
247
|
+
function(sData, headers, nHttpStatusCode) {
|
|
248
|
+
var resultado = JSON.parse(sData);
|
|
249
|
+
miObjeto.MAP_RESULTADO = resultado.id;
|
|
250
|
+
ui.refresh("MAP_RESULTADO");
|
|
251
|
+
},
|
|
252
|
+
function(nError, sErrorDesc) {
|
|
253
|
+
ui.showToast("Error: " + sErrorDesc);
|
|
254
|
+
}
|
|
255
|
+
);
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Como obtengo la ubicación GPS?
|
|
259
|
+
|
|
260
|
+
```javascript
|
|
261
|
+
ui.startGps();
|
|
262
|
+
var lat = ui.getGpsLatitude();
|
|
263
|
+
var lng = ui.getGpsLongitude();
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
O con callback:
|
|
267
|
+
|
|
268
|
+
```javascript
|
|
269
|
+
ui.startGps({
|
|
270
|
+
nodeName: "callbackGPS",
|
|
271
|
+
timeBetweenUpdates: 10000
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Como tomo una foto?
|
|
276
|
+
|
|
277
|
+
Usa un `<prop>` de tipo `PH`:
|
|
278
|
+
|
|
279
|
+
```xml
|
|
280
|
+
<prop name="MAP_FOTO" type="PH" height="40%" title="Foto"/>
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
La foto se captura automáticamente al tocar el control. El valor del campo sera el nombre del archivo generado.
|
|
284
|
+
|
|
285
|
+
### Como ejecuto un evento custom?
|
|
286
|
+
|
|
287
|
+
```javascript
|
|
288
|
+
// Desde JavaScript
|
|
289
|
+
self.executeNode("miEvento");
|
|
290
|
+
|
|
291
|
+
// Con parametros
|
|
292
|
+
self.executeNode("miEvento", "parametro1");
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Como refresco la pantalla?
|
|
296
|
+
|
|
297
|
+
```javascript
|
|
298
|
+
// Refrescar todo
|
|
299
|
+
ui.refresh();
|
|
300
|
+
|
|
301
|
+
// Refrescar campos especificos
|
|
302
|
+
ui.refresh("MAP_NOMBRE,MAP_PRECIO");
|
|
303
|
+
|
|
304
|
+
// Refrescar solo el valor (sin reconstruir)
|
|
305
|
+
ui.refreshValue("MAP_CAMPO");
|
|
306
|
+
|
|
307
|
+
// Refrescar un content
|
|
308
|
+
ui.refresh("@miContent");
|
|
309
|
+
|
|
310
|
+
// Refrescar un frame y sus hijos
|
|
311
|
+
ui.getView(self).refreshAll("frmMiFrame");
|
|
312
|
+
|
|
313
|
+
// Refrescar fila de content
|
|
314
|
+
ui.refreshContentRow("CONTENT_PROP", indice);
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Como muestro un mensaje al usuario?
|
|
318
|
+
|
|
319
|
+
```javascript
|
|
320
|
+
// Toast simple
|
|
321
|
+
ui.showToast("Mensaje rápido");
|
|
322
|
+
|
|
323
|
+
// Dialogo OK
|
|
324
|
+
ui.msgBox("Mensaje", "Título", 0);
|
|
325
|
+
|
|
326
|
+
// Dialogo Si/No
|
|
327
|
+
var respuesta = ui.msgBox("Desea continuar?", "Confirmar", 4);
|
|
328
|
+
if (respuesta == 6) {
|
|
329
|
+
// Pulso Si
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Toast personalizado
|
|
333
|
+
ui.showToast({
|
|
334
|
+
color: "#4CAF50",
|
|
335
|
+
text: "Exito!",
|
|
336
|
+
textColor: "#FFFFFF",
|
|
337
|
+
duration: "short"
|
|
338
|
+
});
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 17. FAQ CSS
|
|
344
|
+
|
|
345
|
+
### Por que no funcionan px, em, rem?
|
|
346
|
+
|
|
347
|
+
El CSS de XOne no es CSS web estándar. Usa su propio sistema de unidades y no reconoce `px`, `em`, `rem`, `vh`, `vw` ni ninguna unidad CSS web.
|
|
348
|
+
|
|
349
|
+
### Que unidades uso?
|
|
350
|
+
|
|
351
|
+
| Unidad | Descripción | Ejemplo |
|
|
352
|
+
|--------|-------------|---------|
|
|
353
|
+
| `p` | Puntos (unidad fija) | `width:200p;` |
|
|
354
|
+
| `%` | Porcentaje del contenedor padre | `width:50%;` |
|
|
355
|
+
| (sin unidad) | Número entero para ciertos atributos | `fontsize:14;` |
|
|
356
|
+
|
|
357
|
+
> **Referencia cruzada:** Para la guía completa de CSS XOne, consultar el tópico 04.
|
|
358
|
+
|
|
359
|
+
### Como aplico multiples clases?
|
|
360
|
+
|
|
361
|
+
Separar con espacios:
|
|
362
|
+
|
|
363
|
+
```xml
|
|
364
|
+
<prop name="campo" type="T" class="mClassT alineacion color"/>
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
```css
|
|
368
|
+
.mClassT {
|
|
369
|
+
width:90%;
|
|
370
|
+
height:50p;
|
|
371
|
+
}
|
|
372
|
+
.alineacion {
|
|
373
|
+
text-align:center;
|
|
374
|
+
}
|
|
375
|
+
.color {
|
|
376
|
+
forecolor:#FF0000;
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### Como hago herencia CSS con extends?
|
|
381
|
+
|
|
382
|
+
```css
|
|
383
|
+
.clasePadre {
|
|
384
|
+
width:90%;
|
|
385
|
+
height:50p;
|
|
386
|
+
fontsize:14;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.claseHija {
|
|
390
|
+
extends:.clasePadre;
|
|
391
|
+
forecolor:#FF0000;
|
|
392
|
+
}
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### Como reutilizo el header/footer en varias pantallas?
|
|
396
|
+
|
|
397
|
+
Con el atributo `inherits` a nivel de `<coll>`. Defines una coll `special="true"` que contenga la estructura común (grupos `HEADER` y `FOOTER`, eventos `<onback>`, etc.), y cada pantalla concreta la hereda.
|
|
398
|
+
|
|
399
|
+
```xml
|
|
400
|
+
<!-- Coll padre reutilizable -->
|
|
401
|
+
<coll name="layoutsFijos" special="true">
|
|
402
|
+
<group name="HEADER" id="999" class="groupfixed_header">
|
|
403
|
+
<!-- Header comun a todas las pantallas -->
|
|
404
|
+
</group>
|
|
405
|
+
<group name="FOOTER" id="0" class="groupfixed_footer">
|
|
406
|
+
<!-- Footer comun -->
|
|
407
|
+
</group>
|
|
408
|
+
</coll>
|
|
409
|
+
|
|
410
|
+
<!-- Pantalla concreta que hereda -->
|
|
411
|
+
<coll name="MiPantalla" inherits="layoutsFijos" special="true">
|
|
412
|
+
<!-- HEADER y FOOTER se heredan automaticamente.
|
|
413
|
+
Solo se declara lo específico de esta pantalla -->
|
|
414
|
+
<group name="Group1" id="1">
|
|
415
|
+
<!-- Contenido propio de MiPantalla -->
|
|
416
|
+
</group>
|
|
417
|
+
</coll>
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
La hija puede sobrescribir grupos/frames/props del padre declarandolos con el mismo `name`. Todo lo que no declare se hereda tal cual.
|
|
421
|
+
|
|
422
|
+
### Como incluyo un fragmento XML desde otro fichero?
|
|
423
|
+
|
|
424
|
+
Con el nodo `<include-layout>`. Útil para factorizar botoneras, bloques de props o eventos que se repiten.
|
|
425
|
+
|
|
426
|
+
```xml
|
|
427
|
+
<!-- Dentro de una coll -->
|
|
428
|
+
<coll name="MiPantalla" ...>
|
|
429
|
+
<group name="General" id="1" />
|
|
430
|
+
<frame name="todo" width="100%" height="100%" />
|
|
431
|
+
|
|
432
|
+
<prop group="1" frame="todo" name="MAP_CAMPO1" type="T" visible="1" />
|
|
433
|
+
<include-layout file="MisBotones.xml" group="1" frame="todo" />
|
|
434
|
+
<prop group="1" frame="todo" name="MAP_CAMPO2" type="T" visible="1" />
|
|
435
|
+
</coll>
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
El fichero `MisBotones.xml` debe tener raiz `<xml>` y estructura plana:
|
|
439
|
+
|
|
440
|
+
```xml
|
|
441
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
442
|
+
<xml>
|
|
443
|
+
<prop name="MAP_SALIR" type="B" title="Salir"
|
|
444
|
+
method="ExecuteNode(salir)" width="100%" />
|
|
445
|
+
<salir refresh="false">
|
|
446
|
+
<action name="runscript">
|
|
447
|
+
<script language="javascript">
|
|
448
|
+
appData.exit();
|
|
449
|
+
</script>
|
|
450
|
+
</action>
|
|
451
|
+
</salir>
|
|
452
|
+
</xml>
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
Los atributos `group` y `frame` del `<include-layout>` actuan como defaults para los props del fichero incluido que no los declaren. La ruta del `file` es relativa a la raiz del proyecto.
|
|
456
|
+
|
|
457
|
+
### Que diferencia hay entre `extends` (CSS) e `inherits` (coll)?
|
|
458
|
+
|
|
459
|
+
Actuan en niveles completamente distintos:
|
|
460
|
+
|
|
461
|
+
- **`extends`** (CSS) vive en archivos `.css` y hace que una clase herede atributos visuales de otra. Solo afecta a estilos.
|
|
462
|
+
- **`inherits`** (XML) es un atributo de `<coll>` en un `.xne` y hace que una coleccion herede la estructura completa (groups, frames, props y eventos) de otra coleccion.
|
|
463
|
+
|
|
464
|
+
Son compatibles: puedes usar los dos al mismo tiempo — una coll puede hacer `inherits` de otra, y sus props usar clases CSS que a su vez hacen `extends`.
|
|
465
|
+
|
|
466
|
+
### Como pongo transparencia en colores?
|
|
467
|
+
|
|
468
|
+
Usa el formato `#AARRGGBB` donde `AA` es el valor alfa (00=transparente, FF=opaco):
|
|
469
|
+
|
|
470
|
+
```css
|
|
471
|
+
.fondoSemiTransparente {
|
|
472
|
+
bgcolor:#80000000; /* Negro con 50% de transparencia */
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.fondoTransparente {
|
|
476
|
+
bgcolor:#00000000; /* Completamente transparente */
|
|
477
|
+
}
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## 18. FAQ Estructura
|
|
483
|
+
|
|
484
|
+
### Que va en mappings.xne?
|
|
485
|
+
|
|
486
|
+
Solo las colecciones `Empresas` y `Usuarios`. Todas las demas colecciones van en archivos `.xne` separados.
|
|
487
|
+
|
|
488
|
+
```xml
|
|
489
|
+
<!-- mappings.xne - SOLO Empresas y Usuarios -->
|
|
490
|
+
<coll name="Empresas">
|
|
491
|
+
<prop name="CODIGO" type="N"/>
|
|
492
|
+
<prop name="NOMBRE" type="T" fieldsize="100"/>
|
|
493
|
+
|
|
494
|
+
<onlogon>...</onlogon>
|
|
495
|
+
<maintenance>...</maintenance>
|
|
496
|
+
</coll>
|
|
497
|
+
|
|
498
|
+
<coll name="Usuarios">
|
|
499
|
+
<prop name="CODIGO" type="N"/>
|
|
500
|
+
<prop name="NOMBRE" type="T" fieldsize="100"/>
|
|
501
|
+
<prop name="IDEMPRESA" type="N" mapcol="Empresas" mapfld="ID"/>
|
|
502
|
+
<prop name="LOGIN" type="T" fieldsize="50"/>
|
|
503
|
+
<prop name="PWD" type="X" fieldsize="100"/>
|
|
504
|
+
</coll>
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### Donde pongo mis colecciones adicionales?
|
|
508
|
+
|
|
509
|
+
Cada coleccion adicional va en su propio archivo `.xne` en la raiz del proyecto:
|
|
510
|
+
|
|
511
|
+
```
|
|
512
|
+
MiProyecto/
|
|
513
|
+
mappings.xne <- Solo Empresas y Usuarios
|
|
514
|
+
EntradaApp.xne <- Pantalla de entrada
|
|
515
|
+
MenuPrincipal.xne <- Menu principal
|
|
516
|
+
Productos.xne <- Coleccion de productos
|
|
517
|
+
DetalleProducto.xne <- Pantalla de detalle
|
|
518
|
+
...
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### Este proyecto tiene ficheros `.xml` además de los `.xne`, ¿los toco?
|
|
522
|
+
|
|
523
|
+
**No.** Los ficheros `.xml` de colecciones/pantallas son **artefactos generados automáticamente por XOneStudio** a partir del `.xne` correspondiente. Existen porque algunos motores de ejecución del framework aún leen `.xml`, pero se regeneran solos cada vez que XOneStudio procesa el proyecto.
|
|
524
|
+
|
|
525
|
+
Regla operativa: **solo se trabaja con `.xne`**. Si editas un `.xml` a mano, tu cambio se perdera la proxima vez que XOneStudio regenere el proyecto. Si quieres modificar el comportamiento, modifica el `.xne` correspondiente.
|
|
526
|
+
|
|
527
|
+
Excepciones:
|
|
528
|
+
- `app.xml` (configuración global de la aplicación) SI es fuente: el programador lo edita directamente. No tiene un `.xne` que lo genere.
|
|
529
|
+
|
|
530
|
+
Horizonte de futuro: el plan es que los `.xml` generados desaparezcan y todo el proyecto quede solo en `.xne`. El trabajo con IA ya se comporta como si esos `.xml` no existieran.
|
|
531
|
+
|
|
532
|
+
### Por que necesito ROWID en Empresas y Usuarios?
|
|
533
|
+
|
|
534
|
+
El campo `ROWID` almacena un GUID (identificador único global) de 32 caracteres sin guiones. Es necesario para el sistema de replica/sincronización de XOne, que identifica cada registro de forma única entre dispositivos.
|
|
535
|
+
|
|
536
|
+
```xml
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### Como se genera la base de datos?
|
|
540
|
+
|
|
541
|
+
La base de datos se genera con la herramienta `xone-db-tools`:
|
|
542
|
+
|
|
543
|
+
```bash
|
|
544
|
+
npm install -g xone-db-tools
|
|
545
|
+
xone-db-tools create-db templates/synthetic_samples/MiProyecto --overwrite
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
Esto analiza todos los archivos `.xne` y crea las tablas correspondientes en `bd/gestion.db` con prefijo `gen_`, nombres de tabla en minúsculas y campos en mayúsculas.
|
|
549
|
+
|
|
550
|
+
### Donde pongo las imágenes?
|
|
551
|
+
|
|
552
|
+
- **`icons/`** - Iconos y recursos estáticos (PNG, JPG, SVG)
|
|
553
|
+
- **`files/`** - Archivos dinámicos generados por la app (fotos, firmas, documentos)
|
|
554
|
+
|
|
555
|
+
### Que formato de iconos usa XOne?
|
|
556
|
+
|
|
557
|
+
**PNG, JPG y SVG**. XOne soporta los tres formatos para iconos y recursos gráficos. El soporte de SVG es **nativo y completo**.
|
|
558
|
+
|
|
559
|
+
### Como muestro un SVG? Necesito un WebView (`type="WEB"`)?
|
|
560
|
+
|
|
561
|
+
**No.** Un SVG es una imagen como cualquier otra: se renderiza de forma nativa. Refiérelo con `type="IMG"` (`path="dibujo.svg"`) o con los atributos `img`/`imgbk` de cualquier control, exactamente igual que un PNG. **Nunca** lo metas dentro de un `type="WEB"` ni lo conviertas a PNG: el control `WEB` es solo para contenido web remoto (URLs), y usarlo para una imagen local rompe el escalado y la integración con el control.
|