xonecode 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +167 -0
  2. package/dist/agent/authEnDisco.js +56 -0
  3. package/dist/agent/authEnDisco.js.map +1 -0
  4. package/dist/agent/configEnDisco.js +109 -0
  5. package/dist/agent/configEnDisco.js.map +1 -0
  6. package/dist/agent/crearProyecto.js +34 -0
  7. package/dist/agent/crearProyecto.js.map +1 -0
  8. package/dist/agent/entorno.js +124 -0
  9. package/dist/agent/entorno.js.map +1 -0
  10. package/dist/agent/guionizado.js +53 -0
  11. package/dist/agent/guionizado.js.map +1 -0
  12. package/dist/agent/instantanea.js +129 -0
  13. package/dist/agent/instantanea.js.map +1 -0
  14. package/dist/agent/interrupts.js +83 -0
  15. package/dist/agent/interrupts.js.map +1 -0
  16. package/dist/agent/mensajes.js +24 -0
  17. package/dist/agent/mensajes.js.map +1 -0
  18. package/dist/agent/modelos.js +42 -0
  19. package/dist/agent/modelos.js.map +1 -0
  20. package/dist/agent/normalizar.js +20 -0
  21. package/dist/agent/normalizar.js.map +1 -0
  22. package/dist/agent/perfiles.js +103 -0
  23. package/dist/agent/perfiles.js.map +1 -0
  24. package/dist/agent/proyecto.js +107 -0
  25. package/dist/agent/proyecto.js.map +1 -0
  26. package/dist/agent/puente.js +142 -0
  27. package/dist/agent/puente.js.map +1 -0
  28. package/dist/agent/resumenDeTool.js +48 -0
  29. package/dist/agent/resumenDeTool.js.map +1 -0
  30. package/dist/agent/skills.js +65 -0
  31. package/dist/agent/skills.js.map +1 -0
  32. package/dist/agent/textoDeTool.js +113 -0
  33. package/dist/agent/textoDeTool.js.map +1 -0
  34. package/dist/agent/turnoReal.js +173 -0
  35. package/dist/agent/turnoReal.js.map +1 -0
  36. package/dist/agent/verificador.js +65 -0
  37. package/dist/agent/verificador.js.map +1 -0
  38. package/dist/agent/xoneAgent.js +106 -0
  39. package/dist/agent/xoneAgent.js.map +1 -0
  40. package/dist/bin.js +9 -0
  41. package/dist/bin.js.map +1 -0
  42. package/dist/cli/aprobar.js +82 -0
  43. package/dist/cli/aprobar.js.map +1 -0
  44. package/dist/cli/config.js +133 -0
  45. package/dist/cli/config.js.map +1 -0
  46. package/dist/cli/consola.js +346 -0
  47. package/dist/cli/consola.js.map +1 -0
  48. package/dist/cli/describe.js +53 -0
  49. package/dist/cli/describe.js.map +1 -0
  50. package/dist/cli/doctor.js +45 -0
  51. package/dist/cli/doctor.js.map +1 -0
  52. package/dist/cli/main.js +520 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/cli/markdown.js +90 -0
  55. package/dist/cli/markdown.js.map +1 -0
  56. package/dist/cli/run.js +164 -0
  57. package/dist/cli/run.js.map +1 -0
  58. package/dist/cli/spinner.js +89 -0
  59. package/dist/cli/spinner.js.map +1 -0
  60. package/dist/cli/stdio.js +193 -0
  61. package/dist/cli/stdio.js.map +1 -0
  62. package/dist/cli/tema.js +40 -0
  63. package/dist/cli/tema.js.map +1 -0
  64. package/dist/cli/verify.js +62 -0
  65. package/dist/cli/verify.js.map +1 -0
  66. package/dist/core/bitacora.js +30 -0
  67. package/dist/core/bitacora.js.map +1 -0
  68. package/dist/core/config.js +236 -0
  69. package/dist/core/config.js.map +1 -0
  70. package/dist/core/contextos.js +56 -0
  71. package/dist/core/contextos.js.map +1 -0
  72. package/dist/core/deps.js +51 -0
  73. package/dist/core/deps.js.map +1 -0
  74. package/dist/core/diff.js +79 -0
  75. package/dist/core/diff.js.map +1 -0
  76. package/dist/core/esqueleto.js +366 -0
  77. package/dist/core/esqueleto.js.map +1 -0
  78. package/dist/core/events.js +2 -0
  79. package/dist/core/events.js.map +1 -0
  80. package/dist/core/modelos.js +85 -0
  81. package/dist/core/modelos.js.map +1 -0
  82. package/dist/core/notify.js +106 -0
  83. package/dist/core/notify.js.map +1 -0
  84. package/dist/core/ports.js +114 -0
  85. package/dist/core/ports.js.map +1 -0
  86. package/dist/core/turno.js +127 -0
  87. package/dist/core/turno.js.map +1 -0
  88. package/dist/vendor/hitl.js +103 -0
  89. package/dist/vendor/hitl.js.map +1 -0
  90. package/dist/vendor/skillLoaders/catalog.js +74 -0
  91. package/dist/vendor/skillLoaders/catalog.js.map +1 -0
  92. package/dist/vendor/tokenTracking.js +58 -0
  93. package/dist/vendor/tokenTracking.js.map +1 -0
  94. package/package.json +41 -0
  95. package/skills/xone-debugging/SKILL.md +52 -0
  96. package/skills/xone-debugging/references/faq.md +561 -0
  97. package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
  98. package/skills/xone-development/SKILL.md +105 -0
  99. package/skills/xone-development/references/anti-patrones.md +94 -0
  100. package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
  101. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
  102. package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
  103. package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
  104. package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
  105. package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
  106. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
  107. package/skills/xone-development/references/datos/appdata.md +611 -0
  108. package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
  109. package/skills/xone-development/references/datos/http.md +366 -0
  110. package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
  111. package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
  112. package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
  113. package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
  114. package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
  115. package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
  116. package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
  117. package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
  118. package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
  119. package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
  120. package/skills/xone-development/references/indice-completo.md +77 -0
  121. package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
  122. package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
  123. package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
  124. package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
  125. package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
  126. package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
  127. package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
  128. package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
  129. package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
  130. package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
  131. package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
  132. package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
  133. package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
  134. package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
  135. package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
  136. package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
  137. package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
  138. package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
  139. package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
  140. package/skills/xone-development/references/tipos-de-prop.md +28 -0
  141. package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
  142. package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
  143. package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
  144. package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
  145. package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
  146. package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
  147. package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
  148. package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
  149. package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
  150. package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
  151. package/skills/xone-development/references/xml-ui/mapas.md +685 -0
  152. package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
  153. package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
  154. package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
  155. package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
  156. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
  157. package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
  158. package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
  159. package/skills/xone-plan-builder/SKILL.md +183 -0
  160. package/skills/xone-plan-builder/agents/openai.yaml +5 -0
  161. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
  162. package/skills/xone-project-generator/SKILL.md +111 -0
  163. package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
  164. package/skills/xone-project-generator/references/colecciones-base.md +16 -0
  165. package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
  166. package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
  167. package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
  168. package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
  169. package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
  170. package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
  171. package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
  172. package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
  173. package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
  174. package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
  175. package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
  176. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
  177. package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
  178. package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
  179. package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
  180. package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
  181. package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
  182. package/skills/xone-review/SKILL.md +189 -0
  183. package/skills/xone-spec-builder/SKILL.md +235 -0
  184. package/skills/xone-spec-builder/agents/openai.yaml +5 -0
  185. package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
  186. package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
  187. package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
