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.
- package/README.md +167 -0
- package/dist/agent/authEnDisco.js +56 -0
- package/dist/agent/authEnDisco.js.map +1 -0
- package/dist/agent/configEnDisco.js +109 -0
- package/dist/agent/configEnDisco.js.map +1 -0
- package/dist/agent/crearProyecto.js +34 -0
- package/dist/agent/crearProyecto.js.map +1 -0
- package/dist/agent/entorno.js +124 -0
- package/dist/agent/entorno.js.map +1 -0
- package/dist/agent/guionizado.js +53 -0
- package/dist/agent/guionizado.js.map +1 -0
- package/dist/agent/instantanea.js +129 -0
- package/dist/agent/instantanea.js.map +1 -0
- package/dist/agent/interrupts.js +83 -0
- package/dist/agent/interrupts.js.map +1 -0
- package/dist/agent/mensajes.js +24 -0
- package/dist/agent/mensajes.js.map +1 -0
- package/dist/agent/modelos.js +42 -0
- package/dist/agent/modelos.js.map +1 -0
- package/dist/agent/normalizar.js +20 -0
- package/dist/agent/normalizar.js.map +1 -0
- package/dist/agent/perfiles.js +103 -0
- package/dist/agent/perfiles.js.map +1 -0
- package/dist/agent/proyecto.js +107 -0
- package/dist/agent/proyecto.js.map +1 -0
- package/dist/agent/puente.js +142 -0
- package/dist/agent/puente.js.map +1 -0
- package/dist/agent/resumenDeTool.js +48 -0
- package/dist/agent/resumenDeTool.js.map +1 -0
- package/dist/agent/skills.js +65 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/textoDeTool.js +113 -0
- package/dist/agent/textoDeTool.js.map +1 -0
- package/dist/agent/turnoReal.js +173 -0
- package/dist/agent/turnoReal.js.map +1 -0
- package/dist/agent/verificador.js +65 -0
- package/dist/agent/verificador.js.map +1 -0
- package/dist/agent/xoneAgent.js +106 -0
- package/dist/agent/xoneAgent.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/aprobar.js +82 -0
- package/dist/cli/aprobar.js.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/consola.js +346 -0
- package/dist/cli/consola.js.map +1 -0
- package/dist/cli/describe.js +53 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/doctor.js +45 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/main.js +520 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/markdown.js +90 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/run.js +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spinner.js +89 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/stdio.js +193 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/tema.js +40 -0
- package/dist/cli/tema.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/core/bitacora.js +30 -0
- package/dist/core/bitacora.js.map +1 -0
- package/dist/core/config.js +236 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextos.js +56 -0
- package/dist/core/contextos.js.map +1 -0
- package/dist/core/deps.js +51 -0
- package/dist/core/deps.js.map +1 -0
- package/dist/core/diff.js +79 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/esqueleto.js +366 -0
- package/dist/core/esqueleto.js.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/modelos.js +85 -0
- package/dist/core/modelos.js.map +1 -0
- package/dist/core/notify.js +106 -0
- package/dist/core/notify.js.map +1 -0
- package/dist/core/ports.js +114 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/turno.js +127 -0
- package/dist/core/turno.js.map +1 -0
- package/dist/vendor/hitl.js +103 -0
- package/dist/vendor/hitl.js.map +1 -0
- package/dist/vendor/skillLoaders/catalog.js +74 -0
- package/dist/vendor/skillLoaders/catalog.js.map +1 -0
- package/dist/vendor/tokenTracking.js +58 -0
- package/dist/vendor/tokenTracking.js.map +1 -0
- package/package.json +41 -0
- package/skills/xone-debugging/SKILL.md +52 -0
- package/skills/xone-debugging/references/faq.md +561 -0
- package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
- package/skills/xone-development/SKILL.md +105 -0
- package/skills/xone-development/references/anti-patrones.md +94 -0
- package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
- package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
- package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
- package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
- package/skills/xone-development/references/datos/appdata.md +611 -0
- package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
- package/skills/xone-development/references/datos/http.md +366 -0
- package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
- package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
- package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
- package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
- package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
- package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
- package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
- package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
- package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
- package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
- package/skills/xone-development/references/indice-completo.md +77 -0
- package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
- package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
- package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
- package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
- package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
- package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
- package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
- package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
- package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
- package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
- package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
- package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
- package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
- package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
- package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
- package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
- package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
- package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
- package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
- package/skills/xone-development/references/tipos-de-prop.md +28 -0
- package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
- package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
- package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
- package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
- package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
- package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
- package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
- package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
- package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
- package/skills/xone-development/references/xml-ui/mapas.md +685 -0
- package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
- package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
- package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
- package/skills/xone-plan-builder/SKILL.md +183 -0
- package/skills/xone-plan-builder/agents/openai.yaml +5 -0
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
- package/skills/xone-project-generator/SKILL.md +111 -0
- package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
- package/skills/xone-project-generator/references/colecciones-base.md +16 -0
- package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
- package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
- package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
- package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
- package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
- package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
- package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
- package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
- package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
- package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
- package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
- package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
- package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
- package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
- package/skills/xone-review/SKILL.md +189 -0
- package/skills/xone-spec-builder/SKILL.md +235 -0
- package/skills/xone-spec-builder/agents/openai.yaml +5 -0
- package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
- package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
- package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
# XOne XML — Layouts avanzados, herencia y buenas prácticas
|
|
2
|
+
|
|
3
|
+
> Fuente: `xone/v2/xone-help-docs/topics/02d-xml-layouts-herencia.md` §9–§11. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
|
|
4
|
+
|
|
5
|
+
Contenido: §9 layouts: responsive con porcentajes, modales flotantes, FAB · §10 herencia entre colecciones con inherits y composición con include-layout · §11 best practices, checklist de validación XML y unicidad de nombres de nodos
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 9. Layouts Avanzados
|
|
10
|
+
|
|
11
|
+
### 9.1 Responsive con porcentajes
|
|
12
|
+
|
|
13
|
+
XOne no tiene media queries como CSS web, pero puedes hacer layouts adaptables usando porcentajes:
|
|
14
|
+
|
|
15
|
+
```xml
|
|
16
|
+
<!-- Dos columnas que se adaptan -->
|
|
17
|
+
<frame name="frmRow" width="100%" height="-2">
|
|
18
|
+
<frame name="frmCol1" width="48%" lmargin="1%" newline="false">
|
|
19
|
+
<prop name="CAMPO1" type="T" title="Campo 1" width="100%" />
|
|
20
|
+
</frame>
|
|
21
|
+
<frame name="frmCol2" width="48%" lmargin="2%" newline="false">
|
|
22
|
+
<prop name="CAMPO2" type="T" title="Campo 2" width="100%" />
|
|
23
|
+
</frame>
|
|
24
|
+
</frame>
|
|
25
|
+
|
|
26
|
+
<!-- Tres columnas -->
|
|
27
|
+
<frame name="frmRow3" width="100%" height="-2">
|
|
28
|
+
<frame name="col1" width="32%" lmargin="1%" newline="false">
|
|
29
|
+
<prop name="C1" type="T" title="Col 1" />
|
|
30
|
+
</frame>
|
|
31
|
+
<frame name="col2" width="32%" lmargin="1%" newline="false">
|
|
32
|
+
<prop name="C2" type="T" title="Col 2" />
|
|
33
|
+
</frame>
|
|
34
|
+
<frame name="col3" width="32%" lmargin="1%" newline="false">
|
|
35
|
+
<prop name="C3" type="T" title="Col 3" />
|
|
36
|
+
</frame>
|
|
37
|
+
</frame>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 9.2 Overlays y modales flotantes
|
|
41
|
+
|
|
42
|
+
Patron para mostrar un modal sobre el contenido:
|
|
43
|
+
|
|
44
|
+
```xml
|
|
45
|
+
<!-- Contenido principal -->
|
|
46
|
+
<group name="Contenido" id="1">
|
|
47
|
+
<!-- ... contenido normal ... -->
|
|
48
|
+
<prop name="MAP_MOSTRAR_MODAL" type="N" visible="0" />
|
|
49
|
+
</group>
|
|
50
|
+
|
|
51
|
+
<!-- Modal flotante -->
|
|
52
|
+
<group name="Modal" id="50"
|
|
53
|
+
floating="true"
|
|
54
|
+
top="0" left="0"
|
|
55
|
+
width="100%" height="100%"
|
|
56
|
+
bgcolor="#77000000"
|
|
57
|
+
disablevisible="MAP_MOSTRAR_MODAL=0">
|
|
58
|
+
<frame name="frmModalContent"
|
|
59
|
+
width="80%" height="300p"
|
|
60
|
+
lmargin="10%" tmargin="200p"
|
|
61
|
+
bgcolor="#FFFFFF"
|
|
62
|
+
border-corner-radius="16"
|
|
63
|
+
elevation="10">
|
|
64
|
+
<prop name="lblModalTitulo" type="L" visible="1"
|
|
65
|
+
title="Título del Modal"
|
|
66
|
+
fontbold="true" fontsize="18"
|
|
67
|
+
tmargin="20p" lmargin="20p" />
|
|
68
|
+
<prop name="lblModalTexto" type="L" visible="1"
|
|
69
|
+
title="Contenido del modal aquí"
|
|
70
|
+
fontsize="14" forecolor="#666666"
|
|
71
|
+
tmargin="10p" lmargin="20p" />
|
|
72
|
+
<prop name="btnCerrarModal" type="B" visible="1"
|
|
73
|
+
title="Cerrar" width="80%" lmargin="10%"
|
|
74
|
+
tmargin="30p"
|
|
75
|
+
onclick="self.MAP_MOSTRAR_MODAL = 0; ui.refresh('MAP_MOSTRAR_MODAL');" />
|
|
76
|
+
</frame>
|
|
77
|
+
</group>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
También se puede lograr con un frame flotante animado (patron del wiki, EspecialChat.xne):
|
|
81
|
+
|
|
82
|
+
```xml
|
|
83
|
+
<frame name="frmnuevochat"
|
|
84
|
+
animation-in-delay="250"
|
|
85
|
+
animation-out-delay="250"
|
|
86
|
+
animation-in="##RIGHT_IN##"
|
|
87
|
+
animation-out="##LEFT_OUT##"
|
|
88
|
+
disablevisible="MAP_VERFLOTANTE=0"
|
|
89
|
+
bgcolor="#ffffff"
|
|
90
|
+
modal="true"
|
|
91
|
+
floating="true"
|
|
92
|
+
top="0" left="0"
|
|
93
|
+
width="100%" height="100%">
|
|
94
|
+
<!-- Contenido del modal animado -->
|
|
95
|
+
</frame>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 9.3 Sticky headers y footers
|
|
99
|
+
|
|
100
|
+
El patron Header + Content + Footer con grupos fijos:
|
|
101
|
+
|
|
102
|
+
```xml
|
|
103
|
+
<coll name="PantallaCompleta" special="true" notab="true">
|
|
104
|
+
<!-- Header STICKY -->
|
|
105
|
+
<group name="Header" id="10"
|
|
106
|
+
fixed="true" orientation="top"
|
|
107
|
+
width="100%" height="120p">
|
|
108
|
+
<frame name="frmHeader" bgcolor="#1565C0"
|
|
109
|
+
width="100%" height="120p" align="center|center">
|
|
110
|
+
<prop name="TITULO" type="L" visible="1"
|
|
111
|
+
forecolor="#FFFFFF" fontsize="20" fontbold="true"
|
|
112
|
+
title="Mi App" />
|
|
113
|
+
</frame>
|
|
114
|
+
</group>
|
|
115
|
+
|
|
116
|
+
<!-- Contenido scrollable -->
|
|
117
|
+
<group name="Body" id="1">
|
|
118
|
+
<frame name="frmBody" width="100%" height="100%"
|
|
119
|
+
scroll="true" align="left|top">
|
|
120
|
+
<!-- Todo el contenido scrollable aquí -->
|
|
121
|
+
</frame>
|
|
122
|
+
</group>
|
|
123
|
+
|
|
124
|
+
<!-- Footer STICKY -->
|
|
125
|
+
<group name="Footer" id="0"
|
|
126
|
+
fixed="true" orientation="bottom"
|
|
127
|
+
width="100%" height="80p">
|
|
128
|
+
<frame name="frmFooter" bgcolor="#FFFFFF"
|
|
129
|
+
width="100%" height="80p" elevation="8">
|
|
130
|
+
<prop name="BTN_GUARDAR" type="B" visible="1"
|
|
131
|
+
title="Guardar" width="90%" height="56p"
|
|
132
|
+
lmargin="5%" tmargin="12p"
|
|
133
|
+
bgcolor="#4CAF50" forecolor="#FFFFFF"
|
|
134
|
+
border-corner-radius="28" />
|
|
135
|
+
</frame>
|
|
136
|
+
</group>
|
|
137
|
+
</coll>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 9.4 FAB (Floating Action Button)
|
|
141
|
+
|
|
142
|
+
Botón flotante estilo Material Design:
|
|
143
|
+
|
|
144
|
+
```xml
|
|
145
|
+
<!-- FAB usando prop flotante -->
|
|
146
|
+
<prop name="MAP_FAB" type="B" visible="1"
|
|
147
|
+
floating="true"
|
|
148
|
+
top="1550p"
|
|
149
|
+
left="850p"
|
|
150
|
+
behavior="move"
|
|
151
|
+
img="ic_fab.png"
|
|
152
|
+
width="192p"
|
|
153
|
+
height="192p" />
|
|
154
|
+
|
|
155
|
+
<!-- FAB simplificado -->
|
|
156
|
+
<prop name="btnNuevo" type="B" visible="7"
|
|
157
|
+
class="btnFAB"
|
|
158
|
+
src="./icons/ic_add.png"
|
|
159
|
+
dock="bottom" align="right"
|
|
160
|
+
rmargin="16p" bmargin="16p"
|
|
161
|
+
onclick="crearNuevo();" />
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
El FAB también se puede crear con un frame flotante:
|
|
165
|
+
|
|
166
|
+
```xml
|
|
167
|
+
<frame name="floatadd1"
|
|
168
|
+
top="920p" left="510p"
|
|
169
|
+
width="290p" height="90p"
|
|
170
|
+
floating="true">
|
|
171
|
+
<prop name="BTADD1" type="B" visible="1"
|
|
172
|
+
labelwidth="0"
|
|
173
|
+
method="ExecuteNode(nuevo)"
|
|
174
|
+
width="75p"
|
|
175
|
+
img="add.png"
|
|
176
|
+
imgsel="add_click.png" />
|
|
177
|
+
</frame>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 9.5 Recycler view optimizado
|
|
181
|
+
|
|
182
|
+
Para listas con muchos registros, `recyclerview` es esencial:
|
|
183
|
+
|
|
184
|
+
```xml
|
|
185
|
+
<prop name="LISTA" type="Z" visible="1"
|
|
186
|
+
contents="@MiLista"
|
|
187
|
+
viewmode="recyclerview"
|
|
188
|
+
width="100%" height="80%"
|
|
189
|
+
edit-inrow="true"
|
|
190
|
+
show-no-data="true"
|
|
191
|
+
show-loading="true" />
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Tips de rendimiento**:
|
|
195
|
+
- Siempre usar `viewmode="recyclerview"` para listas largas.
|
|
196
|
+
- Limitar el número de props visibles en cada fila del content.
|
|
197
|
+
- Usar `loadall="true"` solo si la tabla tiene pocos registros (menos de 500).
|
|
198
|
+
- Usar filtros SQL eficientes con índices.
|
|
199
|
+
- Evitar imágenes pesadas en filas de lista.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 10. Herencia entre Colecciones y Composición XML
|
|
204
|
+
|
|
205
|
+
XOne ofrece dos mecanismos **independientes del CSS** para reutilizar definiciones XML entre colecciones: herencia de coll con `inherits` y composición por inclusión de fragmentos XML con `<include-layout>`. Son distintos del sistema CSS `extends` — operan sobre la estructura XML (groups, frames, props, eventos), no sobre estilos.
|
|
206
|
+
|
|
207
|
+
### 10.1 Herencia entre colecciones con `inherits`
|
|
208
|
+
|
|
209
|
+
El atributo `inherits` en el nodo `<coll>` permite que una coleccion herede **grupos, frames, props y nodos de evento** de otra coleccion. La coleccion resultante en ejecución se comporta como una **mezcla entre la PADRE y la HIJA**.
|
|
210
|
+
|
|
211
|
+
**Sintaxis:**
|
|
212
|
+
|
|
213
|
+
```xml
|
|
214
|
+
<coll name="EspecialHerencia" inherits="groupsFixed" special="true" notab="false" ...>
|
|
215
|
+
...
|
|
216
|
+
</coll>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
El valor de `inherits` es el `name` de otra `<coll>` del proyecto (sin extensión `.xne`).
|
|
220
|
+
|
|
221
|
+
**Regla de precedencia (importante):**
|
|
222
|
+
|
|
223
|
+
> En caso de duplicidad (mismo `name`) de `<group>`, `<frame>`, `<prop>` o nodo de evento (`<onback>`, `<before-edit>`, `<create>`, etc.), **prevalece la definición de la HIJA**. Los elementos no duplicados de la PADRE se conservan tal cual.
|
|
224
|
+
|
|
225
|
+
La hija puede además **añadir** grupos, frames, props o eventos que no existen en la padre.
|
|
226
|
+
|
|
227
|
+
**Caso de uso típico:** scaffolding visual compartido — un header fijo, un footer de paginación, botones de navegación. Se define una coll `special="true"` con toda la maquinaria común, y cada pantalla concreta la hereda.
|
|
228
|
+
|
|
229
|
+
#### Ejemplo: header y footer fijos compartidos
|
|
230
|
+
|
|
231
|
+
**Coleccion PADRE** (maquinaria reutilizable):
|
|
232
|
+
|
|
233
|
+
```xml
|
|
234
|
+
<coll name="groupsFixed" title="" special="true">
|
|
235
|
+
<group name="HEADER" id="999" class="groupfixed_header">
|
|
236
|
+
<frame name="frmtitulo" class="frmsuperior">
|
|
237
|
+
<prop name="SALIR" type="B" class="btvolversuper" />
|
|
238
|
+
<prop name="MENU" type="L" class="tlsuper" title="Herencia" />
|
|
239
|
+
<prop name="MAP_COLORACTIVO" type="T" visible="0" />
|
|
240
|
+
</frame>
|
|
241
|
+
</group>
|
|
242
|
+
<group name="FOOTER" id="0" class="groupfixed_footer">
|
|
243
|
+
<prop name="MAP_GROUP" type="N" visible="0" />
|
|
244
|
+
<prop name="MAP_TOTAL_PAGES" type="N" visible="0" />
|
|
245
|
+
<frame name="FLOAT_FOOTER_FRAME" class="frmsuperior">
|
|
246
|
+
<prop name="MAP_LAST" type="B" img="last.png" title="Anterior"
|
|
247
|
+
onclick="javascript:prev(self,'ir'); ui.refresh('MAP_LAST', 'MAP_NEXT', 'MAP_LAST_EMPTY');"
|
|
248
|
+
width="45%" height="80%" labelwidth="1"
|
|
249
|
+
disablevisible="MAP_GROUP=1" />
|
|
250
|
+
<prop name="MAP_NEXT" type="B" img="next.png" title="Siguiente"
|
|
251
|
+
onclick="javascript:next(self,'ir'); ui.refresh('MAP_LAST', 'MAP_NEXT', 'MAP_LAST_EMPTY');"
|
|
252
|
+
width="45%" height="80%" labelwidth="1" newline="false"
|
|
253
|
+
disablevisible="MAP_GROUP=MAP_TOTAL_PAGES" />
|
|
254
|
+
</frame>
|
|
255
|
+
</group>
|
|
256
|
+
<group name="Group1" id="1">
|
|
257
|
+
<prop name="MENU2" type="L" class="classtl"
|
|
258
|
+
title="Grupo heredado de la coll padre." label-wrap="true" />
|
|
259
|
+
</group>
|
|
260
|
+
<onback show-wait-dialog="false">
|
|
261
|
+
<action name="runscript">
|
|
262
|
+
<script language="javascript">
|
|
263
|
+
ui.getView(self).exit();
|
|
264
|
+
</script>
|
|
265
|
+
</action>
|
|
266
|
+
</onback>
|
|
267
|
+
</coll>
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Coleccion HIJA** (pantalla concreta que hereda la estructura):
|
|
271
|
+
|
|
272
|
+
```xml
|
|
273
|
+
<coll name="EspecialHerencia" inherits="groupsFixed"
|
|
274
|
+
special="true" notab="false" group-swipe="true">
|
|
275
|
+
|
|
276
|
+
<!-- Override: solo redefine MENU en el HEADER.
|
|
277
|
+
SALIR y MAP_COLORACTIVO se conservan del padre. -->
|
|
278
|
+
<group name="HEADER" id="999">
|
|
279
|
+
<frame name="frmtitulo" class="frmsuperior">
|
|
280
|
+
<prop name="MENU" type="L" class="tlsuper" title="Mi Pantalla" />
|
|
281
|
+
</frame>
|
|
282
|
+
</group>
|
|
283
|
+
|
|
284
|
+
<!-- Override: Group1 queda vacio en la hija (pero se hereda el ID).
|
|
285
|
+
NOTA: esto sobreescribe el MENU2 del padre al declarar el grupo. -->
|
|
286
|
+
<group name="Group1" id="1">
|
|
287
|
+
</group>
|
|
288
|
+
|
|
289
|
+
<!-- Nuevo grupo: no existe en el padre, se anade -->
|
|
290
|
+
<group name="Group2" id="2">
|
|
291
|
+
<include-layout file="EjemploIncludeLayout.xml" group="2" />
|
|
292
|
+
</group>
|
|
293
|
+
|
|
294
|
+
<!-- Evento propio de la hija (no conflicta con el padre) -->
|
|
295
|
+
<before-edit>
|
|
296
|
+
<action name="runscript">
|
|
297
|
+
<script language="javascript">
|
|
298
|
+
self.MAP_GROUP = 1;
|
|
299
|
+
self.MAP_TOTAL_PAGES = 2;
|
|
300
|
+
</script>
|
|
301
|
+
</action>
|
|
302
|
+
</before-edit>
|
|
303
|
+
</coll>
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
#### Cadenas de herencia (A → B → C)
|
|
307
|
+
|
|
308
|
+
`inherits` soporta **cadenas**: una coll B puede heredar de A, y una C puede heredar de B. La resolución recorre toda la cadena hacia arriba y aplica la regla hijo-gana en cada nivel.
|
|
309
|
+
|
|
310
|
+
```xml
|
|
311
|
+
<coll name="BaseLayout" special="true"> ... </coll>
|
|
312
|
+
<coll name="LayoutConMenu" inherits="BaseLayout" special="true"> ... </coll>
|
|
313
|
+
<coll name="PantallaFinal" inherits="LayoutConMenu"> ... </coll>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
`PantallaFinal` recibe: definiciones de `BaseLayout` + lo que `LayoutConMenu` sobreescriba o añada + lo que `PantallaFinal` sobreescriba o añada.
|
|
317
|
+
|
|
318
|
+
#### Herencia multiple: NO soportada
|
|
319
|
+
|
|
320
|
+
Solo se admite **un padre** por coll. No existe la sintaxis `inherits="A,B"` ni similares. Si necesitas combinar piezas de varias fuentes, usa `<include-layout>` (sección 10.2) para factorizar fragmentos.
|
|
321
|
+
|
|
322
|
+
#### Eventos heredados
|
|
323
|
+
|
|
324
|
+
Los nodos de evento a nivel de coll (`<onback>`, `<before-edit>`, `<create>`, `<after-edit>`, `<onchange>`, custom nodes, etc.) también se heredan. Aplica la misma regla:
|
|
325
|
+
- Si el evento no esta en la hija, se ejecuta el del padre.
|
|
326
|
+
- Si la hija define el mismo evento, se ejecuta el de la hija (sobreescribe completamente; **no hay concepto de `super()`** que llame al del padre).
|
|
327
|
+
|
|
328
|
+
#### Cuando usar `inherits`
|
|
329
|
+
|
|
330
|
+
| Escenario | Recomendacion |
|
|
331
|
+
|-----------|---------------|
|
|
332
|
+
| Varias pantallas comparten header/footer/navegación | SI usar `inherits` con coll padre `special="true"` |
|
|
333
|
+
| Dos pantallas muy parecidas pero con lógica distinta | Normalmente SI — override de eventos en la hija |
|
|
334
|
+
| Pantallas totalmente distintas | NO — la herencia no aporta |
|
|
335
|
+
| Colecciones de datos (con `objname`) | Raro. `inherits` es útil sobre todo en colecciones de UI (`special="true"`) |
|
|
336
|
+
|
|
337
|
+
### 10.2 Composición con `<include-layout>`
|
|
338
|
+
|
|
339
|
+
`<include-layout>` es un nodo que **inyecta el contenido de un fichero XML externo** en el punto donde aparece. Se usa para factorizar fragmentos reutilizables (botoneras, bloques de props, eventos compartidos).
|
|
340
|
+
|
|
341
|
+
**Sintaxis:**
|
|
342
|
+
|
|
343
|
+
```xml
|
|
344
|
+
<include-layout file="MisBotones.xml" group="1" frame="todo" />
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
| Atributo | Obligatorio | Descripción |
|
|
348
|
+
|----------|-------------|-------------|
|
|
349
|
+
| `file` | Si | Ruta al fichero XML a incluir. **Relativa a la raiz del proyecto**. |
|
|
350
|
+
| `group` | No | ID de grupo por defecto para los `<prop>` del fichero incluido que NO declaren `group`. |
|
|
351
|
+
| `frame` | No | Nombre de frame por defecto para los `<prop>` del fichero incluido que NO declaren `frame`. |
|
|
352
|
+
|
|
353
|
+
#### Formato del fichero incluido
|
|
354
|
+
|
|
355
|
+
El fichero referenciado por `file=` debe cumplir una estructura especifica:
|
|
356
|
+
|
|
357
|
+
- **Cabecera XML** con encoding `utf-8`: `<?xml versión="1.0" encoding="utf-8"?>`
|
|
358
|
+
- **Raiz `<xml>`** (NO `<coll>`).
|
|
359
|
+
- **Estructura plana (no jerárquica)** al nivel de la raiz: los nodos (`<prop>`, `<group>`, `<frame>`, eventos custom) van todos al mismo nivel dentro de `<xml>`.
|
|
360
|
+
|
|
361
|
+
Puede contener `<prop>`, `<group>`, `<frame>` y nodos de evento (incluyendo eventos custom como `<salir>`, `<guardar>`, etc., invocables con `method="ExecuteNode(nombre)"`).
|
|
362
|
+
|
|
363
|
+
**Ejemplo de fichero incluido — `MisBotones.xml`:**
|
|
364
|
+
|
|
365
|
+
```xml
|
|
366
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
367
|
+
<xml>
|
|
368
|
+
<prop name="MAP_SALIR" type="B" title="Salir" visible="1"
|
|
369
|
+
method="ExecuteNode(salir)"
|
|
370
|
+
width="100%" height="20%" labelwidth="10" tmargin="0" />
|
|
371
|
+
|
|
372
|
+
<salir refresh="false">
|
|
373
|
+
<action name="runscript" type="runscript">
|
|
374
|
+
<script language="javascript">
|
|
375
|
+
appData.exit();
|
|
376
|
+
</script>
|
|
377
|
+
</action>
|
|
378
|
+
</salir>
|
|
379
|
+
</xml>
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
#### Ejemplo de uso en una coll
|
|
383
|
+
|
|
384
|
+
```xml
|
|
385
|
+
<coll name="MenuEntrada" special="true" notab="true">
|
|
386
|
+
<group name="General" id="1" />
|
|
387
|
+
<frame name="todo" width="100%" height="100%" scroll="true" />
|
|
388
|
+
|
|
389
|
+
<prop group="1" frame="todo" name="MAP_TEXTO_01" type="T" title="Texto #1"
|
|
390
|
+
visible="1" labelwidth="10" width="100%" />
|
|
391
|
+
<prop group="1" frame="todo" name="MAP_TEXTO_02" type="T" title="Texto #2"
|
|
392
|
+
visible="1" labelwidth="10" width="100%" />
|
|
393
|
+
<prop group="1" frame="todo" name="MAP_TEXTO_03" type="T" title="Texto #3"
|
|
394
|
+
visible="1" labelwidth="10" width="100%" />
|
|
395
|
+
|
|
396
|
+
<!-- Se inyecta aquí el contenido de MisBotones.xml.
|
|
397
|
+
Los props del fichero sin group/frame tomaran group="1" frame="todo" -->
|
|
398
|
+
<include-layout file="MisBotones.xml" group="1" frame="todo" />
|
|
399
|
+
|
|
400
|
+
<prop group="1" frame="todo" name="MAP_TEXTO_04" type="T" title="Texto #4"
|
|
401
|
+
visible="1" labelwidth="10" width="100%" />
|
|
402
|
+
<prop group="1" frame="todo" name="MAP_TEXTO_05" type="T" title="Texto #5"
|
|
403
|
+
visible="1" labelwidth="10" width="100%" />
|
|
404
|
+
</coll>
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
#### Semantica de `group` y `frame` en `<include-layout>`
|
|
408
|
+
|
|
409
|
+
Los atributos `group` y `frame` del nodo `<include-layout>` **solo actuan como valores por defecto** para los props del fichero incluido que NO declaren explicitamente `group` o `frame`. Si un prop del fichero incluido ya declara esos atributos, prevalece lo declarado.
|
|
410
|
+
|
|
411
|
+
Esto permite que el mismo fichero `MisBotones.xml` se incluya desde distintas colls y se ubique automáticamente en el grupo/frame correctos.
|
|
412
|
+
|
|
413
|
+
#### Limitaciones
|
|
414
|
+
|
|
415
|
+
- **No se pueden anidar `<include-layout>`**: el fichero incluido NO puede contener a su vez otro `<include-layout>`. La inclusión es un solo nivel.
|
|
416
|
+
- **No sustituye a `inherits`**: `<include-layout>` es **composición** (pegar fragmentos), no herencia. No hay concepto de override — si el fichero incluido define un `name` que ya existe en la coll, es error de modelo del desarrollador (duplicidad de nombres prohibida dentro de la misma coll).
|
|
417
|
+
- **Ruta relativa a la raiz del proyecto**, no a la carpeta de la coll.
|
|
418
|
+
|
|
419
|
+
### 10.3 Combinar `inherits` + `<include-layout>`
|
|
420
|
+
|
|
421
|
+
Los dos mecanismos se combinan con normalidad. El patron más potente es:
|
|
422
|
+
|
|
423
|
+
1. Una coll padre `special="true"` que defina la estructura visual base (headers, footers, navegación) — reutilizada via `inherits`.
|
|
424
|
+
2. Ficheros XML factorizados (botoneras, fragmentos de formulario) reutilizados via `<include-layout>` dentro de cada pantalla concreta.
|
|
425
|
+
|
|
426
|
+
```xml
|
|
427
|
+
<coll name="PantallaA" inherits="groupsFixed" special="true">
|
|
428
|
+
<group name="Group2" id="2">
|
|
429
|
+
<include-layout file="ControlesGpsComunes.xml" group="2" frame="frmMapa" />
|
|
430
|
+
</group>
|
|
431
|
+
</coll>
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### 10.4 Diferencia con el CSS `extends`
|
|
435
|
+
|
|
436
|
+
No confundir estos mecanismos con la herencia CSS (`extends:` dentro de `.css`). Actuan en niveles distintos:
|
|
437
|
+
|
|
438
|
+
| Aspecto | `extends` (CSS) | `inherits` (coll XML) | `<include-layout>` (nodo XML) |
|
|
439
|
+
|---------|-----------------|------------------------|-------------------------------|
|
|
440
|
+
| Nivel | Estilos | Estructura de coll | Fragmento XML |
|
|
441
|
+
| Que aporta | Atributos visuales | groups, frames, props y eventos completos | Nodos predefinidos en fichero externo |
|
|
442
|
+
| Duplicidad | Hija sobrescribe atributos | Hija sobrescribe nodos con mismo `name` | No aplica (no hay resolución de duplicados) |
|
|
443
|
+
| Cadenas | Si (A→B→C) | Si (A→B→C) | No (un solo nivel) |
|
|
444
|
+
| Multiple | No | No | — |
|
|
445
|
+
| Sintaxis | `extends: .base;` | `inherits="ColPadre"` | `<include-layout file="..." />` |
|
|
446
|
+
| Donde vive | `.css` | Atributo en `<coll>` | Nodo XML dentro de `<coll>` |
|
|
447
|
+
|
|
448
|
+
### 10.5 Anti-patrones
|
|
449
|
+
|
|
450
|
+
| Error | Consecuencia |
|
|
451
|
+
|-------|--------------|
|
|
452
|
+
| Usar `inherits` entre colecciones de datos con `objname` distintos sin planificarlo | Confusion de modelo: la hija puede heredar eventos o campos que no aplican a su tabla |
|
|
453
|
+
| Cadenas de `inherits` muy largas (>3-4 niveles) | Difícil de depurar: para saber que tiene realmente una coll hay que recorrer toda la cadena |
|
|
454
|
+
| Crear una padre gigante que todo el mundo hereda «por si acaso» | Se arrastran nodos innecesarios a cada pantalla. Mejor varias padres pequeñas y especificas |
|
|
455
|
+
| Usar `<include-layout>` con ficheros anidados | No soportado: el fichero incluido no puede contener otro `<include-layout>` |
|
|
456
|
+
| Poner encoding `iso-8859-1` o `iso-8859-15` en el fichero de `<include-layout>` | Limita los caracteres admitidos. Usar **`utf-8`** en los ficheros incluidos (los `.xne` pueden ir en UTF-8 o iso-8859-15) |
|
|
457
|
+
| Declarar `<coll>` como raiz en el fichero de `<include-layout>` | Formato incorrecto: la raiz debe ser `<xml>`, no `<coll>` |
|
|
458
|
+
| Repetir un `name` entre coll y fichero incluido | Los nombres de props/groups/frames deben ser únicos en el ambito final tras la composición |
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## 11. Best Practices y Anti-patrones
|
|
463
|
+
|
|
464
|
+
### 11.1 Top 15 buenas prácticas XML
|
|
465
|
+
|
|
466
|
+
1. **Nombres en PascalCase para colecciones**: `MenuPrincipal`, `DetalleCliente`.
|
|
467
|
+
2. **Nombres en camelCase para props de UI**: `btnGuardar`, `lblTitulo`, `txtNombre`.
|
|
468
|
+
3. **MAYUSCULAS para campos de BD**: `NOMBRE`, `DIRECCION`, `FECHA_CREACION`.
|
|
469
|
+
4. **Prefijo `MAP_` para campos temporales**: `MAP_FILTRO`, `MAP_SELECCIONADO`.
|
|
470
|
+
5. **Prefijo `frm` para frames**: `frmHeader`, `frmBody`, `frmCard`.
|
|
471
|
+
6. **`##PREF##` en todas las consultas SQL**: Nunca hardcodear el nombre de tabla.
|
|
472
|
+
7. **`visible="0"` para campos internos**: Campos de control que no se muestran.
|
|
473
|
+
8. **`visible="7"` por defecto**: Para campos que deben verse en todos los contextos.
|
|
474
|
+
9. **Un archivo `.xne` por coleccion**: Salvo `mappings.xne` (ver Tópico 01 - Estructura).
|
|
475
|
+
10. **Comentarios XML explicativos**: Documentar cada sección importante.
|
|
476
|
+
11. **Usar clases CSS en lugar de estilos inline**: Para reutilización (ver Tópico 04).
|
|
477
|
+
12. **Event handlers con nombres descriptivos**: `guardar`, `buscar`, `irAlDetalle`.
|
|
478
|
+
13. **`method="executenode()"` para lógica compleja**: No poner código extenso en `onclick`.
|
|
479
|
+
14. **Porcentajes para anchos**: Mejor adaptacion a diferentes pantallas.
|
|
480
|
+
15. **`height="-2"` para contenido dinámico**: Evita alturas fijas innecesarias.
|
|
481
|
+
|
|
482
|
+
### 11.2 Top 10 anti-patrones a evitar
|
|
483
|
+
|
|
484
|
+
1. **Inventar atributos XML**: Si no esta en la documentación, no existe. XOne los ignora silenciosamente.
|
|
485
|
+
2. **Usar `px` como unidad**: XOne usa `p` (puntos) y `%`, no `px`, `em`, `rem`.
|
|
486
|
+
3. **Mezclar `onclick` y `method`**: Usar uno u otro en el mismo prop, nunca ambos.
|
|
487
|
+
4. **Poner lógica compleja en `onclick`**: Mejor usar `method="executenode(nombre)"` y un nodo aparte.
|
|
488
|
+
5. **Olvidar `newline="false"`**: Los elementos son `newline="true"` por defecto. Si quieres columnas, debes especificarlo.
|
|
489
|
+
6. **Exceso de anidamiento**: Más de 4-5 niveles de frames anidados degrada el rendimiento.
|
|
490
|
+
7. **`loadall="true"` en tablas grandes**: Puede bloquear la aplicación al cargar miles de registros.
|
|
491
|
+
8. **Contents sin prefijo `@`**: El content no se vincula correctamente al prop.
|
|
492
|
+
9. **Combinar `special="true"` con consultas SQL**: Son mutuamente excluyentes.
|
|
493
|
+
10. **Usar CSS web estándar**: XOne tiene su propio CSS propietario. Ver Tópico 04.
|
|
494
|
+
11. **Usar APIs del DOM**: XOne no es HTML y no tiene navegador. Las funciones `document`, `document.getElementById`, `document.querySelector`, `window`, `localStorage`, `sessionStorage`, `XMLHttpRequest`, `navigator`, `history` NO existen en XOne. Para HTTP idiomático usar `$http`; para navegación `ui.*`; para datos `self.*` y `appData.*`. (SÍ existen, vía implementación custom: `fetch`, `Promise` ES2024, `setTimeout`/`setInterval`, `URL`, `Headers`, `AbortController`, `EventTarget`, `console`, `performance.now()`.)
|
|
495
|
+
12. **Repetir nombres de nodos dentro de la misma coleccion**: Ver sección 11.4 abajo — es una restricción crítica de la plataforma.
|
|
496
|
+
13. **Crear un evento como nodo XML cuando es atributo**: Los eventos de control (`onclick`, `ontextchanged`, `onfocuschanged`, `oneditoraction`, `onlongpress`, `onlongpressitem`, `onscroll`, `onconsolemessage`, `oncodescanned`, `ondateselected`, `onpageselected`, `ondraweropened`, `ondrawerclosed`, etc.) se declaran SIEMPRE como atributos del `<prop>`/`<frame>`/`<coll>` y su valor es JS inline. NO existen como nodos XML hijos: `<onconsolemessage>...</onconsolemessage>` o `<onclick>...</onclick>` son XML invalidos que XOne ignora silenciosamente. Excepción documentada: `onchange` admite ambas formas (ver §3.2 del Tópico 05) — es la unica. Los nodos hijos de `<coll>` que SI existen son eventos de objeto/coleccion (`<create>`, `<load>`, `<before-edit>`, `<after-edit>`, `<onback>`, `<onrefresh>`, `<login-ok>`, `<login-fail>`, etc.), no eventos de control.
|
|
497
|
+
|
|
498
|
+
### 11.3 Checklist de validación XML
|
|
499
|
+
|
|
500
|
+
Antes de entregar código XML, verifica:
|
|
501
|
+
|
|
502
|
+
**Estructura general:**
|
|
503
|
+
- [ ] Declaración XML con encoding coherente (UTF-8 o iso-8859-15): `<?xml version="1.0" encoding="utf-8"?>`
|
|
504
|
+
- [ ] Nodo raiz `<coll>` con atributo `name`
|
|
505
|
+
- [ ] Al menos un `<group>` con `name` e `id`
|
|
506
|
+
- [ ] Todos los IDs de grupo son únicos
|
|
507
|
+
- [ ] No hay dos nodos del mismo tipo con el mismo `name` dentro de la misma `<coll>` (ver 11.4)
|
|
508
|
+
- [ ] No hay dos `<coll>` con el mismo `name` en el proyecto
|
|
509
|
+
|
|
510
|
+
**Nodo coll:**
|
|
511
|
+
- [ ] `name` en PascalCase
|
|
512
|
+
- [ ] Si tiene datos: `sql`, `objname`, `updateobj` definidos
|
|
513
|
+
- [ ] Si es pantalla: `special="true"` y sin `sql`
|
|
514
|
+
- [ ] SQL usa `##PREF##`
|
|
515
|
+
- [ ] `notab="true"` si solo hay un grupo visible
|
|
516
|
+
|
|
517
|
+
**Nodos prop:**
|
|
518
|
+
- [ ] Todos tienen `name` y `type`
|
|
519
|
+
- [ ] `type` es un valor valido de la tabla de tipos
|
|
520
|
+
- [ ] `visible` usa el bitmask correcto (0-7)
|
|
521
|
+
- [ ] Los botones usan `method` O `onclick`, no ambos
|
|
522
|
+
- [ ] Los combos tienen `mapcol`/`mapfld` en el prop oculto y `linkedto`/`linkedfield` en el visible
|
|
523
|
+
- [ ] Los `type="Z"` tienen un `<contents>` correspondiente
|
|
524
|
+
|
|
525
|
+
**Nodos frame:**
|
|
526
|
+
- [ ] Todos tienen `name`
|
|
527
|
+
- [ ] Los frames horizontales usan `newline="false"`
|
|
528
|
+
- [ ] Las dimensiones usan `p` o `%`, nunca `px`
|
|
529
|
+
- [ ] Los frames flotantes tienen `floating="true"` con `top`/`left`
|
|
530
|
+
|
|
531
|
+
**Event handlers:**
|
|
532
|
+
- [ ] `<create>`, `<load>`, `<onback>` son hijos de `<coll>`
|
|
533
|
+
- [ ] Los nodos custom tienen la estructura: `<action name="runscript"><script>...</script></action>`
|
|
534
|
+
- [ ] Los parámetros se declaran con `<param name="..." />`
|
|
535
|
+
- [ ] Las condiciones XML usan `>` para `>` y `<` para `<`
|
|
536
|
+
|
|
537
|
+
**Contents:**
|
|
538
|
+
- [ ] Los `<contents>` tienen `name` (con `@`) y `src`
|
|
539
|
+
- [ ] Los filtros usan `##FLD_CAMPO##` para valores dinámicos
|
|
540
|
+
- [ ] Cada content esta vinculado a un `<prop type="Z">`
|
|
541
|
+
- [ ] Todos los nodos con `name` tienen nombres únicos en su ambito (ver 11.4)
|
|
542
|
+
|
|
543
|
+
### 11.4 Restricción crítica: unicidad de nombres de nodos
|
|
544
|
+
|
|
545
|
+
**Esta es una restricción de la plataforma XOne, no una sugerencia.**
|
|
546
|
+
|
|
547
|
+
Dentro de una `<coll>`, todos los nodos que tengan atributo `name` deben tener nombres únicos. **El ambito de unicidad es la `<coll>` ENTERA**, no el `<group>` o `<frame>` que contiene al nodo: dos elementos del mismo tipo no pueden tener el mismo `name` en ningun lugar de la misma coll, **ni siquiera si están en `<group>` o `<frame>` distintos**.
|
|
548
|
+
|
|
549
|
+
Casos prohibidos:
|
|
550
|
+
|
|
551
|
+
- **Dos `<group>` con el mismo `name`** dentro de la misma `<coll>` — prohibido
|
|
552
|
+
- **Dos `<frame>` con el mismo `name`** dentro de la misma `<coll>` — prohibido (incluso aunque estén en `<group>` distintos)
|
|
553
|
+
- **Dos `<prop>` con el mismo `name`** dentro de la misma `<coll>` — prohibido (incluso aunque estén en `<group>` o `<frame>` distintos)
|
|
554
|
+
- **Dos eventos del mismo tipo** (ej. dos `<before-edit>`) dentro de la misma `<coll>` — prohibido
|
|
555
|
+
- **Dos `<coll>` con el mismo `name`** en el mismo proyecto — prohibido
|
|
556
|
+
|
|
557
|
+
**Razón técnica:** el `name` de cada nodo se publica a nivel de la propia `<coll>` (los `collprops`), por lo que actuaria como identificador único ambiguo si se repitiera. La unicidad se evalua sobre la coll completa, no sobre el padre inmediato.
|
|
558
|
+
|
|
559
|
+
**Lo que SI es valido:** dos `<coll>` distintas (distinto `name`) con el contenido exactamente igual — incluso con los mismos `name` internos de prop/group/frame. Cada coll es un ambito independiente. La unicidad aplica al nombre del nodo dentro de su coll, no al contenido en si.
|
|
560
|
+
|
|
561
|
+
```xml
|
|
562
|
+
<!-- INCORRECTO: dos group con el mismo name -->
|
|
563
|
+
<coll name="MiPantalla" special="true">
|
|
564
|
+
<group name="grpPrincipal" id="1">...</group>
|
|
565
|
+
<group name="grpPrincipal" id="2">...</group> <!-- ERROR: nombre duplicado -->
|
|
566
|
+
</coll>
|
|
567
|
+
|
|
568
|
+
<!-- INCORRECTO: dos prop con el mismo name -->
|
|
569
|
+
<group name="grpDatos" id="1">
|
|
570
|
+
<prop name="NOMBRE" type="T" visible="7"/>
|
|
571
|
+
<prop name="NOMBRE" type="L" visible="2"/> <!-- ERROR: nombre duplicado -->
|
|
572
|
+
</group>
|
|
573
|
+
|
|
574
|
+
<!-- INCORRECTO: dos before-edit en la misma coll -->
|
|
575
|
+
<coll name="MiPantalla" special="true">
|
|
576
|
+
<before-edit>...</before-edit>
|
|
577
|
+
<before-edit>...</before-edit> <!-- ERROR: evento duplicado -->
|
|
578
|
+
</coll>
|
|
579
|
+
|
|
580
|
+
<!-- CORRECTO: nombres distintos en todos los nodos -->
|
|
581
|
+
<coll name="MiPantalla" special="true">
|
|
582
|
+
<before-edit>...</before-edit>
|
|
583
|
+
<group name="grpPrincipal" id="1">
|
|
584
|
+
<frame name="frmHeader" width="100%" height="100p"/>
|
|
585
|
+
<frame name="frmBody" width="100%" height="-2"/> <!-- nombres distintos -->
|
|
586
|
+
<prop name="MAP_TITULO" type="L" visible="7"/>
|
|
587
|
+
<prop name="MAP_SUBTITULO" type="L" visible="7"/> <!-- nombres distintos -->
|
|
588
|
+
</group>
|
|
589
|
+
<group name="grpSecundario" id="2">...</group> <!-- nombre distinto -->
|
|
590
|
+
</coll>
|
|
591
|
+
|
|
592
|
+
<!-- CORRECTO: dos coll distintas con contenido identico -->
|
|
593
|
+
<coll name="ColeccionA" progid="ASData.CASBasicDataObj" ...>
|
|
594
|
+
<group name="General" id="1">
|
|
595
|
+
<prop name="NOMBRE" type="T" visible="7"/>
|
|
596
|
+
</group>
|
|
597
|
+
</coll>
|
|
598
|
+
<coll name="ColeccionB" progid="ASData.CASBasicDataObj" ...> <!-- distinto name: valido -->
|
|
599
|
+
<group name="General" id="1">
|
|
600
|
+
<prop name="NOMBRE" type="T" visible="7"/>
|
|
601
|
+
</group>
|
|
602
|
+
</coll>
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
**Estrategia para evitar colisiones al generar código:** usa prefijos que incluyan el contexto funcional del elemento:
|
|
606
|
+
|
|
607
|
+
```xml
|
|
608
|
+
<!-- En lugar de nombres genericos reutilizables en varias pantallas: -->
|
|
609
|
+
<frame name="frmContenido"> <!-- RIESGO de colision si otro grupo tiene el mismo nombre -->
|
|
610
|
+
|
|
611
|
+
<!-- Usa nombres especificos que describan su funcion: -->
|
|
612
|
+
<frame name="frmClienteHeader">
|
|
613
|
+
<frame name="frmClienteBody">
|
|
614
|
+
<frame name="frmClienteFooter">
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
> **Referencia cruzada**: Para más información sobre estructura de proyecto consulta el Tópico 01 - Estructura del Proyecto. Para estilos CSS, consulta el Tópico 04 - CSS. Para la API JavaScript, consulta el Tópico 03 - JavaScript. Para crear un proyecto desde cero, consulta el Tópico 01 - Fundamentos.
|
|
618
|
+
|