====== 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'' |