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.
Files changed (187) hide show
  1. package/README.md +167 -0
  2. package/dist/agent/authEnDisco.js +56 -0
  3. package/dist/agent/authEnDisco.js.map +1 -0
  4. package/dist/agent/configEnDisco.js +109 -0
  5. package/dist/agent/configEnDisco.js.map +1 -0
  6. package/dist/agent/crearProyecto.js +34 -0
  7. package/dist/agent/crearProyecto.js.map +1 -0
  8. package/dist/agent/entorno.js +124 -0
  9. package/dist/agent/entorno.js.map +1 -0
  10. package/dist/agent/guionizado.js +53 -0
  11. package/dist/agent/guionizado.js.map +1 -0
  12. package/dist/agent/instantanea.js +129 -0
  13. package/dist/agent/instantanea.js.map +1 -0
  14. package/dist/agent/interrupts.js +83 -0
  15. package/dist/agent/interrupts.js.map +1 -0
  16. package/dist/agent/mensajes.js +24 -0
  17. package/dist/agent/mensajes.js.map +1 -0
  18. package/dist/agent/modelos.js +42 -0
  19. package/dist/agent/modelos.js.map +1 -0
  20. package/dist/agent/normalizar.js +20 -0
  21. package/dist/agent/normalizar.js.map +1 -0
  22. package/dist/agent/perfiles.js +103 -0
  23. package/dist/agent/perfiles.js.map +1 -0
  24. package/dist/agent/proyecto.js +107 -0
  25. package/dist/agent/proyecto.js.map +1 -0
  26. package/dist/agent/puente.js +142 -0
  27. package/dist/agent/puente.js.map +1 -0
  28. package/dist/agent/resumenDeTool.js +48 -0
  29. package/dist/agent/resumenDeTool.js.map +1 -0
  30. package/dist/agent/skills.js +65 -0
  31. package/dist/agent/skills.js.map +1 -0
  32. package/dist/agent/textoDeTool.js +113 -0
  33. package/dist/agent/textoDeTool.js.map +1 -0
  34. package/dist/agent/turnoReal.js +173 -0
  35. package/dist/agent/turnoReal.js.map +1 -0
  36. package/dist/agent/verificador.js +65 -0
  37. package/dist/agent/verificador.js.map +1 -0
  38. package/dist/agent/xoneAgent.js +106 -0
  39. package/dist/agent/xoneAgent.js.map +1 -0
  40. package/dist/bin.js +9 -0
  41. package/dist/bin.js.map +1 -0
  42. package/dist/cli/aprobar.js +82 -0
  43. package/dist/cli/aprobar.js.map +1 -0
  44. package/dist/cli/config.js +133 -0
  45. package/dist/cli/config.js.map +1 -0
  46. package/dist/cli/consola.js +346 -0
  47. package/dist/cli/consola.js.map +1 -0
  48. package/dist/cli/describe.js +53 -0
  49. package/dist/cli/describe.js.map +1 -0
  50. package/dist/cli/doctor.js +45 -0
  51. package/dist/cli/doctor.js.map +1 -0
  52. package/dist/cli/main.js +520 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/cli/markdown.js +90 -0
  55. package/dist/cli/markdown.js.map +1 -0
  56. package/dist/cli/run.js +164 -0
  57. package/dist/cli/run.js.map +1 -0
  58. package/dist/cli/spinner.js +89 -0
  59. package/dist/cli/spinner.js.map +1 -0
  60. package/dist/cli/stdio.js +193 -0
  61. package/dist/cli/stdio.js.map +1 -0
  62. package/dist/cli/tema.js +40 -0
  63. package/dist/cli/tema.js.map +1 -0
  64. package/dist/cli/verify.js +62 -0
  65. package/dist/cli/verify.js.map +1 -0
  66. package/dist/core/bitacora.js +30 -0
  67. package/dist/core/bitacora.js.map +1 -0
  68. package/dist/core/config.js +236 -0
  69. package/dist/core/config.js.map +1 -0
  70. package/dist/core/contextos.js +56 -0
  71. package/dist/core/contextos.js.map +1 -0
  72. package/dist/core/deps.js +51 -0
  73. package/dist/core/deps.js.map +1 -0
  74. package/dist/core/diff.js +79 -0
  75. package/dist/core/diff.js.map +1 -0
  76. package/dist/core/esqueleto.js +366 -0
  77. package/dist/core/esqueleto.js.map +1 -0
  78. package/dist/core/events.js +2 -0
  79. package/dist/core/events.js.map +1 -0
  80. package/dist/core/modelos.js +85 -0
  81. package/dist/core/modelos.js.map +1 -0
  82. package/dist/core/notify.js +106 -0
  83. package/dist/core/notify.js.map +1 -0
  84. package/dist/core/ports.js +114 -0
  85. package/dist/core/ports.js.map +1 -0
  86. package/dist/core/turno.js +127 -0
  87. package/dist/core/turno.js.map +1 -0
  88. package/dist/vendor/hitl.js +103 -0
  89. package/dist/vendor/hitl.js.map +1 -0
  90. package/dist/vendor/skillLoaders/catalog.js +74 -0
  91. package/dist/vendor/skillLoaders/catalog.js.map +1 -0
  92. package/dist/vendor/tokenTracking.js +58 -0
  93. package/dist/vendor/tokenTracking.js.map +1 -0
  94. package/package.json +41 -0
  95. package/skills/xone-debugging/SKILL.md +52 -0
  96. package/skills/xone-debugging/references/faq.md +561 -0
  97. package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
  98. package/skills/xone-development/SKILL.md +105 -0
  99. package/skills/xone-development/references/anti-patrones.md +94 -0
  100. package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
  101. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
  102. package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
  103. package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
  104. package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
  105. package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
  106. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
  107. package/skills/xone-development/references/datos/appdata.md +611 -0
  108. package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
  109. package/skills/xone-development/references/datos/http.md +366 -0
  110. package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
  111. package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
  112. package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
  113. package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
  114. package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
  115. package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
  116. package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
  117. package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
  118. package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
  119. package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
  120. package/skills/xone-development/references/indice-completo.md +77 -0
  121. package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
  122. package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
  123. package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
  124. package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
  125. package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
  126. package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
  127. package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
  128. package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
  129. package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
  130. package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
  131. package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
  132. package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
  133. package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
  134. package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
  135. package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
  136. package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
  137. package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
  138. package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
  139. package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
  140. package/skills/xone-development/references/tipos-de-prop.md +28 -0
  141. package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
  142. package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
  143. package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
  144. package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
  145. package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
  146. package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
  147. package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
  148. package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
  149. package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
  150. package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
  151. package/skills/xone-development/references/xml-ui/mapas.md +685 -0
  152. package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
  153. package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
  154. package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
  155. package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
  156. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
  157. package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
  158. package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
  159. package/skills/xone-plan-builder/SKILL.md +183 -0
  160. package/skills/xone-plan-builder/agents/openai.yaml +5 -0
  161. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
  162. package/skills/xone-project-generator/SKILL.md +111 -0
  163. package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
  164. package/skills/xone-project-generator/references/colecciones-base.md +16 -0
  165. package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
  166. package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
  167. package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
  168. package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
  169. package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
  170. package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
  171. package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
  172. package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
  173. package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
  174. package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
  175. package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
  176. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
  177. package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
  178. package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
  179. package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
  180. package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
  181. package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
  182. package/skills/xone-review/SKILL.md +189 -0
  183. package/skills/xone-spec-builder/SKILL.md +235 -0
  184. package/skills/xone-spec-builder/agents/openai.yaml +5 -0
  185. package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
  186. package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
  187. 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.