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