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,668 @@
|
|
|
1
|
+
# XOne — Archivos de configuración: app.xml, app.ini y mappings.xne
|
|
2
|
+
|
|
3
|
+
> Fuente: `xone/v2/xone-help-docs/topics/01-xone-fundamentals.md` §4. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
|
|
4
|
+
|
|
5
|
+
Contenido: §4 configuración completa: atributos de app.xml (incluido compatibility-mode), app.ini y mappings.xne
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 4. Archivos de Configuración
|
|
10
|
+
|
|
11
|
+
### 4.1 app.xml
|
|
12
|
+
|
|
13
|
+
El archivo `app.xml` es el **punto de partida** de toda la configuración. Define como se comporta la aplicación, donde están sus recursos y cual es la pantalla inicial.
|
|
14
|
+
|
|
15
|
+
#### Estructura Completa
|
|
16
|
+
|
|
17
|
+
```xml
|
|
18
|
+
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
|
19
|
+
<xml>
|
|
20
|
+
<app
|
|
21
|
+
prefix="gen"
|
|
22
|
+
version="1.0.0"
|
|
23
|
+
debug="true"
|
|
24
|
+
autologon="false"
|
|
25
|
+
screen-orientation="portrait"
|
|
26
|
+
resolution-width="1080"
|
|
27
|
+
resolution-height="1920"
|
|
28
|
+
scale-fontsize="true"
|
|
29
|
+
android-font-factor="7"
|
|
30
|
+
ios-font-factor="8"
|
|
31
|
+
default-language="javascript">
|
|
32
|
+
|
|
33
|
+
<!-- Conexión a una base de datos alternativa. La base de datos principal NO necesita este nodo. -->
|
|
34
|
+
<connection name="other_db" connstring="bd/other_db.db" />
|
|
35
|
+
|
|
36
|
+
<!-- Primera pantalla que se abre al iniciar la app -->
|
|
37
|
+
<entry-point>
|
|
38
|
+
<item name="EntradaApp" conditions="" />
|
|
39
|
+
</entry-point>
|
|
40
|
+
|
|
41
|
+
<!-- Pantalla de login (opcional pero recomendada) -->
|
|
42
|
+
<login-coll>
|
|
43
|
+
<item name="Login" conditions="" />
|
|
44
|
+
</login-coll>
|
|
45
|
+
|
|
46
|
+
<!-- Archivos CSS -->
|
|
47
|
+
<style url="default.css" encoding="UTF-8" />
|
|
48
|
+
|
|
49
|
+
<!-- Archivos JavaScript -->
|
|
50
|
+
<include file="functions.js" language="javascript" encoding="UTF-8"/>
|
|
51
|
+
</app>
|
|
52
|
+
</xml>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
#### Atributos Explicados Linea por Linea
|
|
56
|
+
|
|
57
|
+
| Atributo | Valor | Explicacion |
|
|
58
|
+
|----------|-------|-------------|
|
|
59
|
+
| `prefix` | `"gen"` | Prefijo para las tablas en la BD. Las tablas se llamaran `gen_empresas`, `gen_usuarios`, etc. **Siempre usar "gen" por defecto** a menos que el usuario pida otro |
|
|
60
|
+
| `versión` | `"1.0.0"` | Versión semantica de la aplicación |
|
|
61
|
+
| `debug` | `"true"` / `"false"` | Activa mensajes de depuracion. Usar `"true"` en desarrollo, `"false"` en produccion |
|
|
62
|
+
| `autologon` | `"false"` | Si es `"true"`, salta la pantalla de login y entra directamente con el usuario `admin` sin password. **Solo para desarrollo/pruebas** |
|
|
63
|
+
| `screen-orientation` | `"portrait"` | Orientación forzada: `"portrait"` (vertical), `"landscape"` (horizontal), `"all"` (ambas) |
|
|
64
|
+
| `resolution-width` | dinámico | Ancho en pixeles del dispositivo físico de referencia. Ver sistema de escalado más abajo |
|
|
65
|
+
| `resolution-height` | dinámico | Alto en pixeles del dispositivo físico de referencia |
|
|
66
|
+
| `scale-fontsize` | `"true"` | Escala automáticamente las fuentes según la resolución del dispositivo |
|
|
67
|
+
| `android-font-factor` | `"7"` | Factor de ajuste de fuentes para Android |
|
|
68
|
+
| `ios-font-factor` | `"7"` | Factor de ajuste de fuentes para iOS |
|
|
69
|
+
| `default-language` | `"javascript"` | Lenguaje de scripting. Siempre `"javascript"` en proyectos modernos |
|
|
70
|
+
| `load-wait` | `"false"` | Si es `"true"`, muestra una pantalla de espera durante la carga inicial de la app |
|
|
71
|
+
| `compatibility-mode` | `"false"` | **CRÍTICO:** Si es `"true"`, desactiva completamente todos los estilos CSS |
|
|
72
|
+
| `companycolor` | — | Color corporativo general (menús, pestañas, selecciones donde no haya color específico) |
|
|
73
|
+
| `forecolor` | `"#FFFFFF"` | Color de texto general de la aplicación |
|
|
74
|
+
| `sql-profiler` | `"false"` | Registra las consultas SQL con tiempos de ejecución. **Desactivar en producción** |
|
|
75
|
+
| `load-imgbk` | — | Imagen de fondo del EditView (NO es el splash de carga; el splash se pone con un fichero `splash.png` en la raíz del proyecto) |
|
|
76
|
+
| `application-max-priority` | `"false"` | Marca la app como prioritaria para evitar que el SO la cierre en segundo plano |
|
|
77
|
+
| `application-notification-title` | — | Título de la notificación persistente de la app en Android |
|
|
78
|
+
| `application-notification-text` | — | Texto de la notificación persistente de la app en Android |
|
|
79
|
+
| `gps-service-notification-title` | — | Título de la notificación del servicio GPS en segundo plano |
|
|
80
|
+
| `gps-service-notification-text` | — | Texto de la notificación del servicio GPS en segundo plano |
|
|
81
|
+
| `secure-window` | `"false"` | Si es `"true"`, impide capturar pantalla (screenshot) |
|
|
82
|
+
| `replica-debug` | `"false"` | Loguea información de debug del proceso de réplica |
|
|
83
|
+
| `autologon-username` | `"admin"` | Usuario para el autologin (cuando `autologon="true"`) |
|
|
84
|
+
| `autologon-password` | — | Contraseña para el autologin |
|
|
85
|
+
|
|
86
|
+
> **Atributos que NO van en `<app>`:**
|
|
87
|
+
> - `fullscreen` — es atributo de `<coll>` (oculta barras de estado en una pantalla concreta).
|
|
88
|
+
> - `sql-debug` — es atributo de `<coll>` (loguea las SQL de esa colección).
|
|
89
|
+
|
|
90
|
+
#### Atributo `conditions` en los subnodos `<style>`, `<entry-point>` y `<login-coll>`
|
|
91
|
+
|
|
92
|
+
El atributo `conditions` permite que un subnodo se aplique solo cuando se cumple una condición de plataforma, tamaño de pantalla u orientación. Formato: `PLATAFORMA:TAMANO:ORIENTACION` — solo se especifican las partes necesarias.
|
|
93
|
+
|
|
94
|
+
| Parte | Valores posibles |
|
|
95
|
+
|-------|-----------------|
|
|
96
|
+
| Plataforma | `android`, `ios`, `wm` (Windows Mobile), `bb` (BlackBerry), `wp` (Windows Phone) |
|
|
97
|
+
| Tamaño | `phone` (móvil estándar), `tablet`, `mini` (Android < 3.5"), `hiphone` (Android 4.5"–7") |
|
|
98
|
+
| Orientación | `vertical`, `horizontal` |
|
|
99
|
+
|
|
100
|
+
```xml
|
|
101
|
+
<!-- Base: se aplica siempre -->
|
|
102
|
+
<style url="default.css" strict-mode="true" />
|
|
103
|
+
<!-- Solo en movil orientacion horizontal -->
|
|
104
|
+
<style url="default_hor.css" conditions="phone:horizontal" strict-mode="true" />
|
|
105
|
+
<!-- Solo en iOS -->
|
|
106
|
+
<style url="default-ios.css" conditions="ios" strict-mode="true" />
|
|
107
|
+
<!-- Solo en tablet vertical -->
|
|
108
|
+
<style url="default_tablet.css" conditions="tablet:vertical" strict-mode="true" />
|
|
109
|
+
<!-- Solo en iPhone -->
|
|
110
|
+
<style url="default_iphone.css" conditions="ios:phone" strict-mode="true" />
|
|
111
|
+
|
|
112
|
+
<!-- Entry point distinto según dispositivo -->
|
|
113
|
+
<entry-point>
|
|
114
|
+
<item name="EntradaApp" conditions="" />
|
|
115
|
+
<item name="EntradaAppTablet" conditions="tablet:horizontal" />
|
|
116
|
+
</entry-point>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
> **Regla:** El fichero `default.css` (sin `conditions`) se aplica **siempre** como base. Los demas CSS con `conditions` se aplican adicionalmente cuando se cumple la condición, sobreescribiendo los estilos base donde haya conflicto.
|
|
120
|
+
|
|
121
|
+
#### Que es `<entry-point>`
|
|
122
|
+
|
|
123
|
+
El nodo `<entry-point>` le indica a XOne **cual es la primera coleccion que debe abrirse** cuando el usuario entra en la app. Se ejecuta justo después del login (o directamente al arrancar si `autologon="true"`).
|
|
124
|
+
|
|
125
|
+
La colección apuntada por `<entry-point>` es siempre `special="true"` — no tiene tabla en BD. Puede ser una pantalla de bienvenida, un dashboard, un menú principal, etc. El nombre más habitual es `EntradaApp`. (No confundir con el splash: el splash es un fichero `splash.png` en la raíz, no una `<coll>`.)
|
|
126
|
+
|
|
127
|
+
```xml
|
|
128
|
+
<!-- Entry-point simple -->
|
|
129
|
+
<entry-point>
|
|
130
|
+
<item name="EntradaApp" conditions="" />
|
|
131
|
+
</entry-point>
|
|
132
|
+
|
|
133
|
+
<!-- Entry-point con coleccion distinta según dispositivo -->
|
|
134
|
+
<entry-point>
|
|
135
|
+
<item name="EntradaApp" conditions="" />
|
|
136
|
+
<item name="EntradaAppTablet" conditions="tablet:horizontal" />
|
|
137
|
+
</entry-point>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
> **Convencion:** Usar `EntradaApp` como nombre por defecto. Solo cambiar si la app arranca directamente en el menu principal (`MenuPrincipal`) sin pantalla de bienvenida.
|
|
141
|
+
|
|
142
|
+
#### Que es `<login-coll>`
|
|
143
|
+
|
|
144
|
+
El nodo `<login-coll>` le indica a XOne **cual es la coleccion que gestiona el proceso de autenticación**. XOne muestra esta coleccion **antes** del `<entry-point>`, y solo pasa al entry-point cuando el login es correcto.
|
|
145
|
+
|
|
146
|
+
La coleccion de login es siempre `special="true"`. Contiene el formulario de usuario y contrasena, y la lógica JavaScript que valida las credenciales.
|
|
147
|
+
|
|
148
|
+
```xml
|
|
149
|
+
<login-coll>
|
|
150
|
+
<item name="LoginColl" conditions="" />
|
|
151
|
+
</login-coll>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Flujo de arranque completo:**
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
[Arranque]
|
|
158
|
+
|
|
|
159
|
+
v
|
|
160
|
+
autologon="true"? ── SI ──> [entry-point] ──> App lista
|
|
161
|
+
|
|
|
162
|
+
NO
|
|
163
|
+
|
|
|
164
|
+
v
|
|
165
|
+
[login-coll] → usuario introduce usuario y contraseña
|
|
166
|
+
|
|
|
167
|
+
v
|
|
168
|
+
credenciales OK? ── SI ──> [entry-point] ──> App lista
|
|
169
|
+
|
|
|
170
|
+
NO
|
|
171
|
+
|
|
|
172
|
+
v
|
|
173
|
+
[login-coll] ← vuelve al login con mensaje de error
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
> **IMPORTANTE:** Si `autologon="false"` y no se define `<login-coll>`, XOne usa su pantalla de login interna por defecto, que no es personalizable. En apps de produccion **siempre** definir `<login-coll>` con una coleccion propia.
|
|
177
|
+
|
|
178
|
+
#### Pantalla de splash
|
|
179
|
+
|
|
180
|
+
El splash que se muestra durante la carga inicial de la app **NO es una `<coll>` XML** — es un fichero estático en la raíz del proyecto que el framework carga automáticamente desde `LoadAppActivity`.
|
|
181
|
+
|
|
182
|
+
**Convención:** poner un fichero `splash.png` en la carpeta raíz del proyecto.
|
|
183
|
+
|
|
184
|
+
El framework busca los siguientes ficheros, en este orden, y usa el primero que encuentre:
|
|
185
|
+
|
|
186
|
+
| Tipo | Ficheros (raíz del proyecto, por orden de prioridad) |
|
|
187
|
+
|------|------------------------------------------------------|
|
|
188
|
+
| Vídeo | `splash.3gp`, `splash.mp4` |
|
|
189
|
+
| Imagen | `splash.jpg`, `splash.png`, `splash.gif`, `splash.bmp`, `splash.webp`, `splash.apng` |
|
|
190
|
+
|
|
191
|
+
- Si no se encuentra ninguno, el framework usa una imagen de splash interna por defecto.
|
|
192
|
+
- Para vídeos (`.3gp` / `.mp4`), `LoadAppActivity` añade un botón "Saltar" automáticamente y oculta la barra de progreso y el mensaje.
|
|
193
|
+
- Para imágenes animadas: `.gif` se carga con `GifDrawable`; `.webp` animado se reproduce automáticamente en Android 9+ (`AnimatedImageDrawable`); `.apng` se decodifica con `PngReadHelper`.
|
|
194
|
+
- El ancho de la imagen se ajusta al 100% del ancho de la pantalla manteniendo el ratio.
|
|
195
|
+
|
|
196
|
+
**No confundir** con:
|
|
197
|
+
- `load-imgbk` en `<app>`: imagen de fondo del EditView (NO el splash).
|
|
198
|
+
- `EntradaApp.xne`: pantalla post-login que se abre tras autenticarse (NO el splash).
|
|
199
|
+
|
|
200
|
+
#### Leer y escribir los contactos del teléfono
|
|
201
|
+
|
|
202
|
+
XOne expone la agenda de contactos del dispositivo como una **fuente de datos consultable con SQL**, a través de un proveedor de datos especial. No hay que importar nada: el proveedor forma parte del framework. Se usa en tres pasos.
|
|
203
|
+
|
|
204
|
+
**1. Declarar la conexión** en el nodo `<app>` (en `app.xml`):
|
|
205
|
+
|
|
206
|
+
```xml
|
|
207
|
+
<connection name="ContactsConnection"
|
|
208
|
+
connstring="Provider=Xone Remote Provider;ProgID=com.xone.db.impl.contacts.ContactsConnection" />
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**2. Pedir el permiso** de contactos (en el nodo `<permissions>` de `app.xml`):
|
|
212
|
+
|
|
213
|
+
```xml
|
|
214
|
+
<permission name="contacts" />
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**3. Crear una colección** que use esa conexión. La "tabla" se llama `Contacts`:
|
|
218
|
+
|
|
219
|
+
```xml
|
|
220
|
+
<coll name="Contacts"
|
|
221
|
+
sql="SELECT id,name,email,phone,photo,photo_thumbnail FROM Contacts"
|
|
222
|
+
connection="ContactsConnection"
|
|
223
|
+
idfieldname="id" stringkey="true"
|
|
224
|
+
check-owner="false" dependent="false"
|
|
225
|
+
show-toolbar="false" notab="true"
|
|
226
|
+
onback="ui.getView(e.objItem).exit();">
|
|
227
|
+
<group name="General" id="1">
|
|
228
|
+
<prop visible="7" name="id" type="T" title="ID" width="100%" labelbox="false" text-border="false" />
|
|
229
|
+
<prop visible="7" name="name" type="T" title="Name" width="100%" labelbox="false" text-border="false" />
|
|
230
|
+
<prop visible="7" name="email" type="T" title="Email" width="100%" labelbox="false" text-border="false" />
|
|
231
|
+
<prop visible="7" name="phone" type="T" title="Phone" width="100%" labelbox="false" text-border="false" />
|
|
232
|
+
<prop visible="7" name="photo" type="IMG" title="Photo" width="100%" height="35%" keep-aspect-ratio="true" />
|
|
233
|
+
<prop visible="7" name="photo_thumbnail" type="IMG" title="Photo thumbnail" width="100%" height="35%" keep-aspect-ratio="true" />
|
|
234
|
+
</group>
|
|
235
|
+
</coll>
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Campos disponibles en el SELECT** (tabla `Contacts`):
|
|
239
|
+
|
|
240
|
+
| Campo | Tipo prop | Contenido |
|
|
241
|
+
|-------|-----------|-----------|
|
|
242
|
+
| `id` | `T` | Identificador del contacto. Es la clave de la coll (`idfieldname="id"` + `stringkey="true"`). |
|
|
243
|
+
| `name` | `T` | Nombre a mostrar del contacto. |
|
|
244
|
+
| `email` | `T` | Primer email del contacto. |
|
|
245
|
+
| `phone` | `T` | Primer teléfono del contacto (vacío si el contacto no tiene ninguno). |
|
|
246
|
+
| `photo` | `IMG` | Foto en alta resolución. El proveedor la vuelca a un fichero en la carpeta `files` del proyecto y devuelve el nombre del fichero; por eso se mapea a `type="IMG"`. |
|
|
247
|
+
| `photo_thumbnail` | `IMG` | Miniatura de la foto, con el mismo mecanismo. |
|
|
248
|
+
|
|
249
|
+
**Notas de la fuente de contactos:**
|
|
250
|
+
|
|
251
|
+
- La consulta devuelve **como máximo 100 contactos**. Usa `WHERE` (filtro) y `ORDER BY` (orden) en el SQL para acotar y ordenar el resultado; los nombres de campo del filtro y el orden son los mismos de la tabla (`name`, `phone`, etc.).
|
|
252
|
+
- El SELECT debe incluir al menos uno de los campos anteriores; en caso contrario no devuelve resultados.
|
|
253
|
+
- **Alta y modificación:** un `INSERT`/`UPDATE` sobre `Contacts` crea o actualiza un contacto en la agenda del dispositivo. Además de `name`, `phone` y `email`, al escribir se aceptan `landlinephone` (teléfono fijo), `workphone` (teléfono de trabajo), `company` (empresa) y `job` (puesto). El **borrado de contactos no está soportado**.
|
|
254
|
+
|
|
255
|
+
#### Conexiones remotas: los `ProgID` que el framework trae de fábrica
|
|
256
|
+
|
|
257
|
+
Una `<connection>` con `Provider=Xone Remote Provider` y un `ProgID` conecta la app a una
|
|
258
|
+
fuente que **no es una base de datos local**, y las colls la consultan **con SQL normal**: basta
|
|
259
|
+
`connection="<nombre>"` en la coll. La lista completa la decide el runtime
|
|
260
|
+
(`CXoneApplication::CreateRemoteDataConnector`), y son éstos:
|
|
261
|
+
|
|
262
|
+
| `ProgID` | Qué conecta |
|
|
263
|
+
|---|---|
|
|
264
|
+
| `com.xone.db.json.JSONConnection` | una **API JSON** por HTTP |
|
|
265
|
+
| `com.xone.db.soa.SOAConnection` | un servicio **SOAP** |
|
|
266
|
+
| `com.xone.db.impl.xmlrpc.XMLRPCConnection` | un servicio **XML-RPC** |
|
|
267
|
+
| `com.xone.db.impl.contacts.ContactsConnection` | la **agenda de contactos** del dispositivo |
|
|
268
|
+
| `com.xone.db.impl.replicafiles.RplFilesConnection` | **réplica de ficheros** (solo Android) |
|
|
269
|
+
| `cgsproxy.cproxy` · `cgsrss.cproxy` | proxy HTTP genérico · proxy RSS (heredados) |
|
|
270
|
+
|
|
271
|
+
Un `ProgID` que no esté en esa lista **no crea conexión**: el runtime devuelve `NULL` y la
|
|
272
|
+
conexión no existe. No los inventes.
|
|
273
|
+
|
|
274
|
+
##### La conexión JSON, entera
|
|
275
|
+
|
|
276
|
+
Es la que se usa para hablar con una API propia sin escribir un `addItem` a mano por cada
|
|
277
|
+
registro. La coll declara su `sql` como si la API fuera una tabla, y el proveedor la traduce.
|
|
278
|
+
|
|
279
|
+
**Declarada en `app.xml`**, para toda la app:
|
|
280
|
+
|
|
281
|
+
```xml
|
|
282
|
+
<connection name="DatosOnline" datemask="ymd"
|
|
283
|
+
connstring="Provider=Xone Remote Provider;Data Source=https://api.ejemplo.com/endpoint;ProgID=com.xone.db.json.JSONConnection;Content-Type=application/json;Timeout=15;Security Level=2;Auth=true;LoginCall=true;JWTCall=true;Remote Broker=false;" />
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**O dentro de la propia `.xne`**, si solo la usa esa coll — el nodo `<connection>` vale también
|
|
287
|
+
ahí, y es lo que conviene cuando la fuente es de una pantalla y no del proyecto:
|
|
288
|
+
|
|
289
|
+
```xml
|
|
290
|
+
<coll name="Pedidos" objname="Pedidos" updateobj="Pedidos"
|
|
291
|
+
progid="ASData.CASBasicDataObj" connection="json" loadall="false">
|
|
292
|
+
<connection name="json" datemask="ymd"
|
|
293
|
+
connstring="Provider=Xone Remote Provider;Data Source=http://servidor/json/default.aspx;ProgID=com.xone.db.json.JSONConnection;Timeout=60;Security Level=0" />
|
|
294
|
+
<group name="General" id="1">
|
|
295
|
+
<prop name="CLIENTE" type="T" visible="7" />
|
|
296
|
+
<prop name="TOTAL" type="N" visible="7" />
|
|
297
|
+
</group>
|
|
298
|
+
</coll>
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**Los parámetros del `connstring`**, tal como los lee el runtime
|
|
302
|
+
(`CXoneJsonConnectionData`). Los que no aparecen se quedan en su valor por defecto:
|
|
303
|
+
|
|
304
|
+
| Parámetro | Qué hace |
|
|
305
|
+
|---|---|
|
|
306
|
+
| `Data Source` | la **URL** del endpoint |
|
|
307
|
+
| `Timeout` | segundos de espera; entero |
|
|
308
|
+
| `Security Level` | nivel de seguridad del canal; entero (`0` en los ejemplos abiertos, `2` con autenticación) |
|
|
309
|
+
| `Content-Type` | cabecera de la petición, p. ej. `application/json` |
|
|
310
|
+
| `HttpMethod` | método HTTP a usar |
|
|
311
|
+
| `Auth` | `true`/`false` — la conexión autentica |
|
|
312
|
+
| `LoginCall` | `true`/`false` — hace la llamada de login |
|
|
313
|
+
| `JWTCall` | `true`/`false` — el token viaja como JWT |
|
|
314
|
+
| `User Id` / `Password` | credenciales (alias equivalentes: `xoneuser` / `xonepass`) |
|
|
315
|
+
| `Remote Broker` | `true`/`false` — habla contra el broker remoto |
|
|
316
|
+
| `Remote Mapped` | URL alternativa del broker mapeado |
|
|
317
|
+
| `postencode` | `true`/`false` — codifica el cuerpo del POST |
|
|
318
|
+
| `sqlquery` | `false` desactiva el modo de consulta SQL |
|
|
319
|
+
| `AllowUnsafeCertificates` | `true` acepta certificados no válidos. **En producción, `false`** |
|
|
320
|
+
| `EnableCertificatePinning` | `true` activa pinning de certificado |
|
|
321
|
+
| `LocalCertificatePath` | ruta del certificado local para el pinning |
|
|
322
|
+
|
|
323
|
+
**Nunca dejes credenciales escritas en el `connstring` de un proyecto que se entrega**, ni
|
|
324
|
+
`AllowUnsafeCertificates=true`: las dos cosas viajan en claro dentro del `.xne` o del `app.xml`.
|
|
325
|
+
|
|
326
|
+
#### Sistema de Escalado, Resoluciones y Tamaños de UI
|
|
327
|
+
|
|
328
|
+
**Como funciona `resolution-width` y `resolution-height`**
|
|
329
|
+
|
|
330
|
+
Estos atributos definen la resolución del dispositivo físico con el que se diseña y prueba la app. No son valores fijos — deben coincidir exactamente con la resolución real del dispositivo de referencia usado en el desarrollo.
|
|
331
|
+
|
|
332
|
+
Cuando la app se ejecuta en un dispositivo con distinta resolución, XOne escala automáticamente todos los tamaños con esta formula:
|
|
333
|
+
|
|
334
|
+
```
|
|
335
|
+
tamaño_real_px = valor_p × (resolucion_real_dispositivo / resolution-width)
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Valores típicos según dispositivo de referencia:**
|
|
339
|
+
|
|
340
|
+
| Dispositivo de referencia | `resolution-width` | `resolution-height` |
|
|
341
|
+
|--------------------------|-------------------|---------------------|
|
|
342
|
+
| HDPI Compact | `"480"` | `"800"` |
|
|
343
|
+
| XHDPI Standard | `"720"` | `"1280"` |
|
|
344
|
+
| XXHDPI Classic (emulador XOneStudio por defecto) | `"1080"` | `"1920"` |
|
|
345
|
+
| Dispositivo típico actual | `"1080"` | `"1920"` |
|
|
346
|
+
| XXXHDPI Premium | `"1440"` | `"2560"` |
|
|
347
|
+
|
|
348
|
+
> **CRITICO:** Si `resolution-width` no coincide con la resolución del dispositivo con el que se diseña, todos los elementos quedaran desproporcionados. El emulador de XOneStudio usa `1080x1920` por defecto — si el dispositivo físico real es distinto (por ejemplo `1080x2220`), hay que cambiar estos valores en `app.xml`.
|
|
349
|
+
|
|
350
|
+
**La unidad `p` (pixel en el dispositivo de referencia)**
|
|
351
|
+
|
|
352
|
+
Todas las dimensiones en XOne se expresan en `p`. En el dispositivo de referencia (`resolution-width` × `resolution-height`) **`1p = 1px` real**. En cualquier otro dispositivo XOne aplica el escalado automáticamente con la fórmula del bloque anterior.
|
|
353
|
+
|
|
354
|
+
> **CRÍTICO: `p` ≠ Material `dp`.** Es un error común — y conduce a barras/botones ~3× más pequeños de lo necesario en 1080×1920. Material `56dp` (toolbar estándar) **NO** es `56p`: en xxhdpi (1080×1920, density 3×) son **~168p** (workflow estándar: 164p). Si vienes de Material Design, multiplica los `dp` por **~3** para obtener el valor `p` correcto en 1080×1920.
|
|
355
|
+
|
|
356
|
+
```xml
|
|
357
|
+
<!-- Correcto: siempre usar p o % -->
|
|
358
|
+
<frame name="frmTopBar" width="100%" height="164p" />
|
|
359
|
+
<prop name="MAP_BTN" width="60%" height="124p" />
|
|
360
|
+
|
|
361
|
+
<!-- Incorrecto: NUNCA usar px, em, rem, dp. Tampoco asumir que p = Material dp -->
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
**Tabla de tamaños estándar** (para `resolution-width="1080"` / `resolution-height="1920"`)
|
|
365
|
+
|
|
366
|
+
Los siguientes valores funcionan correctamente en proyectos reales diseñados para este dispositivo. Si se usa otra resolución de referencia, escalar proporcionalmente con la formula.
|
|
367
|
+
|
|
368
|
+
| Elemento | `height` | `width` | Notas |
|
|
369
|
+
|----------|----------|---------|-------|
|
|
370
|
+
| TopBar / BottomBar | `164p` | `100%` | Barra de título superior o inferior |
|
|
371
|
+
| Header fijo completo (topBar + tabs) | `404p` | `100%` | Topbar + barra de estado + pestañas |
|
|
372
|
+
| Botón de acción principal (pill) | `124p` | `43–60%` | "Aceptar", "Guardar", "Iniciar viaje" |
|
|
373
|
+
| Botón principal ancho completo | `124p` | `92%` | Botón único centrado en footer |
|
|
374
|
+
| Botón de pestaña / tab | `144p` | `33–50%` | Pestañas tipo "Activa", "Mis OTs" |
|
|
375
|
+
| Campo de texto editable `type="T"` | `144p` | `80–92%` | Campos de formulario estándar |
|
|
376
|
+
| Label `type="L"` estándar | `96p` | `100%` | Etiquetas de sección |
|
|
377
|
+
| Icono de navegación `type="B"` | `104p` | `104p` | Botones con icono cuadrado en topbar |
|
|
378
|
+
| Icono de acción grande | `150p` | `150p` | Camara, galería, adjuntar |
|
|
379
|
+
| Modal / popup | `-2` (alto dinámico) | `840p` | Dialogo centrado (~78% del ancho) |
|
|
380
|
+
| Separador fino | `4p` | `100%` | Linea divisoria entre secciones |
|
|
381
|
+
| Separador medio | `8p` | `100%` | Indicador de pestaña activa |
|
|
382
|
+
| Margen entre elementos `tmargin` | `30p` | — | Espacio entre elementos del mismo bloque |
|
|
383
|
+
| Margen entre bloques `tmargin` | `50p` | — | Espacio entre secciones distintas |
|
|
384
|
+
| Margen lateral contenido `lmargin` | `50p` | — | Sangria del contenido respecto al borde |
|
|
385
|
+
|
|
386
|
+
**Sistema de fuentes**
|
|
387
|
+
|
|
388
|
+
El tamaño de fuente se controla con `fontsize` en el prop, o idealmente via clases CSS para reutilizarlo en todo el proyecto. El nombre de la fuente puede ser cualquier tipografía incluida en el proyecto (`Roboto`, `OpenSans`, etc.) — el fichero `.ttf` o `.otf` debe estar en la carpeta `fonts/` del proyecto.
|
|
389
|
+
|
|
390
|
+
```css
|
|
391
|
+
/* Definición en CSS — lo mas recomendable */
|
|
392
|
+
.font5 { fontsize: 5; text-fontsize: 5; labelfontsize: 5; label-fontsize: 5; }
|
|
393
|
+
.font7 { fontsize: 7; text-fontsize: 7; labelfontsize: 7; label-fontsize: 7; }
|
|
394
|
+
.font10 { fontsize: 10; text-fontsize: 10; labelfontsize: 10; label-fontsize: 10; }
|
|
395
|
+
.font-bold { fontname: Roboto-Bold; }
|
|
396
|
+
.font-regular { fontname: Roboto-Regular; }
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
```xml
|
|
400
|
+
<!-- Uso en el prop via clase CSS — recomendado -->
|
|
401
|
+
<prop name="MAP_TITULO" type="L" class="font7 font-bold" />
|
|
402
|
+
|
|
403
|
+
<!-- También valido: fontsize directamente en el prop -->
|
|
404
|
+
<prop name="MAP_TITULO" type="L" fontsize="7" />
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
| Rango | Uso típico |
|
|
408
|
+
|-------|------------|
|
|
409
|
+
| `fontsize` 1–2 | Textos mínimos, contadores, notas |
|
|
410
|
+
| `fontsize` 3–4 | Textos secundarios, metadatos, fechas |
|
|
411
|
+
| `fontsize` 5 | Texto estándar de campos y labels — **el más usado** |
|
|
412
|
+
| `fontsize` 6–7 | Títulos de sección, pestañas, números destacados |
|
|
413
|
+
| `fontsize` 8–9 | Títulos de tarjeta, subtítulos de pantalla |
|
|
414
|
+
| `fontsize` 10–11 | Títulos de topbar, cabeceras de modal |
|
|
415
|
+
| `fontsize` 12 | Títulos grandes, nombre de la app |
|
|
416
|
+
|
|
417
|
+
#### Ejemplo Real: Proyecto UseCars
|
|
418
|
+
|
|
419
|
+
Este es el `app.xml` del proyecto de ejemplo UseCars (tipo Uber):
|
|
420
|
+
|
|
421
|
+
```xml
|
|
422
|
+
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
|
423
|
+
<xml>
|
|
424
|
+
<app
|
|
425
|
+
prefix="gen"
|
|
426
|
+
version="1.0.0"
|
|
427
|
+
debug="true"
|
|
428
|
+
autologon="false"
|
|
429
|
+
screen-orientation="portrait"
|
|
430
|
+
resolution-width="1080"
|
|
431
|
+
resolution-height="1920"
|
|
432
|
+
scale-fontsize="true"
|
|
433
|
+
android-font-factor="7"
|
|
434
|
+
ios-font-factor="8"
|
|
435
|
+
default-language="javascript"
|
|
436
|
+
application-notification-title="UseCars"
|
|
437
|
+
application-max-priority="true">
|
|
438
|
+
|
|
439
|
+
<entry-point>
|
|
440
|
+
<item name="EntradaApp" conditions="" />
|
|
441
|
+
</entry-point>
|
|
442
|
+
|
|
443
|
+
<login-coll>
|
|
444
|
+
<item name="Login" conditions="" />
|
|
445
|
+
</login-coll>
|
|
446
|
+
|
|
447
|
+
<!-- Se pueden incluir multiples archivos CSS -->
|
|
448
|
+
<style url="default.css" encoding="UTF-8" />
|
|
449
|
+
<style url="colors.css" encoding="UTF-8" />
|
|
450
|
+
|
|
451
|
+
<!-- Se pueden incluir multiples archivos JS -->
|
|
452
|
+
<include file="functions.js" language="javascript" encoding="UTF-8"/>
|
|
453
|
+
<include file="viajes.js" language="javascript" encoding="UTF-8"/>
|
|
454
|
+
<include file="ubicacion.js" language="javascript" encoding="UTF-8"/>
|
|
455
|
+
</app>
|
|
456
|
+
</xml>
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
> **Tip:** Puedes incluir multiples archivos CSS y JS. Es una buena práctica separar estilos por tema (colores, layout) y scripts por funcionalidad (login, negocio, utilidades).
|
|
460
|
+
|
|
461
|
+
### 4.2 app.ini
|
|
462
|
+
|
|
463
|
+
El archivo `app.ini` contiene los metadatos básicos de la aplicación en formato INI (clave=valor). Es más simple que `app.xml` pero igualmente necesario.
|
|
464
|
+
|
|
465
|
+
```ini
|
|
466
|
+
Name=MiProyecto
|
|
467
|
+
Title=Mi Proyecto XOne
|
|
468
|
+
Caption=Descripción corta de la aplicacion
|
|
469
|
+
Icon=app_icon.png
|
|
470
|
+
IconFolder=icons
|
|
471
|
+
FilesFolder=files
|
|
472
|
+
HideSplash=false
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
#### Campos Explicados
|
|
476
|
+
|
|
477
|
+
| Campo | Descripción | Obligatorio |
|
|
478
|
+
|-------|-------------|-------------|
|
|
479
|
+
| `Name` | Nombre interno del proyecto (sin espacios ni caracteres especiales) | Si |
|
|
480
|
+
| `Title` | Título visible de la aplicación | Recomendado |
|
|
481
|
+
| `Caption` | Subtítulo o descripción corta | Opcional |
|
|
482
|
+
| `Icon` | Nombre del archivo del icono de la app (debe estar en `icons/`) | Recomendado |
|
|
483
|
+
| `IconFolder` | Carpeta de iconos. **Siempre `icons`** | Si |
|
|
484
|
+
| `FilesFolder` | Carpeta de archivos dinámicos. **Siempre `files`** | Si |
|
|
485
|
+
| `HideSplash` | Si es `true`, no muestra la pantalla de carga | Opcional |
|
|
486
|
+
|
|
487
|
+
#### Ejemplo Real: Proyecto UseCars
|
|
488
|
+
|
|
489
|
+
```ini
|
|
490
|
+
Name=UseCars
|
|
491
|
+
Title=UseCars
|
|
492
|
+
Caption=Tu viaje, a un toque de distancia
|
|
493
|
+
Icon=app_icon.png
|
|
494
|
+
IconFolder=icons
|
|
495
|
+
FilesFolder=files
|
|
496
|
+
HideSplash=false
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### 4.3 mappings.xne
|
|
500
|
+
|
|
501
|
+
El archivo `mappings.xne` es uno de los más importantes y, al mismo tiempo, uno de los que más errores genera en principiantes. Su proposito es **definir exclusivamente las colecciones base del sistema**: `Empresas` y `Usuarios`.
|
|
502
|
+
|
|
503
|
+
#### Regla Fundamental
|
|
504
|
+
|
|
505
|
+
> **IMPORTANTE:** El archivo `mappings.xne` SOLO debe contener las colecciones `Empresas` y `Usuarios`. NUNCA pongas otras colecciones aquí. Las colecciones adicionales (Productos, Pedidos, Tareas, etc.) van en archivos `.xne` separados.
|
|
506
|
+
|
|
507
|
+
#### Por que solo Empresas y Usuarios?
|
|
508
|
+
|
|
509
|
+
Estas dos colecciones son especiales porque:
|
|
510
|
+
- Son necesarias para el sistema de autenticación y login
|
|
511
|
+
- Son requeridas por el motor de sincronización/replica
|
|
512
|
+
- El framework las busca automáticamente en `mappings.xne`
|
|
513
|
+
- Definen la estructura organizativa básica (empresa -> usuarios)
|
|
514
|
+
|
|
515
|
+
#### Campos Obligatorios
|
|
516
|
+
|
|
517
|
+
**Coleccion Empresas:**
|
|
518
|
+
|
|
519
|
+
| Campo | Tipo | Visible | Descripción |
|
|
520
|
+
|-------|------|---------|-------------|
|
|
521
|
+
| `CODIGO` | `N` | `7` | Identificador numérico de la empresa |
|
|
522
|
+
| `NOMBRE` | `T` | `7` | Nombre de la empresa (fieldsize="150") |
|
|
523
|
+
|
|
524
|
+
**Coleccion Usuarios:**
|
|
525
|
+
|
|
526
|
+
| Campo | Tipo | Visible | Descripción |
|
|
527
|
+
|-------|------|---------|---------------------------------------------------------------------------------------------------------------------------|
|
|
528
|
+
| `CODIGO` | `N` | `7` | Identificador numérico del usuario |
|
|
529
|
+
| `NOMBRE` | `T` | `7` | Nombre del usuario (fieldsize="100") |
|
|
530
|
+
| `IDEMPRESA` | `N` | `7` | Relación con la empresa (mapcol="Empresas") |
|
|
531
|
+
| `LOGIN` | `T` | `7` | Nombre de usuario para login (fieldsize="50") |
|
|
532
|
+
| `PWD` | `X` | `0` | Contrasena (tipo X = enmascarado, fieldsize="100"). El nombre del campo DEBE ser `PWD` — El framework lo lee literalmente |
|
|
533
|
+
|
|
534
|
+
> **No hace falta declarar `ID` ni `ROWID` como `<prop>`** (ni aquí ni en ninguna coll): son columnas de plataforma que XOne gestiona automáticamente — el `ID` es la clave autonumérica y el `ROWID` el GUID de 32 hex de sincronización que el framework autogenera en cada alta. Declararlas es válido pero redundante (mejor omitirlas por limpieza). En el `sql=` de la coll, el `ID` sí se rescata en el SELECT; el `ROWID` no es necesario.
|
|
535
|
+
|
|
536
|
+
#### Ejemplo Completo con Explicaciones
|
|
537
|
+
|
|
538
|
+
```xml
|
|
539
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
540
|
+
<xml>
|
|
541
|
+
<!--
|
|
542
|
+
Cabecera del mappings.xne
|
|
543
|
+
El atributo prefix DEBE coincidir con el de app.xml
|
|
544
|
+
-->
|
|
545
|
+
<app prefix="gen" version="1.0.0" debug="true" default-language="javascript">
|
|
546
|
+
<style url="default.css" />
|
|
547
|
+
</app>
|
|
548
|
+
|
|
549
|
+
<!--
|
|
550
|
+
collprops type="general" envuelve todas las colecciones
|
|
551
|
+
definidas en este archivo
|
|
552
|
+
-->
|
|
553
|
+
<collprops type="general">
|
|
554
|
+
|
|
555
|
+
<!--
|
|
556
|
+
COLECCION: Empresas
|
|
557
|
+
- Define las empresas/organizaciones del sistema
|
|
558
|
+
- sql: usa ##PREF## para insertar el prefijo automaticamente
|
|
559
|
+
- objname: nombre de la tabla en BD (genera gen_empresas)
|
|
560
|
+
- updateobj: nombre del objeto para operaciones de escritura
|
|
561
|
+
- loadall: carga todos los registros al abrir
|
|
562
|
+
-->
|
|
563
|
+
<coll name="Empresas"
|
|
564
|
+
sql="SELECT * FROM ##PREF##Empresas"
|
|
565
|
+
objname="Empresas"
|
|
566
|
+
updateobj="Empresas"
|
|
567
|
+
loadall="true">
|
|
568
|
+
<group name="General" id="1">
|
|
569
|
+
<!--
|
|
570
|
+
ID y ROWID los gestiona el framework: no hace falta declararlos como <prop>
|
|
571
|
+
(declararlos es válido pero redundante).
|
|
572
|
+
- ID: clave autonumérica de la tabla
|
|
573
|
+
- ROWID: GUID de 32 caracteres hex de sincronización/replica que el
|
|
574
|
+
framework autogenera en cada alta (ej: "a1b2c3d4e5f6789012345678abcdef12")
|
|
575
|
+
-->
|
|
576
|
+
|
|
577
|
+
<!-- === CAMPOS OBLIGATORIOS === -->
|
|
578
|
+
<prop name="CODIGO" type="N" visible="7" />
|
|
579
|
+
<prop name="NOMBRE" type="T" visible="7" fieldsize="150" />
|
|
580
|
+
|
|
581
|
+
<!-- === CAMPOS OPCIONALES (según necesidades) === -->
|
|
582
|
+
<prop name="CIF" type="T" visible="7" fieldsize="20" />
|
|
583
|
+
<prop name="DIRECCION" type="T" visible="7" fieldsize="255" />
|
|
584
|
+
<prop name="TELEFONO" type="T" visible="7" fieldsize="20" />
|
|
585
|
+
<prop name="EMAIL" type="T" visible="7" fieldsize="150" />
|
|
586
|
+
<prop name="ACTIVO" type="NC" visible="7" />
|
|
587
|
+
</group>
|
|
588
|
+
</coll>
|
|
589
|
+
|
|
590
|
+
<!--
|
|
591
|
+
COLECCION: Usuarios
|
|
592
|
+
- Define los usuarios que pueden hacer login
|
|
593
|
+
- Tiene relacion con Empresas via IDEMPRESA
|
|
594
|
+
-->
|
|
595
|
+
<coll name="Usuarios"
|
|
596
|
+
sql="SELECT * FROM ##PREF##Usuarios"
|
|
597
|
+
objname="Usuarios"
|
|
598
|
+
updateobj="Usuarios"
|
|
599
|
+
loadall="true">
|
|
600
|
+
<group name="General" id="1">
|
|
601
|
+
|
|
602
|
+
<!-- === CAMPOS OBLIGATORIOS === -->
|
|
603
|
+
<prop name="CODIGO" type="N" visible="7" />
|
|
604
|
+
<prop name="NOMBRE" type="T" visible="7" fieldsize="100" />
|
|
605
|
+
<!--
|
|
606
|
+
IDEMPRESA: Relacion con la tabla Empresas
|
|
607
|
+
- mapcol="Empresas" indica la coleccion relacionada
|
|
608
|
+
- mapfld="ID" indica el campo de enlace
|
|
609
|
+
-->
|
|
610
|
+
<prop name="IDEMPRESA" type="N" visible="7"
|
|
611
|
+
mapcol="Empresas" mapfld="ID" />
|
|
612
|
+
<prop name="LOGIN" type="T" visible="7" fieldsize="50" />
|
|
613
|
+
<!--
|
|
614
|
+
PWD: Tipo X para campos de contraseña
|
|
615
|
+
- El nombre DEBE ser "PWD" — El framework lo lee literalmente
|
|
616
|
+
- visible="0" para que no se muestre en listas
|
|
617
|
+
- El tipo X enmascara el contenido con asteriscos
|
|
618
|
+
-->
|
|
619
|
+
<prop name="PWD" type="X" visible="0" fieldsize="100" />
|
|
620
|
+
|
|
621
|
+
<!-- === CAMPOS OPCIONALES === -->
|
|
622
|
+
<prop name="EMAIL" type="T" visible="7" fieldsize="150" />
|
|
623
|
+
<prop name="TELEFONO" type="T" visible="7" fieldsize="20" />
|
|
624
|
+
<prop name="ROL" type="T" visible="7" fieldsize="20" />
|
|
625
|
+
<prop name="ACTIVO" type="NC" visible="7" />
|
|
626
|
+
</group>
|
|
627
|
+
</coll>
|
|
628
|
+
|
|
629
|
+
<!--
|
|
630
|
+
OTRAS COLECCIONES: En archivos .xne separados
|
|
631
|
+
NO agregarlas aquí. Cada una va en su propio archivo:
|
|
632
|
+
- Productos.xne
|
|
633
|
+
- Pedidos.xne
|
|
634
|
+
- Clientes.xne
|
|
635
|
+
- etc.
|
|
636
|
+
-->
|
|
637
|
+
|
|
638
|
+
</collprops>
|
|
639
|
+
</xml>
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
#### Que pasa con las demas colecciones?
|
|
643
|
+
|
|
644
|
+
Cada coleccion adicional se define en su propio archivo `.xne`. Por ejemplo, `Tareas.xne`:
|
|
645
|
+
|
|
646
|
+
```xml
|
|
647
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
648
|
+
<!--
|
|
649
|
+
Coleccion: Tareas
|
|
650
|
+
Descripción: Almacena las tareas del sistema
|
|
651
|
+
-->
|
|
652
|
+
<coll name="Tareas"
|
|
653
|
+
sql="SELECT * FROM ##PREF##Tareas"
|
|
654
|
+
objname="Tareas"
|
|
655
|
+
updateobj="Tareas"
|
|
656
|
+
loadall="true">
|
|
657
|
+
<group name="General" id="1">
|
|
658
|
+
<prop name="TITULO" type="T" visible="7" fieldsize="200" />
|
|
659
|
+
<prop name="DESCRIPCION" type="T" visible="7" fieldsize="500" />
|
|
660
|
+
<prop name="ESTADO" type="T" visible="7" fieldsize="20" />
|
|
661
|
+
<prop name="PRIORIDAD" type="N" visible="7" />
|
|
662
|
+
<prop name="FECHA_CREACION" type="DT" visible="7" />
|
|
663
|
+
<prop name="FECHA_LIMITE" type="D" visible="7" />
|
|
664
|
+
</group>
|
|
665
|
+
</coll>
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
> Para profundizar en la definición de colecciones y la estructura XML completa, consulta el tópico 02 - Estructura XML y Colecciones.
|