Skip to main content

Agregar elementos de menú

Un módulo con backend suele necesitar entradas en el menú lateral del administrador o en el menú de configuración. Para eso, el módulo declara un proveedor de menú que se descubre automáticamente y engancha sus nodos en el árbol de menús del núcleo (ver Menús).

El proveedor de menú del módulo

Crea una clase que derive de AdminMenuProveedor y sobrescribe ConstruirMenuBase, que recibe el nodo del árbol de menús donde puedes adjuntar tus elementos:

using Crono.Colecciones;
using Crono.Nucleo.Contenidos.Menus;
using Crono.Web.Renderizacion.Constructores;

public class AdminMenu : AdminMenuProveedor
{
protected override void ConstruirMenuBase(ArbolNodo<MenuElemento> nodoModulos)
{
// Ubica el nodo padre existente (por su Id) al que quieres colgarte.
var nodoContabilidad = nodoModulos.Raiz.SeleccionarNodoPorId("contabilidad");
if (nodoContabilidad is null)
return;

var comprobantes = new MenuElemento().AlConstructor()
.Id("contabilidad-comprobantes")
.Texto("Comprobantes electr.")
.ClaveRecurso("Admin.Contabilidad.ComprobantesElectronicos")
.NombresPermisos(FacturacionPermisos.ComprobanteElectronico._)
.Accion("Lista", "ComprobantePago", new { area = "Contabilidad" })
.ComoElemento();

nodoContabilidad.Adjuntar(comprobantes, "contabilidad-comprobantes");
}
}

El constructor de MenuElemento

El patrón fluido new MenuElemento().AlConstructor()...ComoElemento() arma cada entrada. Métodos habituales:

MétodoEfecto
.Id("...")Identificador único del nodo (clave para adjuntarlo y para que otros lo referencien).
.Texto("...")Texto por defecto.
.ClaveRecurso("...")Clave de recurso de idioma para el texto localizado (tiene prioridad sobre Texto).
.NombresPermisos(...)Permiso(s) requeridos; el elemento se oculta si el usuario no los tiene (ver Seguridad).
.Accion("Accion", "Controlador", new { area = "..." })Ruta MVC a la que apunta el elemento.

Adjuntar y jerarquía

nodo.Adjuntar(elemento, "id") cuelga el elemento del nodo y devuelve el nodo recién creado, sobre el que puedes adjuntar hijos:

var nodoComprobantes = nodoContabilidad.Adjuntar(comprobantes, "contabilidad-comprobantes");

var detalle = new MenuElemento().AlConstructor()
.Id("contabilidad-comprobantes-detalle")
.Texto("Detalle")
.ClaveRecurso("Admin.Contabilidad.ComprobantesElectronicos.Detalle")
.Accion("Detalle", "ComprobantePago", new { area = "Contabilidad" })
.ComoElemento();
detalle.Oculto = true; // accesible por ruta pero no visible en el menú
nodoComprobantes.Adjuntar(detalle, "contabilidad-comprobantes-detalle");

La propiedad Oculto = true es útil para páginas de detalle o edición: existen en el árbol (para migas de pan y resolución de ruta) pero no aparecen como opción del menú.

Menú lateral y menú de configuración

Un mismo proveedor puede aportar a varios menús. El módulo de facturación, por ejemplo, engancha su listado en el menú lateral de contabilidad y sus catálogos (tipos de documento, numeraciones) bajo el nodo de configuración configuracion-contabilidad, seleccionando cada nodo padre por su Id y adjuntando allí sus elementos.

tip

Localiza siempre el texto con .ClaveRecurso(...) en lugar de dejar solo .Texto(...), y declara los textos en el recursos.{cultura}.xml del módulo (ver Localización de módulos).