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
package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md
ADDED
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
# XOne — Navegación, convenciones y primer proyecto
|
|
2
|
+
|
|
3
|
+
> Fuente: `xone/v2/xone-help-docs/topics/01-xone-fundamentals.md` §7–§9. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
|
|
4
|
+
|
|
5
|
+
Contenido: §7 flujo de navegación · §8 convenciones de nomenclatura · §9 pasos para crear un proyecto básico
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 7. Flujo de Navegación
|
|
10
|
+
|
|
11
|
+
La navegación en XOne sigue un patron predecible. La app siempre arranca en la pantalla definida como `entry-point` en `app.xml`, típicamente `EntradaApp`.
|
|
12
|
+
|
|
13
|
+
### Flujo Típico
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Splash Login EntradaApp Pantallas
|
|
17
|
+
(splash.png) (login-coll) (entry-point) (funcionales)
|
|
18
|
+
+----------+ +----------+ +-------------+ +-------------+
|
|
19
|
+
| Imagen | -> | Usuario | -> | Bienvenida | -> | ListaTareas |
|
|
20
|
+
| de carga | | Password | | Opción 1 --+--> | DetalleTarea|
|
|
21
|
+
| (fichero | | [Entrar] | | Opción 2 --+--> | ListaClient |
|
|
22
|
+
| splash) | | | | Opción 3 --+--> | Reportes |
|
|
23
|
+
| | | | | [Salir] | | |
|
|
24
|
+
+----------+ +----------+ +-------------+ +-------------+
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
El **splash** lo gestiona el framework automáticamente cargando un fichero `splash.png` (u otros formatos, ver más abajo) de la raíz del proyecto durante la carga inicial. NO es una `<coll>` XML.
|
|
28
|
+
|
|
29
|
+
### Funciones de Navegación
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
// Abrir una pantalla (forma corta: pasar el nombre de la coll)
|
|
33
|
+
// XOne crea internamente un dataObject vacío y abre su EditView.
|
|
34
|
+
ui.openEditView("MenuPrincipal");
|
|
35
|
+
|
|
36
|
+
// Abrir un objeto existente o pre-rellenado
|
|
37
|
+
ui.openEditView(dataObject);
|
|
38
|
+
|
|
39
|
+
// Cerrar la vista origen al abrir la nueva (flujos lineales sin botón atrás)
|
|
40
|
+
ui.openEditView(dataObject, true);
|
|
41
|
+
|
|
42
|
+
// Cerrar la pantalla actual y volver a la anterior
|
|
43
|
+
let window = ui.getView(self);
|
|
44
|
+
window.exit();
|
|
45
|
+
|
|
46
|
+
// Salir completamente de la aplicación
|
|
47
|
+
appData.exit();
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
> Para el caso especial de abrir directamente la **lista** de una coll (no su EditView), ver topics/03b-js-ui.md §3.1 → `ui.openMenu("Coll", mask, 0)`.
|
|
51
|
+
|
|
52
|
+
### Pasar Datos entre Pantallas
|
|
53
|
+
|
|
54
|
+
Para abrir una pantalla pasándole datos, el patrón canónico es **obtener un dataObject de la colección destino, asignarle propiedades y lanzarlo con `ui.openEditView()`**:
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
// === En la pantalla ORIGEN: preparar el objeto destino y abrir su vista ===
|
|
58
|
+
let coll = appData.getCollection("DetalleTarea");
|
|
59
|
+
let obj = new DetalleTarea({ MAP_ID_TAREA: self.ID });
|
|
60
|
+
coll.addItem(obj);
|
|
61
|
+
ui.openEditView(obj);
|
|
62
|
+
|
|
63
|
+
// === Abrir un objeto EXISTENTE de la BD ===
|
|
64
|
+
let coll = appData.getCollection("Tareas");
|
|
65
|
+
let tarea = coll.findObject("ID = " + nId);
|
|
66
|
+
if (tarea) {
|
|
67
|
+
ui.openEditView(tarea);
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
> **Forma corta:** `ui.openEditView("DetalleTarea")` crea un objeto vacío y lo abre en una sola llamada — útil cuando no hay que pre-rellenar nada. Detalles en topics/03c-js-appdata-http.md §4.3.
|
|
72
|
+
|
|
73
|
+
### Ejemplo Completo: EntradaApp con Navegación
|
|
74
|
+
|
|
75
|
+
```xml
|
|
76
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
77
|
+
<coll name="EntradaApp" title="Bienvenido"
|
|
78
|
+
special="true" notab="true" show-toolbar="false">
|
|
79
|
+
|
|
80
|
+
<create>
|
|
81
|
+
<action name="runscript">
|
|
82
|
+
<script language="javascript">
|
|
83
|
+
// Inicialización al crear la pantalla
|
|
84
|
+
</script>
|
|
85
|
+
</action>
|
|
86
|
+
</create>
|
|
87
|
+
|
|
88
|
+
<group name="grpPrincipal" id="1" class="groupNoTab">
|
|
89
|
+
<!-- Cabecera con logo -->
|
|
90
|
+
<frame name="frmHeader" class="frameHeader">
|
|
91
|
+
<prop name="imgLogo" type="IMG" visible="7"
|
|
92
|
+
width="200p" height="80p" align="center"
|
|
93
|
+
src="./icons/app_icon.png"/>
|
|
94
|
+
</frame>
|
|
95
|
+
|
|
96
|
+
<!-- Cuerpo con botón de entrada -->
|
|
97
|
+
<frame name="frmBody" class="frameBody">
|
|
98
|
+
<prop name="lblBienvenida" type="L" visible="7"
|
|
99
|
+
width="100%" height="50p" align="center"
|
|
100
|
+
class="textoTitulo" title="Bienvenido a Mi App"/>
|
|
101
|
+
|
|
102
|
+
<prop name="btnEntrar" type="B" visible="7"
|
|
103
|
+
width="80%" height="50p" align="center"
|
|
104
|
+
class="btnPrimario" title="Entrar" tmargin="30p"
|
|
105
|
+
onclick="ui.openEditView('MenuPrincipal');" />
|
|
106
|
+
</frame>
|
|
107
|
+
</group>
|
|
108
|
+
|
|
109
|
+
<!-- Manejo del botón atrás: confirmar antes de salir -->
|
|
110
|
+
<onback>
|
|
111
|
+
<action name="runscript">
|
|
112
|
+
<script language="javascript">
|
|
113
|
+
let nResult = ui.msgBox(
|
|
114
|
+
"¿Desea salir de la aplicación?",
|
|
115
|
+
"Confirmar salida",
|
|
116
|
+
4 // Tipo 4 = Si/No
|
|
117
|
+
);
|
|
118
|
+
if (nResult == 6) { // 6 = Si
|
|
119
|
+
appData.exit();
|
|
120
|
+
}
|
|
121
|
+
</script>
|
|
122
|
+
</action>
|
|
123
|
+
</onback>
|
|
124
|
+
</coll>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> Para profundizar en los patrones de navegación avanzados y el uso de `contents`, consulta 02 - Estructura XML y Colecciones.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 8. Convenciones de Nomenclatura
|
|
132
|
+
|
|
133
|
+
Seguir convenciones de nomenclatura consistentes es fundamental para mantener un proyecto XOne organizado y legible.
|
|
134
|
+
|
|
135
|
+
### Colecciones y Pantallas
|
|
136
|
+
|
|
137
|
+
| Elemento | Convencion | Ejemplos |
|
|
138
|
+
|----------|-----------|----------|
|
|
139
|
+
| Nombre de coleccion | **PascalCase** | `MenuPrincipal`, `DetalleTarea`, `ListaClientes` |
|
|
140
|
+
| Archivo de coleccion | **PascalCase.xne** | `MenuPrincipal.xne`, `Tareas.xne` |
|
|
141
|
+
| Pantallas de lista | Prefijo `Lista` | `ListaTareas`, `ListaClientes`, `ListaPedidos` |
|
|
142
|
+
| Pantallas de detalle | Prefijo `Detalle` | `DetalleTarea`, `DetalleCliente` |
|
|
143
|
+
| Pantalla de entrada | Siempre `EntradaApp` | `EntradaApp.xne` |
|
|
144
|
+
|
|
145
|
+
### Propiedades y Campos
|
|
146
|
+
|
|
147
|
+
| Tipo de campo | Convencion | Ejemplos |
|
|
148
|
+
|-------------|-----------|----------|
|
|
149
|
+
| Campos de BD | **MAYUSCULAS** | `CODIGO`, `NOMBRE`, `FECHA_CREACION` |
|
|
150
|
+
| Campos temporales (UI) | Prefijo **MAP_** | `MAP_BTN_GUARDAR`, `MAP_TOTAL`, `MAP_BUSQUEDA` |
|
|
151
|
+
| Botones | `MAP_BTN_` + acción | `MAP_BTN_GUARDAR`, `MAP_BTN_CANCELAR`, `MAP_BTN_BUSCAR` |
|
|
152
|
+
| Labels informativos | `MAP_LBL_` + nombre | `MAP_LBL_TITULO`, `MAP_LBL_SUBTITULO` |
|
|
153
|
+
| Propiedades con `title` | camelCase o descriptivo | `txtNombre`, `btnGuardar`, `lblTitulo` |
|
|
154
|
+
|
|
155
|
+
#### Qué significa `MAP_`, exactamente
|
|
156
|
+
|
|
157
|
+
El prefijo **no es cosmético ni una convención de estilo**: le dice al framework que ese prop
|
|
158
|
+
**no es una columna de la tabla de `objname`**, y por eso lo excluye de los `INSERT` y `UPDATE`.
|
|
159
|
+
El valor vive solo en memoria, dentro del DataObject.
|
|
160
|
+
|
|
161
|
+
**Regla de oro:** si el valor no viene de una columna de `objname`, el `name` empieza por
|
|
162
|
+
`MAP_`. Los tres casos:
|
|
163
|
+
|
|
164
|
+
1. **Alias de JOIN** en el `sql` de la coll. La FK real va sin prefijo; la descripción traída
|
|
165
|
+
del JOIN, con él:
|
|
166
|
+
|
|
167
|
+
```xml
|
|
168
|
+
<coll name="Pedidos" objname="pedidos" updateobj="pedidos"
|
|
169
|
+
sql="SELECT p.ID, p.IDCLIENTE, c.NOMBRE AS MAP_NOMBRECLIENTE
|
|
170
|
+
FROM ##PREF##pedidos p JOIN ##PREF##clientes c ON c.ID = p.IDCLIENTE">
|
|
171
|
+
<group name="General" id="1">
|
|
172
|
+
<prop name="IDCLIENTE" type="T" visible="0" /> <!-- columna: sin MAP_ -->
|
|
173
|
+
<prop name="MAP_NOMBRECLIENTE" type="T" title="Cliente" /><!-- alias: con MAP_ -->
|
|
174
|
+
</group>
|
|
175
|
+
</coll>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
2. **Descripción de un combo con `linkedto`**: el prop oculto que guarda el ID **es** columna y
|
|
179
|
+
va sin prefijo; el visible que enseña la descripción lleva `MAP_`.
|
|
180
|
+
|
|
181
|
+
3. **Props puramente visuales**: etiquetas `L`, botones `B`, totales calculados, estados de UI,
|
|
182
|
+
buscadores, imágenes decorativas, callbacks `O`. Nada de eso se persiste.
|
|
183
|
+
|
|
184
|
+
**El fallo es SIMÉTRICO, y las dos mitades duelen distinto:**
|
|
185
|
+
|
|
186
|
+
| Error | Qué pasa |
|
|
187
|
+
|---|---|
|
|
188
|
+
| `MAP_` a algo que **sí** es columna | **el dato se pierde al guardar** — la pantalla carga bien, así que no se nota hasta que falta |
|
|
189
|
+
| **omitirlo** en un alias de JOIN o en la descripción de un combo | **error SQL** al actualizar: se intenta escribir en una columna que no existe |
|
|
190
|
+
|
|
191
|
+
**No son de solo lectura.** Se leen y escriben con normalidad (`self.MAP_X`, `setval`,
|
|
192
|
+
`linkedto`), valen en `disablevisible`, en macros `##FLD_MAP_X##` y como destino de
|
|
193
|
+
`ui.refresh("MAP_X")`. El `locked="true"` que aparece en muchos ejemplos es una decisión de
|
|
194
|
+
interfaz, no una consecuencia del prefijo.
|
|
195
|
+
|
|
196
|
+
### Clases CSS
|
|
197
|
+
|
|
198
|
+
| Tipo de clase | Convencion | Ejemplos |
|
|
199
|
+
|-------------|-----------|----------|
|
|
200
|
+
| Frames | Prefijo descriptivo | `.frameHeader`, `.frameBody`, `.frameFooter` |
|
|
201
|
+
| Botones | Prefijo `.btn` | `.btnPrimario`, `.btnSecundario`, `.btnPeligro` |
|
|
202
|
+
| Texto | Prefijo `.texto` | `.textoTitulo`, `.textoSubtitulo`, `.textoEditable` |
|
|
203
|
+
| Iconos | Prefijo `.icono` | `.iconoAccion`, `.iconoMenu` |
|
|
204
|
+
| Grupos | Prefijo `.group` | `.groupNoTab`, `.groupConTab` |
|
|
205
|
+
|
|
206
|
+
### Funciones JavaScript
|
|
207
|
+
|
|
208
|
+
| Tipo de función | Convencion | Ejemplos |
|
|
209
|
+
|----------------|-----------|----------|
|
|
210
|
+
| Funciones generales | **camelCase** | `mostrarToast()`, `cerrarPantalla()` |
|
|
211
|
+
| Funciones de validación | Prefijo `validar` | `validarFormulario()`, `validarCampo()` |
|
|
212
|
+
| Funciones de negocio | Verbo descriptivo + sustantivo | `doLogin()`, `createPDF()`, `validateUserInput()` |
|
|
213
|
+
| Funciones de evento | Prefijo `on` o `do` | `onMapClicked()`, `doLogin()` |
|
|
214
|
+
| Callbacks | Prefijo `callback` | `callbackGps()`, `callbackHttp()` |
|
|
215
|
+
|
|
216
|
+
### Variables JavaScript
|
|
217
|
+
|
|
218
|
+
| Tipo de variable | Convencion | Ejemplos |
|
|
219
|
+
|-----------------|-----------|----------|
|
|
220
|
+
| Variables locales | **camelCase** | `userName`, `isConnected`, `maxRetries` |
|
|
221
|
+
| Constantes | **MAYUSCULAS con guion bajo** | `MAX_RETRY_ATTEMPTS`, `DEFAULT_TIMEOUT` |
|
|
222
|
+
| Campos de interfaz (en self) | Prefijo **MAP_** | `MAP_USER`, `MAP_PASSWORD`, `MAP_COLORACTIVO`, `MAP_LOADING` |
|
|
223
|
+
| Objetos de configuración | **MAYUSCULAS** | `APP_CONFIG`, `CONNECTION_STATUS` |
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
// CORRECTO - Variables locales en camelCase
|
|
227
|
+
var userName = "admin";
|
|
228
|
+
var isConnected = false;
|
|
229
|
+
var maxRetries = 3;
|
|
230
|
+
|
|
231
|
+
// CORRECTO - Constantes en MAYUSCULAS
|
|
232
|
+
var MAX_RETRY_ATTEMPTS = 3;
|
|
233
|
+
var DEFAULT_TIMEOUT = 5000;
|
|
234
|
+
|
|
235
|
+
// CORRECTO - Campos de interfaz con MAP_
|
|
236
|
+
self.MAP_USER = "usuario";
|
|
237
|
+
self.MAP_PASSWORD = "clave";
|
|
238
|
+
self.MAP_LOADING = 0;
|
|
239
|
+
|
|
240
|
+
// CORRECTO - Funciones con verbos descriptivos
|
|
241
|
+
function doLogin(user, pass) { }
|
|
242
|
+
function createPDF(fileName, pdf) { }
|
|
243
|
+
function validateUserInput() { }
|
|
244
|
+
|
|
245
|
+
// INCORRECTO - Nombres ambiguos o genericos
|
|
246
|
+
function process() { }
|
|
247
|
+
function handle() { }
|
|
248
|
+
var x = "admin";
|
|
249
|
+
var flag = true;
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Nomenclatura de Iconos
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
[prefijo]_[descripcion].png
|
|
256
|
+
|
|
257
|
+
Prefijos estándar:
|
|
258
|
+
ic_ Iconos de interfaz ic_menu.png, ic_search.png
|
|
259
|
+
app_ Icono de aplicación app_icon.png
|
|
260
|
+
avatar_ Fotos de perfil avatar_default.png
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
> **Nota:** La carpeta `icons/` acepta PNG, JPG y SVG. El formato PNG es el más habitual, pero SVG es perfectamente valido y no necesita conversion.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 9. Primeros Pasos - Crear un Proyecto Básico
|
|
268
|
+
|
|
269
|
+
A continuacion, un checklist paso a paso para crear tu primer proyecto XOne funcional:
|
|
270
|
+
|
|
271
|
+
### Checklist: Proyecto "Hola Mundo"
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
1. [ ] Crear la estructura de carpetas
|
|
275
|
+
2. [ ] Crear app.xml con configuracion basica
|
|
276
|
+
3. [ ] Crear app.ini con metadatos
|
|
277
|
+
4. [ ] Crear mappings.xne con Empresas y Usuarios
|
|
278
|
+
5. [ ] Crear default.css con estilos base
|
|
279
|
+
6. [ ] Crear functions.js con utilidades
|
|
280
|
+
7. [ ] Crear EntradaApp.xne como punto de entrada
|
|
281
|
+
8. [ ] Crear MenuPrincipal.xne
|
|
282
|
+
9. [ ] Generar la base de datos
|
|
283
|
+
10. [ ] Insertar datos iniciales (Empresa + Usuario admin)
|
|
284
|
+
11. [ ] Generar iconos
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Archivos Mínimos Necesarios
|
|
288
|
+
|
|
289
|
+
Un proyecto XOne funcional mínimo necesita exactamente estos archivos:
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
MiPrimerProyecto/
|
|
293
|
+
|-- app.xml # Configuración
|
|
294
|
+
|-- app.ini # Metadatos
|
|
295
|
+
|-- mappings.xne # Empresas + Usuarios
|
|
296
|
+
|-- default.css # Estilos
|
|
297
|
+
|-- functions.js # Funciones globales
|
|
298
|
+
|-- EntradaApp.xne # Pantalla de entrada
|
|
299
|
+
|-- MenuPrincipal.xne # Menu principal
|
|
300
|
+
|-- bd/
|
|
301
|
+
| +-- gestion.db # Base de datos (generada)
|
|
302
|
+
|-- icons/
|
|
303
|
+
| +-- app_icon.png # Al menos un icono
|
|
304
|
+
+-- files/ # Carpeta vacia (para runtime)
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Ejemplo: Proyecto "Hola Mundo" Completo
|
|
308
|
+
|
|
309
|
+
#### 1. app.xml
|
|
310
|
+
|
|
311
|
+
```xml
|
|
312
|
+
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
|
313
|
+
<xml>
|
|
314
|
+
<app
|
|
315
|
+
prefix="gen"
|
|
316
|
+
version="1.0.0"
|
|
317
|
+
debug="true"
|
|
318
|
+
autologon="true"
|
|
319
|
+
screen-orientation="portrait"
|
|
320
|
+
resolution-width="1080"
|
|
321
|
+
resolution-height="1920"
|
|
322
|
+
scale-fontsize="true"
|
|
323
|
+
android-font-factor="7"
|
|
324
|
+
default-language="javascript">
|
|
325
|
+
|
|
326
|
+
<entry-point>
|
|
327
|
+
<item name="EntradaApp" conditions="" />
|
|
328
|
+
</entry-point>
|
|
329
|
+
|
|
330
|
+
<style url="default.css" encoding="UTF-8" />
|
|
331
|
+
<include file="functions.js" language="javascript" encoding="UTF-8"/>
|
|
332
|
+
</app>
|
|
333
|
+
</xml>
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
> Nota: `autologon="true"` salta el login para simplificar este ejemplo.
|
|
337
|
+
|
|
338
|
+
#### 2. app.ini
|
|
339
|
+
|
|
340
|
+
```ini
|
|
341
|
+
Name=HolaMundo
|
|
342
|
+
Title=Hola Mundo XOne
|
|
343
|
+
Caption=Mi primer proyecto XOne
|
|
344
|
+
Icon=app_icon.png
|
|
345
|
+
IconFolder=icons
|
|
346
|
+
FilesFolder=files
|
|
347
|
+
HideSplash=false
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
#### 3. mappings.xne (mínimo obligatorio)
|
|
351
|
+
|
|
352
|
+
```xml
|
|
353
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
354
|
+
<xml>
|
|
355
|
+
<app prefix="gen" version="1.0.0" debug="true" default-language="javascript">
|
|
356
|
+
<style url="default.css" />
|
|
357
|
+
</app>
|
|
358
|
+
|
|
359
|
+
<collprops type="general">
|
|
360
|
+
<coll name="Empresas"
|
|
361
|
+
sql="SELECT * FROM ##PREF##Empresas"
|
|
362
|
+
objname="Empresas"
|
|
363
|
+
updateobj="Empresas"
|
|
364
|
+
loadall="true">
|
|
365
|
+
<group name="General" id="1">
|
|
366
|
+
<prop name="CODIGO" type="N" visible="7" />
|
|
367
|
+
<prop name="NOMBRE" type="T" visible="7" fieldsize="150" />
|
|
368
|
+
</group>
|
|
369
|
+
</coll>
|
|
370
|
+
|
|
371
|
+
<coll name="Usuarios"
|
|
372
|
+
sql="SELECT * FROM ##PREF##Usuarios"
|
|
373
|
+
objname="Usuarios"
|
|
374
|
+
updateobj="Usuarios"
|
|
375
|
+
loadall="true">
|
|
376
|
+
<group name="General" id="1">
|
|
377
|
+
<prop name="CODIGO" type="N" visible="7" />
|
|
378
|
+
<prop name="NOMBRE" type="T" visible="7" fieldsize="100" />
|
|
379
|
+
<prop name="IDEMPRESA" type="N" visible="7"
|
|
380
|
+
mapcol="Empresas" mapfld="ID" />
|
|
381
|
+
<prop name="LOGIN" type="T" visible="7" fieldsize="50" />
|
|
382
|
+
<prop name="PWD" type="X" visible="0" fieldsize="100" />
|
|
383
|
+
</group>
|
|
384
|
+
</coll>
|
|
385
|
+
</collprops>
|
|
386
|
+
</xml>
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
#### 4. default.css (estilos básicos)
|
|
390
|
+
|
|
391
|
+
```css
|
|
392
|
+
/* Configuración global */
|
|
393
|
+
prop {
|
|
394
|
+
fontname: Roboto-Regular.ttf;
|
|
395
|
+
fontsize: 10;
|
|
396
|
+
labelbox: false;
|
|
397
|
+
label-wrap: true;
|
|
398
|
+
text-border: false;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
coll {
|
|
402
|
+
notab: true;
|
|
403
|
+
show-toolbar: false;
|
|
404
|
+
group-swipe: false;
|
|
405
|
+
editmask: 0;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/* Clases de layout */
|
|
409
|
+
.frameHeader {
|
|
410
|
+
width: 100%;
|
|
411
|
+
height: 120p;
|
|
412
|
+
bgcolor: #2196F3;
|
|
413
|
+
align: center;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.frameBody {
|
|
417
|
+
width: 100%;
|
|
418
|
+
height: 100%;
|
|
419
|
+
scroll: true;
|
|
420
|
+
bgcolor: #FFFFFF;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/* Clases de botones */
|
|
424
|
+
.btnPrimario {
|
|
425
|
+
width: 90%;
|
|
426
|
+
height: 50p;
|
|
427
|
+
bgcolor: #2196F3;
|
|
428
|
+
forecolor: #FFFFFF;
|
|
429
|
+
border-corner-radius: 8;
|
|
430
|
+
text-align: center;
|
|
431
|
+
fontsize: 14;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* Clases de texto */
|
|
435
|
+
.textoTitulo {
|
|
436
|
+
fontsize: 18;
|
|
437
|
+
forecolor: #212121;
|
|
438
|
+
text-align: center;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
.textoSubtitulo {
|
|
442
|
+
fontsize: 14;
|
|
443
|
+
forecolor: #757575;
|
|
444
|
+
text-align: center;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/* Grupos sin pestana */
|
|
448
|
+
.groupNoTab {
|
|
449
|
+
tab-visible: false;
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
#### 5. functions.js
|
|
454
|
+
|
|
455
|
+
```javascript
|
|
456
|
+
/**
|
|
457
|
+
* Funciones globales - Hola Mundo XOne
|
|
458
|
+
*/
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Verifica si un valor esta vacio
|
|
462
|
+
*/
|
|
463
|
+
function isEmpty(val) {
|
|
464
|
+
return val === undefined || val === null || val === "";
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Muestra un mensaje de confirmacion Si/No
|
|
469
|
+
*/
|
|
470
|
+
function confirmar(mensaje, titulo) {
|
|
471
|
+
titulo = titulo || "Confirmar";
|
|
472
|
+
let nResult = ui.msgBox(mensaje, titulo, 4);
|
|
473
|
+
return nResult == 6;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Muestra un toast simple
|
|
478
|
+
*/
|
|
479
|
+
function mostrarToast(mensaje) {
|
|
480
|
+
ui.showToast(mensaje);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Cierra la pantalla actual
|
|
485
|
+
*/
|
|
486
|
+
function cerrarPantalla() {
|
|
487
|
+
let window = ui.getView(self);
|
|
488
|
+
if (window) {
|
|
489
|
+
window.exit();
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
#### 6. EntradaApp.xne
|
|
495
|
+
|
|
496
|
+
```xml
|
|
497
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
498
|
+
<coll name="EntradaApp" title="Hola Mundo"
|
|
499
|
+
special="true" notab="true" show-toolbar="false">
|
|
500
|
+
|
|
501
|
+
<create>
|
|
502
|
+
<action name="runscript">
|
|
503
|
+
<script language="javascript">
|
|
504
|
+
// Ir directamente al menu
|
|
505
|
+
ui.openEditView("MenuPrincipal");
|
|
506
|
+
</script>
|
|
507
|
+
</action>
|
|
508
|
+
</create>
|
|
509
|
+
|
|
510
|
+
<group name="grpPrincipal" id="1" class="groupNoTab">
|
|
511
|
+
<frame name="frmBody" class="frameBody">
|
|
512
|
+
<prop name="lblCargando" type="L" visible="7"
|
|
513
|
+
width="100%" height="50p" align="center"
|
|
514
|
+
class="textoTitulo" title="Cargando..."/>
|
|
515
|
+
</frame>
|
|
516
|
+
</group>
|
|
517
|
+
|
|
518
|
+
<onback>
|
|
519
|
+
<action name="runscript">
|
|
520
|
+
<script language="javascript">
|
|
521
|
+
if (confirmar("Desea salir?", "Salir")) {
|
|
522
|
+
appData.exit();
|
|
523
|
+
}
|
|
524
|
+
</script>
|
|
525
|
+
</action>
|
|
526
|
+
</onback>
|
|
527
|
+
</coll>
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
#### 7. MenuPrincipal.xne
|
|
531
|
+
|
|
532
|
+
```xml
|
|
533
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
534
|
+
<coll name="MenuPrincipal" title="Menu Principal"
|
|
535
|
+
special="true" notab="true" show-toolbar="false">
|
|
536
|
+
|
|
537
|
+
<group name="grpMenu" id="1" class="groupNoTab">
|
|
538
|
+
<frame name="frmHeader" class="frameHeader">
|
|
539
|
+
<prop name="lblTitulo" type="L" visible="7"
|
|
540
|
+
width="100%" height="60p" align="center"
|
|
541
|
+
forecolor="#FFFFFF" fontsize="20"
|
|
542
|
+
title="Hola Mundo XOne"/>
|
|
543
|
+
</frame>
|
|
544
|
+
|
|
545
|
+
<frame name="frmBody" class="frameBody">
|
|
546
|
+
<prop name="lblMensaje" type="L" visible="7"
|
|
547
|
+
width="100%" height="80p" align="center"
|
|
548
|
+
class="textoTitulo" tmargin="40p"
|
|
549
|
+
title="Bienvenido a tu primer proyecto XOne!"/>
|
|
550
|
+
|
|
551
|
+
<prop name="lblInfo" type="L" visible="7"
|
|
552
|
+
width="90%" height="60p" align="center"
|
|
553
|
+
class="textoSubtitulo" tmargin="20p"
|
|
554
|
+
title="Este es un proyecto básico de ejemplo."/>
|
|
555
|
+
|
|
556
|
+
<prop name="btnSaludo" type="B" visible="7"
|
|
557
|
+
width="80%" height="50p" align="center"
|
|
558
|
+
class="btnPrimario" title="Saludar" tmargin="40p"
|
|
559
|
+
onclick="ui.showToast('Hola desde XOne!');" />
|
|
560
|
+
</frame>
|
|
561
|
+
</group>
|
|
562
|
+
|
|
563
|
+
<onback>
|
|
564
|
+
<action name="runscript">
|
|
565
|
+
<script language="javascript">
|
|
566
|
+
if (confirmar("¿Desea salir de la aplicación?", "Salir")) {
|
|
567
|
+
appData.exit();
|
|
568
|
+
}
|
|
569
|
+
</script>
|
|
570
|
+
</action>
|
|
571
|
+
</onback>
|
|
572
|
+
</coll>
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
> Para una guía completa de creación de proyectos con todas las tareas finales (generar BD, insertar datos, descargar iconos), consulta el tópico 05 - Eventos, Patrones y FAQ.
|
|
576
|
+
|