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,392 @@
1
+ # XOne XML — Nodo contents y macros
2
+
3
+ > Fuente: `xone/v2/xone-help-docs/topics/02c-xml-contents-patrones.md` §6–§7. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §6 contents: vinculación con type=Z, filtros dinámicos ##FLD_CAMPO##, asfilter · §7 macros: macros del sistema, setMacro/getMacro y declaración del nodo macro
6
+
7
+ ---
8
+
9
+ ## 6. Nodo contents - Contenido Embebido
10
+
11
+ ### 6.1 Sintaxis y atributos
12
+
13
+ El nodo `<contents>` define una relación padre-hijo entre colecciones. Permite embeber una lista de registros dentro de otra pantalla.
14
+
15
+ ```xml
16
+ <contents name="@NombreContent"
17
+ src="NombreColeccionHija"
18
+ filter="CAMPO=VALOR"
19
+ sort="CAMPO ASC" />
20
+ ```
21
+
22
+ | Atributo | Tipo | Requerido | Descripción |
23
+ |----------|------|-----------|-------------|
24
+ | `name` | string | **Si** | Nombre del content, con prefijo `@` |
25
+ | `src` | string | **Si** | Nombre de la coleccion fuente (la coleccion hija) |
26
+ | `filter` | string | No | Filtro SQL para los registros |
27
+ | `sort` | string | No | Ordenamiento de los registros |
28
+
29
+ ### 6.2 Vinculacion con prop type=Z
30
+
31
+ Un `<contents>` por si solo no muestra nada. Necesita estar vinculado a un `<prop type="Z">`:
32
+
33
+ ```xml
34
+ <!-- Prop que muestra la lista -->
35
+ <prop name="MAP_LISTA" type="Z" visible="1"
36
+ contents="@MiContent"
37
+ viewmode="recyclerview"
38
+ width="100%" height="60%"
39
+ edit-inrow="true" />
40
+
41
+ <!-- Contents que define la fuente de datos -->
42
+ <contents name="@MiContent" src="ColeccionHija" />
43
+ ```
44
+
45
+ ### 6.3 Patron maestro-detalle
46
+
47
+ El patron más común es mostrar una lista (maestro) donde cada item abre un detalle:
48
+
49
+ ```xml
50
+ <coll name="ListaPedidos" notab="true"
51
+ sql="SELECT * FROM ##PREF##Pedidos"
52
+ objname="Pedidos" loadall="true">
53
+ <group name="Lista" id="1">
54
+ <!-- Campos visibles en la lista (visible="4" para content) -->
55
+ <prop name="NUMERO" type="T" visible="4" />
56
+ <prop name="FECHA" type="D" visible="4" />
57
+ <prop name="TOTAL" type="N2" visible="4" />
58
+
59
+ <!-- Campos visibles solo en edicion -->
60
+ <prop name="CLIENTE" type="T" visible="1" title="Cliente" />
61
+ <prop name="ESTADO" type="T" visible="1" title="Estado" />
62
+
63
+ <!-- Lista de lineas del pedido -->
64
+ <prop name="MAP_LINEAS" type="Z" visible="1"
65
+ contents="@LineasPedido"
66
+ viewmode="recyclerview"
67
+ width="100%" height="300p"
68
+ edit-inrow="true" />
69
+ </group>
70
+
71
+ <contents name="@LineasPedido" src="LineasPedido"
72
+ filter="ID_PEDIDO=##FLD_ID##" />
73
+
74
+ <selecteditem>
75
+ <action name="runscript">
76
+ <script>
77
+ ui.openEditView(self);
78
+ </script>
79
+ </action>
80
+ </selecteditem>
81
+ </coll>
82
+ ```
83
+
84
+ ### 6.4 Filtros dinámicos con ##FLD_CAMPO##
85
+
86
+ La macro `##FLD_CAMPO##` permite filtrar el content basandose en el valor de un campo del registro padre:
87
+
88
+ ```xml
89
+ <!-- Filtra por el ID del registro actual -->
90
+ <contents name="@Detalles" src="Detalles"
91
+ filter="ID_PADRE=##FLD_ID##" />
92
+
93
+ <!-- Filtro complejo con fecha -->
94
+ <contents name="Calendariodatos" src="ContentCalendarioLista"
95
+ filter="strftime('%m',##FLD_MAP_FECHA##)=strftime('%m',FECHA)
96
+ and strftime('%Y',##FLD_MAP_FECHA##)=strftime('%Y',FECHA)" />
97
+
98
+ <!-- Filtro con campo de chat -->
99
+ <contents name="Chatear" src="Chatear"
100
+ filter="IDCHAT=##FLD_MAP_CHATSEL##" />
101
+
102
+ <!-- Filtro con usuario actual -->
103
+ <contents name="nUsuarios" src="UsuariosChat"
104
+ filter="ID<>##USERID##" />
105
+
106
+ <!-- Filtro complejo con multiples condiciones -->
107
+ <contents name="ContentDatosFiltroMultiseleccion"
108
+ src="ContentDatosFiltroMultiseleccion"
109
+ filter="((t1.MARCADO=1 AND 1=##FLD_MAP_BUSCAR_MARCADOS##)
110
+ OR (t1.MARCADO=0 AND 1=##FLD_MAP_BUSCAR_NOMARCADOS##))
111
+ AND (ifnull(t1.NOMBRE,'') LIKE ##FLD_MAP_BUSCAR_TEXT##)" />
112
+ ```
113
+
114
+ ### 6.5 Ejemplos reales
115
+
116
+ **Ejemplo de contents con edición directa** (del wiki, EspecialContents.xne):
117
+
118
+ ```xml
119
+ <frame name="c1" width="98%" height="78%"
120
+ framebox="true" border-corner-radius="10" lmargin="1%" tmargin="2%">
121
+ <prop name="MAP_content1" height="96%" type="Z"
122
+ contents="content1"
123
+ forceonchange="true"
124
+ bgcolor="#FFFFFF"
125
+ onchange="refresh(@content1)" />
126
+ <contents name="content1" src="ContentDatos" />
127
+ </frame>
128
+ ```
129
+
130
+ **Ejemplo de contents con edición en fila**:
131
+
132
+ ```xml
133
+ <frame name="c2" width="98%" height="75%"
134
+ framebox="true" border-corner-radius="10" lmargin="1%" tmargin="2%">
135
+ <prop name="@content2" height="96%" type="Z"
136
+ contents="content2"
137
+ mask="0"
138
+ edit-inrow="true"
139
+ bgcolor="#FFFFFF" />
140
+ <contents name="content2" src="ContentDatosEditRow" />
141
+ </frame>
142
+ ```
143
+
144
+ **Manipulación de contents desde JavaScript** (ver Tópico 03):
145
+
146
+ ```javascript
147
+ // Obtener un content
148
+ var coll = self.getContents("content1");
149
+
150
+ // Crear un nuevo objeto
151
+ var obj = coll.createObject();
152
+ obj.NOMBRE = "Nuevo registro";
153
+ obj.DIRECCION = "Dirección nueva";
154
+
155
+ // Agregar a la lista (al final)
156
+ let view = ui.getView(self);
157
+ view.MAP_content1.addItem(obj);
158
+
159
+ // Agregar en una posicion concreta: 2o parametro opcional con el indice.
160
+ // Sincroniza lista y datos; el indice se acota al rango valido (negativo -> primer
161
+ // elemento; mayor que el total -> al final). Devuelve la vista de la fila insertada.
162
+ view.MAP_content1.addItem(obj, 0); // insertar como primer elemento
163
+
164
+ // Filtrar un content
165
+ self.getContents("content4").setFilter("NOMBRE like '%texto%'");
166
+ self.getContents("content4").loadAll();
167
+ ui.getView(self).refresh("@content4");
168
+
169
+ // Ordenar un content
170
+ self.getContents("content4").sort = "NOMBRE ASC";
171
+ self.getContents("content4").loadAll();
172
+ ```
173
+
174
+ ### 6.6 Nodo asfilter - Filtros de Busqueda en Listas
175
+
176
+ El nodo `<asfilter>` define campos de busqueda que permiten al usuario filtrar los registros de una coleccion directamente desde la interfaz. Se declara como hijo directo de `<coll>` y genera automáticamente una barra de busqueda con los campos especificados.
177
+
178
+ ```xml
179
+ <asfilter fontsize="8" left="12" sort="false">
180
+ <field name="NUMCOMPLETO" fldname="NUMCOMPLETO"
181
+ oper="##FLD## LIKE '##VAL##%'" width="15"
182
+ tooltip="Albaran" newline="false">ALBARAN</field>
183
+ <field name="FECHA" fldname="FECHA"
184
+ oper="##FLD## >= '##VAL##'" width="10"
185
+ tooltip="Fecha desde">FECHA DESDE</field>
186
+ </asfilter>
187
+ ```
188
+
189
+ **Atributos de `<asfilter>`:**
190
+
191
+ | Atributo | Descripción |
192
+ |----------|-------------|
193
+ | `fontsize` | Tamaño de fuente de los campos del filtro |
194
+ | `left` | Margen izquierdo del panel de filtro |
195
+ | `sort` | Habilita ordenamiento en el filtro (`true`/`false`) |
196
+
197
+ **Atributos de `<field>` dentro de `<asfilter>`:**
198
+
199
+ | Atributo | Descripción |
200
+ |----------|-------------|
201
+ | `name` | Nombre del campo de filtro |
202
+ | `fldname` | Nombre del campo real en la tabla de base de datos |
203
+ | `oper` | Operador SQL. Usa `##FLD##` para el nombre del campo y `##VAL##` para el valor ingresado por el usuario |
204
+ | `width` | Ancho del campo de filtro |
205
+ | `tooltip` | Texto de ayuda / placeholder del campo |
206
+ | `newline` | Si es `false`, se coloca en la misma linea que el campo anterior |
207
+
208
+ **Ejemplo básico de busqueda por nombre:**
209
+
210
+ ```xml
211
+ <asfilter>
212
+ <field name="BUSCAR" fldname="NOMBRE"
213
+ oper="##FLD## LIKE '%##VAL##%'" width="20"
214
+ tooltip="Buscar por nombre">BUSCAR</field>
215
+ </asfilter>
216
+ ```
217
+
218
+ > **Nota:** El contenido de texto del nodo `<field>` (ej. `BUSCAR`, `ALBARAN`) se usa como etiqueta visible del campo de filtro. La macro `##FLD##` se reemplaza por el valor de `fldname` y `##VAL##` por lo que el usuario escribe.
219
+
220
+ ---
221
+
222
+ ## 7. Nodo macro - Variables
223
+
224
+ ### 7.1 Definición y uso
225
+
226
+ Las macros en XOne son variables que se resuelven en tiempo de ejecución. Se usan con la sintaxis `##NOMBRE##` tanto en atributos XML como en consultas SQL.
227
+
228
+ ### 7.2 Macros del sistema
229
+
230
+ | Macro | Descripción | Uso típico |
231
+ |-------|-------------|------------|
232
+ | `##PREF##` | Prefijo de tablas en BD (ej: `gen_`) | Consultas SQL |
233
+ | `##ENTID##` | ID de la empresa/entidad actual | Filtros por empresa |
234
+ | `##USERID##` | ID del usuario logueado | Filtros por usuario |
235
+ | `##VERSION##` | Versión de la aplicación | Pantallas "Acerca de" |
236
+ | `##FRAME_VERSION##` | Versión del framework XOne | Información de sistema |
237
+ | `##APP##` | Ruta de la carpeta de la aplicación | Rutas de imágenes |
238
+ | `##EXIT##` | Comando para salir de la pantalla actual (con `appData.failWithMessage(-11888, ...)`). Para cerrar la app entera usar `appData.exit()` | Evento onback |
239
+ | `##NOW_TIME##` | Hora actual del sistema | Timestamps |
240
+
241
+ **Ejemplo de uso en SQL**:
242
+ ```xml
243
+ <coll name="MisRegistros"
244
+ sql="SELECT * FROM ##PREF##Registros WHERE USUARIO_ID = ##USERID##">
245
+ ```
246
+
247
+ **Ejemplo de uso en ruta de imagen**:
248
+ ```xml
249
+ <prop name="ICONO" type="IMG" path="##APP##\icons\xone.png" />
250
+ ```
251
+
252
+ **Ejemplo de uso en create**:
253
+ ```xml
254
+ <create>
255
+ <action name="setval" field="MAP_VERSION"
256
+ value="Versión ##VERSION## - Framework ##FRAME_VERSION##" />
257
+ </create>
258
+ ```
259
+
260
+ ### 7.3 Macros de campo (##FLD_CAMPO##)
261
+
262
+ Las macros `##FLD_CAMPO##` se resuelven al valor actual del campo especificado. Son útiles en:
263
+
264
+ - Filtros de contents
265
+ - Colores dinámicos
266
+ - Textos dinámicos en atributos
267
+
268
+ ```xml
269
+ <!-- Color de fondo dinámico basado en un campo -->
270
+ <prop name="MAP_LABEL" type="L"
271
+ bgcolor="##FLD_MAP_COLOR1##"
272
+ forecolor="##FLD_MAP_COLOR2##" />
273
+
274
+ <!-- Imagen dinámica basada en un campo -->
275
+ <prop name="BTORDENAR" type="B"
276
+ img="##FLD_MAP_BTORDEN##"
277
+ imgsel="##FLD_MAP_BTORDENCLICK##" />
278
+
279
+ <!-- Título dinámico -->
280
+ <prop name="lblOrigen" type="L"
281
+ title="##FLD_MAP_ORIGEN##" />
282
+
283
+ <!-- Filtro de contents con campo del padre -->
284
+ <contents name="@Detalles" src="Detalles"
285
+ filter="ID_PADRE=##FLD_ID##" />
286
+ ```
287
+
288
+ ### 7.4 Macros de animación
289
+
290
+ | Macro | Descripción |
291
+ |-------|-------------|
292
+ | `##ALPHA_IN##` | Fade in (aparece) |
293
+ | `##ALPHA_OUT##` | Fade out (desaparece) |
294
+ | `##ZOOM_IN##` | Zoom in (agranda) |
295
+ | `##ZOOM_OUT##` | Zoom out (reduce) |
296
+ | `##LEFT_IN##` | Entrada desde la izquierda |
297
+ | `##LEFT_OUT##` | Salida hacia la izquierda |
298
+ | `##RIGHT_IN##` | Entrada desde la derecha |
299
+ | `##RIGHT_OUT##` | Salida hacia la derecha |
300
+ | `##TOP_IN##` | Entrada desde arriba |
301
+ | `##BOTTOM_IN##` | Entrada desde abajo |
302
+
303
+ **Uso en frames animados**:
304
+
305
+ ```xml
306
+ <frame name="frmnuevochat"
307
+ animation-in-delay="250"
308
+ animation-out-delay="250"
309
+ animation-in="##RIGHT_IN##"
310
+ animation-out="##LEFT_OUT##"
311
+ disablevisible="MAP_VERFLOTANTE=0"
312
+ floating="true" top="0" left="0"
313
+ width="100%" height="100%">
314
+ ```
315
+
316
+ **Uso en navegación entre grupos**:
317
+
318
+ ```javascript
319
+ ui.showGroup(2, "##ALPHA_IN##", 500, "##ALPHA_OUT##", 500);
320
+ ```
321
+
322
+ ### 7.5 Macros de coleccion — Nodo XML `<macro>` + API `setMacro`/`getMacro`
323
+
324
+ Las macros de coleccion permiten **parametrizar el SQL de una `<coll>`** (en `sql`, `filter`, subconsultas, etc.) y cambiar su valor en tiempo de ejecución desde JavaScript. Son la herramienta principal para filtros dinámicos por interaccion del usuario (ej: cambiar el filtro de una lista cuando se selecciona un combo).
325
+
326
+ > **No confundir con `appData.setGlobalMacro` / `getGlobalMacro`**: las macros globales son variables de aplicación (equivalentes a `localStorage` en navegador) y se leen desde cualquier punto. Las macros de coll viven dentro de **una sola coleccion** y solo afectan al SQL de esa coll. Ver también la API JavaScript en el tópico 03.
327
+
328
+ #### Declaración en el XML — nodo `<macro>`
329
+
330
+ Para que una macro de coll funcione, **debe declararse explicitamente** dentro de la `<coll>`. El nodo `<macro>` se coloca **al mismo nivel que los nodos `<group>`** (es decir, hijo directo de `<coll>`, no anidado dentro de un `<group>` ni de un `<frame>`).
331
+
332
+ Sintaxis:
333
+
334
+ ```xml
335
+ <macro name="##NOMBRE##" value="valor por defecto" default="true" />
336
+ ```
337
+
338
+ | Atributo | Descripción |
339
+ |----------|-------------|
340
+ | `name` | Nombre de la macro con dobles `##...##`. Libre (ej. `##TIPO##`, `##FILTRO##`, `##MACRO1##`). Es el token que se sustituira en el SQL. |
341
+ | `value` | Valor por defecto. Puede ser un literal (`"1"`, `"abc"`) o un fragmento SQL completo (ej. `"1=1"`, `"FILTRO='A'"`, una subconsulta entera). XOne lo inyecta tal cual en la consulta. |
342
+ | `default`| `true` o `false`. Indica si la macro se aplica desde el inicio (con su `value` por defecto). **Convencion: poner siempre `default="true"`** salvo que tengas una razón explicita para lo contrario. |
343
+
344
+ #### Ejemplo completo (declaración + uso en SQL + cambio desde JS)
345
+
346
+ ```xml
347
+ <?xml version="1.0" encoding="iso-8859-15"?>
348
+ <coll name="ListaControles"
349
+ progid="ASData.CASBasicDataObj"
350
+ sql="SELECT ID, TITULO, FILTRO FROM ##PREF##CONTROLES WHERE ##TIPO##"
351
+ objname="Controles"
352
+ loadall="true">
353
+
354
+ <!-- Declaracion de macros: al mismo nivel que los <group>, NO dentro de ninguno -->
355
+ <macro name="##TIPO##" value="1=1" default="true" />
356
+
357
+ <group name="General" id="1">
358
+ <prop name="TITULO" type="T" visible="7" />
359
+ <prop name="FILTRO" type="T" visible="7" />
360
+ </group>
361
+ </coll>
362
+ ```
363
+
364
+ Y desde JavaScript, en un `onchange` de un combo de la pantalla padre:
365
+
366
+ ```javascript
367
+ // CORRECTO: setMacro / getMacro
368
+ var coll = self.getContents("content1");
369
+ if (self.TIPO == "TODOS") {
370
+ coll.setMacro("##TIPO##", "1=1");
371
+ } else {
372
+ coll.setMacro("##TIPO##", "FILTRO='" + self.TIPO.toString() + "'");
373
+ }
374
+ ui.refresh();
375
+ ```
376
+
377
+ > **API correcta:** `setMacro("##NOMBRE##", valor)` y `getMacro("##NOMBRE##")`. **NUNCA** `coll.macro(...)` — esa forma no existe en XOne.
378
+
379
+ #### Casos de uso típicos
380
+
381
+ - Filtrar una lista por un valor de combo/segmented control.
382
+ - Cambiar la query SELECT entera de un content en función del estado de la pantalla padre (`coll.setMacro("##TIPO##", "SELECT ID, TITULO, FILTRO FROM GEN_CONTROLES WHERE FILTRO='" + valor + "'")`).
383
+ - Habilitar/deshabilitar un fragmento del WHERE poniendo la macro a `"1=1"` (todo) o a una clausula concreta.
384
+
385
+ #### Diferencias con `##FLD_CAMPO##`
386
+
387
+ | | `<macro>` + `setMacro` | `##FLD_CAMPO##` |
388
+ |---|---|---|
389
+ | Donde se define | Nodo `<macro>` en la coll + JS imperativo | En el `filter`/SQL del content directamente |
390
+ | Quien la cambia | Código JS llamando a `setMacro` | XOne automáticamente al cambiar el campo padre |
391
+ | Caso típico | Filtro dinámico por interaccion del usuario | Maestro-detalle (sub-content filtrado por el padre) |
392
+
@@ -0,0 +1,245 @@
1
+ # XOne XML — Errores comunes a evitar
2
+
3
+ > Fuente: `xone/v2/xone-project-generator/references/xone-xml-ui-e-mapas-errores.md` §14. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §14 errores comunes de XML y su corrección
6
+
7
+ ---
8
+
9
+ ## 14. Errores Comunes a Evitar
10
+
11
+ ### Error 1: Usar CSS Web Estándar
12
+
13
+ ```css
14
+ /* INCORRECTO */
15
+ prop { font-size: 14px; margin-top: 10px; }
16
+
17
+ /* CORRECTO */
18
+ prop { fontsize: 14; tmargin: 10p; }
19
+ ```
20
+
21
+ ### Error 2: Olvidar ##PREF## en SQL
22
+
23
+ ```xml
24
+ <!-- INCORRECTO -->
25
+ <coll sql="SELECT * FROM Productos">
26
+
27
+ <!-- CORRECTO -->
28
+ <coll sql="SELECT * FROM ##PREF##Productos">
29
+ ```
30
+
31
+ ### Error 3: Tipos No Validos
32
+
33
+ ```xml
34
+ <!-- INCORRECTO -->
35
+ <prop name="NOMBRE" type="STRING" />
36
+
37
+ <!-- CORRECTO -->
38
+ <prop name="NOMBRE" type="T" />
39
+ ```
40
+
41
+ ### Error 4: Sin objname para Persistencia
42
+
43
+ ```xml
44
+ <!-- NO SE PERSISTE -->
45
+ <coll name="Productos">
46
+
47
+ <!-- SE PERSISTE -->
48
+ <coll name="Productos" objname="Productos">
49
+ ```
50
+
51
+ ### Error 5: APIs Web en JavaScript
52
+
53
+ ```javascript
54
+ // INCORRECTO
55
+ document.getElementById("campo").value = "test";
56
+ localStorage.setItem("key", "value");
57
+
58
+ // CORRECTO
59
+ self.MAP_CAMPO = "test";
60
+ appData.setGlobalMacro("KEY", "value");
61
+ ```
62
+
63
+ ### Error 6: Todas las Colecciones en mappings.xne
64
+
65
+ mappings.xne solo debe contener Empresas y Usuarios. Las demas colecciones van en archivos `.xne` separados.
66
+
67
+ ### Error 7: Campos Obligatorios Faltantes
68
+
69
+ Empresas necesita: `CODIGO`, `NOMBRE`, `ROWID`
70
+ Usuarios necesita: `CODIGO`, `NOMBRE`, `IDEMPRESA`, `LOGIN`, `PWD`, `ROWID`
71
+
72
+ ### Error 8: Prefijo Diferente a "gen" Sin Autorización
73
+
74
+ Siempre usar `prefix="gen"` a menos que el usuario lo solicite explicitamente.
75
+
76
+ ### Error 9: Falta @ en name del Contents
77
+
78
+ ```xml
79
+ <!-- INCORRECTO -->
80
+ <contents name="MiContenido" src="MiColeccion" />
81
+
82
+ <!-- CORRECTO -->
83
+ <contents name="@MiContenido" src="MiColeccion" />
84
+ ```
85
+
86
+ El `@` va siempre en el `name` del nodo `<contents>` y en el atributo `contents` del `<prop type="Z">` que lo referencia.
87
+
88
+ ### Error 10: Sintaxis de Otros Frameworks
89
+
90
+ No usar HTML (`<div>`, `<input>`), ni sintaxis React/Angular/Vue. Usar siempre nodos XOne (`<frame>`, `<prop>`, `<coll>`).
91
+
92
+ ### Error 11: progid incorrecto en Empresas / Usuarios
93
+
94
+ `progid` es **opcional**: si se omite, la coll se comporta como un objeto de datos genérico (equivalente a `ASData.CASBasicDataObj`). El error real es **olvidar el progid propio en las colecciones especiales** Empresas y Usuarios, que lo necesitan para activar su lógica de negocio:
95
+
96
+ ```xml
97
+ <!-- INCORRECTO: Empresas/Usuarios sin su progid propio -->
98
+ <coll name="Empresas" objname="empresa" ...>
99
+ <coll name="Usuarios" objname="usuarios" ...>
100
+
101
+ <!-- CORRECTO -->
102
+ <coll name="Empresas" objname="empresa" progid="ASGestion.CASEmpresa" ...>
103
+ <coll name="Usuarios" objname="usuarios" progid="ASGestion.CASUser" ...>
104
+ ```
105
+
106
+ Valores:
107
+ - (omitido) o `ASData.CASBasicDataObj` — cualquier coleccion de negocio genérica
108
+ - `ASGestion.CASEmpresa` — coleccion Empresas, en mappings.xne
109
+ - `ASGestion.CASUser` — coleccion Usuarios, en mappings.xne
110
+
111
+ ### Error 12: Encoding incoherente en ficheros XNE
112
+
113
+ El motor respeta el `encoding` declarado en el prólogo del `.xne` (y asume UTF-8 si no se declara). UTF-8 e `iso-8859-15` son **ambos válidos**. El error real es la **discrepancia**: declarar un encoding distinto de cómo está realmente guardado el fichero, lo que corrompe tildes y ñ.
114
+
115
+ ```xml
116
+ <!-- INCORRECTO: declara iso-8859-15 pero el fichero está guardado como UTF-8 (o al revés) -->
117
+ <?xml version="1.0" encoding="iso-8859-15"?> <!-- ...y los bytes son UTF-8: tildes/ñ corruptas -->
118
+
119
+ <!-- CORRECTO: el encoding declarado coincide con cómo se guarda el fichero -->
120
+ <?xml version="1.0" encoding="utf-8"?> <!-- fichero realmente guardado en UTF-8 -->
121
+ ```
122
+
123
+ ### Error 13: Estructura Incorrecta de mappings.xne
124
+
125
+ ```xml
126
+ <!-- INCORRECTO: collprops no existe en XOne -->
127
+ <xml>
128
+ <collprops type="general">
129
+ <coll name="Empresas" ...>
130
+
131
+ <!-- CORRECTO: las colecciones van directamente dentro de <xml> -->
132
+ <xml>
133
+ <app .../>
134
+ <coll name="Empresas" progid="ASGestion.CASEmpresa" ...>
135
+ <coll name="Usuarios" progid="ASGestion.CASUser" ...>
136
+ </xml>
137
+ ```
138
+
139
+ ### Error 14: filter y sort dentro del SQL
140
+
141
+ ```xml
142
+ <!-- INCORRECTO: el filtro dentro del SQL no es gestionado por el framework -->
143
+ <coll sql="SELECT * FROM ##PREF##Productos WHERE ACTIVO=1 ORDER BY NOMBRE">
144
+
145
+ <!-- CORRECTO: filter y sort como atributos separados del nodo coll -->
146
+ <coll sql="SELECT t1.* FROM ##PREF##Productos t1"
147
+ filter="ACTIVO=1"
148
+ sort="NOMBRE ASC">
149
+ ```
150
+
151
+ ### Error 15: Evento del Calendario con Guion
152
+
153
+ ```xml
154
+ <!-- INCORRECTO -->
155
+ <ondate-selected>
156
+ <script>self.FECHA = e.selectedDate;</script>
157
+ </ondate-selected>
158
+
159
+ <!-- CORRECTO: sin guion, y el parametro es DATEVALUE (no e.selectedDate) -->
160
+ <ondateselected>
161
+ <action name="runscript">
162
+ <param name="DATEVALUE" />
163
+ <script language="javascript">
164
+ self.MAP_FECHA_SEL = DATEVALUE;
165
+ </script>
166
+ </action>
167
+ </ondateselected>
168
+ ```
169
+
170
+ ### Error 16: Usar APIs del DOM en JavaScript
171
+
172
+ XOne no es HTML y no ejecuta código en un navegador. Estas APIs del DOM **no existen** en el entorno XOne y causarán errores:
173
+
174
+ ```javascript
175
+ // INCORRECTO — APIs del DOM, no existen en XOne
176
+ document.getElementById("campo").value = "hola";
177
+ document.querySelector(".clase").style.display = "none";
178
+ window.location.href = "otraPantalla";
179
+ localStorage.setItem("clave", "valor");
180
+ sessionStorage.getItem("clave");
181
+ navigator.geolocation.getCurrentPosition(cb);
182
+ history.back();
183
+
184
+ // CORRECTO — usar las APIs propias de XOne (idiomáticas)
185
+ self.MAP_CAMPO = "hola"; // escribir en campo
186
+ ui.openEditView("OtraPantalla"); // navegar (forma corta: XOne crea el dataObject internamente)
187
+ appData.setGlobalMacro("CLAVE", "valor"); // almacenar globalmente
188
+ appData.getGlobalMacro("CLAVE"); // recuperar valor global
189
+ $http.get("https://api.ejemplo.com/datos", ...); // petición HTTP idiomática
190
+ ui.startGps(...); // GPS
191
+
192
+ // TAMBIÉN funcionan — implementación custom XOne, semántica spec-compatible
193
+ fetch("https://api.ejemplo.com/datos").then(r => r.json()); // alternativa a $http
194
+ new Promise((resolve, reject) => { resolve(42); }); // Promise ES2024
195
+ setTimeout(() => doIt(), 1000); // ms (no segundos)
196
+ ```
197
+
198
+ ### Error 17: Nombres de nodos duplicados dentro de una coleccion
199
+
200
+ **Esta es una restricción crítica de la plataforma XOne.** Dentro de una `<coll>`, cada nodo con atributo `name` debe tener un nombre único en su ambito. Tampoco puede haber dos `<coll>` con el mismo nombre en el proyecto.
201
+
202
+ ```xml
203
+ <!-- INCORRECTO: dos <group> con el mismo name -->
204
+ <coll name="MiPantalla" special="true">
205
+ <group name="grpPrincipal" id="1">...</group>
206
+ <group name="grpPrincipal" id="2">...</group> <!-- ERROR -->
207
+ </coll>
208
+
209
+ <!-- INCORRECTO: dos <prop> con el mismo name -->
210
+ <group name="grpDatos" id="1">
211
+ <prop name="NOMBRE" type="T" visible="7"/>
212
+ <prop name="NOMBRE" type="L" visible="2"/> <!-- ERROR -->
213
+ </group>
214
+
215
+ <!-- INCORRECTO: dos <frame> con el mismo name -->
216
+ <group name="grpPrincipal" id="1">
217
+ <frame name="frmBody" width="100%" height="200p"/>
218
+ <frame name="frmBody" width="100%" height="-2"/> <!-- ERROR -->
219
+ </group>
220
+
221
+ <!-- INCORRECTO: dos eventos del mismo tipo -->
222
+ <coll name="MiPantalla" special="true">
223
+ <before-edit>...</before-edit>
224
+ <before-edit>...</before-edit> <!-- ERROR -->
225
+ </coll>
226
+
227
+ <!-- CORRECTO: todos los nombres son unicos en su ambito -->
228
+ <coll name="MiPantalla" special="true">
229
+ <before-edit>...</before-edit>
230
+ <group name="grpPrincipal" id="1">
231
+ <frame name="frmHeader" width="100%" height="100p"/>
232
+ <frame name="frmBody" width="100%" height="-2"/>
233
+ <prop name="MAP_TITULO" type="L" visible="7"/>
234
+ <prop name="MAP_SUBTITULO" type="L" visible="7"/>
235
+ </group>
236
+ <group name="grpSecundario" id="2">...</group>
237
+ </coll>
238
+ ```
239
+
240
+ **Lo que SI es valido:** dos `<coll>` con distinto `name` pero contenido identico. La restricción es sobre el nombre, no sobre el contenido.
241
+
242
+ ---
243
+
244
+ *Documento de referencia generado a partir de las knowledgebases del proyecto XOneAI, la base de conocimiento estructurada (docs/kb/) y el análisis de 572 archivos .xne de 224 proyectos reales.*
245
+