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,666 @@
|
|
|
1
|
+
# XOne XML — Nodos group y frame
|
|
2
|
+
|
|
3
|
+
> Fuente: `xone/v2/xone-help-docs/topics/02a-xml-estructura.md` §3–§4. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
|
|
4
|
+
|
|
5
|
+
Contenido: §3 group: grupos fijos header/footer, drawer lateral, tabs · §4 frame: contenedores, frames flotantes, bottom sheet, flujo de layout y newline
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 3. Nodo group - Agrupaciones
|
|
10
|
+
|
|
11
|
+
El nodo `<group>` organiza el contenido dentro de una coleccion. Puede representar una pestana (tab), una sección fija (header/footer) o una zona flotante.
|
|
12
|
+
|
|
13
|
+
### 3.1 Atributos principales
|
|
14
|
+
|
|
15
|
+
| Atributo | Tipo | Requerido | Descripción |
|
|
16
|
+
|----------|------|-----------|-------------|
|
|
17
|
+
| `name` | string | **Si** | Nombre del grupo. Se muestra como nombre de pestana si hay tabs. |
|
|
18
|
+
| `id` | integer | **Si** | Identificador numérico **único dentro de la coll**. Si dos `<group>` comparten `id` en la misma coll el comportamiento es indefinido. Convencion: `1, 2, ...` normales; `999` HEADER fijo (`class="groupfixed_header"`), `0` FOOTER fijo (`class="groupfixed_footer"`). |
|
|
19
|
+
| `width` | dimensión | No | Ancho del grupo. |
|
|
20
|
+
| `height` | dimensión | No | Alto del grupo. Obligatorio cuando `fixed="true"`. |
|
|
21
|
+
| `align` | string | No | Alineacion del contenido dentro del group. Funciona igual que en `<frame>`. Ver tabla de valores en sección 4.2. Ejemplos: `center`, `left\|top`, `center\|top` |
|
|
22
|
+
| `scroll` | boolean | No | Habilita scroll vertical en el grupo. |
|
|
23
|
+
| `bgcolor` | color | No | Color de fondo. |
|
|
24
|
+
| `imgbk` | string | No | Imagen de fondo del grupo. |
|
|
25
|
+
| `class` | string | No | Clase CSS para estilizar. |
|
|
26
|
+
| `fixed` | boolean | No | Si es `true`, el grupo queda fijo (header/footer) sin desplazarse con el scroll. |
|
|
27
|
+
| `orientation` | string | No | Posición del grupo fijo: `top` o `bottom`. Solo cuando `fixed="true"`. |
|
|
28
|
+
| `below-drawer` | boolean | No | El grupo queda por debajo de cualquier drawer abierto. Usar en headers y footers. |
|
|
29
|
+
| `floating` | boolean | No | Si es `true`, el grupo se superpone sobre el contenido (modal/overlay). |
|
|
30
|
+
| `top` | dimensión | No | Coordenada vertical del grupo flotante. |
|
|
31
|
+
| `left` | dimensión | No | Coordenada horizontal del grupo flotante. |
|
|
32
|
+
| `tab-width` | dimensión | No | Ancho de la pestana en la barra de tabs. Por defecto `"33%"`. |
|
|
33
|
+
| `disableedit` | condition | No | Deshabilita la edición de todos los campos del grupo si se cumple la condición. |
|
|
34
|
+
| `disablevisible` | condition | No | Oculta el grupo entero si se cumple la condición. |
|
|
35
|
+
| `animation-in` | string | No | Macro de animación al entrar al grupo (ej: `##ALPHA_IN##`, `##RIGHT_IN##`). |
|
|
36
|
+
| `animation-out` | string | No | Macro de animación al salir del grupo (ej: `##ALPHA_OUT##`, `##LEFT_OUT##`). |
|
|
37
|
+
| `onfocus` | string | No | Evento que se ejecuta cuando el usuario selecciona el grupo. |
|
|
38
|
+
| `drawer-orientation` | string | No | Define el grupo como drawer lateral. Valores: `left` o `right`. |
|
|
39
|
+
|
|
40
|
+
### 3.2 Grupos fijos (fixed, orientation: top/bottom)
|
|
41
|
+
|
|
42
|
+
Los grupos fijos permanecen visibles sin importar el scroll del contenido. Son ideales para headers y footers.
|
|
43
|
+
|
|
44
|
+
```xml
|
|
45
|
+
<!-- Header fijo en la parte superior -->
|
|
46
|
+
<group name="HEADER" id="10"
|
|
47
|
+
fixed="true"
|
|
48
|
+
orientation="top"
|
|
49
|
+
width="100%" height="120p">
|
|
50
|
+
<frame name="frmtitulo" class="frmsuperior">
|
|
51
|
+
<prop name="SALIR" type="B" class="btvolversuper" />
|
|
52
|
+
<prop name="MENU" type="L" class="tlsuper" title="Mi App" />
|
|
53
|
+
</frame>
|
|
54
|
+
</group>
|
|
55
|
+
|
|
56
|
+
<!-- Footer fijo en la parte inferior -->
|
|
57
|
+
<group name="FOOTER" id="0"
|
|
58
|
+
fixed="true"
|
|
59
|
+
orientation="bottom"
|
|
60
|
+
width="100%" height="100p">
|
|
61
|
+
<prop name="BTN_GUARDAR" type="B" title="Guardar" />
|
|
62
|
+
</group>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| Atributo | Tipo | Descripción |
|
|
66
|
+
|----------|------|-------------|
|
|
67
|
+
| `fixed` | boolean | Fija el grupo en su posición. No se desplaza con el scroll. |
|
|
68
|
+
| `orientation` | string | Donde se fija: `top` o `bottom`. |
|
|
69
|
+
| `below-drawer` | boolean | El grupo queda por debajo de cualquier drawer abierto. Usar en headers y footers para que el drawer se superponga correctamente. |
|
|
70
|
+
|
|
71
|
+
> **IMPORTANTE:** Una vez definidos los grupos fijos, el espacio restante se toma como el 100% para los grupos de contenido. No hay que restar el alto de los grupos fijos al calcular dimensiones.
|
|
72
|
+
|
|
73
|
+
### 3.3 Grupos flotantes (floating, top, left)
|
|
74
|
+
|
|
75
|
+
Los grupos flotantes se superponen sobre el contenido, como modales u overlays.
|
|
76
|
+
|
|
77
|
+
```xml
|
|
78
|
+
<group name="Modal" id="50"
|
|
79
|
+
floating="true"
|
|
80
|
+
top="100p"
|
|
81
|
+
left="0"
|
|
82
|
+
width="100%"
|
|
83
|
+
height="400p"
|
|
84
|
+
bgcolor="#77000000"
|
|
85
|
+
disablevisible="MOSTRAR_MODAL=0">
|
|
86
|
+
<frame name="ContenidoModal" width="80%" bgcolor="#FFFFFF">
|
|
87
|
+
<!-- contenido del modal -->
|
|
88
|
+
</frame>
|
|
89
|
+
</group>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 3.3b Grupos Drawer (panel lateral deslizante)
|
|
93
|
+
|
|
94
|
+
Un drawer es un grupo que permanece oculto hasta que el usuario desliza desde un borde lateral de la pantalla o se abre por código. Al desplegarse, el fondo queda oscurecido por una capa semitransparente.
|
|
95
|
+
|
|
96
|
+
```xml
|
|
97
|
+
<!-- Definición del drawer -->
|
|
98
|
+
<group name="MenuLateral" id="999" drawer-orientation="left" width="70%" height="100%">
|
|
99
|
+
<prop name="MAP_BT_CLIENTES" type="B" title="Clientes" visible="1"
|
|
100
|
+
onclick="javascript:irColl('ListaClientes'); ui.hideGroup(999);"
|
|
101
|
+
class="xnTituloDrawerC" />
|
|
102
|
+
<prop name="MAP_BT_SALIR" type="B" title="Salir" visible="1"
|
|
103
|
+
method="ExecuteNode(onback)" class="xnTituloDrawerC" />
|
|
104
|
+
</group>
|
|
105
|
+
|
|
106
|
+
<!-- Header con botón para abrir el drawer — below-drawer para que el drawer se superponga -->
|
|
107
|
+
<group name="Header" id="10" fixed="true" orientation="top" below-drawer="true" width="100%" height="120p">
|
|
108
|
+
<prop name="MAP_BT_MENU" type="B" img="menu_icon.png"
|
|
109
|
+
onclick="javascript:ui.showGroup(999);" width="80p" height="80p" />
|
|
110
|
+
<prop name="MAP_TITULO" type="L" title="Mi App" newline="false" />
|
|
111
|
+
</group>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Métodos JavaScript para controlar grupos y drawers:**
|
|
115
|
+
|
|
116
|
+
| Método | Descripción |
|
|
117
|
+
|--------|-------------|
|
|
118
|
+
| `ui.showGroup(id)` | Muestra el grupo |
|
|
119
|
+
| `ui.showGroup(id, animIn, durIn, animOut, durOut)` | Muestra con animación personalizada |
|
|
120
|
+
| `ui.hideGroup(id)` | Oculta el grupo |
|
|
121
|
+
| `ui.toggleGroup(id)` | Alterna entre mostrar y ocultar |
|
|
122
|
+
| `ui.lockGroup(id, close)` | Bloquea el grupo: `close=true` lo bloquea cerrado, `false` lo bloquea abierto |
|
|
123
|
+
| `ui.unlockGroup(id)` | Desbloquea el grupo para que vuelva a ser interactivo |
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// Abrir drawer con animacion
|
|
127
|
+
ui.showGroup(999, "##RIGHT_IN##", 300, "##LEFT_OUT##", 200);
|
|
128
|
+
// Cerrar
|
|
129
|
+
ui.hideGroup(999);
|
|
130
|
+
// Bloquear cerrado (util durante carga inicial)
|
|
131
|
+
ui.lockGroup(999, true);
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
> **Convencion de IDs:** Usar IDs altos (999, 9998, 9997...) para drawers y grupos flotantes/modales, para evitar conflictos con los grupos de contenido (1, 2, 3...).
|
|
135
|
+
|
|
136
|
+
### 3.4 Grupos como pestanas (tabs)
|
|
137
|
+
|
|
138
|
+
Cuando una coleccion tiene multiples grupos con `notab="false"` (o sin `notab`), cada grupo se convierte en una pestana:
|
|
139
|
+
|
|
140
|
+
```xml
|
|
141
|
+
<coll name="MiApp" group-theme="material" tab-mode="scrollable">
|
|
142
|
+
<group name="Datos" id="1" align="center">
|
|
143
|
+
<!-- Contenido de la pestana "Datos" -->
|
|
144
|
+
</group>
|
|
145
|
+
<group name="Fotos" id="2" align="center">
|
|
146
|
+
<!-- Contenido de la pestana "Fotos" -->
|
|
147
|
+
</group>
|
|
148
|
+
<group name="Mapa" id="3" align="center">
|
|
149
|
+
<!-- Contenido de la pestana "Mapa" -->
|
|
150
|
+
</group>
|
|
151
|
+
</coll>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Atributos de la coleccion para tabs:**
|
|
155
|
+
|
|
156
|
+
| Atributo | Descripción |
|
|
157
|
+
|----------|-------------|
|
|
158
|
+
| `group-theme="material"` | Estilo Material Design para las pestanas |
|
|
159
|
+
| `tab-mode="scrollable"` | Los tabs se deslizan si no caben en pantalla |
|
|
160
|
+
| `tab-mode="fixed"` | Los tabs tienen ancho fijo distribuido en la barra |
|
|
161
|
+
| `notab="true"` | Oculta completamente la barra de tabs |
|
|
162
|
+
| `group-swipe="true"` | Permite deslizar entre grupos con gesto horizontal |
|
|
163
|
+
|
|
164
|
+
**Atributos del `<group>` para personalizar la pestana:**
|
|
165
|
+
|
|
166
|
+
| Atributo | Descripción |
|
|
167
|
+
|----------|-------------|
|
|
168
|
+
| `tab-width` | Ancho de la pestana en la barra. Por defecto `"33%"` |
|
|
169
|
+
| `animation-in` | Animación al entrar. Macros disponibles abajo |
|
|
170
|
+
| `animation-out` | Animación al salir |
|
|
171
|
+
|
|
172
|
+
**Macros de animación:**
|
|
173
|
+
|
|
174
|
+
| Macro entrada | Macro salida | Efecto |
|
|
175
|
+
|---------------|--------------|--------|
|
|
176
|
+
| `##ALPHA_IN##` | `##ALPHA_OUT##` | Fundido de entrada/salida |
|
|
177
|
+
| `##RIGHT_IN##` | `##RIGHT_OUT##` | Desde/hacia la derecha |
|
|
178
|
+
| `##LEFT_IN##` | `##LEFT_OUT##` | Desde/hacia la izquierda |
|
|
179
|
+
| `##PUSH_IN##` | `##PUSH_OUT##` | Empuje desde abajo |
|
|
180
|
+
| `##PUSH_DOWN_IN##` | `##PUSH_DOWN_OUT##` | Empuje hacia abajo |
|
|
181
|
+
| `##ROTATE3D_IN##` | `##ROTATE3D_OUT##` | Rotación 3D |
|
|
182
|
+
| `##ZOOM_IN##` | `##ZOOM_OUT##` | Zoom de entrada/salida |
|
|
183
|
+
|
|
184
|
+
### 3.5 group-swipe y navegación entre grupos
|
|
185
|
+
|
|
186
|
+
Con `group-swipe="true"` en la coleccion, el usuario puede deslizar horizontalmente entre grupos. Esto es útil para pantallas tipo wizard o tutorial.
|
|
187
|
+
|
|
188
|
+
```xml
|
|
189
|
+
<coll name="EspecialBasicos" special="true" group-swipe="true">
|
|
190
|
+
<group name="Paso1" id="1">...</group>
|
|
191
|
+
<group name="Paso2" id="2">...</group>
|
|
192
|
+
<group name="Paso3" id="3">...</group>
|
|
193
|
+
</coll>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
También se puede navegar programaticamente con `ui.showGroup()`:
|
|
197
|
+
|
|
198
|
+
```javascript
|
|
199
|
+
ui.showGroup(2, "##ALPHA_IN##", 500, "##ALPHA_OUT##", 500);
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
El evento `onfocus` de grupo permite detectar cuando un grupo se activa:
|
|
203
|
+
|
|
204
|
+
```xml
|
|
205
|
+
<group name="Group1" id="1" onfocus="ExecuteNode(onfocusgrupo(1))">
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### 3.6 disablevisible para visibilidad condicional
|
|
209
|
+
|
|
210
|
+
Los grupos pueden ocultarse condicionalmente:
|
|
211
|
+
|
|
212
|
+
```xml
|
|
213
|
+
<group name="Modal" id="50"
|
|
214
|
+
disablevisible="MOSTRAR_MODAL=0">
|
|
215
|
+
<!-- Se oculta cuando MAP_MOSTRAR_MODAL vale 0 -->
|
|
216
|
+
</group>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
La expresión sigue el formato `CAMPO=VALOR` o `CAMPO>VALOR`, `CAMPO<VALOR`, etc.
|
|
220
|
+
|
|
221
|
+
### 3.7 Patron Header + Content + Footer
|
|
222
|
+
|
|
223
|
+
Este es el patron más común en aplicaciones XOne:
|
|
224
|
+
|
|
225
|
+
```xml
|
|
226
|
+
<coll name="MiPantalla" special="true" notab="true">
|
|
227
|
+
<!-- Header fijo arriba -->
|
|
228
|
+
<group name="Header" id="10"
|
|
229
|
+
fixed="true" orientation="top"
|
|
230
|
+
width="100%" height="120p">
|
|
231
|
+
<frame name="frmHeader" class="frmsuperior">
|
|
232
|
+
<prop name="SALIR" type="B" class="btvolversuper" />
|
|
233
|
+
<prop name="TITULO" type="L" class="tlsuper" title="Mi Pantalla" />
|
|
234
|
+
</frame>
|
|
235
|
+
</group>
|
|
236
|
+
|
|
237
|
+
<!-- Contenido scrollable -->
|
|
238
|
+
<group name="Contenido" id="1" align="center">
|
|
239
|
+
<frame name="frmBody" width="100%" height="100%" scroll="true">
|
|
240
|
+
<!-- Contenido principal aquí -->
|
|
241
|
+
</frame>
|
|
242
|
+
</group>
|
|
243
|
+
|
|
244
|
+
<!-- Footer fijo abajo -->
|
|
245
|
+
<group name="Footer" id="0"
|
|
246
|
+
fixed="true" orientation="bottom"
|
|
247
|
+
width="100%" height="80p">
|
|
248
|
+
<frame name="frmFooter" class="frmsuperior">
|
|
249
|
+
<prop name="BTN_ACCION" type="B" title="Acción" class="btinferior" />
|
|
250
|
+
</frame>
|
|
251
|
+
</group>
|
|
252
|
+
</coll>
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 3.8 Buenas prácticas
|
|
256
|
+
|
|
257
|
+
1. **IDs secuenciales**: Usa `id="1"`, `id="2"`, `id="3"` para grupos de contenido.
|
|
258
|
+
2. **ID alto para headers**: Usa `id="10"` o `id="999"` para headers fijos.
|
|
259
|
+
3. **ID 0 para footer**: Convencion para el footer de la aplicación.
|
|
260
|
+
4. **ID 99 para campos ocultos**: Grupo con `class="groupNoTab"` para props ocultos.
|
|
261
|
+
5. **Nombres descriptivos**: `Header`, `Contenido`, `Footer`, `Datos`, `Mapa`.
|
|
262
|
+
6. **`class="groupNoTab"`** cuando quieres un grupo sin que aparezca como pestana visible.
|
|
263
|
+
|
|
264
|
+
### 3.9 Errores comunes
|
|
265
|
+
|
|
266
|
+
| Error | Consecuencia | Solución |
|
|
267
|
+
|-------|-------------|----------|
|
|
268
|
+
| IDs duplicados | Solo se muestra un grupo | Cada grupo con ID único |
|
|
269
|
+
| `fixed="true"` sin `orientation` | No se posiciona correctamente | Siempre definir `orientation` |
|
|
270
|
+
| Altura fija sin `fixed` | Puede cortar contenido | Usar `scroll="true"` o altura automática |
|
|
271
|
+
| Grupo drawer sin `id="999"` | Conflicto con otros grupos | Usar IDs altos para drawers |
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 4. Nodo frame - Contenedores Visuales
|
|
276
|
+
|
|
277
|
+
El nodo `<frame>` es el equivalente a un `<div>` en HTML. Agrupa elementos visuales y permite crear layouts complejos mediante anidamiento.
|
|
278
|
+
|
|
279
|
+
### 4.1 Atributos de dimensión
|
|
280
|
+
|
|
281
|
+
| Atributo | Tipo | Descripción | Valores comunes |
|
|
282
|
+
|----------|------|-------------|-----------------|
|
|
283
|
+
| `width` | dimensión | Ancho del frame | `"100%"`, `"90%"`, `"300p"`, `"50%"` |
|
|
284
|
+
| `height` | dimensión | Alto del frame | `"100%"`, `"200p"`, `"-2"`, `"-1"` |
|
|
285
|
+
|
|
286
|
+
**Valores especiales de height**:
|
|
287
|
+
- `height="-1"`: Altura automática según contenido.
|
|
288
|
+
- `height="-2"`: Altura automática con ajuste fino (más preciso que -1).
|
|
289
|
+
- `height="100%"`: Ocupa todo el alto disponible.
|
|
290
|
+
|
|
291
|
+
```xml
|
|
292
|
+
<!-- Frame con altura automática -->
|
|
293
|
+
<frame name="frmAuto" width="100%" height="-2">
|
|
294
|
+
<prop name="CAMPO1" type="T" title="Nombre" />
|
|
295
|
+
<prop name="CAMPO2" type="T" title="Email" />
|
|
296
|
+
<!-- La altura se ajusta al contenido -->
|
|
297
|
+
</frame>
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 4.2 Atributos de alineacion (align con |)
|
|
301
|
+
|
|
302
|
+
El atributo `align` funciona igual en los tres nodos que lo soportan: `<group>`, `<frame>` y `<prop>`. Controla la posición del contenido **dentro** del nodo. Es diferente de `text-align` (alineacion del texto dentro del campo) y de `label-align` (alineacion de la etiqueta).
|
|
303
|
+
|
|
304
|
+
El atributo acepta valores simples o combinados con el separador `|`. El primer valor es la **alineacion horizontal** y el segundo es la **alineacion vertical**:
|
|
305
|
+
|
|
306
|
+
| Valor horizontal | Valor vertical | Descripción |
|
|
307
|
+
|-----------------|----------------|-------------|
|
|
308
|
+
| `left` | — | Alineado a la izquierda |
|
|
309
|
+
| `right` | — | Alineado a la derecha |
|
|
310
|
+
| `center` | — | Centrado horizontalmente |
|
|
311
|
+
| — | `top` | Alineado arriba |
|
|
312
|
+
| — | `bottom` | Alineado abajo |
|
|
313
|
+
| — | `center` | Centrado verticalmente |
|
|
314
|
+
|
|
315
|
+
**Combinaciones más usadas** (formato: `horizontal|vertical`):
|
|
316
|
+
|
|
317
|
+
| Valor | Descripción |
|
|
318
|
+
|-------|-------------|
|
|
319
|
+
| `center` | Centrado solo horizontalmente |
|
|
320
|
+
| `center\|center` | Centrado en ambos ejes — el más común en modales y overlays |
|
|
321
|
+
| `left\|top` | Esquina superior izquierda — inicio del flujo normal |
|
|
322
|
+
| `left\|center` | Centrado verticalmente, pegado a la izquierda |
|
|
323
|
+
| `right\|center` | Centrado verticalmente, pegado a la derecha |
|
|
324
|
+
| `center\|top` | Arriba centrado horizontalmente |
|
|
325
|
+
| `center\|bottom` | Abajo centrado horizontalmente |
|
|
326
|
+
| `right\|top` | Esquina superior derecha |
|
|
327
|
+
|
|
328
|
+
> **Nota:** `align` controla la posición del **contenido dentro del nodo**. Para alinear el texto dentro de un campo de texto usar `text-align`. Para alinear la etiqueta usar `label-align`.
|
|
329
|
+
|
|
330
|
+
Ejemplo real del wiki (EspecialFrames.xne):
|
|
331
|
+
|
|
332
|
+
```xml
|
|
333
|
+
<frame name="group1Frame" width="100%" height="100%"
|
|
334
|
+
scroll="true" align="left|top">
|
|
335
|
+
<frame name="topLeft" bgcolor="#5B8DDE"
|
|
336
|
+
width="30%" height="20%"
|
|
337
|
+
align="center" lmargin="5%" tmargin="5%">
|
|
338
|
+
<prop name="text1" type="L" title="Izquierda, arriba"
|
|
339
|
+
label-wrap="true" labelbox="false" align="center" />
|
|
340
|
+
</frame>
|
|
341
|
+
<frame name="topRight" bgcolor="#5B8DDE"
|
|
342
|
+
width="50%" height="20%"
|
|
343
|
+
align="center" newline="false" lmargin="10%" tmargin="5%">
|
|
344
|
+
<prop name="text2" type="L" title="Derecha, arriba"
|
|
345
|
+
label-wrap="true" labelbox="false" align="center" />
|
|
346
|
+
</frame>
|
|
347
|
+
</frame>
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 4.3 Margenes y padding
|
|
351
|
+
|
|
352
|
+
| Atributo | Descripción | Ejemplo |
|
|
353
|
+
|----------|-------------|---------|
|
|
354
|
+
| `tmargin` | Margen superior | `tmargin="20p"` |
|
|
355
|
+
| `bmargin` | Margen inferior | `bmargin="10p"` |
|
|
356
|
+
| `lmargin` | Margen izquierdo | `lmargin="15p"` |
|
|
357
|
+
| `rmargin` | Margen derecho | `rmargin="15p"` |
|
|
358
|
+
| `tpadding` | Padding superior | `tpadding="15p"` |
|
|
359
|
+
| `bpadding` | Padding inferior | `bpadding="15p"` |
|
|
360
|
+
| `lpadding` | Padding izquierdo | `lpadding="15p"` |
|
|
361
|
+
| `rpadding` | Padding derecho | `rpadding="15p"` |
|
|
362
|
+
|
|
363
|
+
> **Diferencia margen vs padding**: El margen es el espacio exterior al frame; el padding es el espacio interior entre el borde y el contenido.
|
|
364
|
+
|
|
365
|
+
### 4.3b Flujo de layout y newline
|
|
366
|
+
|
|
367
|
+
XOne posiciona los elementos en **flujo lineal de arriba a abajo**: por defecto cada `<frame>` o `<prop>` ocupa su propia línea y el siguiente baja. El atributo `newline` controla este comportamiento.
|
|
368
|
+
|
|
369
|
+
| Valor | Comportamiento |
|
|
370
|
+
|-------|---------------|
|
|
371
|
+
| `newline="true"` | **Por defecto.** El elemento empieza en una nueva línea bajo el anterior |
|
|
372
|
+
| `newline="false"` | El elemento se coloca a la derecha del anterior en la misma línea |
|
|
373
|
+
|
|
374
|
+
`newline` funciona igual en `<frame>` y en `<prop>`.
|
|
375
|
+
|
|
376
|
+
#### Uso principal: columnas horizontales
|
|
377
|
+
|
|
378
|
+
```xml
|
|
379
|
+
<!-- Dos columnas de igual ancho -->
|
|
380
|
+
<frame name="frmCol1" width="50%" height="200p">
|
|
381
|
+
<prop name="CAMPO1" type="T" visible="1" title="Columna 1" />
|
|
382
|
+
</frame>
|
|
383
|
+
<frame name="frmCol2" width="50%" height="200p" newline="false">
|
|
384
|
+
<prop name="CAMPO2" type="T" visible="1" title="Columna 2" />
|
|
385
|
+
</frame>
|
|
386
|
+
|
|
387
|
+
<!-- Tres columnas -->
|
|
388
|
+
<frame name="frmA" width="33%" height="200p">...</frame>
|
|
389
|
+
<frame name="frmB" width="33%" height="200p" newline="false">...</frame>
|
|
390
|
+
<frame name="frmC" width="34%" height="200p" newline="false">...</frame>
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
> El primer elemento de la fila **no debe llevar** `newline="false"` — ya parte desde la izquierda. Se pone solo en los siguientes. **No es solo cuestión de estilo**: poner `newline="false"` en el primer elemento de un `<frame>` puede hacer que el frame entero no se monte (sus controles desaparecen de la pantalla sin error visible). Verificado en dispositivo.
|
|
394
|
+
|
|
395
|
+
#### Uso en props: campos en la misma línea
|
|
396
|
+
|
|
397
|
+
```xml
|
|
398
|
+
<!-- Campo de texto con botón de busqueda al lado -->
|
|
399
|
+
<prop name="NOMBRE" type="T" visible="1"
|
|
400
|
+
width="75%" title="Cliente:" />
|
|
401
|
+
<prop name="MAP_BT_BUSCAR" type="B" visible="1"
|
|
402
|
+
width="20%" lmargin="5%"
|
|
403
|
+
img="search.png" labelwidth="0"
|
|
404
|
+
newline="false" />
|
|
405
|
+
|
|
406
|
+
<!-- Tres campos numericos en una fila -->
|
|
407
|
+
<prop name="CANTIDAD" type="N2" visible="1" width="30%" title="Cant:" />
|
|
408
|
+
<prop name="PRECIO" type="N2" visible="1" width="30%" title="Precio:" newline="false" lmargin="2%" />
|
|
409
|
+
<prop name="TOTAL" type="N2" visible="1" width="30%" title="Total:" newline="false" lmargin="2%" locked="true" />
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
#### Reglas importantes
|
|
413
|
+
|
|
414
|
+
- Los anchos de los elementos en la misma fila **deben sumar 100%** (o menos, con márgenes). Si superan el 100% el último elemento se desborda a una nueva línea.
|
|
415
|
+
- Si se mezclan frames y props en la misma fila, todos deben llevar `newline="false"` salvo el primero.
|
|
416
|
+
- `newline` no tiene efecto en grupos fijos (`fixed="true"`) — su posición la controla `orientation`.
|
|
417
|
+
|
|
418
|
+
### 4.4 Atributos visuales
|
|
419
|
+
|
|
420
|
+
| Atributo | Tipo | Descripción | Ejemplo |
|
|
421
|
+
|----------|------|-------------|---------|
|
|
422
|
+
| `bgcolor` | color | Color de fondo | `bgcolor="#FFFFFF"` |
|
|
423
|
+
| `forecolor` | color | Color del borde (en combinacion con `framebox`) | `forecolor="#666666"` |
|
|
424
|
+
| `elevation` | integer | Elevacion / sombra (estilo Material Design) | `elevation="5"` |
|
|
425
|
+
| `border-corner-radius` | string | Radio de esquinas redondeadas | `border-corner-radius="10"` |
|
|
426
|
+
| `framebox` | boolean | Muestra un borde visible alrededor del frame | `framebox="true"` |
|
|
427
|
+
| `border` | boolean | Muestra el borde del frame | `border="true"` |
|
|
428
|
+
| `border-width` | integer | Ancho del borde en puntos | `border-width="2"` |
|
|
429
|
+
| `border-left` | boolean | Muestra solo el borde izquierdo | `border-left="false"` |
|
|
430
|
+
| `border-top` | boolean | Muestra solo el borde superior | `border-top="false"` |
|
|
431
|
+
| `border-right` | boolean | Muestra solo el borde derecho | `border-right="false"` |
|
|
432
|
+
| `border-bottom` | boolean | Muestra solo el borde inferior | `border-bottom="true"` |
|
|
433
|
+
| `imgbk` | string | Imagen de fondo del frame | `imgbk="background.png"` |
|
|
434
|
+
| `class` | string | Clase CSS para estilos reutilizables | `class="frameCard"` |
|
|
435
|
+
| `ignore-touch-on-transparent-area` | boolean | En frames flotantes, los toques sobre zonas transparentes no son capturados por el frame y pasan al elemento que hay detras | `ignore-touch-on-transparent-area="true"` |
|
|
436
|
+
|
|
437
|
+
Ejemplo de tarjeta con sombra:
|
|
438
|
+
|
|
439
|
+
```xml
|
|
440
|
+
<frame name="frmCard"
|
|
441
|
+
width="90%" lmargin="5%"
|
|
442
|
+
tmargin="15p"
|
|
443
|
+
bgcolor="#FFFFFF"
|
|
444
|
+
border-corner-radius="8"
|
|
445
|
+
elevation="3"
|
|
446
|
+
tpadding="15p" bpadding="15p"
|
|
447
|
+
lpadding="15p" rpadding="15p">
|
|
448
|
+
<prop name="TITULO" type="L" fontbold="true" fontsize="14" />
|
|
449
|
+
<prop name="DESCRIPCION" type="L" forecolor="#666666" />
|
|
450
|
+
</frame>
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### 4.5 Frames flotantes (floating, top, left)
|
|
454
|
+
|
|
455
|
+
Los frames flotantes se posicionan por encima del flujo normal, similar a `position: absolute` en CSS:
|
|
456
|
+
|
|
457
|
+
```xml
|
|
458
|
+
<frame name="frmOverlay"
|
|
459
|
+
floating="true"
|
|
460
|
+
left="10%"
|
|
461
|
+
top="100p"
|
|
462
|
+
width="80%"
|
|
463
|
+
height="300p"
|
|
464
|
+
bgcolor="#FFFFFF"
|
|
465
|
+
elevation="10"
|
|
466
|
+
disablevisible="MOSTRAR_OVERLAY=0">
|
|
467
|
+
<!-- Contenido del overlay -->
|
|
468
|
+
</frame>
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
Ejemplo real del wiki (botón flotante para scroll):
|
|
472
|
+
|
|
473
|
+
```xml
|
|
474
|
+
<frame name="frmblotante"
|
|
475
|
+
floating="true"
|
|
476
|
+
top="976p" left="650p"
|
|
477
|
+
width="64p" height="64p"
|
|
478
|
+
disablevisible="MAP_VALORVER=0">
|
|
479
|
+
<prop name="ICONOMAS" type="IMG"
|
|
480
|
+
path="##APP##\icons\arrow_down.png"
|
|
481
|
+
visible="1" width="64p" labelwidth="0" />
|
|
482
|
+
</frame>
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### 4.5b Bottom Sheet (panel deslizante inferior)
|
|
486
|
+
|
|
487
|
+
El Bottom Sheet es un panel que aparece deslizando desde la parte inferior de la pantalla. Se define con `behavior="bottom-sheet"` en un frame flotante.
|
|
488
|
+
|
|
489
|
+
```xml
|
|
490
|
+
<frame name="frmPanel" floating="true" left="0" behavior="bottom-sheet"
|
|
491
|
+
initial-state="collapsed" width="100%" height="50%">
|
|
492
|
+
<prop name="MAP_TL_TITULO" type="L" title="Opciones" labelwidth="0" width="100%"
|
|
493
|
+
height="96p" fontbold="true" />
|
|
494
|
+
<prop name="MAP_BT_OPCION1" type="B" title="Opción 1"
|
|
495
|
+
width="90%" height="124p" lmargin="5%" />
|
|
496
|
+
<prop name="MAP_BT_CERRAR" type="B" title="Cerrar"
|
|
497
|
+
width="90%" height="124p" lmargin="5%"
|
|
498
|
+
onclick="javascript:var w=ui.getView(self); w.setBottomSheetState('frmPanel','hidden');" />
|
|
499
|
+
</frame>
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
**Atributos del Bottom Sheet:**
|
|
503
|
+
|
|
504
|
+
| Atributo | Descripción |
|
|
505
|
+
|----------|-------------|
|
|
506
|
+
| `behavior` | Debe ser `"bottom-sheet"` para activar el panel deslizante |
|
|
507
|
+
| `initial-state` | Estado inicial al abrir la pantalla: `expanded`, `collapsed` o `hidden` |
|
|
508
|
+
| `floating` | Debe ser `"true"` |
|
|
509
|
+
| `left` | Posición horizontal. Normalmente `"0"` para ocupar todo el ancho |
|
|
510
|
+
| `width` | Ancho del panel. Normalmente `"100%"` |
|
|
511
|
+
| `height` | Alto máximo del panel cuando esta expandido |
|
|
512
|
+
|
|
513
|
+
**Estados disponibles para `initial-state` y `setBottomSheetState`:**
|
|
514
|
+
|
|
515
|
+
| Estado | Descripción |
|
|
516
|
+
|--------|-------------|
|
|
517
|
+
| `expanded` | Panel completamente visible al 100% de su alto |
|
|
518
|
+
| `collapsed` | Panel minimizado, mostrando solo una franja inferior |
|
|
519
|
+
| `hidden` | Panel completamente oculto |
|
|
520
|
+
|
|
521
|
+
**Control por JavaScript:**
|
|
522
|
+
|
|
523
|
+
```javascript
|
|
524
|
+
// Obtener la vista actual
|
|
525
|
+
var view = ui.getView(self);
|
|
526
|
+
// Expandir el panel
|
|
527
|
+
view.setBottomSheetState("frmPanel", "expanded");
|
|
528
|
+
// Colapsar
|
|
529
|
+
view.setBottomSheetState("frmPanel", "collapsed");
|
|
530
|
+
// Ocultar
|
|
531
|
+
view.setBottomSheetState("frmPanel", "hidden");
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### 4.6 Frames con scroll
|
|
535
|
+
|
|
536
|
+
```xml
|
|
537
|
+
<frame name="frmScrollable"
|
|
538
|
+
width="100%"
|
|
539
|
+
height="500p"
|
|
540
|
+
scroll="true">
|
|
541
|
+
<!-- Contenido que puede ser mas alto que 500p -->
|
|
542
|
+
<prop name="CAMPO1" type="T" title="Campo 1" />
|
|
543
|
+
<prop name="CAMPO2" type="T" title="Campo 2" />
|
|
544
|
+
<!-- ... mas campos ... -->
|
|
545
|
+
</frame>
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
El evento `onscroll` permite detectar cuando el usuario hace scroll:
|
|
549
|
+
|
|
550
|
+
```xml
|
|
551
|
+
<frame name="group3Frame" width="100%" height="1040p"
|
|
552
|
+
scroll="true"
|
|
553
|
+
onscroll="javascript:scrollArrow(e,'1');">
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
### 4.7 Frames clickeables (onclick)
|
|
557
|
+
|
|
558
|
+
Los frames pueden ser interactivos:
|
|
559
|
+
|
|
560
|
+
```xml
|
|
561
|
+
<frame name="frmItem"
|
|
562
|
+
width="100%"
|
|
563
|
+
height="100p"
|
|
564
|
+
bgcolor="#FAFAFA"
|
|
565
|
+
onclick="abrirDetalle(self);">
|
|
566
|
+
<prop name="TITULO" type="L" fontbold="true" />
|
|
567
|
+
<prop name="SUBTITULO" type="L" forecolor="#888888" />
|
|
568
|
+
</frame>
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### 4.8 Frames anidados para layouts complejos
|
|
572
|
+
|
|
573
|
+
La potencia de los frames viene de la anidacion. Este ejemplo del wiki muestra frames dentro de frames:
|
|
574
|
+
|
|
575
|
+
```xml
|
|
576
|
+
<frame name="bottomContainer" bgcolor="#5B8DDE"
|
|
577
|
+
width="100%" height="45%"
|
|
578
|
+
tmargin="10%" align="left|top">
|
|
579
|
+
<frame name="containedTop" bgcolor="#113163"
|
|
580
|
+
width="40%" height="30%"
|
|
581
|
+
align="center" lmargin="30%" tmargin="5%">
|
|
582
|
+
<prop name="text3" type="L" title="Arriba"
|
|
583
|
+
label-wrap="true" labelbox="false" align="center" />
|
|
584
|
+
</frame>
|
|
585
|
+
<frame name="containedBottom" bgcolor="#113163"
|
|
586
|
+
width="50%" height="20%"
|
|
587
|
+
align="center" lmargin="5%" tmargin="40%">
|
|
588
|
+
<prop name="text5" type="L" title="Abajo"
|
|
589
|
+
label-wrap="true" labelbox="false" align="center" />
|
|
590
|
+
</frame>
|
|
591
|
+
</frame>
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
### 4.9 Patron: Tarjeta (Card) con Material Design
|
|
595
|
+
|
|
596
|
+
```xml
|
|
597
|
+
<frame name="frmCard"
|
|
598
|
+
width="90%" lmargin="5%"
|
|
599
|
+
tmargin="15p"
|
|
600
|
+
bgcolor="#FFFFFF"
|
|
601
|
+
border-corner-radius="8"
|
|
602
|
+
elevation="3"
|
|
603
|
+
tpadding="15p" bpadding="15p"
|
|
604
|
+
lpadding="15p" rpadding="15p">
|
|
605
|
+
<prop name="TITULO" type="L" fontbold="true" fontsize="16" />
|
|
606
|
+
<prop name="DESCRIPCION" type="L" forecolor="#666666" fontsize="13" />
|
|
607
|
+
<prop name="BTN_VER" type="B" title="Ver mas"
|
|
608
|
+
width="100%" tmargin="10p" />
|
|
609
|
+
</frame>
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
### 4.10 Patron: Fila horizontal con columnas
|
|
613
|
+
|
|
614
|
+
Usa `newline="false"` para colocar frames uno al lado del otro:
|
|
615
|
+
|
|
616
|
+
```xml
|
|
617
|
+
<frame name="frmFila" width="100%" height="80p">
|
|
618
|
+
<frame name="frmCol1" width="50%" newline="false">
|
|
619
|
+
<prop name="CAMPO1" type="T" title="Columna 1" />
|
|
620
|
+
</frame>
|
|
621
|
+
<frame name="frmCol2" width="50%" newline="false">
|
|
622
|
+
<prop name="CAMPO2" type="T" title="Columna 2" />
|
|
623
|
+
</frame>
|
|
624
|
+
</frame>
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
### 4.11 Patron: Item de lista con icono y textos
|
|
628
|
+
|
|
629
|
+
```xml
|
|
630
|
+
<frame name="frmListItem" width="100%" height="80p" bgcolor="#FFFFFF">
|
|
631
|
+
<frame name="frmIcono" width="60p" height="60p"
|
|
632
|
+
newline="false" align="center">
|
|
633
|
+
<prop name="ICONO" type="IMG" width="40p" height="40p" />
|
|
634
|
+
</frame>
|
|
635
|
+
<frame name="frmTexto" width="-2" height="60p"
|
|
636
|
+
newline="false" lmargin="10p">
|
|
637
|
+
<prop name="TITULO" type="L" fontbold="true" />
|
|
638
|
+
<prop name="SUBTITULO" type="L" forecolor="#888888" fontsize="10" />
|
|
639
|
+
</frame>
|
|
640
|
+
</frame>
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
### 4.12 Buenas prácticas
|
|
644
|
+
|
|
645
|
+
> **REGLA CRITICA:** Un `<frame>` **solo se pinta si contiene al menos un `<prop>` visible**. Un frame vacio o con todos sus props ocultos (`visible="0"`) no ocupa espacio ni se renderiza. No usar frames como espaciadores ni como elementos decorativos vacios.
|
|
646
|
+
|
|
647
|
+
1. **Nombres con prefijo `frm`**: `frmHeader`, `frmBody`, `frmFooter`, `frmCard`.
|
|
648
|
+
2. **Siempre al menos un prop visible**: Todo frame que deba aparecer en pantalla debe contener al menos un `<prop>` con `visible` distinto de `0`.
|
|
649
|
+
3. **Porcentajes para responsive**: Usa `%` para anchos que se adapten a diferentes pantallas.
|
|
650
|
+
4. **`height="-2"` para contenido variable**: Evita alturas fijas cuando el contenido puede cambiar.
|
|
651
|
+
5. **`newline="false"` para filas**: Indispensable para colocar frames en horizontal.
|
|
652
|
+
6. **Evitar anidamiento excesivo**: Más de 4-5 niveles afecta al rendimiento.
|
|
653
|
+
7. **`elevation` para jerarquía visual**: Valores de 1 a 10 para sombras sutiles.
|
|
654
|
+
|
|
655
|
+
### 4.13 Errores comunes
|
|
656
|
+
|
|
657
|
+
| Error | Consecuencia | Solución |
|
|
658
|
+
|-------|-------------|----------|
|
|
659
|
+
| Frame sin props visibles dentro | El frame no se renderiza — no ocupa espacio ni se pinta | Asegurarse de que haya al menos un `<prop>` visible dentro del frame |
|
|
660
|
+
| Usar frame como espaciador vacio | No funciona — el frame no ocupa espacio si no tiene props visibles | Usar `tmargin`/`bmargin` en el prop anterior o un `<prop type="L" visible="1" height="20p">` como separador |
|
|
661
|
+
| Olvidar `newline="false"` | Los frames se apilan verticalmente | Anadir `newline="false"` al frame que va al lado |
|
|
662
|
+
| Altura fija con contenido variable | Contenido cortado o espacio vacio | Usar `height="-2"` |
|
|
663
|
+
| Anidamiento excesivo | Rendimiento degradado | Aplanar la estructura |
|
|
664
|
+
| `width` que suma más de 100% | Desbordamiento visual | Verificar que las columnas sumen 100% |
|
|
665
|
+
| `floating="true"` sin `top`/`left` | Posición impredecible | Siempre especificar posición |
|
|
666
|
+
|