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,326 @@
1
+ # XOne XML — Estructura de los .xne y nodo coll
2
+
3
+ > Fuente: `xone/v2/xone-help-docs/topics/02a-xml-estructura.md` §1–§2. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §1 introducción al sistema de UI · §2 nodo coll: colecciones de datos vs especiales, valores de progid, atributos, sql y loadall
6
+
7
+ ---
8
+
9
+ ## 1. Introduccion al Sistema de UI
10
+
11
+ ### 1.1 El modelo declarativo XML de XOne
12
+
13
+ XOne utiliza un sistema declarativo basado en XML para definir la interfaz de usuario de aplicaciones móviles nativas. Cada pantalla, formulario o lista se describe en un archivo con extensión `.xne`, que es un documento XML con etiquetas propietarias de la plataforma.
14
+
15
+ A diferencia de tecnologías web como HTML + CSS + JavaScript, donde la estructura, el estilo y la lógica están separados en archivos distintos, XOne combina los tres aspectos en un mismo archivo `.xne`:
16
+
17
+ - **Estructura**: Definida por los nodos XML (`<coll>`, `<group>`, `<frame>`, `<prop>`).
18
+ - **Estilos**: Aplicados mediante atributos inline o clases CSS propietarias (ver Tópico 04 - CSS).
19
+ - **Lógica**: Integrada mediante event handlers (`<create>`, `<load>`, `<onchange>`) y nodos custom que contienen JavaScript (ver Tópico 03 - JavaScript API).
20
+
21
+ ### 1.2 Jerarquía: coll > group > frame > prop
22
+
23
+ La estructura de UI en XOne sigue una jerarquía estricta:
24
+
25
+ ```
26
+ <coll> ← Coleccion (raiz de la pantalla)
27
+ ├── <group> ← Agrupacion / pestana
28
+ │ ├── <frame> ← Contenedor visual
29
+ │ │ ├── <prop> ← Campo / control
30
+ │ │ ├── <prop> ← Campo / control
31
+ │ │ └── <frame> ← Frame anidado
32
+ │ │ └── <prop>
33
+ │ └── <prop> ← Campo directo en grupo
34
+ ├── <group> ← Otra pestana
35
+ ├── <contents> ← Coleccion embebida
36
+ ├── <create> ← Evento de creacion
37
+ ├── <load> ← Evento de carga
38
+ ├── <onchange> ← Evento de cambio
39
+ └── <onback> ← Evento de retroceso
40
+ ```
41
+
42
+ **Reglas clave**:
43
+ - `<coll>` es siempre el nodo raiz.
44
+ - Los `<group>` son hijos directos de `<coll>` y definen secciones o pestanas.
45
+ - Los `<frame>` pueden estar dentro de `<group>` o anidados dentro de otros `<frame>`.
46
+ - Los `<prop>` pueden estar dentro de `<group>` o `<frame>`.
47
+ - Los `<contents>` se declaran como hijos directos de `<coll>` (o dentro de frames/groups en algunos casos).
48
+ - Los event handlers se declaran como hijos directos de `<coll>`.
49
+
50
+ ### 1.3 Diferencias con HTML/CSS/JS web
51
+
52
+ Si vienes del mundo web, estas son las diferencias fundamentales:
53
+
54
+ | Aspecto | HTML/CSS/JS Web | XOne XML |
55
+ |---------|----------------|----------|
56
+ | Extensión de archivo | `.html`, `.css`, `.js` | `.xne` (todo junto) |
57
+ | Nodo raiz | `<html>` | `<coll>` |
58
+ | Contenedores | `<div>`, `<section>` | `<frame>`, `<group>` |
59
+ | Campos de entrada | `<input>`, `<select>` | `<prop type="T">` (texto), `<prop type="T" mapcol="..." mapfld="...">` (selector/combo) |
60
+ | Botones | `<button>` | `<prop type="B">` |
61
+ | Imágenes | `<img>` | `<prop type="IMG">` |
62
+ | Listas | `<ul>`, `<table>` | `<prop type="Z">` + `<contents>` |
63
+ | Unidades CSS | `px`, `em`, `rem` | `p` (puntos), `%` (porcentaje) |
64
+ | Layout | Flexbox, Grid | Flujo lineal con `newline`, `width`, `align` |
65
+ | Eventos | `addEventListener` | Nodos XML: `<create>`, `<onchange>`, etc. |
66
+ | Estilos | CSS3 estándar | CSS propietario XOne (ver Tópico 04) |
67
+
68
+ > **Importante**: NO uses atributos o funciones de HTML/CSS/JS web estándar. XOne tiene su propia API (ver Tópico 03 - JavaScript) y su propio sistema CSS (ver Tópico 04 - CSS).
69
+
70
+ ### 1.4 Declaración XML y encoding
71
+
72
+ Todo archivo `.xne` debe comenzar con la declaración XML:
73
+
74
+ ```xml
75
+ <?xml version="1.0" encoding="utf-8"?>
76
+ ```
77
+
78
+ Los encodings más comunes son:
79
+ - `utf-8` (recomendado para proyectos nuevos)
80
+ - `iso-8859-1`
81
+ - `iso-8859-15`
82
+
83
+ ---
84
+
85
+ ## 2. Nodo coll - Colecciones
86
+
87
+ El nodo `<coll>` es el nodo raiz de cada archivo `.xne`. Representa una **coleccion**, que en XOne puede ser:
88
+ - Una **pantalla** de la aplicación (menú, formulario, etc.).
89
+ - Una **tabla de base de datos** con su interfaz visual asociada.
90
+ - Un **contenedor de lógica** sin datos reales (`special="true"`).
91
+
92
+ ### 2.1 Atributos de identificación
93
+
94
+ | Atributo | Tipo | Requerido | Descripción |
95
+ |----------|------|-----------|-------------|
96
+ | `name` | string | **Si** | Nombre único de la coleccion. Usa PascalCase: `MenuPrincipal`, `DetalleProducto`. |
97
+ | `title` | string | No | Título visible en la barra de la aplicación. Si se omite, no muestra título. |
98
+ | `objname` | string | No | Nombre del objeto de datos en la base de datos. Suele coincidir con el nombre de la tabla. |
99
+ | `updateobj` | string | No | Nombre del objeto para operaciones de escritura (INSERT, UPDATE, DELETE). |
100
+ | `progid` | string | No | Identificador del tipo de objeto de negocio. |
101
+
102
+ **Ejemplo**:
103
+ ```xml
104
+ <coll name="Clientes" title="Lista de Clientes"
105
+ objname="Clientes" updateobj="Clientes">
106
+ ```
107
+
108
+ ### 2.2 Atributos de datos
109
+
110
+ | Atributo | Tipo | Descripción | Ejemplo |
111
+ |----------|------|-------------|---------|
112
+ | `sql` | string | Consulta SQL para cargar datos. Usar `##PREF##` para el prefijo de tabla. | `sql="SELECT * FROM ##PREF##Clientes"` |
113
+ | `filter` | string | Filtro SQL adicional (clausula WHERE). | `filter="ACTIVO=1"` |
114
+ | `sort` | string | Ordenamiento de datos (clausula ORDER BY). | `sort="NOMBRE ASC"` |
115
+ | `connection` | string | Nombre de la conexión a base de datos si no es la principal. | `connection="GpsConnection"` |
116
+ | `loadall` | boolean | Si es `true`, carga todos los registros al abrir. | `loadall="true"` |
117
+ | `dependent` | boolean | Indica si la coleccion depende de una coleccion padre. | `dependent="false"` |
118
+ | `check-owner` | boolean | Verifica que los registros pertenezcan al usuario/empresa actual. | `check-owner="false"` |
119
+ | `page-limit-off` | string | Desactiva la paginación automática. | `page-limit-off="1"` |
120
+ | `userawsql` | boolean | Usar SQL sin procesar (sin modificaciones del framework). | `userawsql="true"` |
121
+ | `autorefresh` | boolean | Refresca datos automáticamente al regresar de otra ventana o pantalla. | `autorefresh="true"` |
122
+ | `start-from-bottom` | boolean | El scroll empieza desde el final y se mantiene anclado al último elemento (estilo chat). Se puede declarar aquí en la coll o en el propio content (el prop `type="Z"`); si está en ambos, gana el del content. | `start-from-bottom="true"` |
123
+ | `no-data-text` | string | Texto a mostrar cuando la coleccion no tiene registros. | `no-data-text="Sin datos"` |
124
+ | `stringkey` | boolean | Indica que la clave primaria es de tipo texto en lugar de entero. | `stringkey="true"` |
125
+ | `idfieldname` | string | Nombre del campo que actua como clave primaria cuando no se llama `ID`. | `idfieldname="CODIGO"` |
126
+
127
+ **Ejemplo con SQL compleja**:
128
+ ```xml
129
+ <coll name="ContentDatos"
130
+ sql="select t1.*, t1.NOMBRE as MAP_NOMBRE_GRID,
131
+ t1.DIRECCION as MAP_DIRECCION_GRID,
132
+ replace(t1.LATITUD, ',', '.') as MAP_LATITUD_GRID
133
+ from ##PREF##mapa_datos t1"
134
+ objname="mapa_datos"
135
+ updateobj="mapa_datos"
136
+ loadall="true"
137
+ check-owner="false"
138
+ dependent="false">
139
+ ```
140
+
141
+ ### 2.3 Atributos visuales
142
+
143
+ | Atributo | Tipo | Descripción | Ejemplo |
144
+ |----------|------|-------------|---------|
145
+ | `bgcolor` | color | Color de fondo de la coleccion. | `bgcolor="#FFFFFF"` |
146
+ | `notab` | boolean | Oculta las pestanas de navegación entre grupos. | `notab="true"` |
147
+ | `special` | boolean | Marca como coleccion especial (sin tabla real en BD). | `special="true"` |
148
+ | `show-toolbar` | boolean | Muestra u oculta la barra de herramientas del sistema. | `show-toolbar="false"` |
149
+ | `show-footer` | boolean | Muestra u oculta el pie de página del sistema. | `show-footer="true"` |
150
+ | `group-theme` | string | Tema visual para los tabs de grupo. | `group-theme="material"` |
151
+ | `tab-mode` | string | Modo de los tabs: `scrollable` o `fixed`. | `tab-mode="scrollable"` |
152
+ | `group-swipe` | boolean | Permite deslizar entre grupos con gesto. | `group-swipe="true"` |
153
+ | `no-data-align` | string | Alineacion del mensaje "sin datos". | `no-data-align="center"` |
154
+ | `cell-selected-bgcolor` | color | Color de fondo de celda seleccionada. | `cell-selected-bgcolor="#00FF00"` |
155
+ | `cell-selected-border-color` | color | Color del borde de celda seleccionada. | `cell-selected-border-color="#00000000"` |
156
+ | `cell-odd-color` | color | Color de filas impares. | `cell-odd-color="#FFFFFF"` |
157
+ | `cell-even-color` | color | Color de filas pares. | `cell-even-color="#F2F2F2"` |
158
+ | `cell-height` | dimensión | Alto fijo de cada fila en modo listado (en puntos `p`). | `cell-height="80p"` |
159
+ | `cell-tpadding` | dimensión | Margen interior superior de cada celda. | `cell-tpadding="4p"` |
160
+ | `cell-bpadding` | dimensión | Margen interior inferior de cada celda. | `cell-bpadding="4p"` |
161
+ | `cell-bgcolor` | color | Color de fondo general de todas las celdas. | `cell-bgcolor="#FFFFFF"` |
162
+
163
+ ### 2.4 Valores de progid
164
+
165
+ El atributo `progid` define el tipo de objeto de datos:
166
+
167
+ | Valor | Descripción |
168
+ |-------|-------------|
169
+ | `ASData.CASBasicDataObj` | Objeto de datos básico (el más común) |
170
+ | `ASGestion.CASEmpresa` | Objeto de gestion de empresa (para coleccion Empresas) |
171
+ | `ASGestion.CASUser` | Objeto de gestion de usuario (para coleccion Usuarios) |
172
+
173
+ > **Nota**: `progid` es **opcional**. Si se omite, la coll se comporta como un objeto de datos genérico (equivalente a `ASData.CASBasicDataObj`). Solo los casos especiales lo requieren: **Empresas** usa `ASGestion.CASEmpresa` y **Usuarios** `ASGestion.CASUser`, normalmente en `mappings.xne`.
174
+
175
+ #### `ID` y `ROWID`: columnas de plataforma (no hace falta declararlas)
176
+
177
+ Los campos `ID` y `ROWID` existen siempre en toda tabla persistida (con `objname`) **a nivel de base de datos** y XOne **gestiona sus valores automáticamente** (el `ID` es autonumérico; el `ROWID` lo autogenera el framework). **No hace falta declararlos** como nodo `<prop>` dentro del `<group>`: declararlos es válido pero redundante, así que la recomendación es omitirlos por limpieza.
178
+
179
+ | Campo | Tipo BD | ¿Hace falta declararlo como `<prop>`? | ¿Incluir en el SELECT del `sql=`? |
180
+ |--------|---------|--------------------------|-----------------------------------|
181
+ | `ID` | N (autoincremental, clave primaria) | **No** (redundante, aunque válido) | **SI** — siempre |
182
+ | `ROWID`| T size 32 (GUID hex sin guiones, gestionado por XOne para la replica) | **No** (redundante, aunque válido) | **NO** — no es necesario |
183
+
184
+ ```xml
185
+ <!-- REDUNDANTE: declarar ID y ROWID (es válido, pero los gestiona XOne) -->
186
+ <coll name="Clientes" progid="ASData.CASBasicDataObj"
187
+ sql="SELECT * FROM ##PREF##Clientes" objname="Clientes" updateobj="Clientes">
188
+ <group name="General" id="1">
189
+ <prop name="ID" type="N" visible="0" /> <!-- redundante: lo gestiona XOne -->
190
+ <prop name="NOMBRE" type="T" visible="7" />
191
+ <prop name="ROWID" type="T" size="32" visible="0" /> <!-- redundante: lo gestiona XOne -->
192
+ </group>
193
+ </coll>
194
+
195
+ <!-- RECOMENDADO (más limpio): solo campos de negocio; el ID se rescata en el SELECT -->
196
+ <coll name="Clientes" progid="ASData.CASBasicDataObj"
197
+ sql="SELECT ID, NOMBRE FROM ##PREF##Clientes" objname="Clientes" updateobj="Clientes">
198
+ <group name="General" id="1">
199
+ <prop name="NOMBRE" type="T" visible="7" />
200
+ </group>
201
+ </coll>
202
+ ```
203
+
204
+ > Aplica a TODAS las colls, incluidas Empresas (`ASGestion.CASEmpresa`) y Usuarios (`ASGestion.CASUser`).
205
+
206
+ #### Convencion de prefijos en nombres de campos
207
+
208
+ | Prefijo | Uso | Ejemplo |
209
+ |---------|-----|---------|
210
+ | _(sin prefijo)_ | Campo de la tabla principal — se graba en BD | `NOMBRE`, `FECHA`, `ESTADO` |
211
+ | `MAP_` | Campo de tabla enlazada (JOIN) — **no** se graba en BD | `MAP_NOMBRE_CLIENTE`, `MAP_TOTAL` |
212
+ | `ID` + nombre | Clave foranea de enlace a otra coleccion | `IDCLIENTE`, `IDEMPRESA` |
213
+ | `@` | Campo de tipo `Z` (contents embebido) | `@LineasPedido` |
214
+ | `%` | Campo de tipo `NC` usado como bitmask | `%OPCIONES` |
215
+ | `$` | Campo calculado (formula) | `$IMPORTE_TOTAL` |
216
+
217
+ ### 2.5 Colecciones especiales vs colecciones de datos
218
+
219
+ **Coleccion especial** (`special="true"`): **el framework NO gestiona sus datos.**
220
+
221
+ - No tiene tabla en la base de datos.
222
+ - **`sql`, `objname` y `updateobj` no se requieren, y si se ponen el framework los IGNORA.**
223
+ Vacíos o ausentes, las dos formas valen. Esto no es lo mismo que «no hacen falta»: un `sql`
224
+ escrito aquí **no se ejecuta**, y ése es el síntoma clásico de pantalla vacía en una coll
225
+ especial — el `SELECT` está, parece correcto, y nadie lo corre.
226
+ - Tiene **dos usos**, que son el mismo visto sin datos y con ellos:
227
+ 1. **Pantalla de puro UI** — menú, login, bienvenida (`EntradaApp`), buscador, o una coll base
228
+ para heredar con `inherits`. Los `<prop>` son memoria temporal.
229
+ 2. **Coleccion llenada desde script** — se rellena a mano con `addItem` (por ejemplo tras
230
+ llamar a una API) para pintarla en un `<contents>` o para buscar sobre ella. Los datos son
231
+ reales; lo que no hay es una tabla detrás que el framework cargue y guarde solo.
232
+ - **No confundir con `<entry-point>`**, el nodo de `app.xml` que dice qué coleccion se abre al
233
+ entrar: esa coll suele ser `special`, pero son cosas distintas.
234
+
235
+ ```xml
236
+ <coll name="MenuPrincipal" title="Menu"
237
+ special="true" notab="true" bgcolor="#FFFFFF">
238
+ <!-- Solo lógica y UI, sin datos en BD -->
239
+ </coll>
240
+ ```
241
+
242
+ **Coleccion de datos**:
243
+ - Tiene tabla en la base de datos.
244
+ - Requiere `sql`, `objname` y `updateobj`.
245
+ - Los campos `<prop>` se mapean a columnas de la tabla.
246
+
247
+ ```xml
248
+ <coll name="Clientes"
249
+ sql="SELECT * FROM ##PREF##Clientes"
250
+ objname="Clientes" updateobj="Clientes"
251
+ loadall="true">
252
+ <!-- Campos mapeados a columnas de gen_clientes -->
253
+ </coll>
254
+ ```
255
+
256
+ ### 2.6 Ejemplo completo comentado
257
+
258
+ Ejemplo real basado en el proyecto UseCars:
259
+
260
+ ```xml
261
+ <?xml version="1.0" encoding="utf-8"?>
262
+ <!--
263
+ MenuPrincipal - Pantalla principal con mapa
264
+ -->
265
+ <coll name="MenuPrincipal" title="UseCars"
266
+ notab="true"
267
+ show-toolbar="false"
268
+ bgcolor="#FFFFFF">
269
+
270
+ <!-- Evento create: se ejecuta una sola vez al crear -->
271
+ <create>
272
+ <script>
273
+ self.MAP_ORIGEN = "";
274
+ self.MAP_DESTINO = "";
275
+ self.MAP_TIPO_VEHICULO = "ECONOMY";
276
+ </script>
277
+ </create>
278
+
279
+ <!-- Inicializar la pantalla cada vez que se abre: usar before-edit -->
280
+ <before-edit refresh="false" show-wait-dialog="false">
281
+ <script>
282
+ let usuario = obtenerUsuarioActual();
283
+ if (usuario) {
284
+ self.MAP_NOMBRE_USUARIO = usuario.NOMBRE;
285
+ }
286
+ </script>
287
+ </before-edit>
288
+
289
+ <!-- Grupo principal sin pestana -->
290
+ <group name="grpPrincipal" id="1" class="groupNoTab">
291
+ <frame name="frmMapa" width="100%" height="100%">
292
+ <prop name="MAP_MAPA" type="Z" viewmode="mapview" visible="7"
293
+ width="100%" height="100%"
294
+ show-user-location="true"/>
295
+ </frame>
296
+ </group>
297
+
298
+ <!-- Evento al pulsar atrás -->
299
+ <onback>
300
+ <script>
301
+ if (confirmar("Desea salir?", "Salir")) {
302
+ appData.exit();
303
+ }
304
+ </script>
305
+ </onback>
306
+ </coll>
307
+ ```
308
+
309
+ ### 2.7 Buenas prácticas
310
+
311
+ 1. **Nombres descriptivos en PascalCase**: `MenuPrincipal`, `DetallePedido`, `ListaClientes`.
312
+ 2. **Usar `##PREF##`** siempre en consultas SQL para compatibilidad con el prefijo de tablas.
313
+ 3. **`special="true"`** para pantallas sin datos: menús, login, pantallas de selección.
314
+ 4. **`notab="true"`** cuando la pantalla tiene un solo grupo visible (sin pestanas).
315
+ 5. **`show-toolbar="false"`** para pantallas con header personalizado.
316
+ 6. **No mezclar** `special="true"` con consultas SQL.
317
+
318
+ ### 2.8 Errores comunes
319
+
320
+ | Error | Consecuencia | Solución |
321
+ |-------|-------------|----------|
322
+ | Olvidar `name` | La coleccion no se identifica | Siempre incluir `name` único |
323
+ | SQL sin `##PREF##` | Error "tabla no encontrada" | Usar `##PREF##` antes del nombre de tabla |
324
+ | `special="true"` con `sql` | Comportamiento indefinido | Usar uno u otro, nunca ambos |
325
+ | `loadall="true"` en tabla grande | Lentitud al cargar | Solo para tablas con pocos registros |
326
+ | `objname` diferente al nombre de tabla | No se guardan los datos | `objname` debe coincidir con el nombre de tabla (sin prefijo) |