Modulo: @nebula-shared/data-access
Tipo: Mecanismo transversal (store + base CRUD)
Responsabilidad: Exponer, al abrir cada vista, las acciones disponibles del usuario para esa opcion y gobernar los botones.
Ultima actualizacion: Julio 2026 | Version: 1.0.0
La autorizacion de Nebula tiene dos contextos (ver arquitectura: Catalogo de Acciones y Roles):
v_menu). Ya resuelto y viaja en el rol del JWT.LIST, VIEW, CREATE, EDIT, DELETE, EXPORT, APPROVE, ANNUL, …). Lo resuelve Simappe (backend) por opcion, aplicando roles y precedencia.Principio clave del front: el frontend no decide ni resuelve acciones (roles, precedencia y colisiones ya vienen resueltos del backend). Solo consume el mapa { actionCode: boolean } que Simappe entrega por opcion y cablea los botones.
El flujo elegido es "traer el menu y filtrar al abrir la opcion": se carga una vez el menu con acciones y, al abrir una vista, se leen las acciones de la opcion activa (por la ruta).
El patron base (AbstractCrudComponent) resuelve las etiquetas de UI por i18n, no con texto fijo:
t(key) → TranslationService.translate(key).ACTIONS.CREATE, ACTIONS.EXPORT, ACTIONS.IMPORT, ACTIONS.SAVE, ACTIONS.CONSULT, etc.libs/shared/data-access/src/lib/i18n/ (es.json / en.json); al cambiar de idioma el base reconstruye la tabla y re-renderiza titulos/botones.Asi, el cableado de acciones (que boton se muestra) y su etiqueta (i18n) son responsabilidades separadas y ambas transversales.
Tres piezas, todas en el repo nebula-erp:
AuthorizationStore (shared/data-access/src/lib/auth/authorization.store.ts)POST /simappe-admin/api/v1/menu-with-actions/by-roles con los roleIds del usuario.Map<segmento-de-ruta, { actionCode: boolean }> (segmento = ultimo tramo significativo del path de la opcion, p. ej. tipo-plan).actionsForRoute(url), can(url, code) y el signal snapshot (para reactividad).SidebarService (hook de carga)authorizationStore.load(). No altera el arbol de accesos existente.AbstractCrudComponent (dotar la herencia)Router. En ngOnInit resuelve la opcion activa por la ruta y deja disponible el signal availableActions con { actionCode: boolean }.gateActionsByPermissions() — hook, default false.grantedAction(code) — con gating off deja todo igual; con gating on exige que la accion venga true.headerActions() — Importar/Exportar/Crear se muestran ademas si su accion esta granted.buildTableConfig() — filtra las row-actions (ver/editar/eliminar) por permiso.effect reconstruye la tabla cuando el store termina su carga asincrona y en cambio de idioma.Techo + permiso: un boton se muestra si la pantalla lo implementa (hasCreateFeature, hasExportFeature, la row-action existe) y la accion viene true. El gating nunca agrega botones que la pantalla no implementa.
AbstractCrudComponent.gateActionsByPermissions() para devolver true.Configurar que rol tiene que accion en que opcion es administracion de datos en Simappe (modulo de seguridad), no del front.
Pais / Departamento / Ciudad (GeoExportReadonlyListComponent) fueron el primer caso adherido:
LIST, SEARCH, VIEW, EXPORT.EXPORT viene true; Ver (row) solo si VIEW; Crear nunca (la pantalla es de solo lectura).AbstractCrudComponent (@nebula-shared/data-access).| Version | Fecha | Descripcion |
|---|---|---|
| 1.0.0 | 2026-07-01 | Creacion. Mecanismo de acciones por opcion (Flujo 2) sobre el patron base + i18n + piloto geografico. |