@@ -0,0 +1,479 @@
1
+ # Generación XOne — Fase 7: viewmodes de mapa y calendario
2
+
3
+ > Fuente: `xone/v2/xone-project-generator/references/xone-project-generation-workflow.md` L3522–3976. Referencia de la skill; el índice está en [../SKILL.md](../SKILL.md).
4
+
5
+ Contenido: §7.13 viewmodes disponibles · §7.13a mapview y openstreetmap · §7.13b calendarview
6
+
7
+ ---
8
+
9
+ ### 7.13 ViewModes Disponibles para Generación
10
+
11
+ Al generar pantallas con contents (`<prop type="Z">`), el agente debe seleccionar el `viewmode` adecuado según el tipo de visualizacion requerida. Referencia completa:
12
+
13
+ #### Listas y Grids
14
+
15
+ | ViewMode | Descripción | Cuando usarlo |
16
+ |----------|-------------|---------------|
17
+ | `grid` | Cuadricula por defecto | Tablas simples sin necesidad de rendimiento alto |
18
+ | `recyclerview` | Lista con reciclaje de vistas | **Recomendado** para toda lista larga (>20 elementos) |
19
+ | `gridview` | Cuadricula de elementos | Catálogos visuales, galerías |
20
+ | `slideview` | Vista deslizable tipo carrusel | Banners promocionales, onboarding, galerías con swipe |
21
+ | `coverflow` | Variante de `slideview` con efecto Cover Flow estilo iTunes (cards laterales escaladas/atenuadas/rotadas en 3D) | Galerías destacadas en home, onboarding ilustrado, selectores visuales (plan/avatar), showcases con foco en una card y peek de adyacentes |
22
+ | `kanban` | Tablero estilo Trello/Jira con columnas verticales y drag&drop entre estados | Gestion de tareas (TODO/DOING/DONE), pipeline comercial (LEAD/QUOTE/WON/LOST), workflows de aprobacion, tableros de proyecto |
23
+ | `expanview` | Vista expandible/colapsable (acordeón) | Listas padre-hijo, árboles, FAQs, categorías agrupadas |
24
+ | `picturemap` | Mosaico de imágenes / catálogo visual | Catálogos de productos con foto, galerías |
25
+
26
+ #### Mapas
27
+
28
+ | ViewMode | Descripción | Cuando usarlo |
29
+ |----------|-------------|---------------|
30
+ | `mapview` | Mapa con marcadores (Google Maps) | Ubicaciones, rutas, tracking |
31
+ | `openstreetmap` | Mapa OpenStreetMap | Alternativa offline, sin dependencia de Google |
32
+
33
+ #### Gráficos (requieren `classid="XOneCharts"`)
34
+
35
+ | ViewMode | Descripción | Cuando usarlo |
36
+ |----------|-------------|---------------|
37
+ | `barchart` | Gráfico de barras | Comparaciones por categorías |
38
+ | `3dbarchart` | Gráfico de barras 3D | Comparaciones con efecto visual 3D |
39
+ | `piechart` | Gráfico circular (tarta) | Distribuciones porcentuales |
40
+ | `piechart2` | Gráfico circular alternativo | Variante visual de distribución |
41
+ | `linechart` | Gráfico de lineas | Tendencias y evoluciones temporales |
42
+ | `xylinechart` | Gráfico de lineas XY | Relaciones entre dos variables numéricas |
43
+ | `areachart` | Gráfico de área | Tendencias acumuladas, volúmenes |
44
+ | `timeserieschart` | Series temporales | Datos con eje temporal preciso (sensores, IoT) |
45
+ | `slidingbarchart` | Barras con navegación | Muchas categorías con scroll horizontal |
46
+
47
+ #### Calendario
48
+
49
+ | ViewMode | Descripción | Cuando usarlo |
50
+ |----------|-------------|---------------|
51
+ | `calendarview` | Vista de calendario | Agendas, citas, planificacion. Usar con `calendar-viewmode="week"` o `"month"` |
52
+
53
+ #### Controles Numéricos (para `<prop type="N">`, NO type="Z")
54
+
55
+ | ViewMode | Descripción | Cuando usarlo |
56
+ |----------|-------------|---------------|
57
+ | `seekbar` | Barra deslizante básica | Selección de valor numérico simple |
58
+ | `slider` | Deslizador Material Design | Ajustes de volumen, brillo, cantidades |
59
+ | `progress-bar` | Barra de progreso | Mostrar avance de proceso |
60
+ | `circular-progress-bar` | Progreso circular | Indicadores de carga, porcentajes |
61
+ | `range-slider` | Selector de rango (min-max) | Filtros de precio, edad, distancia |
62
+ | `stepper` | Control compacto `−` / `+` para valores enteros (auto-repite cada 80 ms en long-press; opcionalmente ciclico con `wrap="true"`) | Cantidades en carritos, spinners de configuración (zoom/volumen discreto), selectores ciclicos de hora/día, pasos de wizard |
63
+
64
+ > **Nota:** Los controles numéricos usan atributos adicionales: `min`, `max`, `step`/`step-size`, `orientation`. El `stepper` además acepta `wrap`, `bar-color`, `forecolor`.
65
+
66
+ #### Controles de Texto/Numéricos especiales (para `<prop type="T">` o `<prop type="N">`)
67
+
68
+ | ViewMode | Tipo base | Descripción | Cuando usarlo |
69
+ |----------|-----------|-------------|---------------|
70
+ | `otp` | `T` o `N` | Entrada de códigos de un solo uso con cajas individuales por digito, auto-avance, backspace inverso y paste distribuido. Valor concatenado sin separadores. Atributos `digits` (default 6), `secret`, `auto-submit`, `allow-letters`, `box-size`, `box-spacing`, `box-color`, `box-color-focus`. | Verificación SMS (`type="N"` `digits="6"`), 2FA, PIN de aplicación (`secret="true"`), códigos de invitacion (`allow-letters="true"`) |
71
+ | `markdown` | `T` | Renderiza el contenido del campo como Markdown CommonMark base (cabeceras, enfasis, listas, enlaces, imágenes, blockquotes, código). NO soporta tablas/strikethrough/task lists/HTML embebido. Sin atributos propios. | Mensajes formateados al usuario, descripciones servidas desde backend, plantillas dinámicas, cabeceras ricas, renderizado de respuestas de IA / chatbots |
72
+
73
+ > **Nota:** `markdown` aplica a `type="T"` y también a `type="L"` (y a su alias legacy `type="TL"`): el label-only también renderiza el contenido como Markdown vía el mismo mecanismo. En `type="T"`, para evitar el modo edición accidental, marcar el campo con `readonly="true"` o `locked="true"`.
74
+
75
+ #### Ejemplo de selección de viewmode en generación
76
+
77
+ ```
78
+ Si el usuario pide:
79
+ - "lista de productos" -> viewmode="recyclerview"
80
+ - "mapa de clientes" -> viewmode="mapview" o "openstreetmap"
81
+ - "gráfico de ventas" -> viewmode="barchart" + classid="XOneCharts"
82
+ - "agenda de citas" -> viewmode="calendarview"
83
+ - "arbol de categorias" -> viewmode="expanview" con filter="IDPADRE IS NULL"
84
+ - "carrusel de imagenes" -> viewmode="slideview" con autoslide-delay="5"
85
+ - "galeria estilo iTunes" -> viewmode="coverflow" con cover-flow-rotation="35"
86
+ - "tablero de tareas Kanban" -> viewmode="kanban" con kanban-column-field y kanban-columns
87
+ - "selector de cantidad" -> viewmode="slider" en prop type="N"
88
+ - "selector +/- de unidades" -> viewmode="stepper" en prop type="N" con min/max/step-size
89
+ - "indicador de progreso" -> viewmode="progress-bar" en prop type="N"
90
+ - "filtro de rango de precios" -> viewmode="range-slider" en prop type="N"
91
+ - "código SMS de 6 digitos" -> viewmode="otp" en prop type="N" con digits="6"
92
+ - "PIN oculto de 4 caracteres" -> viewmode="otp" en prop type="T" con digits="4" secret="true" allow-letters="true"
93
+ - "texto con formato Markdown" -> viewmode="markdown" en prop type="T" (readonly="true" si es decorativo)
94
+ ```
95
+
96
+ ---
97
+
98
+ ### 7.13a ViewMode: mapview / openstreetmap
99
+
100
+ **Cuando usarlo:** ubicaciones de clientes, rutas de trabajo, tracking de vehiculos, puntos de interes geolocalizados.
101
+
102
+ - `mapview` — Google Maps (Android e iOS). Requiere API Key de Google si se usan servicios avanzados.
103
+ - `openstreetmap` — OpenStreetMap, alternativa sin dependencia de Google, funciona offline.
104
+
105
+ #### Coleccion de datos para el mapa
106
+
107
+ La coleccion que alimenta el contents de mapa debe tener campos con atributos especiales que indican al framework que campo contiene cada dato geografico:
108
+
109
+ ```xml
110
+ <coll name="ContentCoordenadas" title="coordenadas"
111
+ sql="SELECT t1.* FROM ##PREF##clientes t1"
112
+ objname="clientes" updateobj="clientes"
113
+ progid="ASData.CASBasicDataObj" loadall="true">
114
+ <group name="General" id="1">
115
+ <prop name="NOMBRE" type="T" visible="4" />
116
+ <!-- Atributo mapview-address: muestra la dirección en el popup del marcador -->
117
+ <prop name="DIRECCION" type="T" visible="4" mapview-address="true" />
118
+ <!-- Atributo mapview-latitude: indica que este campo es la latitud del POI -->
119
+ <prop name="LATITUD" type="N6" visible="4" mapview-latitude="true" />
120
+ <!-- Atributo mapview-longitude: indica que este campo es la longitud del POI -->
121
+ <prop name="LONGITUD" type="N6" visible="4" mapview-longitude="true" />
122
+ <!-- Atributo mapview-marker-icon: icono personalizado del marcador (fichero PNG en icons/) -->
123
+ <prop name="MAP_ICONO" type="T" visible="4" mapview-marker-icon="true" />
124
+ </group>
125
+ </coll>
126
+ ```
127
+
128
+ #### Declaración del prop type="Z" con viewmode="mapview"
129
+
130
+ ```xml
131
+ <prop name="@mapaClientes"
132
+ type="Z"
133
+ viewmode="mapview"
134
+ mapview-embedded="true"
135
+ contents="mapaClientes"
136
+ width="100%"
137
+ height="70%"
138
+ map-type="normal"
139
+ show-user-location="true"
140
+ zoom-to-pois="true"
141
+ show-zoom-buttons="true"
142
+ show-google-buttons="true"
143
+ onmapclicked="onMapClicked(e);"
144
+ onmapready="onMapReady(e);" />
145
+ <contents name="mapaClientes" src="ContentCoordenadas" />
146
+ ```
147
+
148
+ #### Atributos del prop mapview
149
+
150
+ | Atributo | Descripción |
151
+ |----------|-------------|
152
+ | `mapview-embedded="true"` | Embebe el mapa dentro de la coleccion. Sin este atributo abre la app de mapas del dispositivo |
153
+ | `map-type` | Tipo de mapa: `normal`, `satellite`, `terrain`, `hybrid` |
154
+ | `map-features="roads"` | Activa visualizacion de carreteras |
155
+ | `map-style` | Estilo JSON de Google (en línea o nombre de fichero); recolorea el mapa. Prioritario sobre `map-features` |
156
+ | `traffic-enabled="false"` | Muestra la capa de tráfico |
157
+ | `map-padding="0,0,0,0"` | Padding del mapa en píxeles (`left,top,right,bottom`) |
158
+ | `tilt-gestures-enabled="true"` | Permite inclinar el mapa con gestos |
159
+ | `scroll-gestures-enabled="true"` | Permite desplazar el mapa con gestos |
160
+ | `zoom-gestures-enabled="true"` | Permite hacer zoom con gestos |
161
+ | `rotate-gestures-enabled="true"` | Permite rotar el mapa con gestos |
162
+ | `show-compass="false"` | Muestra la brújula (mapview y openstreetmap) |
163
+ | `indoor-maps-enabled="true"` | Activa los planos de interiores |
164
+ | `show-my-location-button="true"` | Botón para centrar en la ubicación del usuario |
165
+ | `show-user-location="true"` | Muestra la posición del usuario en el mapa |
166
+ | `show-zoom-buttons="true"` | Muestra botones de zoom |
167
+ | `show-google-buttons="true"` | Muestra controles nativos de Google Maps |
168
+ | `zoom-to-pois="true"` | Ajusta el zoom para que entren todos los marcadores |
169
+ | `zoom-to-my-location="false"` | Hace zoom a la posición del usuario al cargar |
170
+ | `clear-lines-on-refresh="false"` | Mantiene las lineas dibujadas al refrescar |
171
+ | `restrict-map-to-bounds="lat1,lon1,lat2,lon2"` | Restringe el área visible del mapa a unas coordenadas |
172
+ | `cluster-markers="true"` | Agrupa marcadores cercanos en un cluster |
173
+ | `show-pois="true"` | Muestra los puntos de interes |
174
+
175
+ #### Atributos de la coleccion de datos mapview
176
+
177
+ | Atributo en prop | Descripción |
178
+ |------------------|-------------|
179
+ | `mapview-latitude="true"` | Este campo contiene la latitud del marcador |
180
+ | `mapview-longitude="true"` | Este campo contiene la longitud del marcador |
181
+ | `mapview-address="true"` | Este campo contiene la dirección a mostrar en el popup |
182
+ | `mapview-marker-icon="true"` | Este campo contiene el nombre del icono PNG del marcador |
183
+
184
+ #### Eventos del mapa (JavaScript)
185
+
186
+ | Evento | Cuando se dispara |
187
+ |--------|-------------------|
188
+ | `onmapready="onMapReady(e);"` | El mapa esta listo para usarse |
189
+ | `onmapclicked="onMapClicked(e);"` | El usuario toca el mapa (coordenadas en `e.latitude`, `e.longitude`) |
190
+ | `onmaplongclicked="onMapLongClicked(e);"` | Pulsacion larga sobre el mapa |
191
+ | `onmarkerdragend="onMarkerDraggedEnd(e);"` | Se suelta un marcador arrastrado |
192
+ | `onlocationready="onLocationReady(e);"` | La localización del usuario esta disponible |
193
+ | `onlocationchanged="onLocationChanged(e);"` | Cambia la localización del usuario |
194
+ | `onmapzoomchanged="onMapZoomChanged(e);"` | Cambia el nivel de zoom |
195
+ | `ondistancemeter="onDistanceMeter(e);"` | Resultado de medición de distancia |
196
+
197
+ #### Métodos JavaScript sobre el control de mapa
198
+
199
+ ```javascript
200
+ // Obtener el control del mapa
201
+ var window = ui.getView(self);
202
+ var mapControl = window["@mapaClientes"];
203
+
204
+ // Zoom a coordenadas
205
+ mapControl.zoomTo(38.886546, -7.0043193);
206
+
207
+ // Zoom a todos los POIs
208
+ mapControl.zoomToBounds(["lat1,lon1", "lat2,lon2"]);
209
+
210
+ // Dibujar una línea entre dos puntos
211
+ mapControl.drawLine("miLinea", "#FF0000", "solid", 38.88, -7.00, 40.41, -3.70);
212
+
213
+ // Borrar todas las lineas
214
+ mapControl.clearAllLines();
215
+
216
+ // Cambiar tipo de mapa
217
+ mapControl.setMapType("satellite"); // normal, satellite, terrain, hybrid
218
+
219
+ // Estilo JSON de Google (en línea o nombre de fichero de la app; vacío/nulo restablece el defecto)
220
+ mapControl.setMapStyle("estilo_mapa.json");
221
+
222
+ // Capa de tráfico
223
+ mapControl.setTrafficEnabled(true);
224
+
225
+ // Padding del mapa en píxeles (reserva espacio para controles superpuestos)
226
+ mapControl.setMapPadding(0, 200, 0, 0);
227
+
228
+ // Activar seguimiento del usuario
229
+ mapControl.setFollowUserLocation(true);
230
+
231
+ // Medir distancia entre dos puntos (devuelve metros)
232
+ var nMetros = new GpsTools().distanceTo([
233
+ { latitude: 38.8685452, longitude: -6.8170906 },
234
+ { latitude: 40.4167747, longitude: -3.70379019 }
235
+ ]);
236
+ ```
237
+
238
+ #### OpenStreetMap — atributos adicionales
239
+
240
+ ```xml
241
+ <prop name="@mapaOSM"
242
+ type="Z"
243
+ viewmode="openstreetmap"
244
+ contents="mapaOSM"
245
+ width="100%"
246
+ height="70%"
247
+ show-compass="true"
248
+ show-minimap="true"
249
+ show-scale="true"
250
+ follow-location-on-background="true"
251
+ tile-source="mapnik_hd"
252
+ zoom-buttons-visibility="never"
253
+ onmapclicked="onMapClicked(e);" />
254
+ ```
255
+
256
+ | Atributo exclusivo OSM | Descripción |
257
+ |------------------------|-------------|
258
+ | `show-minimap="true"` | Muestra un minimapa de referencia |
259
+ | `show-scale="true"` | Muestra la escala del mapa |
260
+ | `follow-location-on-background="true"` | Sigue la localización aunque la app este en segundo plano |
261
+ | `tile-source="mapnik_hd"` | Fuente de tiles del mapa |
262
+ | `zoom-buttons-visibility` | `always`, `never`, `touch` |
263
+
264
+ ---
265
+
266
+ ### 7.13b ViewMode: calendarview
267
+
268
+ **Cuando usarlo:** agendas de citas, planificacion de tareas, calendarios de visitas, horarios.
269
+
270
+ El calendario se define como un `prop type="Z"` con `viewmode="calendarview"`. Puede mostrarse en vista mensual (por defecto) o semanal con `calendar-viewmode="week"`.
271
+
272
+ #### Declaración del prop tipo calendarview
273
+
274
+ ```xml
275
+ <frame name="frmCalendario" width="100%" height="30%" bgcolor="#273238" align="center">
276
+ <prop name="@MiCalendario" type="Z"
277
+ viewmode="calendarview"
278
+ calendar-viewmode="month"
279
+ contents="MiCalendario"
280
+ class="z_calendario"
281
+ width="90%" height="100%" />
282
+ <contents name="MiCalendario" src="ContentDatosCalendario" />
283
+ </frame>
284
+ ```
285
+
286
+ #### Coleccion de datos del calendario
287
+
288
+ ```xml
289
+ <coll name="ContentDatosCalendario" title="calendario"
290
+ sql="SELECT t1.*,
291
+ t1.FECHA AS MAP_FECHA,
292
+ t1.DESCRIPCION AS MAP_DESCRIPCION,
293
+ CASE WHEN t1.TIPO='Urgente' THEN '#FF5722'
294
+ WHEN t1.TIPO='Normal' THEN '#2196F3'
295
+ ELSE '#4CAF50'
296
+ END AS MAP_COLORVIEW
297
+ FROM ##PREF##tareas t1"
298
+ objname="tareas" updateobj="tareas"
299
+ progid="ASData.CASBasicDataObj">
300
+ <group name="General" id="1">
301
+ <!-- Campos en modo grid/lista del calendario (visible="4") -->
302
+ <frame name="frmgrid" width="100%">
303
+ <prop name="MAP_FECHA" type="D" visible="4" labelwidth="0"
304
+ width="200p" text-align="center" textfont-size="8" />
305
+ <prop name="MAP_DESCRIPCION" type="T" visible="4" labelwidth="0"
306
+ width="520p" text-align="center" textfont-size="8" newline="false" />
307
+ </frame>
308
+ <!-- Formulario de edicion (visible="1") -->
309
+ <prop name="FECHA" type="D" visible="1"
310
+ datefrom="true" dateto="true" title="Fecha:" />
311
+ <prop name="HORAINI" type="TT" mask="Hh#:#Mm" visible="1"
312
+ timefrom="true" title="Hora Inicio:" />
313
+ <prop name="HORAFIN" type="TT" mask="Hh#:#Mm" visible="1"
314
+ timeto="true" title="Hora Fin:" />
315
+ <prop name="DESCRIPCION" type="T" visible="1" title="Descripción:" lines="3" />
316
+ <!-- colorview=true: el valor de este campo se usa como color de la celda del dia -->
317
+ <prop name="MAP_COLORVIEW" type="T" visible="0" colorview="true" />
318
+ </group>
319
+ </coll>
320
+ ```
321
+
322
+ > `colorview="true"` hace que el valor del campo se use como color de la celda del día en el calendario. `datefrom="true"` y `dateto="true"` en el campo `FECHA` definen el rango de días del evento.
323
+
324
+ #### Atributos de estilo del calendarview
325
+
326
+ | Atributo | Descripción |
327
+ |----------|-------------|
328
+ | `calendar-viewmode` | `"month"` (por defecto) o `"week"` para vista semanal |
329
+ | `page-swipe` | `true` permite deslizar entre meses/semanas con el dedo |
330
+ | `bgcolor` | Color de fondo general del calendario |
331
+ | `forecolor` | Color del texto general |
332
+ | `cell-bgcolor` | Color de fondo de las celdas de días |
333
+ | `cell-forecolor` | Color del texto de los días |
334
+ | `cell-border-width` | Grosor del borde de cada celda |
335
+ | `cell-border-color` | Color del borde de cada celda |
336
+ | `cell-align` | Alineacion del contenido de cada celda |
337
+ | `cell-selected-bgcolor` | Color de fondo del día seleccionado |
338
+ | `cell-selected-forecolor` | Color del texto del día seleccionado |
339
+ | `cell-selected-border-color` | Color del borde del día seleccionado |
340
+ | `cell-other-month-bgcolor` | Color de días de otros meses visibles en la vista actual |
341
+ | `weekdays-bgcolor` | Color de fondo de la fila de nombres de día |
342
+ | `weekdays-forecolor` | Color del texto de los nombres de día (admite 7 colores separados por comas: Dom,Lun,Mar,Mie,Jue,Vie,Sab) |
343
+ | `weekdays-fontsize` | Tamaño de fuente de los nombres de día |
344
+ | `weekdays-longname` | `true` nombre largo ("Lunes"), `false` nombre corto ("L") |
345
+ | `week-start-hour` | Hora de inicio en vista semanal (0-23) |
346
+ | `week-end-hour` | Hora de fin en vista semanal (0-23) |
347
+ | `border` | `false` elimina el borde exterior |
348
+ | `textfont-bold` | `true` texto en negrita |
349
+
350
+ #### Clase CSS de ejemplo
351
+
352
+ ```css
353
+ .z_calendario {
354
+ extends: prop;
355
+ cell-border-width: 0;
356
+ cell-align: center;
357
+ align: center;
358
+ fontsize: 11;
359
+ forecolor: #FFFFFF;
360
+ bgcolor: #273238;
361
+ cell-forecolor: #FFFFFF;
362
+ cell-bgcolor: #273238;
363
+ cell-other-month-bgcolor: #777777;
364
+ cell-selected-forecolor: #FABB00;
365
+ cell-selected-bgcolor: #FFFFFF;
366
+ cell-border-color: #273238;
367
+ weekdays-bgcolor: #00000000;
368
+ weekdays-forecolor: #FFFFFF;
369
+ weekdays-fontsize: 5;
370
+ weekdays-longname: false;
371
+ weekdays-align: top|left;
372
+ border-width: 3;
373
+ textfont-bold: true;
374
+ page-swipe: false;
375
+ border: false;
376
+ week-start-hour: 0;
377
+ week-end-hour: 1;
378
+ }
379
+ ```
380
+
381
+ #### Eventos del calendario (en la coleccion de datos)
382
+
383
+ | Evento | Parámetros | Cuando se dispara |
384
+ |--------|------------|-------------------|
385
+ | `ondateselected` | `DATEVALUE`, `TIMEVALUE`, `EVENTVALUE` | El usuario toca un día |
386
+ | `onpageselected` | `DATEVALUE`, `CURRENT`, `DATEFROM`, `TOTALDAYS` | El usuario cambia de mes o semana |
387
+ | `oncelldraw` | `CELLDATE` | Se pinta cada celda (usar con precaucion, puede ser lento) |
388
+
389
+ ```xml
390
+ <ondateselected refresh="true" show-wait-dialog="false"
391
+ refresh-owner="MAP_FECHA,MAP_MES,MAP_ANO">
392
+ <action name="runscript">
393
+ <param name="DATEVALUE" />
394
+ <param name="TIMEVALUE" />
395
+ <param name="EVENTVALUE" />
396
+ <script language="javascript">
397
+ var meses = ["Enero","Febrero","Marzo","Abril","Mayo","Junio",
398
+ "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"];
399
+ selfDataColl.getOwnerObject().MAP_FECHA = DATEVALUE;
400
+ selfDataColl.getOwnerObject().MAP_MES = meses[DATEVALUE.getMonth()].toUpperCase();
401
+ selfDataColl.getOwnerObject().MAP_ANO = DATEVALUE.getFullYear().toString();
402
+ </script>
403
+ </action>
404
+ </ondateselected>
405
+
406
+ <onpageselected refresh="true" show-wait-dialog="false"
407
+ refresh-owner="MAP_FECHA,MAP_MES,MAP_ANO">
408
+ <action name="runscript">
409
+ <param name="DATEVALUE" />
410
+ <param name="CURRENT" />
411
+ <param name="DATEFROM" />
412
+ <param name="TOTALDAYS" />
413
+ <script language="javascript">
414
+ var meses = ["Enero","Febrero","Marzo","Abril","Mayo","Junio",
415
+ "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"];
416
+ selfDataColl.getOwnerObject().MAP_FECHA = DATEVALUE;
417
+ selfDataColl.getOwnerObject().MAP_MES = meses[DATEVALUE.getMonth()].toUpperCase();
418
+ selfDataColl.getOwnerObject().MAP_ANO = DATEVALUE.getFullYear().toString();
419
+ </script>
420
+ </action>
421
+ </onpageselected>
422
+ ```
423
+
424
+ #### Control por JavaScript
425
+
426
+ ```javascript
427
+ // Navegar al mes anterior
428
+ self.getContents("MiCalendario").setVariable("moveto", "prev");
429
+
430
+ // Navegar al mes siguiente
431
+ self.getContents("MiCalendario").setVariable("moveto", "next");
432
+ ```
433
+
434
+ ---
435
+
436
+
437
+
438
+ ```xml
439
+ <coll name="ListaProductos"
440
+ sql="SELECT * FROM ##PREF##Productos"
441
+ objname="Productos" loadall="true">
442
+
443
+ <!-- Filtro de busqueda nativo -->
444
+ <asfilter fontsize="8" left="12" sort="false">
445
+ <field name="NOMBRE" fldname="NOMBRE"
446
+ oper="##FLD## LIKE '##VAL##%'" width="15"
447
+ tooltip="Buscar por nombre">NOMBRE</field>
448
+ <field name="CODIGO" fldname="CODIGO"
449
+ oper="##FLD## LIKE '##VAL##%'" width="10"
450
+ tooltip="Buscar por código" newline="false">CODIGO</field>
451
+ </asfilter>
452
+
453
+ <group name="Lista" id="1">
454
+ <!-- contenido de la lista -->
455
+ </group>
456
+ </coll>
457
+ ```
458
+
459
+ **Atributos del nodo `<asfilter>`:**
460
+
461
+ | Atributo | Descripción |
462
+ |----------|-------------|
463
+ | `fontsize` | Tamaño de fuente de los campos del filtro |
464
+ | `left` | Margen izquierdo del filtro |
465
+ | `sort` | Habilita ordenamiento (`true`/`false`) |
466
+
467
+ **Atributos de `<field>` dentro de `<asfilter>`:**
468
+
469
+ | Atributo | Descripción |
470
+ |----------|-------------|
471
+ | `name` | Nombre del campo de filtro |
472
+ | `fldname` | Nombre del campo real en la tabla |
473
+ | `oper` | Operador SQL. Usa `##FLD##` para el campo y `##VAL##` para el valor ingresado |
474
+ | `width` | Ancho del campo de filtro |
475
+ | `tooltip` | Texto de ayuda |
476
+ | `newline` | Si es `false`, se coloca en la misma linea que el anterior |
477
+
478
+ > **Regla de generación:** Usar `<asfilter>` cuando la lista tenga muchos registros y el usuario necesite busqueda rápida. Para busquedas más personalizadas (con botón y lógica JS), usar el patron de filtrado con `ontextchanged` y `coll.setFilter()` mostrado en la sección 7.7.
479
+