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,298 @@
1
+ # XOne XML — Nodo prop: atributos, visibilidad y condiciones
2
+
3
+ > Fuente: `xone/v2/xone-help-docs/topics/02b-xml-prop-tipos.md` §5.1–§5.8, §5.10–§5.11. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §5.1 tabla completa de tipos · §5.2 atributos comunes · §5.3 sistema de visibilidad · §5.4 dimensiones y márgenes · §5.5 estilos inline · §5.6 comportamiento · §5.7 bordes · §5.8 disablevisible y disableedit · §5.10 buenas prácticas · §5.11 errores comunes
6
+
7
+ ---
8
+
9
+ ### 5.1 Tabla completa de tipos
10
+
11
+ Lista autoritativa de tipos de `<prop>` reconocidos por XOne (constantes `PROP_TYPE_*` en `Utils.java`). El sufijo numérico en `N` y `TN` indica los decimales visibles en el control (`N2` = 2 decimales, ..., `N6` = 6 decimales).
12
+
13
+ | Tipo | Nombre | Descripción | Equivalente web |
14
+ |------|--------|-------------|-----------------|
15
+ | `T` | Texto | Campo de texto editable | `<input type="text">` |
16
+ | `L` | Label | Texto de solo lectura (etiqueta) — forma preferida | `<span>`, `<label>` |
17
+ | `TL` | Label (alias legacy) | Alias legacy de `L`: se renderiza como label. | `<span>`, `<label>` |
18
+ | `THTML` | Texto HTML enriquecido | Muestra contenido HTML formateado con etiquetas | - |
19
+ | `N` | Numérico | Número entero | `<input type="number">` |
20
+ | `N2` | Numérico 2 decimales | Número con 2 decimales (precios) | - |
21
+ | `N3` | Numérico 3 decimales | Número con 3 decimales | - |
22
+ | `N4` | Numérico 4 decimales | Número con 4 decimales | - |
23
+ | `N5` | Numérico 5 decimales | Número con 5 decimales (coordenadas) | - |
24
+ | `N6` | Numérico 6 decimales | Número con 6 decimales | - |
25
+ | `TN` | Número-Texto | Número almacenado como texto (entero) | - |
26
+ | `TN2` | Número-Texto 2 decimales | Número almacenado como texto con 2 decimales | - |
27
+ | `TN3` | Número-Texto 3 decimales | Número almacenado como texto con 3 decimales | - |
28
+ | `TN4` | Número-Texto 4 decimales | Número almacenado como texto con 4 decimales | - |
29
+ | `TN5` | Número-Texto 5 decimales | Número almacenado como texto con 5 decimales | - |
30
+ | `TN6` | Número-Texto 6 decimales | Número almacenado como texto con 6 decimales | - |
31
+ | `B` | Botón | Botón de acción | `<button>` |
32
+ | `NC` | Checkbox/Toggle/Radio/Switch | Booleano con varias apariencias según `check-type` (`toggle`/`radio`/`switch` o default checkbox) | `<input type="checkbox">` / `<input type="radio">` |
33
+ | `D` | Fecha | Selector de fecha | `<input type="date">` |
34
+ | `DT` | Fecha y hora | Selector de fecha y hora | `<input type="datetime-local">` |
35
+ | `TT` | Hora | Selector de hora | `<input type="time">` |
36
+ | `X` | Password | Campo de contrasena enmascarado | `<input type="password">` |
37
+ | `IMG` | Imagen | Visualizador de imagen referenciada | `<img>` |
38
+ | `PH` | Foto | Captura de foto con camara | - |
39
+ | `VD` | Video/Camara/Escaner | Camara, video o escaner QR/barcode | `<video>` |
40
+ | `DR` | Dibujo/Firma | Control para capturar firmas o dibujos a mano alzada | - |
41
+ | `Z` | Contenedor de lista | Lista embebida / grid / mapa (`viewmode="mapview"`) / kanban / slider / etc. según `viewmode` | `<table>`, `<ul>` |
42
+ | `WEB` | WebView | Contenido web embebido | `<iframe>` |
43
+ | `AT` | Adjunto | Campo de archivo adjunto | `<input type="file">` |
44
+ | `O` | DataObject | Sub-objeto JavaScript (no persiste en BD) | - |
45
+
46
+ > **Combos/selectores**: NO tienen un type propio. Se implementan con `type="T"` (o `type="N"`) más los atributos `mapcol` y `mapfld` que apuntan a la coleccion de origen y al campo de enlace.
47
+ >
48
+ > **Mapas**: se implementan con `type="Z" viewmode="mapview"` (Google Maps), `"maplibre"` u `"openstreetmap"`. No existe un `type="M"`.
49
+ >
50
+ > **Sliders, progress bars, stepper, OTP, navbar, kanban, coverflow, markdown**: son **viewmodes** sobre los tipos `T`, `N` o `Z`. No son types propios. Ver §5.9 (atributos por tipo) y la guía de atributos del tópico 07.
51
+
52
+ ### 5.2 Atributos comunes
53
+
54
+ Estos atributos aplican a todos los tipos de `<prop>`:
55
+
56
+ | Atributo | Tipo | Requerido | Descripción |
57
+ |----------|------|-----------|-------------|
58
+ | `name` | string | **Si** | Nombre único del campo. **El ambito de unicidad es la `<coll>` ENTERA**, no el `<group>` o `<frame>` que lo contiene: no pueden existir dos props con el mismo `name` en cualquier parte de la misma coll, ni siquiera en `<group>` o `<frame>` distintos. Convencion: `MAP_NOMBRE` para campos de UI, `NOMBRE` para campos de BD. |
59
+ | `type` | string | **Si** | Tipo del control (ver tabla anterior). |
60
+ | `title` | string | No | Etiqueta/texto mostrado junto al campo. |
61
+ | `visible` | integer | No | Mascara de bits de visibilidad (ver sección 5.3). Default: `0`. |
62
+ | `width` | dimensión | No | Ancho del control (`"100%"`, `"200p"`, etc). |
63
+ | `height` | dimensión | No | Alto del control. |
64
+ | `class` | string | No | Clase CSS para estilizar (ver Tópico 04). |
65
+
66
+ ### 5.3 Sistema de visibilidad (`visible`)
67
+
68
+ El atributo `visible` define **en que contextos de la UI se pinta el campo**. Es una decisión estática tomada en tiempo de diseño — **no se puede cambiar en tiempo de ejecución**, ni por script, ni por eventos, ni por condiciones. Si un campo tiene `visible="0"`, no existe en pantalla en ningun momento.
69
+
70
+ Funciona como un bitmask donde cada bit representa un contexto de visualizacion:
71
+
72
+ | Bit | Valor decimal | Contexto |
73
+ |-----|---------------|----------|
74
+ | Bit 0 | 1 | Visible en modo **edición** (formulario individual) |
75
+ | Bit 1 | 2 | Visible en modo **lista** (vista de registros) |
76
+ | Bit 2 | 4 | Visible en **content** (lista embebida `type="Z"`) |
77
+ | Bit 3 | 8 | Visible en **combo** (desplegable) |
78
+
79
+ Cualquier combinacion de bits es valida. Las más usadas:
80
+
81
+ | Valor | Contextos | Uso típico |
82
+ |-------|-----------|------------|
83
+ | `0` | Ninguno | Campo puramente interno — solo existe para lógica |
84
+ | `1` | Edición | Solo en formulario individual |
85
+ | `2` | Lista | Solo en vista de registros |
86
+ | `3` | Edición + Lista | En formulario y en lista |
87
+ | `4` | Content | Solo en listas embebidas |
88
+ | `7` | Edición + Lista + Content | **El más habitual** |
89
+ | `8` | Combo | Solo visible en desplegables |
90
+ | `15` | Todos | Edición + Lista + Content + Combo |
91
+
92
+ ```xml
93
+ <!-- Campo ID oculto, solo para lógica -->
94
+
95
+ <!-- Nombre visible en todos los contextos principales -->
96
+ <prop name="NOMBRE" type="T" visible="7" title="Nombre" />
97
+
98
+ <!-- Descripción solo en el formulario de detalle -->
99
+ <prop name="DESCRIPCION" type="T" visible="1" title="Descripción detallada" />
100
+
101
+ <!-- Resumen solo en la vista de lista -->
102
+ <prop name="MAP_RESUMEN" type="L" visible="2" />
103
+
104
+ <!-- Campo para filas de content embebido -->
105
+ <prop name="MAP_NOMBRE_GRID" type="T" visible="4" />
106
+
107
+ <!-- Campo que también debe aparecer en un combo -->
108
+ <prop name="NOMBRE" type="T" visible="15" />
109
+ ```
110
+
111
+ > **Diferencia con `disablevisible`:** `visible` es estático — decide si el campo existe en pantalla en ese contexto. `disablevisible` es dinámico — el campo existe pero se muestra u oculta según el valor de otro campo en tiempo de ejecución. Ver sección 5.8.
112
+
113
+ ### 5.4 Dimensiones y margenes
114
+
115
+ ```xml
116
+ <prop name="CAMPO" type="T"
117
+ width="90%" <!-- Ancho -->
118
+ height="56p" <!-- Alto -->
119
+ tmargin="20p" <!-- Margen superior -->
120
+ bmargin="10p" <!-- Margen inferior -->
121
+ lmargin="5%" <!-- Margen izquierdo -->
122
+ rmargin="5%" <!-- Margen derecho -->
123
+ tpadding="10p" <!-- Padding superior -->
124
+ bpadding="10p" <!-- Padding inferior -->
125
+ lpadding="10p" <!-- Padding izquierdo -->
126
+ rpadding="10p" <!-- Padding derecho -->
127
+ />
128
+ ```
129
+
130
+ ### 5.5 Estilos inline
131
+
132
+ | Atributo | Tipo | Descripción | Ejemplo |
133
+ |----------|------|-------------|---------|
134
+ | `class` | string | Clase CSS (pueden ser multiples separadas por espacio) | `class="mClassT alineacion color"` |
135
+ | `forecolor` | color | Color del texto | `forecolor="#333333"` |
136
+ | `bgcolor` | color | Color de fondo | `bgcolor="#FFFFFF"` |
137
+ | `fontsize` | integer | Tamaño de fuente | `fontsize="14"` |
138
+ | `fontbold` | boolean | Texto en negrita | `fontbold="true"` |
139
+ | `fontname` | string | Archivo de fuente (.ttf) | `fontname="Roboto-Bold.ttf"` |
140
+ | `align` | string | Posición del prop dentro del frame contenedor. Mismos valores que en `<frame>` y `<group>`. Ver sección 4.2 del sub-archivo 02a | `align="center\|center"` |
141
+ | `text-align` | string | Alineacion del texto **dentro** del campo editable | `text-align="center"` |
142
+ | `label-align` | string | Alineacion de la etiqueta del prop | `label-align="left"` |
143
+
144
+ Ejemplo con multiples clases CSS (del wiki, EspecialBasicos.xne):
145
+
146
+ ```xml
147
+ <prop name="MAP_EJEMPLO3" class="mClassT alineacion color"
148
+ type="T" title="TRES CSS" />
149
+ ```
150
+
151
+ ### 5.6 Comportamiento
152
+
153
+ | Atributo | Tipo | Descripción | Ejemplo |
154
+ |----------|------|-------------|---------|
155
+ | `locked` | boolean | **Bloquea la UI de edición** del control (no editable visualmente). Versión estática de `disableedit` (fórmula). **No** afecta a la persistencia: si el valor cambia desde JS, sí se graba. Para impedir que el campo se grabe en BD usar `readonly="true"` (ver tópico 07 §4.3). | `locked="true"` |
156
+ | `readonly` | boolean | **Excluye el campo del UPDATE en BD**. NO bloquea la UI (los controles T/N/NC/spinner no lo leen). Excepción: en `type="VD"` actúa como flag UI (`true`=reproducir, `false`=capturar). Para bloquear edición visual usar `locked`. | `readonly="true"` |
157
+ | `newline` | boolean | Por defecto `true` (nueva línea). Si es `false`, el prop se coloca a la derecha del anterior en la misma línea. Ver sección 4.3b del sub-archivo 02a para detalle completo | `newline="false"` |
158
+ | `tooltip` | string | Texto de ayuda (placeholder) | `tooltip="Escriba aquí..."` |
159
+ | `floating-tooltip` | boolean | El tooltip flota sobre el campo al escribir | `floating-tooltip="true"` |
160
+ | `labelwidth` | integer | Ancho de la etiqueta. `0` = sin etiqueta | `labelwidth="0"` |
161
+ | `labelbox` | boolean | Muestra caja alrededor de la etiqueta | `labelbox="false"` |
162
+ | `label-wrap` | boolean | La etiqueta puede ocupar varias lineas | `label-wrap="true"` |
163
+ | `lines` | integer | Número de lineas de texto | `lines="3"` |
164
+ | `fixed-lines` | boolean | Fija el número de lineas (no crece) | `fixed-lines="true"` |
165
+ | `size` | integer | Tamaño de la columna en la base de datos (en caracteres). XOneStudio lo usa para crear la columna con ese tamaño. Si se combina con `fixed-text="true"`, además impide escribir más caracteres de los indicados en UI | `size="150"` |
166
+ | `fieldsize` | integer | Ancho visual de la caja del campo, calculado como: ancho de carácter x valor. **En proyectos nuevos no es necesario — usar `width` en su lugar**, ya que `width` tiene prioridad sobre `fieldsize` cuando ambos están presentes | `fieldsize="100"` |
167
+ | `phone` | boolean | Indica que el campo es un número de telefono (activa enlace telefonico) | `phone="true"` |
168
+ | `input-type` | string | Tipo de teclado en dispositivo (valores exactos): `text`, `numeric`, `numeric_unsigned`, `decimal`, `phone`, `datetime`, `email`, `username`, `uri`, `password`, `none`. `number`/`url` NO existen → usar `numeric`/`uri` (un valor no reconocido lanza error) | `input-type="numeric"` |
169
+ | `scale-type` | string | Tipo de escalado para imágenes: `center_crop`, `fit_center`, `center_inside`, `fit_xy` | `scale-type="center_crop"` |
170
+ | `edit-inrow` | boolean | Permite la edición directa dentro de las filas de una lista (type="Z") | `edit-inrow="true"` |
171
+ | `show-no-data` | string/boolean | Texto o indicador a mostrar cuando no hay datos en la lista | `show-no-data="true"` |
172
+ | `start-from-bottom` | boolean | El scroll de la lista (`type="Z"`) arranca y se mantiene anclado al último elemento (estilo chat). Declarado aquí tiene preferencia sobre el mismo atributo en la `<coll>` | `start-from-bottom="true"` |
173
+ | `divider-height` | integer | Alto (grosor) del separador entre ítems de la lista (`type="Z"`). En listas expandibles el default es `4` | `divider-height="2"` |
174
+ | `divider-color` | color | Color del separador entre ítems de la lista (`type="Z"`) | `divider-color="#DDDDDD"` |
175
+ | `divider-background` | string | Imagen (ruta de recurso) usada como separador entre ítems; tiene prioridad sobre `divider-color` | `divider-background="linea.png"` |
176
+ | `floating` | boolean | El prop se superpone sobre el layout, similar al frame flotante. Se posiciona con `top` y `left` | `floating="true"` |
177
+ | `keep-aspect-ratio` | boolean | Mantiene la proporcion original de la imagen al redimensionar | `keep-aspect-ratio="true"` |
178
+ | `updates` | string | Al cambiar este campo, propaga el cambio al campo indicado en otra coleccion contents | `updates="DESCRIPCION"` |
179
+ | `fixed-text` | boolean | Si es `true`, combinado con `size`, impide introducir más caracteres del limite indicado en UI | `fixed-text="true"` |
180
+ | `min-height` | dimensión | Alto mínimo del control. Útil para campos de texto multilinea | `min-height="120p"` |
181
+ | `ripple-effect` | boolean | Activa el efecto ripple de Material Design al pulsar | `ripple-effect="true"` |
182
+
183
+ **Atributos de imagen en botones:**
184
+
185
+ | Atributo | Descripción |
186
+ |----------|-------------|
187
+ | `img` | Imagen del botón en estado normal |
188
+ | `img-sel` | Imagen del botón al pulsarlo |
189
+ | `img-disabled` | Imagen cuando el botón esta deshabilitado |
190
+ | `img-delete` | Imagen del botón de borrar/limpiar en campos editables |
191
+ | `img-search` | Imagen del botón de busqueda (lupa) en campos mapeados |
192
+ | `img-spinner` | Imagen del desplegable combo con `showinline="true"` |
193
+ | `img-width` | Ancho del icono de imagen |
194
+ | `img-height` | Alto del icono de imagen |
195
+ | `img-date` | Imagen del selector de fecha |
196
+ | `img-time` | Imagen del selector de hora |
197
+ | `img-att` | Imagen del botón de adjuntar archivos |
198
+
199
+ ### 5.7 Bordes
200
+
201
+ | Atributo | Tipo | Descripción | Ejemplo |
202
+ |----------|------|-------------|---------|
203
+ | `border` | boolean | Muestra borde | `border="false"` |
204
+ | `border-width` | integer | Ancho del borde | `border-width="2"` |
205
+ | `border-corner-radius` | integer | Radio de esquinas redondeadas | `border-corner-radius="10"` |
206
+ | `border-corner-radius-top-left` | integer | Radio esquina superior izquierda | `border-corner-radius-top-left="50"` |
207
+ | `text-border` | boolean | Borde solo en la zona de texto | `text-border="true"` |
208
+ | `text-border-bottom` | boolean | Solo borde inferior en el texto | `text-border-bottom="true"` |
209
+
210
+ ### 5.8 Condiciones (`disablevisible`, `disableedit`)
211
+
212
+ #### disablevisible — Visibilidad condicional en tiempo de ejecución
213
+
214
+ El atributo `disablevisible` oculta el elemento en tiempo de ejecución cuando se cumple la condición especificada. A diferencia de `visible`, este si responde a los valores del objeto en pantalla. El campo referenciado en la condición debe existir en la misma coleccion.
215
+
216
+ Funciona en `<group>`, `<frame>` y `<prop>`.
217
+
218
+ **Formato de la condición:** `CAMPO=VALOR`, `CAMPO>VALOR`, `CAMPO<VALOR`
219
+
220
+ ```xml
221
+ <!-- Oculta el prop cuando MAP_TIPO vale 0 -->
222
+ <prop name="MAP_DETALLE" type="T" visible="1"
223
+ disablevisible="MAP_TIPO=0" />
224
+
225
+ <!-- Oculta el frame entero cuando ESTADO vale 2 -->
226
+ <frame name="frmExtra"
227
+ disablevisible="ESTADO=2" />
228
+
229
+ <!-- Oculta el grupo entero cuando un campo es 0 -->
230
+ <group name="GrpOpciones" id="3"
231
+ disablevisible="MAP_MOSTRAR=0" />
232
+ ```
233
+
234
+ **Refresco del disablevisible por script:**
235
+
236
+ Cuando el campo referenciado en la condición cambia por código, hay que refrescar para que `disablevisible` se reevalúe. Hay dos formas:
237
+
238
+ ```javascript
239
+ // Refrescar un prop específico
240
+ ui.refresh("MAP_DETALLE");
241
+
242
+ // Refrescar varios props — refresh()/refreshValue() aceptan varargs:
243
+ // argumentos sueltos, un string con comas, o un array (equivalentes)
244
+ ui.refresh("MAP_DETALLE", "MAP_EXTRA"); // varios argumentos
245
+ ui.refresh("MAP_DETALLE,MAP_EXTRA"); // string separado por comas
246
+ ui.refresh(["MAP_DETALLE", "MAP_EXTRA"]); // array — útil para listas dinámicas
247
+
248
+ // Refrescar toda la pantalla (sin argumentos)
249
+ ui.refresh();
250
+
251
+ // Con referencia explicita a la vista — util en callbacks o eventos
252
+ var view = ui.getView(self);
253
+ view.refresh("MAP_DETALLE"); // prop específico
254
+ view.refresh(); // toda la pantalla
255
+ ```
256
+
257
+ > **Listas dinámicas:** como `refresh`/`refreshValue` aceptan un **array**, cuando los campos a refrescar son condicionales conviene acumularlos y refrescar una sola vez — `let a=[]; if (cond) a.push("MAP_X"); if (a.length) ui.refresh(a);`.
258
+
259
+ > El `disablevisible` también se reevalua automáticamente si el campo referenciado tiene `onchange="refresh"` en el XML — en ese caso no hace falta llamar a `ui.refresh()` por script.
260
+
261
+ #### disableedit — Deshabilitacion condicional
262
+
263
+ El atributo `disableedit` deshabilita la edición del elemento si se cumple la condición. El campo sigue siendo visible pero el usuario no puede modificarlo.
264
+
265
+ ```xml
266
+ <!-- Campo que se deshabilita condicionalmente -->
267
+ <prop name="MAP_TEXT3" type="T"
268
+ title="Campo bloqueado condicionalmente"
269
+ disableedit="MAP_CHECK1=1" />
270
+ ```
271
+
272
+ | Atributo | Aplica en | Descripción |
273
+ |----------|-----------|-------------|
274
+ | `disablevisible` | `<group>`, `<frame>`, `<prop>` | Oculta el elemento si se cumple la condición |
275
+ | `disableedit` | `<group>`, `<prop>` | Deshabilita la edición si se cumple la condición |
276
+
277
+ ### 5.10 Buenas prácticas
278
+
279
+ 1. **Prefijo `MAP_`** para campos de UI temporal (no se guardan en BD).
280
+ 2. **MAYUSCULAS** para campos de BD: `NOMBRE`, `DIRECCION`, `FECHA`.
281
+ 3. **`labelwidth="0"`** cuando no necesitas etiqueta (botones de icono, imágenes, o campos cuyo contenido va en el *valor*: `T`, `N`, etc.). **NUNCA en `type="L"`/`TL`**: el texto del label (su `title`, o el valor del campo si no hay `title`) se pinta dentro del ancho de la etiqueta; con `labelwidth="0"` no queda sitio y el texto se vuelve invisible. Para alinear un label usa `label-align="left|center|right"`, no `labelwidth`.
282
+ 4. **`visible="0"`** para campos internos/auxiliares.
283
+ 5. **`type="L"`** para textos que solo se muestran, nunca `type="T"` con `locked="true"`. Un label muestra su `title`; si no declaras `title`, muestra el valor del campo, así que también sirve para valores dinámicos.
284
+ 6. **`onclick` vs `method`**: Usa `method` para lógica compleja con nodos XML, `onclick` para JavaScript simple y directo. **No combines ambos** en el mismo prop.
285
+ 7. **`viewmode="recyclerview"`** siempre para listas largas, mejora el rendimiento.
286
+
287
+ ### 5.11 Errores comunes
288
+
289
+ | Error | Consecuencia | Solución |
290
+ |-------|-------------|----------|
291
+ | Olvidar `type` | Error de parseo XML | Siempre incluir `type` |
292
+ | `visible` incorrecto | Campo no aparece donde se espera | Revisar el bitmask (7 = todos) |
293
+ | `onclick` y `method` juntos | Solo se ejecuta uno | Usar uno u otro |
294
+ | `linkedto` sin `mapcol` en el prop oculto | Combo no carga opciones | Asegurar que el prop oculto tiene `mapcol` y `mapfld` |
295
+ | `contents` sin prefijo `@` | El content no se vincula | Usar `contents="@NombreContent"` |
296
+ | Usar `px` en lugar de `p` | Unidad no reconocida | Usar `p` (puntos) o `%` |
297
+ | Inventar atributos | Se ignoran silenciosamente | Consultar esta documentación |
298
+