====== Layout del menú (PWA_MENUS) ======
//El menú lateral de SmartPWA —sus categorías, sus secciones y cada opción con
su icono y su destino— también se declara en un texto de configuración
guardado en la base de datos.//
Es el hermano del [[pwa:doc:Documentación diseño de formularios en SmartPWA|layout de los formularios]]: mismo sitio
(un campo ''DESCRIPCION''), mismos [[pwa:doc:Documentación de ámbitos en SmartPWA|ámbitos]] y la misma idea de que
lo que se ve no está compilado en el programa. Lo que cambia es la sintaxis,
que aquí es más sencilla: una línea por opción.
===== Dónde vive =====
En la tabla ''PWA_MENUS'', cuya clave es ''COD_MENU + TIPO_AMBITO +
COD_AMBITO + CLAVE_INSTALACION''.
^ Campo ^ Qué es ^
| ''COD_MENU'' | qué menú es. El de la aplicación se llama ''PRINCIPAL'' |
| ''NOMBRE'' | descripción para quien administra («Menú principal de SmartPWA») |
| ''DESCRIPCION'' | el texto de configuración, que es de lo que va esta página |
| ''ACTIVO'' | ''S'' o ''N'' |
A quién se le aplica cada fila lo resuelve ''PWA_GET_MENU(COD_MENU,
COD_USUARIO)'' con las cinco precedencias de siempre: usuario, usuario del que
hereda, clave de instalación, clave de grupo y general. Está explicado en
[[pwa:doc:Documentación de ámbitos en SmartPWA|Ámbitos: quién ve qué]].
El menú se lee de un solo tirón, así que su límite son **8000
caracteres** (el del layout de un formulario es tres veces mayor). Un menú
completo de los que hay hoy anda por la mitad.
==== El menú nunca se queda vacío ====
Al arrancar, la aplicación pinta el menú en tres pasadas: primero el que lleva
compilado dentro, después el que guardó de la última sesión y, cuando contesta
la base de datos, el que le toca al usuario. Por eso:
* una base de datos a la que todavía no ha llegado el script de ''PWA_MENUS'' enseña el menú de respaldo, sin dar ningún error;
* sin conexión se sigue viendo el de la última vez;
* y **un cambio en la base de datos no se ve hasta la siguiente entrada**, o hasta recargar el menú desde la pantalla de menús.
===== El texto, línea a línea =====
M:Gestión de flota
S:Formularios
Control de vehículos | VEHI_CONTROL | speedometer
Avisos | /avisos | notifications | badge=avisos
^ Línea ^ Qué hace ^
| ''M:nombre'' | abre una **categoría** (lo que en el menú es una pestaña o un bloque) |
| ''S:nombre'' | abre una **sección** dentro de la categoría |
| ''título %%|%% destino %%|%% icono %%|%% opciones'' | una **opción** de la sección abierta |
| //(en blanco)// | se ignora: sirve para separar bloques y que el texto se lea |
| ''-- lo que sea'' | comentario, se ignora |
Repetir un ''M:'' que ya existe no crea otra categoría: sus opciones se suman a
las que ya tenía. Con las secciones pasa lo mismo. Eso permite escribir el
texto por bloques —o pegarle a un menú un trozo de otro— sin que salgan
categorías duplicadas.
Si alguna sección de la categoría tiene nombre, la categoría se pinta como
acordeón; si ninguna lo tiene, sale la lista de opciones sin más.
==== La opción, campo a campo ====
Los cuatro campos van separados por barras verticales. Los espacios sobran, así
que se pueden alinear en columnas para que el texto se lea, que es como están
escritos los menús de hoy.
^ Campo ^ Obligatorio ^ Qué es ^
| **título** | sí | lo que se lee en el menú |
| **destino** | sí | adónde lleva (ver debajo) |
| **icono** | no | nombre del catálogo; sin él, o si no existe, sale el genérico |
| **opciones** | no | pares ''clave=valor'' separados por punto y coma |
=== El destino ===
^ Se escribe ^ Adónde va ^
| ''VEHI_CONTROL'' | al listado genérico de esa tabla (''/tabla-list-wrap/VEHI_CONTROL'') |
| ''/consultas/ALR_FICHA_VEHICULO'' | a esa consulta |
| ''/planificador'', ''/avisos'' | a una pantalla propia de la aplicación |
La regla es simple: **si empieza por barra, es una ruta; si no, es una tabla**.
=== Las opciones ===
^ Se escribe ^ Qué hace ^
| ''badge=avisos'' | pinta junto al título el contador de avisos pendientes |
| ''id=algo'' | identificador estable de la opción, para poder renombrarla sin perder su ancla |
| ''defecto.CAMPO=valor'' | el listado propone ese valor al crear un registro nuevo |
| ''cualquier=cosa'' | va como parámetro de la pantalla de destino; el más usado es ''titulo='' |
Clientes | TERCERO | people | titulo=Clientes; defecto.TIPO=CL
Esa línea abre el listado de terceros titulado «Clientes» y, al dar de alta,
propone el tipo ''CL''. Es la manera de sacar del mismo listado varias
opciones de menú distintas: clientes, proveedores y empleados son la misma
tabla ''TERCERO'' con distinto valor por defecto.
=== Los iconos ===
Se nombran sin sufijo (''people'', ''car'', ''document-text''), y la aplicación
pinta la variante que corresponde. Solo valen los del catálogo; los que no
estén salen con el icono genérico (''ellipse''), sin dar error. La opción
**Comprobar el texto** de la pantalla de menús dice cuáles no ha reconocido.
Para añadir un icono nuevo hay que meterlo en el catálogo del programa
(''menu/iconos-menu.ts''), que es un cambio de versión: al escribir un menú
conviene quedarse en los que ya hay.
===== Ejemplos =====
==== Una categoría con tres secciones ====
M:Gestión de flota
S:Formularios
Control de vehículos | VEHI_CONTROL | speedometer
Siniestros | VEHI_SINIESTRO | warning
Contratos de vehículos | VEHI_CAB_CONTRATO | document
Avisos | /avisos | notifications | badge=avisos
S:Configuración
Vehículos | /consultas/ALR_FICHA_VEHICULO | car
Perfiles documento | DOC_PERFIL | document-text
S:Informes
Flota de vehículos | /consultas/ALR_VEHICULOS_FLOTA | car
Vehículos alquilados | /consultas/ALR_VEHICULOS_ALQUILADOS | car
Resumen facturación | /consultas/ALV_DIARIO_FACTURAS_DELEG | stats-chart
Es como está montado el menú de flota: los formularios con los que se trabaja,
lo que se configura de tarde en tarde y los informes, separados.
==== Una categoría sin secciones ====
M:Procesos
Borrar lote asientos | /ejecutar-proceso/BORRAR_LOTE_ASIENTOS | trash
Dotación amortizaciones | /ejecutar-proceso/CONTAB_AMORT2 | calculator
Sin ninguna ''S:'', la categoría enseña sus opciones seguidas, sin acordeón. Y
un destino ''/ejecutar-proceso/PROC'' lleva a la pantalla que pide los
parámetros de un proceso y lo lanza.
==== Varias opciones sobre el mismo listado ====
M:Terceros
S:Formularios
Clientes | TERCERO | people | titulo=Clientes; defecto.TIPO=CL
Proveedores | TERCERO | briefcase | titulo=Proveedores; defecto.TIPO=PR
Empleados | TERCERO | person | titulo=Empleados; defecto.TIPO=EM
Bancos | TERCERO | cash | titulo=Bancos; defecto.TIPO=BA
==== Texto comentado ====
-- Menú de la instalación 026: sin alquiler y sin planificador.
M:Taller
S:Formularios
Partes de avería | CAB_PARTE_AVERIA | construct
-- Pendiente de que entre en producción el nuevo circuito de garantías:
-- Garantías | GARANTIA_PARTE | warning
Comentar una línea con ''--'' es la manera de quitar una opción sin perderla,
que en un menú por instalación se agradece.
===== Comprobar antes de dar por bueno un cambio =====
El menú se edita en **Menús** (''/menus''), y su propio menú de acciones trae:
^ Opción ^ Para qué ^
| **Comprobar el texto** | dice cuántas categorías y opciones salen, qué iconos no están en el catálogo y qué líneas no ha entendido, //sobre lo que hay escrito en pantalla//, antes de guardar |
| **Comparar con el general** | enseña lo que tiene el menú general y a este ámbito le falta |
| **Copiar a otro ámbito** | duplica esta definición para un usuario, una instalación o un grupo |
| **Copiar script de actualización** / **Descargar script (.sql)** | el ''UPDATE OR INSERT'' listo para llevar el cambio a otra base de datos |
Lo de **Comparar con el general** importa más de lo que parece: cada ámbito
describe el menú **entero**, no un parche. Una instalación con menú propio no
se entera de las opciones nuevas que se añadan al general, y esa comparación es
lo que lo pone de manifiesto. Está explicado en [[pwa:doc:Documentación de ámbitos en SmartPWA|Ámbitos: quién ve qué]].
===== Recetas =====
^ Lo que se quiere ^ Cómo se escribe ^
| Un bloque nuevo en el menú | ''M:Tesorería'' |
| Separar dentro de él lo que se configura | ''S:Configuración'' |
| Una opción a un listado de tabla | ''Clientes %%|%% TERCERO %%|%% people'' |
| Una opción a una consulta | ''Flota %%|%% /consultas/ALR_VEHICULOS_FLOTA %%|%% car'' |
| Ponerle otro título al listado | ''titulo=Clientes'' |
| Que el alta proponga un valor | ''defecto.TIPO=CL'' |
| El contador de avisos al lado del título | ''badge=avisos'' |
| Quitar una opción sin perderla | comentar la línea con ''--'' |
| Que una instalación no vea una categoría | borrar esas líneas de **su** fila de ''PWA_MENUS'' |
===== Cómo se mantiene esta página =====
Como la de los formularios: **se actualiza en el mismo cambio** en que se toca
la sintaxis.
^ Qué ^ Dónde ^
| Lectura del texto del menú | ''projects/smart-core/src/lib/menu/menu-config.ts'' |
| Catálogo de iconos | ''projects/smart-core/src/lib/menu/iconos-menu.ts'' |
| Lectura por ámbito, caché y respaldo | ''projects/smart-core/src/lib/servicios/menu.service.ts'' |
| Pantalla de edición | ''projects/smart-core/paginas/src/lib/pwa-menu-edit/'' |
| Menús versionados y sus procedimientos | ''db/pwa_menus_datos.sql'', ''db/pwa_menus_procs.sql'' |