Version: 3.0
Fecha: 06 de Abril, 2026
Contexto: Evaluacion tecnica basada en el codigo fuente real de nebula-erp y nebula-ui-kit (branch develop), para definir como Nebula Vault consume las librerias existentes y publica su propia libreria @nebula/vault para integracion futura con nebula-erp.
Arquitecto: Carlos Alberto Torres Camargo
Clasificacion: Interno — Arquitectura
Repositorios evaluados:
https://gitlab.centricasoluciones.com/nebula/frontend/nebula-erp.git (branch develop, commit 9a630a1)https://gitlab.centricasoluciones.com/nebula/frontend/nebula-ui-kit.git (branch develop, commit d26be14, v0.2.1)Documentar el estado tecnico real de las librerias del ecosistema Nebula frontend y definir los requerimientos para que Nebula Vault las consuma correctamente, y a su vez publique @nebula/vault como libreria reutilizable para que nebula-erp integre gestion documental en el futuro.
Repositorio: nebula/frontend/nebula-ui-kit
Build system: ng-packagr 21.2.0
Angular: 21.2.x
UI base: Angular Material 21.2 + Angular CDK 21.2
Iconos: Lucide Angular 0.577.0 (80+ iconos registrados)
Estilos: SCSS con Material Design 3 tokens (NO Tailwind, NO PrimeNG)
Estado de publicacion: No publicado en Nexus — se consume como dependencia directa en nebula-erp
Layout y Navegacion (4):
| Componente | Inputs | Outputs | Estado |
|---|---|---|---|
HeaderComponent |
title, logoUrl, logoAlt, user, isDarkMode, showSearch |
search, searchSubmit, darkModeToggle, refresh, notificationsClick, profileClick, logout |
Funcional |
SidebarComponent |
menuItems, isLoading, collapsed, logoUrl, logoAlt, activeItemIds |
itemClick, collapsedChange |
Funcional |
BreadcrumbComponent |
items (required), separator |
navigate |
Funcional |
FooterComponent |
variant, date, status |
— | Funcional |
Controles de Formulario (8):
| Componente | Inputs clave | CVA | Estado |
|---|---|---|---|
ButtonComponent |
variant (primary|secondary|icon|success|warning|danger), loading, disabled, prefixIcon, suffixIcon |
No | Funcional |
InputComponent |
label, type (text|password|email|number), placeholder, clearable, prefixIcon, suffixIcon, errorStateMatcher |
Si | Funcional |
SelectComponent |
label, options, multiple, searchable, panelClass, errorStateMatcher |
Si | Funcional |
TextareaComponent |
label, rows, maxLength, resize, errorStateMatcher |
Si | Funcional |
DatepickerComponent |
label, minDate, maxDate, range, errorStateMatcher |
Si | Funcional |
CheckboxComponent |
label, indeterminate |
Si | Funcional |
RadioComponent |
label, name, options, vertical |
Si | Funcional |
FileUploadComponent |
label, hint, accept, multiple, maxSizeBytes, buttonLabel, dragLabel |
No | Funcional |
CVA = ControlValueAccessor (integrable con Reactive Forms)
Datos y Tablas (2):
| Componente | Inputs | Features | Estado |
|---|---|---|---|
TableComponent |
config (TableConfig<T>), data, loading, selectable, pageSizeOptions |
Sorting, paginacion (Material Paginator), busqueda global, seleccion multiple, templates custom por celda, acciones con iconos, formateo (currency, percent, date) | Funcional |
GridCardComponent |
items (required), loading |
Grid responsivo con cards, badges, iconos | Funcional |
Navegacion y Tabs (2):
| Componente | Inputs | Features | Estado |
|---|---|---|---|
TabsComponent |
tabs, showClose, ariaLabel + TabItemComponent + TabContentDirective |
Tabs imperativos o declarativos, navegacion por teclado, lazy-load, sincronizacion con NebulaNavigationService |
Funcional |
SearchComponent |
placeholder, debounceMs, showClearButton, loading |
Debounce, teclas Escape/Enter, boton clear | Funcional |
Feedback y Overlays (3):
| Componente | Mecanismo | Features | Estado |
|---|---|---|---|
AlertComponent |
Input-based | Auto-close configurable por tipo, iconos semanticos, aria-live |
Funcional |
DialogComponent |
DialogService.open() programatico |
Tamanos sm|md|lg|xl|full, header/body/footer directives | Funcional |
ConfirmDialogComponent |
DialogService.confirm() |
Retorna Observable<boolean>, variantes de severidad |
Funcional |
Elements — Atomos (3):
| Componente | Inputs | Estado |
|---|---|---|
IconComponent |
name (IconName), size, strokeWidth, color |
Funcional — 80+ iconos Lucide |
BadgeComponent |
text, variant (7 variantes M3), size, customColor |
Funcional |
SkeletonComponent |
variant (text|circle|rectangle|chip), animation, count, direction |
Funcional |
| Servicio | Scope | Proposito |
|---|---|---|
NebulaNavigationService |
providedIn: 'root' |
Gestion de tabs y navegacion por contexto. Soporta multi-workspace, persistencia en localStorage con ofuscacion XOR, guard nebulaTabGuard |
FormatService |
providedIn: 'root' |
Formateo estandarizado: currency (COP), date (es-CO), percent, number |
// Token: NEBULA_UI_CONFIG
interface NebulaUIConfig {
requiredMessage: string; // default: 'Este campo es obligatorio'
selectPlaceholder: string; // default: 'Seleccione una opción'
datepickerLabel: string; // default: 'Seleccione una fecha'
datepickerPlaceholder: string; // default: 'DD/MM/AAAA'
tableEmptyDash: string; // default: '-'
locale: string; // default: 'es-CO'
getConnectionStatus?: () => boolean;
alertDurations?: { success?: number; error?: number; warning?: number; info?: number };
navStorageKey?: string;
encryptionKey?: string;
}
Basado en SCSS con Material Design 3 tokens:
| Token | Valor |
|---|---|
| Primary | #0E58A9 (Tech Blue) |
| Secondary | #163A73 (Regal Navy) |
| Accent | #2ABBE2 (Sky Surge) |
| Success | #2E7D32 |
| Error | #D32F2F |
| Warning | #E6A017 |
| Info | #0284C7 |
| Dark bg | #233255 |
| Border radius | 12px |
| Font | Inter |
| Transitions | cubic-bezier(0.4, 0, 0.2, 1) 0.3s |
Todos los componentes siguen:
standalone: trueChangeDetectionStrategy.OnPushinput() / model() (Signals Angular 21)output()signal() + computed()Repositorio: nebula/frontend/nebula-erp
Angular: 21.1.0
Nx: 22.5.4
TypeScript: 5.9.2
Testing: Vitest 4.0.18 + Playwright 1.58.2
Dependencia de ui-kit: nebula-ui-kit: 0.2.1
@nebula/shared/data-access (scope:shared, type:data-access)
| Export | Tipo | Implementacion |
|---|---|---|
AuthService |
Injectable | Login, logout, refreshToken, isAuthenticated, getToken, hasRole, hasAllRoles. Manejo de JWT con refresh queue para 401 concurrentes. Cookie segura para perfil (SameSite=Strict, 2 dias). Extrae: id, username, email, roles, permissions, companyId, customerId |
HttpService |
Injectable | Wrapper tipado: get<T>(), post<T>(), put<T>(), delete<T>(). Headers custom y opciones |
tokenInterceptor |
HttpInterceptorFn | Inyecta Authorization: Bearer {token} en toda request |
errorInterceptor |
HttpInterceptorFn | Manejo global de errores HTTP |
ApiConfigService |
Injectable | Configuracion de API (base URL) |
TenantContextService |
Injectable | Provee companyId, clientId del JWT activo |
authGuard |
CanActivateFn | Protege rutas autenticadas |
loginGuard |
CanActivateFn | Redirige usuarios ya autenticados |
@nebula/shared/domain (scope:shared, type:domain)
| Export | Tipo | Descripcion |
|---|---|---|
ApiResponse<T> |
Interface | Envelope generico para respuestas de API |
BaseDto |
Interface | DTO base (id, status, timestamps, version) |
@nebula/shared/util (scope:shared, type:util)
| Export | Tipo | Estado |
|---|---|---|
| Helpers | Funciones | Implementados como patrones ejemplo |
| Pipes | Angular Pipes | Patron ejemplo |
| Validators | Funciones | Patron ejemplo |
| Constants | Constantes | Patron ejemplo |
@nebula/shared/master (scope:shared, type:feature)
| Export | Tipo | Descripcion |
|---|---|---|
StateService |
Injectable | Persistencia de estado por componente: getState(), setState(), clearState() |
@nebula/shared/domain → libs/shared/domain/src/index.ts
@nebula/shared/util → libs/shared/util/src/index.ts
@nebula/shared/master → libs/shared/master/src/index.ts
@nebula/shared/data-access → libs/shared/data-access/src/index.ts
@nebula/shared/styles/* → libs/shared/styles/src/*
@nebula/login → libs/login/src/index.ts
@nebula/layout → libs/layout/src/index.ts
@nebula/company → libs/company/src/index.ts
@nebula/products → libs/products/src/index.ts
@nebula/accounting → libs/accounting/src/index.ts
@nebula/tesoreria → libs/tesoreria/src/index.ts
@nebula/budget → libs/budget/src/index.ts
| Libreria | Componentes | Descripcion |
|---|---|---|
login |
LoginComponent + LoginService | Formulario reactivo, integracion AuthService, redirige a /layout/company |
company |
CompanyComponent + CompanyService | Tabla con busqueda/sort para seleccion de empresa. Actualiza JWT |
products |
ProductsComponent + ProductsService | Grid de modulos ERP disponibles. Redirige al modulo seleccionado |
layout |
LayoutComponent, SidebarWrapper, TopbarWrapper, BreadcrumbWrapper, FooterWrapper, TabContainerComponent | Shell principal. Sidebar, topbar, breadcrumb, footer, dark mode, tabs por modulo |
accounting |
AccountingComponent + 4 sub-vistas (home, master, cost-center, cost-center-type, ciudades) | Tab-based via TabContainerComponent |
budget |
BudgetComponent + 3 sub-vistas (home, funding, parameters, resource-type) | Tab-based via TabContainerComponent |
tesoreria |
TesoreriaComponent + 2 sub-vistas (home, bank-accounts, embargos) | Tab-based via TabContainerComponent |
/login → LoginComponent
│
▼ (login exitoso)
/layout/company → CompanyComponent (seleccion de empresa)
│
▼ (empresa seleccionada, JWT actualizado)
/layout/products → ProductsComponent (grid de modulos)
│
▼ (modulo seleccionado)
/layout/{accounting|budget|tesoreria} → TabContainerComponent
│
└── Sub-tabs lazy-loaded por modulo
EQUIPO FRONTEND PRIMARIO EQUIPO NEBULA VAULT
──────────────────────── ─────────────────────
Mantiene y publica: Consume:
nebula-ui-kit v0.2.1+ nebula-ui-kit (dependencia directa)
nebula-erp/libs/shared/* @nebula/shared/* (path alias o paquete)
Mantiene y publica:
Consume en el futuro: @nebula/vault (domain + data-access + api)
@nebula/vault ◄───────────────────────────── └── Nexus npm privado
Solo se publican las capas reutilizables. Los features (UI) son internos del workspace.
@nebula/vault (paquete npm) nebula-vault workspace (INTERNO)
─────────────────────────── ─────────────────────────────────
SE PUBLICA: NO SE PUBLICA:
domain/ vault/feature-projects/
project.model.ts vault/feature-upload/
ingest.model.ts vault/feature-files/
file.model.ts vault/feature-repository/
preservation.model.ts preservation/feature-*/
retention.model.ts retention/feature-*/
legal-hold.model.ts legal-hold/feature-*/
cloud.model.ts cloud/feature-*/
dashboard.model.ts shared-vault/feature-*/
audit.model.ts shared-vault/ui/ (componentes especificos)
notification.model.ts apps/vault-shell/
data-access/
vault.service.ts
preservation.service.ts
retention.service.ts
legal-hold.service.ts
cloud.service.ts
dashboard.service.ts
audit.service.ts
notification.service.ts
api/
vault.facade.ts
Punto de entrada unico que nebula-erp usara en el futuro:
@Injectable({ providedIn: 'root' })
export class VaultFacade {
private projectService = inject(ProjectService);
private preservationService = inject(PreservationService);
private retentionService = inject(RetentionPolicyService);
private legalHoldService = inject(LegalHoldService);
private cloudService = inject(CloudService);
private dashboardService = inject(DashboardService);
// Proyectos
getProjects(): Observable<ApiResponse<Project[]>>;
getProject(id: number): Observable<ApiResponse<Project>>;
createProject(data: Partial<Project>): Observable<ApiResponse<Project>>;
// Ingesta
uploadFiles(projectId: number, files: File[]): Observable<UploadProgress>;
getIngestStatus(ingestId: number): Observable<ApiResponse<IngestStatus>>;
// Repositorio
browseFiles(path: string): Observable<ApiResponse<VaultFile[]>>;
searchFiles(query: string): Observable<ApiResponse<VaultFile[]>>;
downloadFile(fileId: number): Observable<Blob>;
// Preservacion
getPreservationStatus(fileId: number): Observable<ApiResponse<PreservationStatus>>;
runDiagnostic(fileId: number): Observable<ApiResponse<DiagnosticResult>>;
// Retencion
getRetentionPolicies(): Observable<ApiResponse<RetentionPolicy[]>>;
getDocumentsUnderRetention(): Observable<ApiResponse<DocumentRetention[]>>;
// Legal Hold
getLegalHolds(): Observable<ApiResponse<LegalHold[]>>;
assignDocumentToHold(holdId: number, docId: number): Observable<ApiResponse<void>>;
// Cloud
getCloudStatus(): Observable<ApiResponse<CloudStatus>>;
// Dashboard
getDashboardStats(): Observable<ApiResponse<DashboardStats>>;
}
Nota: Usa
ApiResponse<T>de@nebula/shared/domain, no un wrapper propio.
{
"name": "@nebula/vault",
"peerDependencies": {
"@angular/core": "^21.0.0",
"@angular/common": "^21.0.0",
"rxjs": "~7.8.0"
}
}
@nebula/vault depende de Angular y RxJS como peer dependencies. Los services internos usan HttpClient directamente; el interceptor de token ya esta configurado a nivel de la app consumidora (nebula-erp o vault-shell).
@nebula/vault/domain → No depende de nada (leaf node, solo tipos)
@nebula/vault/data-access → Depende de: @nebula/vault/domain, @angular/common/http
@nebula/vault/api → Depende de: @nebula/vault/data-access, @nebula/vault/domain
Diagrama del ecosistema:
┌────────────────────┐
│ @nebula/shared │
│ data-access │ (AuthService, HttpService,
│ domain │ tokenInterceptor, authGuard,
│ util │ TenantContextService, ApiResponse<T>)
│ master │
└─────────┬──────────┘
│
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌───────────┐ ┌──────────────┐
│nebula-ui-kit │ │@nebula/ │ │ futuros │
│ v0.2.1+ │ │vault │ │ @nebula/* │
│ │ │ domain │ │ │
│ 22 comps │ │ data-acc │ │ │
│ 3 elements │ │ api │ │ │
│ 2 services │ │ │ │ │
└──────┬───────┘ └─────┬─────┘ └──────────────┘
│ │
│ ┌──────────┼──────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌──────────────┐ ┌──────────────┐
│ nebula-vault │ │ nebula-erp │
│ (workspace) │ │ (workspace) │
│ │ │ │
│ features/* │ │ Solo importa │
│ (INTERNAS) │ │ @nebula/vault│
└──────────────┘ └──────────────┘
Estado actual: La libreria funciona pero no esta publicada. nebula-erp la consume como dependencia directa (posiblemente link local o git dependency).
Requerimiento: Publicar nebula-ui-kit en Nexus npm privado para que nebula-vault pueda instalarla de forma independiente.
| # | Criterio | Estado Actual | Requerido |
|---|---|---|---|
| 1 | Compilacion con ng-packagr | No compilada (sin dist/) |
npm run build genera artefacto |
| 2 | Publicada en Nexus | No | npm publish --registry=https://nexus.centricasoluciones.com/repository/npm/ |
| 3 | Nombre del paquete | nebula-ui-kit (sin scope) |
Mantener o migrar a @nebula/ui-kit |
| 4 | Version | 0.2.1 | Continuar semver |
| 5 | Peer dependencies declaradas | Angular 21.2, Material 21.2, CDK 21.2, Lucide 0.577 | Verificar en package.json del artefacto |
Estado actual: Las shared libs viven dentro del workspace Nx de nebula-erp como librerias internas. No estan publicadas como paquete npm independiente.
Requerimiento: Extraer y publicar @nebula/shared como paquete npm para que nebula-vault lo consuma de forma independiente.
| # | Criterio | Estado Actual | Requerido |
|---|---|---|---|
| 1 | @nebula/shared/domain exporta ApiResponse<T>, BaseDto |
Implementado | Publicar |
| 2 | @nebula/shared/data-access exporta AuthService, HttpService, tokenInterceptor, errorInterceptor, authGuard, loginGuard, TenantContextService |
Implementado | Publicar |
| 3 | @nebula/shared/util exporta helpers, pipes, validators |
Parcial (patrones ejemplo) | Completar lo minimo y publicar |
| 4 | @nebula/shared/master exporta StateService |
Implementado | Publicar |
| 5 | Compilacion independiente con ng-packagr | No existe (es lib Nx interna) | Crear ng-package.json y pipeline de build |
| 6 | Publicada en Nexus | No | Publicar como @nebula/shared con sub-entry points |
Si la publicacion formal toma tiempo, hay dos alternativas funcionales:
Opcion A — Git dependency:
{
"nebula-ui-kit": "git+https://gitlab.centricasoluciones.com/nebula/frontend/nebula-ui-kit.git#v0.2.1",
"@nebula/shared": "git+https://gitlab.centricasoluciones.com/nebula/frontend/nebula-erp.git#develop"
}
Opcion B — Git submodule de shared:
# En nebula-vault workspace
git submodule add https://gitlab.centricasoluciones.com/nebula/frontend/nebula-erp.git external/nebula-erp
# tsconfig paths apuntan a external/nebula-erp/libs/shared/*/src/index.ts
Ambas son workarounds temporales. El estado objetivo es publicacion en Nexus.
Relacion entre componentes reales de nebula-ui-kit v0.2.1 y los modulos de Nebula Vault:
| Modulo Vault | Componentes ui-kit que usara | Uso principal |
|---|---|---|
| Ingesta (projects, upload) | TableComponent, ButtonComponent, InputComponent, SelectComponent, FileUploadComponent, DialogComponent, AlertComponent, SearchComponent |
CRUD proyectos, carga de archivos, validacion |
| Repositorio (file browser) | TableComponent, SearchComponent, BreadcrumbComponent, ButtonComponent, IconComponent, SkeletonComponent |
Navegacion de archivos, busqueda, descarga |
| Preservacion | TableComponent, BadgeComponent, AlertComponent, GridCardComponent, SkeletonComponent |
Dashboard de estado, diagnostico, metricas |
| Retencion | TableComponent, InputComponent, SelectComponent, DatepickerComponent, DialogComponent, ConfirmDialogComponent |
CRUD politicas, calendario de retencion, suspension |
| Legal Hold | TableComponent, SearchComponent, DialogComponent, ConfirmDialogComponent, CheckboxComponent |
CRUD casos, asignacion documentos |
| Cloud | TableComponent, BadgeComponent, AlertComponent, ButtonComponent |
Estado daemon, logs de sync |
| Dashboard | GridCardComponent, BadgeComponent, SkeletonComponent, TabsComponent |
Metricas, estadisticas, actividad |
| Auditoria/Reportes | TableComponent, SearchComponent, DatepickerComponent, SelectComponent, ButtonComponent |
Log filtrable, exportacion |
| Admin/Config | TableComponent, InputComponent, SelectComponent, TextareaComponent, CheckboxComponent, RadioComponent |
Configuracion de modulos, servidores, permisos |
| Shell (layout) | SidebarComponent, HeaderComponent, BreadcrumbComponent, FooterComponent, TabsComponent |
Layout principal de vault-shell |
Estos componentes son especificos del dominio de gestion documental y se crearan dentro del workspace nebula-vault en libs/shared-vault/ui/:
| Componente | Proposito | Razon de no estar en ui-kit |
|---|---|---|
VaultFilePreviewComponent |
Preview de documentos (PDF, imagen, texto) dentro del repositorio | Logica de preview especifica de OAIS |
PreservationStatusBadge |
Indicador visual de estado de preservacion (optimo, atencion, critico) | Semantica especifica de preservacion digital |
OaisStatusIndicator |
Estado del pipeline OAIS (SIP→AIP→DIP) | Concepto exclusivo de gestion documental |
UploadProgressTracker |
Progreso detallado de carga masiva con estados por archivo | Logica de ingesta multi-archivo |
FolderTreeComponent |
Arbol de carpetas con permisos y navegacion | Navegacion jerarquica de repositorio |
RetentionCalendarComponent |
Calendario visual de vencimientos de retencion | Logica de calendario de retencion |
nebula-vault/
├── apps/
│ ├── vault-shell/ App Angular standalone
│ └── vault-shell-e2e/ Playwright E2E
├── libs/
│ ├── vault/
│ │ ├── domain/ Interfaces (Project, Ingest, File, Upload, Folder)
│ │ ├── data-access/ Services HTTP (ProjectService, IngestService, FileService)
│ │ ├── feature-projects/ SmartTable + CRUD proyectos
│ │ ├── feature-upload/ FileUpload + progress + batch
│ │ ├── feature-files/ FileBrowser + subfolder navigation
│ │ ├── feature-repository/ Search + preview + download
│ │ └── shell/ Routes lazy-loaded
│ ├── preservation/
│ │ ├── domain/
│ │ ├── data-access/
│ │ ├── feature-dashboard/
│ │ ├── feature-diagnostic/
│ │ └── shell/
│ ├── retention/
│ │ ├── domain/
│ │ ├── data-access/
│ │ ├── feature-policies/
│ │ ├── feature-documents/
│ │ └── shell/
│ ├── legal-hold/
│ │ ├── domain/
│ │ ├── data-access/
│ │ ├── feature-cases/
│ │ └── shell/
│ ├── cloud/
│ │ ├── domain/
│ │ ├── data-access/
│ │ ├── feature-status/
│ │ └── shell/
│ ├── shared-vault/
│ │ ├── domain/ Interfaces compartidas entre modulos vault
│ │ ├── data-access/ VaultHttpService (base URL /api/vault/)
│ │ ├── feature-dashboard/ Dashboard principal
│ │ ├── feature-audit/ Log de auditoria
│ │ ├── feature-reports/ Reportes
│ │ ├── feature-notifications/ Notificaciones
│ │ ├── feature-admin/ Config de modulos, servidores, permisos
│ │ └── ui/ Componentes visuales especificos de vault
│ └── vault-api/ VaultFacade (lo que se publica en @nebula/vault/api)
├── package.json
├── nx.json
├── tsconfig.base.json
└── eslint.config.mjs
Basado en el stack real de nebula-erp:
{
"dependencies": {
"@angular/animations": "~21.1.0",
"@angular/cdk": "~21.1.0",
"@angular/common": "~21.1.0",
"@angular/compiler": "~21.1.0",
"@angular/core": "~21.1.0",
"@angular/forms": "~21.1.0",
"@angular/material": "~21.1.0",
"@angular/platform-browser": "~21.1.0",
"@angular/platform-browser-dynamic": "~21.1.0",
"@angular/router": "~21.1.0",
"nebula-ui-kit": "0.2.1",
"lucide-angular": "^0.577.0",
"rxjs": "~7.8.0",
"dayjs": "^1.11.20"
},
"devDependencies": {
"nx": "22.5.4",
"@nx/angular": "22.5.4",
"@nx/eslint": "22.5.4",
"@nx/vitest": "22.5.4",
"@nx/playwright": "22.5.4",
"typescript": "~5.9.2",
"vitest": "^4.0.18",
"@playwright/test": "^1.58.2",
"ng-packagr": "^21.2.0"
}
}
Basado en el patron real de nebula-erp:
import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
import { provideRouter, withComponentInputBinding } from '@angular/router';
import { provideHttpClient, withInterceptors } from '@angular/common/http';
import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
import { provideNebulaCoreIcons } from 'nebula-ui-kit';
import { tokenInterceptor, errorInterceptor } from '@nebula/shared/data-access';
import { appRoutes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [
provideZoneChangeDetection({ eventCoalescing: true }),
provideRouter(appRoutes, withComponentInputBinding()),
provideHttpClient(withInterceptors([tokenInterceptor, errorInterceptor])),
provideAnimationsAsync(),
provideNebulaCoreIcons(),
{ provide: 'API_BASE_URL', useValue: environment.apiBaseUrl }
]
};
Cuando nebula-vault publique @nebula/vault, nebula-erp lo integra asi:
// En nebula-erp, cualquier feature que necesite gestion documental:
import { Project, PreservationStatus } from '@nebula/vault/domain';
import { VaultFacade } from '@nebula/vault/api';
@Component({
selector: 'app-document-widget',
standalone: true,
template: `
@if (projects(); as list) {
<neb-table [config]="tableConfig" [data]="list" />
}
`
})
export class DocumentWidgetComponent {
private vault = inject(VaultFacade);
projects = toSignal(this.vault.getProjects().pipe(
map(res => res.content)
));
}
No necesita el backend localmente — los services hablan con el Gateway de Simappe (/api/vault/**).
No. Solicitar cambios via issue en GitLab al equipo frontend primario.
Crear componentes locales en libs/shared-vault/ui/. Ejemplo: VaultFilePreviewComponent.
No. Solo necesita que el backend Vault este corriendo detras del Gateway (/api/vault/**). @nebula/vault es solo codigo Angular.
| Documento | Ubicacion | Relevancia |
|---|---|---|
| Arquitectura Frontend Nebula | 01-arquitectura/ARQUITECTURA_FRONTEND_NEBULA | Arquitectura Nx, reglas de boundaries, tipos de lib |
| Orquestador Backend | migracion-backend/ORQUESTADOR_MIGRACION_BACKEND_SIMAPPE | Integracion FastAPI con Simappe |
| nebula-ui-kit README | /code/centrica/frontend/nebula-ui-kit/projects/nebula-ui-kit/README.md |
Documentacion completa de componentes |
| nebula-erp README | /code/centrica/frontend/nebula-erp/README.md |
Documentacion del monorepo |
| Libreria @nebula/vault | migracion-frontend/LIBRERIA_NEBULA_VAULT | Implementacion real de la libreria definida en este documento |
| Version | Fecha | Autor | Descripcion |
|---|---|---|---|
| 1.0.0 | 2026-04-06 | Carlos Torres | Creacion inicial con suposiciones |
| 2.0.0 | 2026-04-06 | Carlos Torres | Agregar @nebula/vault como tercer paquete |
| 3.0.0 | 2026-04-06 | Carlos Torres | Reescritura completa basada en codigo fuente real. Eliminar cronograma (va en 08_Cronogramas). Corregir stack: Angular Material (no PrimeNG), SCSS M3 (no Tailwind), Signals (no NgRx). Documentar 22 componentes reales de ui-kit v0.2.1 y shared libs implementadas |