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,302 @@
1
+ # Generación XOne — Fase 7: plantillas de pantalla base
2
+
3
+ > Fuente: `xone/v2/xone-project-generator/references/xone-project-generation-workflow.md` L2269–2562. Referencia de la skill; el índice está en [../SKILL.md](../SKILL.md).
4
+
5
+ Contenido: §7.1-7.3 orden de generación y preguntas previas · §7.4 plantilla EntradaApp.xne (obligatoria) · §7.5 MenuPrincipal.xne · §7.6 Login.xne
6
+
7
+ ---
8
+
9
+ ### 7.1 Objetivo
10
+
11
+ Crear todas las pantallas de la aplicación como archivos `.xne` individuales. Cada pantalla define su UI, eventos y lógica.
12
+
13
+ Antes de generar pantallas, el agente debe responder estas preguntas clave:
14
+
15
+ ### 7.2 Preguntas de Decisión Previas a la Generación
16
+
17
+ #### Pregunta 1: ¿La app tiene autologin o requiere login?
18
+
19
+ | Escenario | Configuración en app.xml | Pantallas a generar |
20
+ |-----------|--------------------------|---------------------|
21
+ | **Con login** | `autologon="false"` + nodo `<login-coll>` apuntando a `LoginColl` | Generar `Login.xne` |
22
+ | **Sin login / autologin** | `autologon="true"` | NO generar `Login.xne` |
23
+
24
+ ```xml
25
+ <!-- app.xml CON login -->
26
+ <app autologon="false" ...>
27
+ <login-coll>
28
+ <item name="LoginColl" conditions="" />
29
+ </login-coll>
30
+ <entry-point>
31
+ <item name="EntradaApp" conditions="" />
32
+ </entry-point>
33
+ </app>
34
+
35
+ <!-- app.xml SIN login (autologin) -->
36
+ <app autologon="true" ...>
37
+ <entry-point>
38
+ <item name="EntradaApp" conditions="" />
39
+ </entry-point>
40
+ </app>
41
+ ```
42
+
43
+ #### Pregunta 2: ¿Cual es el punto de entrada de la app?
44
+
45
+ El punto de entrada es la primera coleccion que se muestra al usuario tras el arranque (o tras el login si lo hay). Se configura en el nodo `<entry-point>` de `app.xml`.
46
+
47
+ | Nombre habitual | Cuando usarlo |
48
+ |-----------------|---------------|
49
+ | `EntradaApp` | **El más usado.** Pantalla de bienvenida que luego navega al menu |
50
+ | `MenuPrincipal` | Cuando la app arranca directamente en el menu sin pantalla de bienvenida |
51
+
52
+ > **REGLA:** Preguntar siempre al usuario cual prefiere. Si no especifica, usar `EntradaApp` por convencion.
53
+
54
+ #### Pregunta 3: ¿La app necesita consola de replica?
55
+
56
+ **Siempre si.** La `ConsolaReplica` es una pantalla técnica obligatoria en todo proyecto XOne. Proporciona información del dispositivo, estado de la replica y herramientas de diagnostico. No es visible para el usuario final en produccion — se accede típicamente desde un botón oculto o menu de administracion.
57
+
58
+ ### 7.3 Orden de Generación de Pantallas
59
+
60
+ Generar las pantallas en este orden:
61
+
62
+ | Orden | Pantalla | Archivo | Obligatoria |
63
+ |-------|----------|---------|-------------|
64
+ | 1 | Login | `Login.xne` | Solo si `autologon="false"` |
65
+ | 2 | Punto de entrada | `EntradaApp.xne` o `MenuPrincipal.xne` | **Si** |
66
+ | 3 | Consola | `Consola.xne` | **Si (siempre)**. Si la app usa replica: incluir todos los grupos (info replica, dispositivo, ficheros). Si no usa replica: incluir solo el grupo de información del dispositivo |
67
+ | 4 | Menu principal | `MenuPrincipal.xne` (si EntradaApp es el entry-point) | Según proyecto |
68
+ | 5+ | Pantallas de negocio | `Lista[Entidad].xne`, `Detalle[Entidad].xne`, etc. | Según requisitos |
69
+
70
+ **Pantallas de negocio comunes:**
71
+
72
+ | Pantalla | Archivo | Proposito |
73
+ |----------|---------|-----------|
74
+ | Lista | `Lista[Entidad].xne` | Listado de registros |
75
+ | Detalle | `Detalle[Entidad].xne` | Formulario de edición |
76
+ | Mapa | `Mapa[Entidad].xne` | Visualizacion en mapa |
77
+ | Configuración | `Configuración.xne` | Ajustes de la app |
78
+ | Dashboard | `Dashboard.xne` | Panel con gráficos |
79
+
80
+ ### 7.4 Plantilla: EntradaApp.xne (OBLIGATORIA)
81
+
82
+ ```xml
83
+ <?xml version="1.0" encoding="utf-8"?>
84
+ <!--
85
+ Pantalla de entrada de la aplicación
86
+ Esta es la primera pantalla que ve el usuario
87
+ -->
88
+ <coll name="EntradaApp" title="Bienvenido"
89
+ special="true" notab="true" show-toolbar="false">
90
+
91
+ <!-- Inicialización (se ejecuta una sola vez) -->
92
+ <create>
93
+ <action name="runscript">
94
+ <script language="javascript">
95
+ // Inicialización de la aplicación
96
+ </script>
97
+ </action>
98
+ </create>
99
+
100
+ <!-- Al abrir la pantalla, antes de pintar la UI -->
101
+ <before-edit>
102
+ <action name="runscript">
103
+ <script language="javascript">
104
+ // Código al abrir la pantalla
105
+ </script>
106
+ </action>
107
+ </before-edit>
108
+
109
+ <group name="grpPrincipal" id="1" class="groupNoTab">
110
+ <!-- Header con logo -->
111
+ <frame name="frmHeader" class="frameHeader">
112
+ <prop name="imgLogo" type="IMG" visible="7"
113
+ width="200p" height="80p" align="center"
114
+ path="./icons/app_icon.png" />
115
+ </frame>
116
+
117
+ <!-- Contenido principal -->
118
+ <frame name="frmBody" class="frameBody">
119
+ <prop name="lblNombreApp" type="L" visible="7"
120
+ width="100%" height="50p" align="center"
121
+ class="textoTitulo" title="Nombre de la App" />
122
+
123
+ <prop name="lblDescripcion" type="L" visible="7"
124
+ width="80%" height="30p" align="center"
125
+ class="textoSubtitulo" title="Descripción breve" />
126
+
127
+ <prop name="btnEntrar" type="B" visible="7"
128
+ width="80%" height="50p" align="center"
129
+ class="btnPrimario" title="Entrar" tmargin="30p"
130
+ onclick="ui.openEditView('MenuPrincipal');" />
131
+ </frame>
132
+
133
+ <!-- Versión -->
134
+ <frame name="frmFooter" class="frameFooter">
135
+ <prop name="lblVersion" type="L" visible="7"
136
+ width="100%" height="30p" align="center"
137
+ class="textoSubtitulo" title="v1.0.0" />
138
+ </frame>
139
+ </group>
140
+
141
+ <!-- Manejo del botón atrás -->
142
+ <onback>
143
+ <action name="runscript">
144
+ <script language="javascript">
145
+ if (confirmar("¿Desea salir de la aplicación?", "Salir")) {
146
+ appData.exit();
147
+ }
148
+ </script>
149
+ </action>
150
+ </onback>
151
+ </coll>
152
+ ```
153
+
154
+ ### 7.5 Plantilla: MenuPrincipal.xne
155
+
156
+ ```xml
157
+ <?xml version="1.0" encoding="utf-8"?>
158
+ <!--
159
+ Menu principal de la aplicación
160
+ Muestra las opciones de navegacion
161
+ -->
162
+ <coll name="MenuPrincipal" title="Menu"
163
+ special="true" notab="true" show-toolbar="false">
164
+
165
+ <create>
166
+ <action name="runscript">
167
+ <script language="javascript">
168
+ // Inicialización del menu
169
+ </script>
170
+ </action>
171
+ </create>
172
+
173
+ <group name="grpMenu" id="1" class="groupNoTab">
174
+ <!-- Header -->
175
+ <frame name="frmHeader" width="100%" height="120p"
176
+ bgcolor="#2196F3" align="center">
177
+ <prop name="lblTitulo" type="L" visible="7"
178
+ width="100%" height="50p" align="center"
179
+ forecolor="#FFFFFF" fontsize="18"
180
+ title="Menu Principal" />
181
+ </frame>
182
+
183
+ <!-- Opciones del menu -->
184
+ <frame name="frmOpciones" width="100%" height="100%"
185
+ scroll="true" bgcolor="#FFFFFF">
186
+
187
+ <!-- Opción 1 -->
188
+ <frame name="frmOpcion1" width="90%" height="80p"
189
+ align="center" tmargin="15p"
190
+ bgcolor="#F5F5F5" border-corner-radius="10">
191
+ <prop name="imgOpcion1" type="IMG" visible="7"
192
+ width="48p" height="48p" lmargin="15p"
193
+ path="./icons/ic_opcion1.png" />
194
+ <prop name="lblOpcion1" type="L" visible="7"
195
+ width="70%" height="48p" lmargin="15p"
196
+ newline="false" fontsize="14"
197
+ title="Opción 1" />
198
+ <prop name="btnOpcion1" type="B" visible="7"
199
+ width="100%" height="100%"
200
+ bgcolor="#00000000"
201
+ onclick="ui.openEditView('ListaEntidad');" />
202
+ </frame>
203
+
204
+ <!-- Repetir para cada opción del menu -->
205
+ </frame>
206
+ </group>
207
+
208
+ <onback>
209
+ <action name="runscript">
210
+ <script language="javascript">
211
+ if (confirmar("¿Desea salir de la aplicación?", "Salir")) {
212
+ appData.exit();
213
+ }
214
+ </script>
215
+ </action>
216
+ </onback>
217
+ </coll>
218
+ ```
219
+
220
+ ### 7.6 Plantilla: Login.xne
221
+
222
+ ```xml
223
+ <?xml version="1.0" encoding="utf-8"?>
224
+ <!--
225
+ Pantalla de login
226
+ -->
227
+ <coll name="LoginColl" title="" special="true" notab="true"
228
+ show-toolbar="false">
229
+
230
+ <group name="grpLogin" id="1" class="groupNoTab">
231
+ <frame name="frmLogin" width="100%" height="100%"
232
+ bgcolor="#FFFFFF" align="center">
233
+
234
+ <!-- Logo -->
235
+ <prop name="imgLogo" type="IMG" visible="1"
236
+ width="200p" height="80p" align="center"
237
+ tmargin="150p" path="./icons/app_icon.png" />
238
+
239
+ <!-- Campo usuario -->
240
+ <prop name="MAP_USUARIO" type="T" visible="1"
241
+ width="80%" height="50p" align="center"
242
+ tmargin="80p" labelwidth="0"
243
+ floating-tooltip="true" tooltip="Usuario"
244
+ class="textoEditable" />
245
+
246
+ <!-- Campo contraseña -->
247
+ <prop name="MAP_PASSWORD" type="X" visible="1"
248
+ width="80%" height="50p" align="center"
249
+ tmargin="20p" labelwidth="0"
250
+ floating-tooltip="true" tooltip="Contraseña"
251
+ show-password-visibility-toggle="true"
252
+ class="textoEditable" />
253
+
254
+ <!-- Botón login -->
255
+ <prop name="btnLogin" type="B" visible="1"
256
+ width="80%" height="50p" align="center"
257
+ tmargin="40p" class="btnPrimario"
258
+ title="Iniciar Sesion"
259
+ method="executenode(aceptarLogin)" />
260
+ </frame>
261
+ </group>
262
+
263
+ <!-- Evento de login -->
264
+ <aceptarLogin>
265
+ <action name="runscript">
266
+ <script language="javascript">
267
+ var sUsuario = cstr(self.MAP_USUARIO);
268
+ var sPassword = cstr(self.MAP_PASSWORD);
269
+
270
+ // Solo validamos el usuario: en XOne puede haber usuarios sin
271
+ // contraseña (perfiles invitado, kiosco) y, si la contraseña es
272
+ // incorrecta, el propio backend la rechaza vía onLoginFailed.
273
+ if (isEmpty(sUsuario)) {
274
+ ui.showToast("Introduzca el usuario");
275
+ return;
276
+ }
277
+
278
+ appData.login({
279
+ userName: sUsuario,
280
+ password: sPassword,
281
+ entryPoint: "MenuPrincipal",
282
+ onLoginSuccessful: function() {
283
+ ui.showToast("Bienvenido!");
284
+ },
285
+ onLoginFailed: function() {
286
+ ui.showToast("Usuario o contraseña incorrectos");
287
+ }
288
+ });
289
+ </script>
290
+ </action>
291
+ </aceptarLogin>
292
+
293
+ <onback>
294
+ <action name="runscript">
295
+ <script language="javascript">
296
+ appData.exit();
297
+ </script>
298
+ </action>
299
+ </onback>
300
+ </coll>
301
+ ```
302
+