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,464 @@
1
+ # XOne JavaScript — ui: métodos adicionales y catálogo completo
2
+
3
+ > Fuente: `xone/v2/xone-help-docs/topics/03b-js-ui.md` §3.10–§3.11. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §3.10 métodos adicionales (executeActionAfterDelay, startChronometer, API de controles Stepper y OTP, speak/recognizeSpeech, startAudioRecord) · §3.11 catálogo completo de métodos de ui
6
+
7
+ ---
8
+
9
+ ### 3.10 Métodos Adicionales de ui
10
+
11
+ #### refreshValue(fieldName) - Refrescar Valor de Campo
12
+
13
+ Refresca solo el valor de un campo especifico sin reconstruir la vista del control. Más ligero que `ui.refresh()`:
14
+
15
+ ```javascript
16
+ ui.refreshValue("MAP_CAMPO");
17
+ ```
18
+
19
+ #### refreshContentRow(contentName, index) - Refrescar Fila de Content
20
+
21
+ Refresca una fila especifica de un content sin recargar toda la lista:
22
+
23
+ ```javascript
24
+ ui.refreshContentRow("@content", 0); // Refresca la primera fila
25
+ ui.refreshContentSelectedRow("MAP_CONTENT"); // Refresca la fila seleccionada
26
+ ```
27
+
28
+ #### captureImage(targetVariable, controlName) - Capturar Imagen
29
+
30
+ ```javascript
31
+ ui.captureImage("variable_imagen", "nombre_control");
32
+ ```
33
+
34
+ #### shareData(text, subject, attachment) - Compartir Datos
35
+
36
+ ```javascript
37
+ ui.shareData("Texto a compartir", "Asunto del mensaje", "archivo_adjunto.jpg");
38
+ ```
39
+
40
+ #### showDatePicker(params) / showTimePicker(params) - Selectores de Fecha y Hora
41
+
42
+ ```javascript
43
+ ui.showDatePicker({
44
+ initialYear: 2024,
45
+ initialMonth: 6,
46
+ initialDay: 15,
47
+ title: "Seleccione fecha",
48
+ onDateSet: function(nYear, nMonth, nDay) {
49
+ self.MAP_FECHA = nDay + "/" + nMonth + "/" + nYear;
50
+ ui.refresh("MAP_FECHA");
51
+ }
52
+ });
53
+
54
+ ui.showTimePicker({
55
+ initialHour: 17,
56
+ initialMinute: 30,
57
+ is24HoursMode: true,
58
+ onTimeSet: function(nHours, nMinutes) {
59
+ var h = ("0" + nHours).slice(-2);
60
+ var m = ("0" + nMinutes).slice(-2);
61
+ self.MAP_HORA = h + ":" + m;
62
+ ui.refresh("MAP_HORA");
63
+ }
64
+ });
65
+ ```
66
+
67
+ #### speak(params) - Text-to-Speech
68
+
69
+ Sintetiza voz a partir de texto.
70
+
71
+ | Parámetro | Descripción |
72
+ | --- | --- |
73
+ | **language** | Idioma: `"es"`, `"en"`, ... |
74
+ | **text** | Texto que se va a pronunciar. |
75
+ | **speechRate** | Ritmo de habla en milisegundos. |
76
+ | **onCompleted** | Callback `function()` al terminar de hablar. |
77
+
78
+ ```javascript
79
+ ui.speak({
80
+ language : "es",
81
+ text : "El proceso ha finalizado correctamente",
82
+ speechRate : 120,
83
+ onCompleted: function() {
84
+ // p.ej. arrancar aquí el reconocimiento de la respuesta
85
+ }
86
+ });
87
+ ```
88
+
89
+ #### recognizeSpeech(params) - Speech-to-Text
90
+
91
+ | Parámetro | Descripción |
92
+ | --- | --- |
93
+ | **language** | Idioma del reconocedor (`"es"`, `"en"`, ...). |
94
+ | **timeoutAfterSilence** | Milisegundos de silencio antes de cortar la escucha. |
95
+ | **characterLimit** | *(Opcional)* Número máximo de caracteres a reconocer. |
96
+ | **onRecognize** | Callback `function(sText)` con el texto reconocido. |
97
+ | **onError** | Callback `function(nErrorCode, sError)` con el error. |
98
+ | **onPartialResults** | *(Opcional)* Callback `function(extras)` con resultados parciales. |
99
+ | **onEndOfSpeech** | *(Opcional)* Callback `function()` al terminar la locucion del usuario. |
100
+
101
+ ```javascript
102
+ ui.recognizeSpeech({
103
+ language: "es",
104
+ timeoutAfterSilence: 10000,
105
+ onRecognize: function(sText) {
106
+ self.MAP_TEXT = sText;
107
+ ui.refreshValue("MAP_TEXT");
108
+ },
109
+ onError: function(nErrorCode, sError) {
110
+ ui.msgBox("Error " + nErrorCode + ": " + sError, "Reconocimiento", 0);
111
+ }
112
+ });
113
+ ```
114
+
115
+ > **Patron combinado (voz bidireccional):** usar `onCompleted` de `ui.speak` para arrancar `ui.recognizeSpeech`, de modo que el microfono solo empiece a escuchar cuando el dispositivo ha acabado de hablar (evita que el reconocedor capte la propia síntesis).
116
+
117
+ #### startAudioRecord(params) / stopAudioRecord() - Grabacion de Audio
118
+
119
+ | Parámetro | Descripción |
120
+ | --- | --- |
121
+ | **onComplete** | Callback `function(sPath)` con la ruta del fichero al terminar. |
122
+ | **onError** | Callback `function(sError)` con el mensaje de error. |
123
+ | **timeout** | Duración máxima en segundos. `0` = infinito. |
124
+ | **outputFormat** | *(Opcional)* `wav`, `3gp`, `mp4`, `amr_nb`, `amr_wb`, `aac_adts`, `mp2_ts`, `webm`, `ogg`. |
125
+ | **audioEncoder** | *(Opcional)* `amr_nb`, `amr_wb`, `aac`, `he_aac`, `aac_eld`, `vorbis`, `opus`. |
126
+
127
+ ```javascript
128
+ ui.startAudioRecord({
129
+ onComplete: function(sPath) {
130
+ self.MAP_AUDIO = sPath;
131
+ ui.refresh("MAP_AUDIO");
132
+ },
133
+ onError: function(sError) { ui.showToast("Error: " + sError); },
134
+ timeout: 0,
135
+ outputFormat: "mp4",
136
+ audioEncoder: "he_aac"
137
+ });
138
+
139
+ ui.stopAudioRecord();
140
+ ```
141
+
142
+ > **`stopAudioRecord()` finaliza la grabación de forma asíncrona.** No deja el fichero listo en la línea siguiente: corta la captura y cierra el archivo en segundo plano, y el audio solo está completo cuando se dispara `onComplete(sPath)`. Tanto si la grabación termina sola por `timeout` como si la paras a mano con `stopAudioRecord()`, el final pasa por el mismo `onComplete`; haz ahí cualquier uso del fichero (subirlo, reproducirlo, transcribirlo con la IA), nunca justo después de la llamada a `stopAudioRecord()`.
143
+
144
+ > **Para transcribir voz con la IA on-device (objeto `ai` / Gemma), graba en `wav`.** El formato por defecto es `mp4` (códec AAC), que el motor de IA **no admite**. Usa `outputFormat: "wav"` (produce WAV PCM de 16 bits, 16 kHz, mono, justo el formato recomendado por el modelo) y limita la duración con `timeout: 30` (máximo de audio que acepta Gemma). La ruta que llega al `onComplete` se pasa tal cual como `audio`:
145
+
146
+ ```javascript
147
+ ui.startAudioRecord({
148
+ outputFormat: "wav", // imprescindible: el default mp4/AAC no lo acepta la IA
149
+ timeout: 30, // segundos; 30 = máximo de audio que admite Gemma
150
+ onComplete: function(sPath) {
151
+ // el modelo debe estar cargado con audioBackend (ver objeto ai)
152
+ var sTexto = ai.generate({ prompt: "Transcribe el audio en español.", audio: sPath });
153
+ self.TRANSCRIPCION = sTexto;
154
+ ui.refresh("TRANSCRIPCION");
155
+ },
156
+ onError: function(sError) { ui.showToast(sError); }
157
+ });
158
+ ```
159
+
160
+ > `ai.generate` es síncrono y bloquea mientras transcribe; si el `onComplete` se ejecuta en el hilo de UI, lánzalo en segundo plano o usa `ai.chat({audio, onComplete})` para no congelar la pantalla.
161
+
162
+ #### addCalendarItem(params) - Agregar Evento al Calendario
163
+
164
+ ```javascript
165
+ ui.addCalendarItem({
166
+ title : "Reunion con cliente",
167
+ startDate : "2024-06-15 10:00",
168
+ endDate : "2024-06-15 11:00",
169
+ description: "Reunion de seguimiento",
170
+ location : "Oficina central"
171
+ });
172
+ ```
173
+
174
+ #### executeActionAfterDelay(action, seconds) - Ejecución con Retardo
175
+
176
+ Ejecuta una acción (definida como nodo XML del mismo nombre, o función JS global) después de un retardo en **segundos**. Equivalente conceptual a `setTimeout()` **para un solo disparo**.
177
+
178
+ ```javascript
179
+ // Uso correcto: una sola acción tras un retardo corto
180
+ ui.executeActionAfterDelay("miFuncion", 5);
181
+
182
+ // Típico de una pantalla de bienvenida: ejecutar una acción a los 2 segundos
183
+ ui.executeActionAfterDelay("irAMenuPrincipal", 2);
184
+ ```
185
+
186
+ > **ATENCION — antipatron a evitar:** **NO** encadenar `executeActionAfterDelay` recursivamente para simular un `setInterval` (que la acción se vuelva a programar a si misma cada segundo). Aunque tecnicamente funcione, **consume mucha memoria y ralentiza el dispositivo** porque acumula overhead en cada iteración.
187
+ >
188
+ > **Cuándo usar `executeActionAfterDelay`:** acciones puntuales (un toast tras X segundos, redirigir desde una pantalla de bienvenida tras un retardo, mostrar un aviso único).
189
+ >
190
+ > **Cuando NO:** temporizadores continuos, relojes, polling regular. Para esos casos usar **`control.startChronometer`** (siguiente sección).
191
+
192
+ ```javascript
193
+ // MAL — patron prohibido (auto-encadenado para repetir cada segundo)
194
+ function onSetTime() {
195
+ actualizarTemporizador();
196
+ if (self.MAP_ACTIVO == 1) {
197
+ ui.executeActionAfterDelay("onSetTime", 1); // <-- consume memoria, no hacer
198
+ }
199
+ }
200
+
201
+ // BIEN — para reloj/cronometro continuo, usar control.startChronometer (siguiente seccion)
202
+ ```
203
+
204
+ #### startChronometer / stopChronometer - Cronometros continuos
205
+
206
+ > **CLAVE:** `startChronometer` y `stopChronometer` **NO son métodos de `ui.*`**, son métodos de un **control** (un nodo `<prop>` de la pantalla, típicamente `type="T"`). Hay que obtener el control primero.
207
+
208
+ Es la API correcta para mostrar un cronometro/reloj continuo en pantalla **sin penalizar memoria** (lo gestiona la plataforma, no encadena timers JavaScript).
209
+
210
+ **Firma:**
211
+ ```
212
+ control.startChronometer(jsOptions); // arranca
213
+ control.stopChronometer(); // detiene
214
+ ```
215
+
216
+ | Campo | Tipo | Descripción |
217
+ |--------------|--------|-------------|
218
+ | `fromDate` | Date | Fecha desde la que arranca el cronometro. Típico: `new Date()`. |
219
+ | `dateFormat` | string | Formato de visualizacion. Ej. `"mm:ss"`, `"HH:mm:ss"`. |
220
+
221
+ **Ejemplo completo (XML + JS):**
222
+
223
+ ```xml
224
+ <coll name="Menu" notab="true" special="true">
225
+ <group name="General" id="1" align="center">
226
+ <prop name="MAP_T" type="T" visible="7" labelwidth="0"
227
+ width="80%" height="10%" />
228
+ <prop name="MAP_START" type="B" visible="7"
229
+ width="80%" height="10%" title="Start"
230
+ onclick="start('MAP_T');" />
231
+ <prop name="MAP_STOP" type="B" visible="7"
232
+ width="80%" height="10%" title="Stop"
233
+ onclick="stop('MAP_T');" />
234
+ </group>
235
+ </coll>
236
+ ```
237
+
238
+ ```javascript
239
+ function start(sPropName) {
240
+ let control = getControl(sPropName);
241
+ if (!control) return;
242
+ let jsOptions = {
243
+ fromDate : new Date(),
244
+ dateFormat: "mm:ss"
245
+ };
246
+ control.startChronometer(jsOptions);
247
+ }
248
+
249
+ function stop(sPropName) {
250
+ let control = getControl(sPropName);
251
+ if (!control) return;
252
+ control.stopChronometer();
253
+ }
254
+ ```
255
+
256
+ > **NO existe `ui.startChronometer(...)`** — es método del control, no del objeto global `ui`.
257
+
258
+ #### API de controles Stepper (`<prop type="N" viewmode="stepper">`)
259
+
260
+ Los controles con `viewmode="stepper"` exponen estos métodos:
261
+
262
+ | Método | Efecto |
263
+ |--------|--------|
264
+ | `control.getValue()` | Devuelve el valor actual como entero |
265
+ | `control.setValue(n)` | Asigna el valor (se clampa al rango `[min, max]`) |
266
+ | `control.setMin(n)` | Cambia el mínimo en runtime |
267
+ | `control.setMax(n)` | Cambia el máximo en runtime |
268
+ | `control.setStepSize(n)` | Cambia el incremento (debe ser `> 0`) |
269
+
270
+ ```javascript
271
+ function onTipoChange() {
272
+ var ctrl = getControl("CANTIDAD");
273
+ if (self.TIPO === "PACK_GRANDE") {
274
+ ctrl.setMin(10);
275
+ ctrl.setMax(500);
276
+ ctrl.setStepSize(10);
277
+ } else {
278
+ ctrl.setMin(1);
279
+ ctrl.setMax(99);
280
+ ctrl.setStepSize(1);
281
+ }
282
+ }
283
+ ```
284
+
285
+ Ver tópico 02 (sub-archivo 02b §5.9.17b) para el detalle XML.
286
+
287
+ #### API de controles OTP (props con `viewmode="otp"` sobre `type="T"` o `type="N"`)
288
+
289
+ | Método | Efecto |
290
+ |--------|--------|
291
+ | `control.getOtpValue()` | Devuelve el valor combinado de todas las cajas como string |
292
+ | `control.clearOtp()` | Limpia todas las cajas y pone el foco en la primera |
293
+ | `control.focusOtp()` | Pone el foco en la primera caja vacia |
294
+
295
+ ```javascript
296
+ function onOtpChange() {
297
+ var sCode = getControl("CODIGO_VERIFICACION").getOtpValue();
298
+ if (sCode.length !== 6) return;
299
+ if (sCode === self.CODIGO_ESPERADO) {
300
+ ui.showToast("Código correcto");
301
+ ui.openEditView("PantallaPrincipal");
302
+ } else {
303
+ ui.showToast("Código incorrecto");
304
+ getControl("CODIGO_VERIFICACION").clearOtp();
305
+ }
306
+ }
307
+ ```
308
+
309
+ El valor se persiste en el `dataObject` como **string concatenado sin separadores** (ej. `"123456"`). Ver tópico 02 (sub-archivo 02b §5.9.17c) para la definición XML.
310
+
311
+ #### sleep(seconds) - Pausa de Ejecución
312
+
313
+ **Precaucion:** Bloquea la interfaz de usuario. Preferir `executeActionAfterDelay()`:
314
+
315
+ ```javascript
316
+ ui.sleep(3); // Pausa de 3 segundos (BLOQUEA la UI)
317
+ ```
318
+
319
+ #### Otros Métodos Útiles
320
+
321
+ ```javascript
322
+ var bBackground = ui.isInBackground();
323
+ ui.returnToForeground();
324
+ ui.makePhoneCall("+34123456789");
325
+ ui.sendMail("destino@email.com", "copia@email.com", "Asunto", "Cuerpo", "adjunto.pdf");
326
+
327
+ // Reproducir sonido y/o vibrar
328
+ ui.playSoundAndVibrate({ sound: "sonido.mp3", vibrate: true, continuePlaying: false });
329
+ ui.stopPlaySoundAndVibrate();
330
+ ui.vibrate();
331
+
332
+ // Verificar conectividad
333
+ var wifiOn = ui.isWifiEnabled();
334
+ var btStatus = ui.getBluetoothStatus();
335
+ ui.setBluetoothStatus(true);
336
+
337
+ // Iniciar replica desde ui
338
+ ui.startReplica();
339
+ ```
340
+
341
+ ### 3.11 Referencia completa: catálogo de métodos del objeto `ui`
342
+
343
+ La siguiente tabla lista **todos los métodos** expuestos por el objeto global `ui` con una descripción breve. Para los métodos con parámetros complejos consulta los ejemplos detallados en las secciones 3.1-3.10.
344
+
345
+ | Método | Descripción |
346
+ | --- | --- |
347
+ | **addCalendarItem** | Añadir item al calendario. |
348
+ | **askUserForGPSPermission** | Solicitar al usuario permiso para GPS. |
349
+ | **canMakePhoneCall** | Comprueba si se puede hacer una llamada de teléfono. |
350
+ | **captureImage** | Capturar imagen. |
351
+ | **checkGPSStatus** | Comprobar el status del GPS. |
352
+ | **clearDrawing** | Eliminar el dibujo/firma. |
353
+ | **createShortcut** | Crear acceso directo. |
354
+ | **deleteShortcut** | Borrar acceso directo. |
355
+ | **dismissNotification** | Rechazar/ocultar una notificación. |
356
+ | **drawMapRoute** | Dibujar ruta en el mapa. |
357
+ | **endPrint** | Finalizar impresión. |
358
+ | **ensureVisible** | Asegurar que el control sea visible (scroll). |
359
+ | **executeActionAfterDelay** | Ejecutar acción tras un retraso. |
360
+ | **getLastKnownLocation** | Obtener la última localización conocida. |
361
+ | **getLastKnownLocationAccuracy** | Precisión de la última localización conocida. |
362
+ | **getLastKnownLocationAltitude** | Altitud de la última localización conocida. |
363
+ | **getLastKnownLocationBearing** | Marcación de la última localización conocida. |
364
+ | **getLastKnownLocationDateTime** | Fecha y hora de la última localización conocida. |
365
+ | **getLastKnownLocationLatitude** | Latitud de la última localización conocida. |
366
+ | **getLastKnownLocationLongitude** | Longitud de la última localización conocida. |
367
+ | **getLastKnownLocationProvider** | Proveedor de la última localización conocida. |
368
+ | **getLastKnownLocationSpeed** | Velocidad de la última localización conocida. |
369
+ | **getMaxSoundVolumen** | Máximo volumen de sonido. |
370
+ | **getSoundVolumen** | Volumen de sonido actual. |
371
+ | **getView** | Obtener la vista actual (p.ej. `ui.getView(self)`). |
372
+ | **hideGroup** | Ocultar grupo. |
373
+ | **hideNavigationDrawer** | Ocultar cajón de navegación. |
374
+ | **hideSoftwareKeyboard** | Ocultar teclado del software. |
375
+ | **hideWaitDialog** | Ocultar diálogo de espera. |
376
+ | **injectJavascript** | Inyectar Javascript. |
377
+ | **isApplicationInstalled** | Comprobar si una aplicación está instalada. |
378
+ | **isOnCall** | Comprobar si el dispositivo está en llamada. |
379
+ | **isSuperuserAvailable** | Comprobar si hay super usuario disponible. |
380
+ | **isTaskKillerInstalled** | Comprobar si hay instalador de cierre de tareas. |
381
+ | **isWifiConnected** | Comprobar si la wifi está conectada. |
382
+ | **isWifiEnabled** | Comprobar si la wifi está activada. |
383
+ | **launchApp** | Lanzar aplicación. |
384
+ | **launchApplication** | Lanzar aplicación (alias). |
385
+ | **lineFeed** | Salto de línea (impresión). |
386
+ | **lockGroup** | Bloquear grupo. |
387
+ | **makePhoneCall** | Hacer una llamada desde el dispositivo. |
388
+ | **mergeImagesLeftToRight** | Fusionar imágenes de izquierda a derecha. |
389
+ | **msgBox** | Mostrar caja de mensaje. |
390
+ | **msgBoxWithSound** | Mostrar caja de mensaje con sonido. |
391
+ | **openEditView** | Abrir vista edición. |
392
+ | **openFile** | Abrir un archivo. |
393
+ | **openMenu** | **Legacy** — usar `openEditView` para abrir pantallas. Sólo útil para el caso especial de lanzar directamente la LISTA de una coll: `openMenu(collName, mask, 0)`. Ver §3.1. |
394
+ | **openUrl** | Abrir URL. |
395
+ | **pickFile** | Seleccionar archivo. |
396
+ | **playSoundAndVibrate** | Reproducir sonido y vibración. |
397
+ | **playSoundVolumen** | Reproducir con volumen de sonido. |
398
+ | **print** | Imprimir. |
399
+ | **printBarcode** | Imprimir código de barras. |
400
+ | **printBIDI** | Imprimir BIDI. |
401
+ | **printCommand** | Imprimir comando. |
402
+ | **printImage** | Imprimir imagen. |
403
+ | **printLine** | Línea de impresión. |
404
+ | **printPDF** | Imprimir PDF. |
405
+ | **quitApp** | Salir de la aplicación. |
406
+ | **recognizeSpeech** | Reconocimiento de voz. Ver sección 3.10. |
407
+ | **recognizeText** | OCR de una imagen del dispositivo (alfabeto latino). Ver sección 3.5. |
408
+ | **refresh** | Refrescar (se le pueden pasar nombres de props a refrescar). |
409
+ | **refreshContentRow** | Refrescar la línea de un content. |
410
+ | **refreshContentSelectedRow** | Refrescar el content en la fila seleccionada. |
411
+ | **refreshValue** | Refrescar el valor de un campo. |
412
+ | **relayout** | Rediseñar la página. |
413
+ | **restartApp** | Reiniciar la aplicación. |
414
+ | **returnToForeground** | Volver al primer plano. |
415
+ | **returnToMainMenu** | Volver al menú principal. |
416
+ | **saveDrawing** | Guardar dibujo/firma. |
417
+ | **scanDocument** | Escanear un documento en papel con la cámara (recorte y enderezado automáticos, JPG y/o PDF). Ver sección 3.5. |
418
+ | **sendMail** | Enviar un email. |
419
+ | **sendSMS** | Enviar SMS. |
420
+ | **setFeedMode** | Ajustar modo de alimentación (impresión). |
421
+ | **setLanguage** | Ajustar idioma. |
422
+ | **setMaxWaitDialog** | Establecer el máximo del diálogo de espera (progreso). |
423
+ | **setNotificationLed** | Ajustar LED de notificación. |
424
+ | **setSelection** | Ajustar selección. |
425
+ | **shareData** | Compartir datos. |
426
+ | **sharedData** | Datos compartidos. |
427
+ | **showConsoleReplica** | Mostrar la consola de réplica. |
428
+ | **showDatePicker** | Mostrar selector de fecha. |
429
+ | **showGroup** | Mostrar grupo. |
430
+ | **showNavigationDrawer** | Mostrar cajón de navegación. |
431
+ | **showNotification** | Mostrar notificación. |
432
+ | **showSnackbar** | Mostrar snackbar. |
433
+ | **showSoftwareKeyboard** | Mostrar teclado del software. |
434
+ | **showTimePicker** | Mostrar selector de hora. |
435
+ | **showToast** | Mostrar toast. |
436
+ | **showWaitDialog** | Mostrar diálogo de espera. |
437
+ | **signDataObject** | Firmar data object. |
438
+ | **sleep** | Dormir (pausa). |
439
+ | **speak** | Síntesis de voz (text-to-speech). Ver sección 3.10. |
440
+ | **startAudioRecord** | Comenzar grabación de audio. Ver sección 3.10. |
441
+ | **startCamera** | Abrir la cámara y guardar la foto o el vídeo en un campo, con opción de foto en movimiento. Ver sección 3.5. |
442
+ | **startGps** | Iniciar GPS. |
443
+ | **startGpsV1** | Iniciar Gpsv1. |
444
+ | **startGpsV2** | Iniciar Gpsv2. |
445
+ | **startKioskMode** | Iniciar modo kiosko. |
446
+ | **startPrint** | Comenzar la impresión. |
447
+ | **startReplica** | Comenzar la réplica. |
448
+ | **startSignature** | Iniciar firma. |
449
+ | **startWifi** | Iniciar la wifi. |
450
+ | **stopAudioRecord** | Detener grabación de audio. |
451
+ | **stopGps** | Detener GPS. |
452
+ | **stopGpsV1** | Detener Gpsv1. |
453
+ | **stopGpsV2** | Detener Gpsv2. |
454
+ | **stopKioskMode** | Detener modo kiosko. |
455
+ | **stopPlaySoundAndVibrate** | Detener reproducción de sonido y vibración. |
456
+ | **stopReplica** | Detener réplica. |
457
+ | **stopWifi** | Para detener la wifi. |
458
+ | **takePhoto** | Tomar foto. |
459
+ | **toggleGroup** | Cambiar el estado de la visibilidad del grupo. |
460
+ | **uninstallApplication** | Desinstalar la aplicación. |
461
+ | **unlockGroup** | Desbloquear grupo. |
462
+ | **updateWaitDialog** | Actualizar diálogo de espera. |
463
+ | **useLastPrinter** | Utilizar la última impresora. |
464
+