@telcomdev/ui 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/fesm2022/telcomdev-ui.mjs +15 -13
- package/fesm2022/telcomdev-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/telcomdev-ui.d.ts +6 -6
package/README.md
CHANGED
|
@@ -57,6 +57,7 @@ export class Establecimientos {
|
|
|
57
57
|
];
|
|
58
58
|
|
|
59
59
|
botones: TdDataTableBoton[] = [
|
|
60
|
+
{ id: 'agregar', etiqueta: 'Agregar establecimiento', icono: 'add', tono: 'primario' },
|
|
60
61
|
{ id: 'pdf', etiqueta: 'Exportar PDF', icono: 'pdf', tono: 'peligro' },
|
|
61
62
|
{ id: 'excel', etiqueta: 'Exportar Excel', icono: 'description', tono: 'exito' },
|
|
62
63
|
];
|
|
@@ -64,24 +65,28 @@ export class Establecimientos {
|
|
|
64
65
|
ejecutar(evento: TdDataTableAccionEvento<Establecimiento>) {
|
|
65
66
|
// evento.accion.id, evento.fila y evento.indice
|
|
66
67
|
}
|
|
68
|
+
|
|
69
|
+
ejecutarBoton(boton: TdDataTableBoton) {
|
|
70
|
+
if (boton.id === 'agregar') this.abrirModal(0);
|
|
71
|
+
if (boton.id === 'pdf') this.exportarPdf();
|
|
72
|
+
}
|
|
67
73
|
}
|
|
68
74
|
```
|
|
69
75
|
|
|
70
76
|
```html
|
|
71
77
|
<td-data-table
|
|
72
78
|
campoId="establecimientoId"
|
|
73
|
-
textoAgregar="Agregar establecimiento"
|
|
74
79
|
[datos]="lista()"
|
|
75
80
|
[columnas]="columnas"
|
|
76
81
|
[acciones]="acciones"
|
|
77
82
|
[botones]="botones"
|
|
78
83
|
[total]="totalEstablecimientos()"
|
|
79
84
|
[cargando]="cargando()"
|
|
85
|
+
[filasAntesDeCargar]="5"
|
|
80
86
|
[puedeCargarMas]="paginaActual() < totalPaginas()"
|
|
81
87
|
(busquedaChange)="buscar($event)"
|
|
82
|
-
(agregar)="abrirModal(0)"
|
|
83
88
|
(accion)="ejecutar($event)"
|
|
84
|
-
(botonClick)="
|
|
89
|
+
(botonClick)="ejecutarBoton($event)"
|
|
85
90
|
(cargarMas)="paginaSiguiente()"
|
|
86
91
|
>
|
|
87
92
|
<select tdDataTableFilters [(ngModel)]="estado">
|
|
@@ -556,18 +556,16 @@ class TdDataTable {
|
|
|
556
556
|
cargando = false;
|
|
557
557
|
puedeCargarMas = false;
|
|
558
558
|
itemSize = 65;
|
|
559
|
+
filasAntesDeCargar = 2;
|
|
559
560
|
altura = 'min(620px, calc(100dvh - 18rem))';
|
|
560
561
|
campoId = 'id';
|
|
561
562
|
oscuro = false;
|
|
562
563
|
mostrarBusqueda = true;
|
|
563
|
-
mostrarAgregar = true;
|
|
564
564
|
placeholderBusqueda = 'Buscar...';
|
|
565
|
-
textoAgregar = 'Agregar';
|
|
566
565
|
textoVacio = 'No hay registros disponibles';
|
|
567
|
-
descripcionVacio = '
|
|
566
|
+
descripcionVacio = 'Prueba cambiando los filtros o vuelve más tarde.';
|
|
568
567
|
debounceBusqueda = 250;
|
|
569
568
|
busquedaChange = new EventEmitter();
|
|
570
|
-
agregar = new EventEmitter();
|
|
571
569
|
accion = new EventEmitter();
|
|
572
570
|
botonClick = new EventEmitter();
|
|
573
571
|
cargarMas = new EventEmitter();
|
|
@@ -628,6 +626,14 @@ class TdDataTable {
|
|
|
628
626
|
accionesVisibles(fila) {
|
|
629
627
|
return this.acciones.filter((accion) => accion.visible?.(fila) ?? true);
|
|
630
628
|
}
|
|
629
|
+
iconoAccion(accion, fila) {
|
|
630
|
+
return typeof accion.icono === 'function' ? accion.icono(fila) : accion.icono;
|
|
631
|
+
}
|
|
632
|
+
tonoAccion(accion, fila) {
|
|
633
|
+
if (typeof accion.tono === 'function')
|
|
634
|
+
return accion.tono(fila);
|
|
635
|
+
return accion.tono ?? 'neutro';
|
|
636
|
+
}
|
|
631
637
|
botonesVisibles() {
|
|
632
638
|
return this.botones.filter((boton) => boton.visible ?? true);
|
|
633
639
|
}
|
|
@@ -640,7 +646,7 @@ class TdDataTable {
|
|
|
640
646
|
if (!this.viewport)
|
|
641
647
|
return;
|
|
642
648
|
const distanciaAlFinal = this.viewport.measureScrollOffset('bottom');
|
|
643
|
-
const umbralPx = this.itemSize *
|
|
649
|
+
const umbralPx = this.itemSize * Math.max(0, this.filasAntesDeCargar);
|
|
644
650
|
if (distanciaAlFinal <= umbralPx &&
|
|
645
651
|
this.datos.length > 0 &&
|
|
646
652
|
this.puedeCargarMas &&
|
|
@@ -652,11 +658,11 @@ class TdDataTable {
|
|
|
652
658
|
}
|
|
653
659
|
trackFila = (_indice, fila) => fila[this.campoId] ?? fila;
|
|
654
660
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TdDataTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
655
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TdDataTable, isStandalone: true, selector: "td-data-table", inputs: { datos: "datos", columnas: "columnas", acciones: "acciones", botones: "botones", total: "total", cargando: "cargando", puedeCargarMas: "puedeCargarMas", itemSize: "itemSize", altura: "altura", campoId: "campoId", oscuro: "oscuro", mostrarBusqueda: "mostrarBusqueda", mostrarAgregar: "mostrarAgregar", placeholderBusqueda: "placeholderBusqueda", textoAgregar: "textoAgregar", textoVacio: "textoVacio", descripcionVacio: "descripcionVacio", debounceBusqueda: "debounceBusqueda" }, outputs: { busquedaChange: "busquedaChange", agregar: "agregar", accion: "accion", botonClick: "botonClick", cargarMas: "cargarMas" }, viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar b\u00FAsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n @if (cargando) {\n <span class=\"td-tabla__cargando-inline\"><i></i> Cargando...</span>\n }\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n @if (mostrarAgregar) {\n <button class=\"td-tabla__agregar\" type=\"button\" (click)=\"agregar.emit()\">\n <td-icon nombre=\"add\" />\n <span>{{ textoAgregar }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div\n class=\"td-tabla__encabezado\"\n role=\"row\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scrolledIndexChange)=\"alCambiarIndice()\"\n >\n <div\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span [class.td-tabla__numero]=\"columna.tipo === 'numero'\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + (accionFila.tono || 'neutro')\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"accionFila.icono\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n", styles: [":host{display:block}*{box-sizing:border-box}.td-tabla{--fondo: #fff;--fondo-suave: #f8fafc;--borde: #e4e8f0;--texto: #263147;--suave: #748096;--hover: #f7f8fc;--acento: #5746d8;color:var(--texto);font-family:Inter,ui-sans-serif,system-ui,sans-serif}.td-tabla--oscura{--fondo: #15151b;--fondo-suave: #1b1b22;--borde: #2d2d36;--texto: #ededf0;--suave: #9393a0;--hover: #202028;--acento: #a89cf7}.td-tabla__toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding-bottom:.85rem}.td-tabla__filtros{display:flex;min-width:0;flex:1;flex-wrap:wrap;align-items:center;gap:.65rem}.td-tabla__filtros ::ng-deep [tdDataTableFilters]{height:2.55rem;min-width:10.5rem;border:1px solid var(--borde);border-radius:.75rem;padding:0 .8rem;color:var(--texto);background-color:var(--fondo);font:600 .75rem/1 Inter,ui-sans-serif,system-ui,sans-serif;outline:none;transition:border-color .14s ease,box-shadow .14s ease,background-color .14s ease}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:hover{border-color:color-mix(in srgb,var(--acento) 42%,var(--borde))}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:focus{border-color:var(--acento);box-shadow:0 0 0 3px color-mix(in srgb,var(--acento) 15%,transparent)}.td-tabla__filtros ::ng-deep select[tdDataTableFilters]{appearance:none;padding-right:2.45rem;background-image:linear-gradient(45deg,transparent 50%,var(--suave) 50%),linear-gradient(135deg,var(--suave) 50%,transparent 50%);background-position:calc(100% - 1rem) 50%,calc(100% - .72rem) 50%;background-repeat:no-repeat;background-size:.3rem .3rem,.3rem .3rem;cursor:pointer}.td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]{min-width:9.8rem;color-scheme:light;cursor:pointer}.td-tabla--oscura .td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]{color-scheme:dark}.td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]::-webkit-calendar-picker-indicator{opacity:.65;cursor:pointer}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:disabled{opacity:.55;cursor:not-allowed}.td-tabla__busqueda{display:flex;width:min(22rem,100%);height:2.55rem;align-items:center;gap:.6rem;border:1px solid var(--borde);border-radius:.75rem;padding:0 .75rem;color:var(--suave);background:var(--fondo)}.td-tabla__busqueda:focus-within{border-color:var(--acento);box-shadow:0 0 0 3px color-mix(in srgb,var(--acento) 15%,transparent)}.td-tabla__busqueda input{min-width:0;flex:1;border:0;appearance:none;outline:0;color:var(--texto);background:transparent;font:inherit;font-size:.78rem}.td-tabla__busqueda input::-webkit-search-cancel-button,.td-tabla__busqueda input::-webkit-search-decoration{appearance:none;display:none}.td-tabla__busqueda input::-ms-clear,.td-tabla__busqueda input::-ms-reveal{display:none;width:0;height:0}.td-tabla__busqueda button{display:grid;place-items:center;border:0;padding:.2rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__agregar,.td-tabla__vacio button,.td-tabla__boton{display:inline-flex;height:2.55rem;align-items:center;gap:.45rem;border:0;border-radius:.7rem;padding:0 1rem;color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833;font-size:.75rem;font-weight:750;cursor:pointer}.td-tabla__resumen-acciones{display:flex;align-items:center;gap:.45rem}.td-tabla__boton{height:2.15rem;padding:0 .75rem;box-shadow:none;color:#526077;background:#edf0f5}.td-tabla__boton--primario{color:#fff;background:#5746d8}.td-tabla__boton--exito{color:#fff;background:#168447}.td-tabla__boton--advertencia{color:#fff;background:#b66d05}.td-tabla__boton--peligro{color:#fff;background:#d33f3f}.td-tabla__boton:disabled{opacity:.45;cursor:not-allowed}.td-tabla__superficie{overflow:hidden;border:1px solid var(--borde);border-radius:1rem;background:var(--fondo);box-shadow:0 12px 32px #1f2a440f}.td-tabla__resumen{display:flex;min-height:3rem;align-items:center;justify-content:space-between;border-bottom:1px solid var(--borde);padding:.7rem 1rem;color:var(--suave);background:var(--fondo-suave);font-size:.7rem}.td-tabla__resumen strong{color:var(--texto)}.td-tabla__cargando-inline{display:flex;align-items:center;gap:.4rem}.td-tabla__cargando-inline i{width:.65rem;height:.65rem;border:2px solid var(--borde);border-top-color:var(--acento);border-radius:50%;animation:td-tabla-girar .7s linear infinite}.td-tabla__encabezado,.td-tabla__fila{display:grid;min-width:max-content;align-items:center}.td-tabla__encabezado{position:relative;z-index:2;min-height:2.75rem;border-bottom:1px solid var(--borde);color:var(--suave);background:var(--fondo-suave);font-size:.62rem;font-weight:800;letter-spacing:.075em;text-transform:uppercase}.td-tabla__encabezado>div,.td-tabla__celda{padding:.6rem 1rem}.td-tabla__viewport{width:100%;min-height:12rem}.td-tabla__fila{border-bottom:1px solid var(--borde);transition:background .12s ease}.td-tabla__fila:hover{background:var(--hover)}.td-tabla__celda{overflow:hidden;color:var(--texto);font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.td-tabla__numero{font-variant-numeric:tabular-nums}.td-tabla__alinear--inicio{text-align:left}.td-tabla__alinear--centro{text-align:center;justify-content:center}.td-tabla__alinear--fin{text-align:right;justify-content:flex-end}.td-tabla__chip{display:inline-flex;border-radius:999px;padding:.25rem .55rem;color:#526077;background:#edf0f5;font-size:.65rem;font-weight:750}.td-tabla__chip--primario{color:#4f46e5;background:#eeecff}.td-tabla__chip--exito{color:#13713a;background:#dff7e8}.td-tabla__chip--advertencia{color:#9a5a05;background:#fff0cf}.td-tabla__chip--peligro{color:#b53434;background:#fee5e5}.td-tabla__acciones-fila{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:0 .7rem}.td-tabla__accion{display:grid;width:2rem;height:2rem;place-items:center;border:0;border-radius:.55rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__accion:hover{background:var(--hover);color:var(--acento)}.td-tabla__accion--exito{color:#168447}.td-tabla__accion--peligro{color:#dc3e3e}.td-tabla__accion--advertencia{color:#b66d05}.td-tabla__accion:disabled{opacity:.35;cursor:not-allowed}.td-tabla__vacio{display:grid;min-height:21rem;place-items:center;align-content:center;padding:2rem;text-align:center}.td-tabla__vacio>span{display:grid;width:4.5rem;height:4.5rem;place-items:center;border-radius:1.2rem;color:var(--acento);background:color-mix(in srgb,var(--acento) 10%,transparent)}.td-tabla__vacio h3{margin:1rem 0 .3rem;font-size:1rem}.td-tabla__vacio p{margin:0 0 1.25rem;color:var(--suave);font-size:.75rem}.td-tabla__skeleton{padding:.5rem 1rem}.td-tabla__skeleton span{display:block;height:3.5rem;border-bottom:1px solid var(--borde);background:linear-gradient(90deg,transparent,var(--hover),transparent);background-size:200% 100%;animation:td-tabla-cargar 1.2s linear infinite}.td-tabla__sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}@keyframes td-tabla-girar{to{transform:rotate(360deg)}}@keyframes td-tabla-cargar{to{background-position:-200% 0}}@media(max-width:640px){.td-tabla__toolbar{align-items:stretch;flex-direction:column}.td-tabla__busqueda{width:100%}.td-tabla__resumen{align-items:flex-start;flex-direction:column}.td-tabla__resumen-acciones{width:100%;flex-wrap:wrap}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: TdIcon, selector: "td-icon", inputs: ["nombre", "titulo", "tamano"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
661
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TdDataTable, isStandalone: true, selector: "td-data-table", inputs: { datos: "datos", columnas: "columnas", acciones: "acciones", botones: "botones", total: "total", cargando: "cargando", puedeCargarMas: "puedeCargarMas", itemSize: "itemSize", filasAntesDeCargar: "filasAntesDeCargar", altura: "altura", campoId: "campoId", oscuro: "oscuro", mostrarBusqueda: "mostrarBusqueda", placeholderBusqueda: "placeholderBusqueda", textoVacio: "textoVacio", descripcionVacio: "descripcionVacio", debounceBusqueda: "debounceBusqueda" }, outputs: { busquedaChange: "busquedaChange", accion: "accion", botonClick: "botonClick", cargarMas: "cargarMas" }, viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar b\u00FAsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n @if (cargando) {\n <span class=\"td-tabla__cargando-inline\"><i></i> Cargando...</span>\n }\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div\n class=\"td-tabla__encabezado\"\n role=\"row\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scrolledIndexChange)=\"alCambiarIndice()\"\n >\n <div\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span [class.td-tabla__numero]=\"columna.tipo === 'numero'\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + tonoAccion(accionFila, fila)\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"iconoAccion(accionFila, fila)\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n", styles: [":host{display:block}*{box-sizing:border-box}.td-tabla{--fondo: #fff;--fondo-suave: #f8fafc;--borde: #e4e8f0;--texto: #263147;--suave: #748096;--hover: #f7f8fc;--acento: #5746d8;color:var(--texto);font-family:Inter,ui-sans-serif,system-ui,sans-serif}.td-tabla--oscura{--fondo: #15151b;--fondo-suave: #1b1b22;--borde: #2d2d36;--texto: #ededf0;--suave: #9393a0;--hover: #202028;--acento: #a89cf7}.td-tabla__toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding-bottom:.85rem}.td-tabla__filtros{display:flex;min-width:0;flex:1;flex-wrap:wrap;align-items:center;gap:.65rem}.td-tabla__filtros ::ng-deep [tdDataTableFilters]{height:2.55rem;min-width:10.5rem;border:1px solid var(--borde);border-radius:.75rem;padding:0 .8rem;color:var(--texto);background-color:var(--fondo);font:600 .75rem/1 Inter,ui-sans-serif,system-ui,sans-serif;outline:none;transition:border-color .14s ease,box-shadow .14s ease,background-color .14s ease}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:hover{border-color:color-mix(in srgb,var(--acento) 42%,var(--borde))}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:focus{border-color:var(--acento);box-shadow:0 0 0 3px color-mix(in srgb,var(--acento) 15%,transparent)}.td-tabla__filtros ::ng-deep select[tdDataTableFilters]{appearance:none;padding-right:2.45rem;background-image:linear-gradient(45deg,transparent 50%,var(--suave) 50%),linear-gradient(135deg,var(--suave) 50%,transparent 50%);background-position:calc(100% - 1rem) 50%,calc(100% - .72rem) 50%;background-repeat:no-repeat;background-size:.3rem .3rem,.3rem .3rem;cursor:pointer}.td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]{min-width:9.8rem;color-scheme:light;cursor:pointer}.td-tabla--oscura .td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]{color-scheme:dark}.td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]::-webkit-calendar-picker-indicator{opacity:.65;cursor:pointer}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:disabled{opacity:.55;cursor:not-allowed}.td-tabla__busqueda{display:flex;width:min(22rem,100%);height:2.55rem;align-items:center;gap:.6rem;border:1px solid var(--borde);border-radius:.75rem;padding:0 .75rem;color:var(--suave);background:var(--fondo)}.td-tabla__busqueda:focus-within{border-color:var(--acento);box-shadow:0 0 0 3px color-mix(in srgb,var(--acento) 15%,transparent)}.td-tabla__busqueda input{min-width:0;flex:1;border:0;appearance:none;outline:0;color:var(--texto);background:transparent;font:inherit;font-size:.78rem}.td-tabla__busqueda input::-webkit-search-cancel-button,.td-tabla__busqueda input::-webkit-search-decoration{appearance:none;display:none}.td-tabla__busqueda input::-ms-clear,.td-tabla__busqueda input::-ms-reveal{display:none;width:0;height:0}.td-tabla__busqueda button{display:grid;place-items:center;border:0;padding:.2rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__vacio button,.td-tabla__boton{display:inline-flex;height:2.55rem;align-items:center;gap:.45rem;border:0;border-radius:.7rem;padding:0 1rem;color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833;font-size:.75rem;font-weight:750;cursor:pointer}.td-tabla__resumen-acciones{display:flex;align-items:center;gap:.45rem}.td-tabla__boton{height:2.15rem;padding:0 .75rem;box-shadow:none;color:#526077;background:#edf0f5}.td-tabla__boton--primario{color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833}.td-tabla__boton--exito{color:#fff;background:#168447}.td-tabla__boton--advertencia{color:#fff;background:#b66d05}.td-tabla__boton--peligro{color:#fff;background:#d33f3f}.td-tabla__boton:disabled{opacity:.45;cursor:not-allowed}.td-tabla__superficie{overflow:hidden;border:1px solid var(--borde);border-radius:1rem;background:var(--fondo);box-shadow:0 12px 32px #1f2a440f}.td-tabla__resumen{display:flex;min-height:3rem;align-items:center;justify-content:space-between;border-bottom:1px solid var(--borde);padding:.7rem 1rem;color:var(--suave);background:var(--fondo-suave);font-size:.7rem}.td-tabla__resumen strong{color:var(--texto)}.td-tabla__cargando-inline{display:flex;align-items:center;gap:.4rem}.td-tabla__cargando-inline i{width:.65rem;height:.65rem;border:2px solid var(--borde);border-top-color:var(--acento);border-radius:50%;animation:td-tabla-girar .7s linear infinite}.td-tabla__encabezado,.td-tabla__fila{display:grid;min-width:max-content;align-items:center}.td-tabla__encabezado{position:relative;z-index:2;min-height:2.75rem;border-bottom:1px solid var(--borde);color:var(--suave);background:var(--fondo-suave);font-size:.62rem;font-weight:800;letter-spacing:.075em;text-transform:uppercase}.td-tabla__encabezado>div,.td-tabla__celda{padding:.6rem 1rem}.td-tabla__viewport{width:100%;min-height:12rem}.td-tabla__fila{border-bottom:1px solid var(--borde);transition:background .12s ease}.td-tabla__fila:hover{background:var(--hover)}.td-tabla__celda{overflow:hidden;color:var(--texto);font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.td-tabla__numero{font-variant-numeric:tabular-nums}.td-tabla__alinear--inicio{text-align:left}.td-tabla__alinear--centro{text-align:center;justify-content:center}.td-tabla__alinear--fin{text-align:right;justify-content:flex-end}.td-tabla__chip{display:inline-flex;border-radius:999px;padding:.25rem .55rem;color:#526077;background:#edf0f5;font-size:.65rem;font-weight:750}.td-tabla__chip--primario{color:#4f46e5;background:#eeecff}.td-tabla__chip--exito{color:#13713a;background:#dff7e8}.td-tabla__chip--advertencia{color:#9a5a05;background:#fff0cf}.td-tabla__chip--peligro{color:#b53434;background:#fee5e5}.td-tabla__acciones-fila{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:0 .7rem}.td-tabla__accion{display:grid;width:2rem;height:2rem;place-items:center;border:0;border-radius:.55rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__accion:hover{background:var(--hover);color:var(--acento)}.td-tabla__accion--exito{color:#168447}.td-tabla__accion--peligro{color:#dc3e3e}.td-tabla__accion--advertencia{color:#b66d05}.td-tabla__accion:disabled{opacity:.35;cursor:not-allowed}.td-tabla__vacio{display:grid;min-height:21rem;place-items:center;align-content:center;padding:2rem;text-align:center}.td-tabla__vacio>span{display:grid;width:4.5rem;height:4.5rem;place-items:center;border-radius:1.2rem;color:var(--acento);background:color-mix(in srgb,var(--acento) 10%,transparent)}.td-tabla__vacio h3{margin:1rem 0 .3rem;font-size:1rem}.td-tabla__vacio p{margin:0 0 1.25rem;color:var(--suave);font-size:.75rem}.td-tabla__skeleton{padding:.5rem 1rem}.td-tabla__skeleton span{display:block;height:3.5rem;border-bottom:1px solid var(--borde);background:linear-gradient(90deg,transparent,var(--hover),transparent);background-size:200% 100%;animation:td-tabla-cargar 1.2s linear infinite}.td-tabla__sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}@keyframes td-tabla-girar{to{transform:rotate(360deg)}}@keyframes td-tabla-cargar{to{background-position:-200% 0}}@media(max-width:640px){.td-tabla__toolbar{align-items:stretch;flex-direction:column}.td-tabla__busqueda{width:100%}.td-tabla__resumen{align-items:flex-start;flex-direction:column}.td-tabla__resumen-acciones{width:100%;flex-wrap:wrap}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: TdIcon, selector: "td-icon", inputs: ["nombre", "titulo", "tamano"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
656
662
|
}
|
|
657
663
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TdDataTable, decorators: [{
|
|
658
664
|
type: Component,
|
|
659
|
-
args: [{ selector: 'td-data-table', imports: [FormsModule, ScrollingModule, TdIcon], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar b\u00FAsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n @if (cargando) {\n <span class=\"td-tabla__cargando-inline\"><i></i> Cargando...</span>\n }\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n @if (mostrarAgregar) {\n <button class=\"td-tabla__agregar\" type=\"button\" (click)=\"agregar.emit()\">\n <td-icon nombre=\"add\" />\n <span>{{ textoAgregar }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div\n class=\"td-tabla__encabezado\"\n role=\"row\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scrolledIndexChange)=\"alCambiarIndice()\"\n >\n <div\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span [class.td-tabla__numero]=\"columna.tipo === 'numero'\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + (accionFila.tono || 'neutro')\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"accionFila.icono\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n", styles: [":host{display:block}*{box-sizing:border-box}.td-tabla{--fondo: #fff;--fondo-suave: #f8fafc;--borde: #e4e8f0;--texto: #263147;--suave: #748096;--hover: #f7f8fc;--acento: #5746d8;color:var(--texto);font-family:Inter,ui-sans-serif,system-ui,sans-serif}.td-tabla--oscura{--fondo: #15151b;--fondo-suave: #1b1b22;--borde: #2d2d36;--texto: #ededf0;--suave: #9393a0;--hover: #202028;--acento: #a89cf7}.td-tabla__toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding-bottom:.85rem}.td-tabla__filtros{display:flex;min-width:0;flex:1;flex-wrap:wrap;align-items:center;gap:.65rem}.td-tabla__filtros ::ng-deep [tdDataTableFilters]{height:2.55rem;min-width:10.5rem;border:1px solid var(--borde);border-radius:.75rem;padding:0 .8rem;color:var(--texto);background-color:var(--fondo);font:600 .75rem/1 Inter,ui-sans-serif,system-ui,sans-serif;outline:none;transition:border-color .14s ease,box-shadow .14s ease,background-color .14s ease}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:hover{border-color:color-mix(in srgb,var(--acento) 42%,var(--borde))}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:focus{border-color:var(--acento);box-shadow:0 0 0 3px color-mix(in srgb,var(--acento) 15%,transparent)}.td-tabla__filtros ::ng-deep select[tdDataTableFilters]{appearance:none;padding-right:2.45rem;background-image:linear-gradient(45deg,transparent 50%,var(--suave) 50%),linear-gradient(135deg,var(--suave) 50%,transparent 50%);background-position:calc(100% - 1rem) 50%,calc(100% - .72rem) 50%;background-repeat:no-repeat;background-size:.3rem .3rem,.3rem .3rem;cursor:pointer}.td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]{min-width:9.8rem;color-scheme:light;cursor:pointer}.td-tabla--oscura .td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]{color-scheme:dark}.td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]::-webkit-calendar-picker-indicator{opacity:.65;cursor:pointer}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:disabled{opacity:.55;cursor:not-allowed}.td-tabla__busqueda{display:flex;width:min(22rem,100%);height:2.55rem;align-items:center;gap:.6rem;border:1px solid var(--borde);border-radius:.75rem;padding:0 .75rem;color:var(--suave);background:var(--fondo)}.td-tabla__busqueda:focus-within{border-color:var(--acento);box-shadow:0 0 0 3px color-mix(in srgb,var(--acento) 15%,transparent)}.td-tabla__busqueda input{min-width:0;flex:1;border:0;appearance:none;outline:0;color:var(--texto);background:transparent;font:inherit;font-size:.78rem}.td-tabla__busqueda input::-webkit-search-cancel-button,.td-tabla__busqueda input::-webkit-search-decoration{appearance:none;display:none}.td-tabla__busqueda input::-ms-clear,.td-tabla__busqueda input::-ms-reveal{display:none;width:0;height:0}.td-tabla__busqueda button{display:grid;place-items:center;border:0;padding:.2rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__agregar,.td-tabla__vacio button,.td-tabla__boton{display:inline-flex;height:2.55rem;align-items:center;gap:.45rem;border:0;border-radius:.7rem;padding:0 1rem;color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833;font-size:.75rem;font-weight:750;cursor:pointer}.td-tabla__resumen-acciones{display:flex;align-items:center;gap:.45rem}.td-tabla__boton{height:2.15rem;padding:0 .75rem;box-shadow:none;color:#526077;background:#edf0f5}.td-tabla__boton--primario{color:#fff;background:#5746d8}.td-tabla__boton--exito{color:#fff;background:#168447}.td-tabla__boton--advertencia{color:#fff;background:#b66d05}.td-tabla__boton--peligro{color:#fff;background:#d33f3f}.td-tabla__boton:disabled{opacity:.45;cursor:not-allowed}.td-tabla__superficie{overflow:hidden;border:1px solid var(--borde);border-radius:1rem;background:var(--fondo);box-shadow:0 12px 32px #1f2a440f}.td-tabla__resumen{display:flex;min-height:3rem;align-items:center;justify-content:space-between;border-bottom:1px solid var(--borde);padding:.7rem 1rem;color:var(--suave);background:var(--fondo-suave);font-size:.7rem}.td-tabla__resumen strong{color:var(--texto)}.td-tabla__cargando-inline{display:flex;align-items:center;gap:.4rem}.td-tabla__cargando-inline i{width:.65rem;height:.65rem;border:2px solid var(--borde);border-top-color:var(--acento);border-radius:50%;animation:td-tabla-girar .7s linear infinite}.td-tabla__encabezado,.td-tabla__fila{display:grid;min-width:max-content;align-items:center}.td-tabla__encabezado{position:relative;z-index:2;min-height:2.75rem;border-bottom:1px solid var(--borde);color:var(--suave);background:var(--fondo-suave);font-size:.62rem;font-weight:800;letter-spacing:.075em;text-transform:uppercase}.td-tabla__encabezado>div,.td-tabla__celda{padding:.6rem 1rem}.td-tabla__viewport{width:100%;min-height:12rem}.td-tabla__fila{border-bottom:1px solid var(--borde);transition:background .12s ease}.td-tabla__fila:hover{background:var(--hover)}.td-tabla__celda{overflow:hidden;color:var(--texto);font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.td-tabla__numero{font-variant-numeric:tabular-nums}.td-tabla__alinear--inicio{text-align:left}.td-tabla__alinear--centro{text-align:center;justify-content:center}.td-tabla__alinear--fin{text-align:right;justify-content:flex-end}.td-tabla__chip{display:inline-flex;border-radius:999px;padding:.25rem .55rem;color:#526077;background:#edf0f5;font-size:.65rem;font-weight:750}.td-tabla__chip--primario{color:#4f46e5;background:#eeecff}.td-tabla__chip--exito{color:#13713a;background:#dff7e8}.td-tabla__chip--advertencia{color:#9a5a05;background:#fff0cf}.td-tabla__chip--peligro{color:#b53434;background:#fee5e5}.td-tabla__acciones-fila{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:0 .7rem}.td-tabla__accion{display:grid;width:2rem;height:2rem;place-items:center;border:0;border-radius:.55rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__accion:hover{background:var(--hover);color:var(--acento)}.td-tabla__accion--exito{color:#168447}.td-tabla__accion--peligro{color:#dc3e3e}.td-tabla__accion--advertencia{color:#b66d05}.td-tabla__accion:disabled{opacity:.35;cursor:not-allowed}.td-tabla__vacio{display:grid;min-height:21rem;place-items:center;align-content:center;padding:2rem;text-align:center}.td-tabla__vacio>span{display:grid;width:4.5rem;height:4.5rem;place-items:center;border-radius:1.2rem;color:var(--acento);background:color-mix(in srgb,var(--acento) 10%,transparent)}.td-tabla__vacio h3{margin:1rem 0 .3rem;font-size:1rem}.td-tabla__vacio p{margin:0 0 1.25rem;color:var(--suave);font-size:.75rem}.td-tabla__skeleton{padding:.5rem 1rem}.td-tabla__skeleton span{display:block;height:3.5rem;border-bottom:1px solid var(--borde);background:linear-gradient(90deg,transparent,var(--hover),transparent);background-size:200% 100%;animation:td-tabla-cargar 1.2s linear infinite}.td-tabla__sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}@keyframes td-tabla-girar{to{transform:rotate(360deg)}}@keyframes td-tabla-cargar{to{background-position:-200% 0}}@media(max-width:640px){.td-tabla__toolbar{align-items:stretch;flex-direction:column}.td-tabla__busqueda{width:100%}.td-tabla__resumen{align-items:flex-start;flex-direction:column}.td-tabla__resumen-acciones{width:100%;flex-wrap:wrap}}\n"] }]
|
|
665
|
+
args: [{ selector: 'td-data-table', imports: [FormsModule, ScrollingModule, TdIcon], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar b\u00FAsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n @if (cargando) {\n <span class=\"td-tabla__cargando-inline\"><i></i> Cargando...</span>\n }\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div\n class=\"td-tabla__encabezado\"\n role=\"row\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scrolledIndexChange)=\"alCambiarIndice()\"\n >\n <div\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span [class.td-tabla__numero]=\"columna.tipo === 'numero'\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + tonoAccion(accionFila, fila)\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"iconoAccion(accionFila, fila)\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n", styles: [":host{display:block}*{box-sizing:border-box}.td-tabla{--fondo: #fff;--fondo-suave: #f8fafc;--borde: #e4e8f0;--texto: #263147;--suave: #748096;--hover: #f7f8fc;--acento: #5746d8;color:var(--texto);font-family:Inter,ui-sans-serif,system-ui,sans-serif}.td-tabla--oscura{--fondo: #15151b;--fondo-suave: #1b1b22;--borde: #2d2d36;--texto: #ededf0;--suave: #9393a0;--hover: #202028;--acento: #a89cf7}.td-tabla__toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding-bottom:.85rem}.td-tabla__filtros{display:flex;min-width:0;flex:1;flex-wrap:wrap;align-items:center;gap:.65rem}.td-tabla__filtros ::ng-deep [tdDataTableFilters]{height:2.55rem;min-width:10.5rem;border:1px solid var(--borde);border-radius:.75rem;padding:0 .8rem;color:var(--texto);background-color:var(--fondo);font:600 .75rem/1 Inter,ui-sans-serif,system-ui,sans-serif;outline:none;transition:border-color .14s ease,box-shadow .14s ease,background-color .14s ease}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:hover{border-color:color-mix(in srgb,var(--acento) 42%,var(--borde))}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:focus{border-color:var(--acento);box-shadow:0 0 0 3px color-mix(in srgb,var(--acento) 15%,transparent)}.td-tabla__filtros ::ng-deep select[tdDataTableFilters]{appearance:none;padding-right:2.45rem;background-image:linear-gradient(45deg,transparent 50%,var(--suave) 50%),linear-gradient(135deg,var(--suave) 50%,transparent 50%);background-position:calc(100% - 1rem) 50%,calc(100% - .72rem) 50%;background-repeat:no-repeat;background-size:.3rem .3rem,.3rem .3rem;cursor:pointer}.td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]{min-width:9.8rem;color-scheme:light;cursor:pointer}.td-tabla--oscura .td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]{color-scheme:dark}.td-tabla__filtros ::ng-deep input[type=date][tdDataTableFilters]::-webkit-calendar-picker-indicator{opacity:.65;cursor:pointer}.td-tabla__filtros ::ng-deep [tdDataTableFilters]:disabled{opacity:.55;cursor:not-allowed}.td-tabla__busqueda{display:flex;width:min(22rem,100%);height:2.55rem;align-items:center;gap:.6rem;border:1px solid var(--borde);border-radius:.75rem;padding:0 .75rem;color:var(--suave);background:var(--fondo)}.td-tabla__busqueda:focus-within{border-color:var(--acento);box-shadow:0 0 0 3px color-mix(in srgb,var(--acento) 15%,transparent)}.td-tabla__busqueda input{min-width:0;flex:1;border:0;appearance:none;outline:0;color:var(--texto);background:transparent;font:inherit;font-size:.78rem}.td-tabla__busqueda input::-webkit-search-cancel-button,.td-tabla__busqueda input::-webkit-search-decoration{appearance:none;display:none}.td-tabla__busqueda input::-ms-clear,.td-tabla__busqueda input::-ms-reveal{display:none;width:0;height:0}.td-tabla__busqueda button{display:grid;place-items:center;border:0;padding:.2rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__vacio button,.td-tabla__boton{display:inline-flex;height:2.55rem;align-items:center;gap:.45rem;border:0;border-radius:.7rem;padding:0 1rem;color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833;font-size:.75rem;font-weight:750;cursor:pointer}.td-tabla__resumen-acciones{display:flex;align-items:center;gap:.45rem}.td-tabla__boton{height:2.15rem;padding:0 .75rem;box-shadow:none;color:#526077;background:#edf0f5}.td-tabla__boton--primario{color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833}.td-tabla__boton--exito{color:#fff;background:#168447}.td-tabla__boton--advertencia{color:#fff;background:#b66d05}.td-tabla__boton--peligro{color:#fff;background:#d33f3f}.td-tabla__boton:disabled{opacity:.45;cursor:not-allowed}.td-tabla__superficie{overflow:hidden;border:1px solid var(--borde);border-radius:1rem;background:var(--fondo);box-shadow:0 12px 32px #1f2a440f}.td-tabla__resumen{display:flex;min-height:3rem;align-items:center;justify-content:space-between;border-bottom:1px solid var(--borde);padding:.7rem 1rem;color:var(--suave);background:var(--fondo-suave);font-size:.7rem}.td-tabla__resumen strong{color:var(--texto)}.td-tabla__cargando-inline{display:flex;align-items:center;gap:.4rem}.td-tabla__cargando-inline i{width:.65rem;height:.65rem;border:2px solid var(--borde);border-top-color:var(--acento);border-radius:50%;animation:td-tabla-girar .7s linear infinite}.td-tabla__encabezado,.td-tabla__fila{display:grid;min-width:max-content;align-items:center}.td-tabla__encabezado{position:relative;z-index:2;min-height:2.75rem;border-bottom:1px solid var(--borde);color:var(--suave);background:var(--fondo-suave);font-size:.62rem;font-weight:800;letter-spacing:.075em;text-transform:uppercase}.td-tabla__encabezado>div,.td-tabla__celda{padding:.6rem 1rem}.td-tabla__viewport{width:100%;min-height:12rem}.td-tabla__fila{border-bottom:1px solid var(--borde);transition:background .12s ease}.td-tabla__fila:hover{background:var(--hover)}.td-tabla__celda{overflow:hidden;color:var(--texto);font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.td-tabla__numero{font-variant-numeric:tabular-nums}.td-tabla__alinear--inicio{text-align:left}.td-tabla__alinear--centro{text-align:center;justify-content:center}.td-tabla__alinear--fin{text-align:right;justify-content:flex-end}.td-tabla__chip{display:inline-flex;border-radius:999px;padding:.25rem .55rem;color:#526077;background:#edf0f5;font-size:.65rem;font-weight:750}.td-tabla__chip--primario{color:#4f46e5;background:#eeecff}.td-tabla__chip--exito{color:#13713a;background:#dff7e8}.td-tabla__chip--advertencia{color:#9a5a05;background:#fff0cf}.td-tabla__chip--peligro{color:#b53434;background:#fee5e5}.td-tabla__acciones-fila{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:0 .7rem}.td-tabla__accion{display:grid;width:2rem;height:2rem;place-items:center;border:0;border-radius:.55rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__accion:hover{background:var(--hover);color:var(--acento)}.td-tabla__accion--exito{color:#168447}.td-tabla__accion--peligro{color:#dc3e3e}.td-tabla__accion--advertencia{color:#b66d05}.td-tabla__accion:disabled{opacity:.35;cursor:not-allowed}.td-tabla__vacio{display:grid;min-height:21rem;place-items:center;align-content:center;padding:2rem;text-align:center}.td-tabla__vacio>span{display:grid;width:4.5rem;height:4.5rem;place-items:center;border-radius:1.2rem;color:var(--acento);background:color-mix(in srgb,var(--acento) 10%,transparent)}.td-tabla__vacio h3{margin:1rem 0 .3rem;font-size:1rem}.td-tabla__vacio p{margin:0 0 1.25rem;color:var(--suave);font-size:.75rem}.td-tabla__skeleton{padding:.5rem 1rem}.td-tabla__skeleton span{display:block;height:3.5rem;border-bottom:1px solid var(--borde);background:linear-gradient(90deg,transparent,var(--hover),transparent);background-size:200% 100%;animation:td-tabla-cargar 1.2s linear infinite}.td-tabla__sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}@keyframes td-tabla-girar{to{transform:rotate(360deg)}}@keyframes td-tabla-cargar{to{background-position:-200% 0}}@media(max-width:640px){.td-tabla__toolbar{align-items:stretch;flex-direction:column}.td-tabla__busqueda{width:100%}.td-tabla__resumen{align-items:flex-start;flex-direction:column}.td-tabla__resumen-acciones{width:100%;flex-wrap:wrap}}\n"] }]
|
|
660
666
|
}], propDecorators: { viewport: [{
|
|
661
667
|
type: ViewChild,
|
|
662
668
|
args: [CdkVirtualScrollViewport]
|
|
@@ -676,6 +682,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
676
682
|
type: Input
|
|
677
683
|
}], itemSize: [{
|
|
678
684
|
type: Input
|
|
685
|
+
}], filasAntesDeCargar: [{
|
|
686
|
+
type: Input
|
|
679
687
|
}], altura: [{
|
|
680
688
|
type: Input
|
|
681
689
|
}], campoId: [{
|
|
@@ -684,12 +692,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
684
692
|
type: Input
|
|
685
693
|
}], mostrarBusqueda: [{
|
|
686
694
|
type: Input
|
|
687
|
-
}], mostrarAgregar: [{
|
|
688
|
-
type: Input
|
|
689
695
|
}], placeholderBusqueda: [{
|
|
690
696
|
type: Input
|
|
691
|
-
}], textoAgregar: [{
|
|
692
|
-
type: Input
|
|
693
697
|
}], textoVacio: [{
|
|
694
698
|
type: Input
|
|
695
699
|
}], descripcionVacio: [{
|
|
@@ -698,8 +702,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
698
702
|
type: Input
|
|
699
703
|
}], busquedaChange: [{
|
|
700
704
|
type: Output
|
|
701
|
-
}], agregar: [{
|
|
702
|
-
type: Output
|
|
703
705
|
}], accion: [{
|
|
704
706
|
type: Output
|
|
705
707
|
}], botonClick: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telcomdev-ui.mjs","sources":["../../../projects/telcomdev-ui/src/lib/telcomdev-ui.ts","../../../projects/telcomdev-ui/src/lib/alerta/td-alerta.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-iconos.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-icono-registry.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-icon.ts","../../../projects/telcomdev-ui/src/lib/data-table/td-data-table.ts","../../../projects/telcomdev-ui/src/lib/data-table/td-data-table.html","../../../projects/telcomdev-ui/src/lib/footer/td-footer.ts","../../../projects/telcomdev-ui/src/lib/footer/td-footer.html","../../../projects/telcomdev-ui/src/lib/header/td-header.ts","../../../projects/telcomdev-ui/src/lib/header/td-header.html","../../../projects/telcomdev-ui/src/lib/sidebar/td-sidebar.ts","../../../projects/telcomdev-ui/src/lib/sidebar/td-sidebar.html","../../../projects/telcomdev-ui/src/public-api.ts","../../../projects/telcomdev-ui/src/telcomdev-ui.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'td-telcomdev-ui',\n imports: [],\n template: ` <p>telcomdev-ui works!</p> `,\n styles: ``,\n})\nexport class TelcomdevUi {}\n","export type TdAlertaTipo = 'exito' | 'error' | 'advertencia' | 'info' | 'pregunta';\r\n\r\nexport interface TdAlertaOpciones {\r\n titulo?: string;\r\n mensaje?: string;\r\n tipo?: TdAlertaTipo;\r\n textoConfirmar?: string;\r\n textoCancelar?: string;\r\n mostrarCancelar?: boolean;\r\n cerrarConEscape?: boolean;\r\n cerrarConFondo?: boolean;\r\n}\r\n\r\nexport class TdAlerta {\r\n private static readonly estiloId = 'td-alerta-estilos';\r\n\r\n static exito(mensaje: string, titulo = '¡Operación exitosa!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'exito',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static error(mensaje: string, titulo = '¡Error!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'error',\r\n textoConfirmar: 'Cerrar',\r\n });\r\n }\r\n\r\n static errorSistema(mensaje: string, titulo = '¡Error de Sistema!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'error',\r\n textoConfirmar: 'Cerrar',\r\n });\r\n }\r\n\r\n static advertencia(mensaje: string, titulo = '¡Advertencia!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'advertencia',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static info(mensaje: string, titulo = 'Información'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'info',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static confirmar(\r\n mensaje: string,\r\n titulo = '¿Estás seguro?',\r\n textoConfirmar = 'Sí, continuar',\r\n textoCancelar = 'Cancelar'\r\n ): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'pregunta',\r\n textoConfirmar,\r\n textoCancelar,\r\n mostrarCancelar: true,\r\n });\r\n }\r\n\r\n static confirmarEliminar(\r\n mensaje = 'Esta acción no se puede deshacer.',\r\n titulo = '¿Eliminar registro?'\r\n ): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'advertencia',\r\n textoConfirmar: 'Sí, eliminar',\r\n textoCancelar: 'Cancelar',\r\n mostrarCancelar: true,\r\n });\r\n }\r\n\r\n static mostrar(opciones: TdAlertaOpciones): Promise<boolean> {\r\n if (typeof document === 'undefined') {\r\n return Promise.resolve(false);\r\n }\r\n\r\n this.inyectarEstilos();\r\n\r\n const config: Required<TdAlertaOpciones> = {\r\n titulo: opciones.titulo ?? '',\r\n mensaje: opciones.mensaje ?? '',\r\n tipo: opciones.tipo ?? 'info',\r\n textoConfirmar: opciones.textoConfirmar ?? 'Aceptar',\r\n textoCancelar: opciones.textoCancelar ?? 'Cancelar',\r\n mostrarCancelar: opciones.mostrarCancelar ?? false,\r\n cerrarConEscape: opciones.cerrarConEscape ?? true,\r\n cerrarConFondo: opciones.cerrarConFondo ?? false,\r\n };\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const fondo = document.createElement('div');\r\n fondo.className = 'td-alerta-fondo';\r\n\r\n const modal = document.createElement('div');\r\n modal.className = 'td-alerta-modal';\r\n modal.setAttribute('role', 'dialog');\r\n modal.setAttribute('aria-modal', 'true');\r\n\r\n const icono = document.createElement('div');\r\n icono.className = `td-alerta-icono td-alerta-icono--${config.tipo}`;\r\n icono.textContent = this.obtenerIcono(config.tipo);\r\n\r\n const titulo = document.createElement('h2');\r\n titulo.className = 'td-alerta-titulo';\r\n titulo.textContent = config.titulo;\r\n\r\n const mensaje = document.createElement('p');\r\n mensaje.className = 'td-alerta-mensaje';\r\n mensaje.textContent = config.mensaje;\r\n\r\n const acciones = document.createElement('div');\r\n acciones.className = 'td-alerta-acciones';\r\n\r\n const botonConfirmar = document.createElement('button');\r\n botonConfirmar.type = 'button';\r\n botonConfirmar.className = `td-alerta-boton td-alerta-boton--${config.tipo}`;\r\n botonConfirmar.textContent = config.textoConfirmar;\r\n\r\n const botonCancelar = document.createElement('button');\r\n botonCancelar.type = 'button';\r\n botonCancelar.className = 'td-alerta-boton td-alerta-boton--cancelar';\r\n botonCancelar.textContent = config.textoCancelar;\r\n\r\n const cerrar = (resultado: boolean): void => {\r\n document.removeEventListener('keydown', onKeyDown);\r\n fondo.classList.add('td-alerta-saliendo');\r\n\r\n window.setTimeout(() => {\r\n fondo.remove();\r\n resolve(resultado);\r\n }, 140);\r\n };\r\n\r\n const onKeyDown = (event: KeyboardEvent): void => {\r\n if (event.key === 'Escape' && config.cerrarConEscape) {\r\n cerrar(false);\r\n }\r\n };\r\n\r\n botonConfirmar.addEventListener('click', () => cerrar(true));\r\n botonCancelar.addEventListener('click', () => cerrar(false));\r\n\r\n if (config.cerrarConFondo) {\r\n fondo.addEventListener('click', (event) => {\r\n if (event.target === fondo) {\r\n cerrar(false);\r\n }\r\n });\r\n }\r\n\r\n document.addEventListener('keydown', onKeyDown);\r\n\r\n if (config.mostrarCancelar) {\r\n acciones.appendChild(botonCancelar);\r\n }\r\n\r\n acciones.appendChild(botonConfirmar);\r\n\r\n modal.appendChild(icono);\r\n modal.appendChild(titulo);\r\n\r\n if (config.mensaje) {\r\n modal.appendChild(mensaje);\r\n }\r\n\r\n modal.appendChild(acciones);\r\n fondo.appendChild(modal);\r\n document.body.appendChild(fondo);\r\n\r\n botonConfirmar.focus();\r\n });\r\n }\r\n\r\n private static obtenerIcono(tipo: TdAlertaTipo): string {\r\n const iconos: Record<TdAlertaTipo, string> = {\r\n exito: '✓',\r\n error: '!',\r\n advertencia: '!',\r\n info: 'i',\r\n pregunta: '?',\r\n };\r\n\r\n return iconos[tipo];\r\n }\r\n\r\n private static inyectarEstilos(): void {\r\n if (document.getElementById(this.estiloId)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = this.estiloId;\r\n style.textContent = `\r\n .td-alerta-fondo {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 99999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 1rem;\r\n background: rgba(15, 23, 42, 0.52);\r\n animation: td-alerta-fondo-entrada 160ms ease-out;\r\n }\r\n\r\n .td-alerta-modal {\r\n width: min(100%, 430px);\r\n border-radius: 18px;\r\n background: #ffffff;\r\n padding: 1.75rem;\r\n text-align: center;\r\n box-shadow: 0 22px 70px rgba(15, 23, 42, 0.28);\r\n animation: td-alerta-modal-entrada 180ms ease-out;\r\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n }\r\n\r\n .td-alerta-icono {\r\n width: 4.25rem;\r\n height: 4.25rem;\r\n margin: 0 auto 1rem;\r\n border-radius: 999px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 2.1rem;\r\n font-weight: 800;\r\n }\r\n\r\n .td-alerta-icono--exito {\r\n color: #16a34a;\r\n background: #dcfce7;\r\n }\r\n\r\n .td-alerta-icono--error {\r\n color: #ef4444;\r\n background: #fee2e2;\r\n }\r\n\r\n .td-alerta-icono--advertencia {\r\n color: #f59e0b;\r\n background: #fef3c7;\r\n }\r\n\r\n .td-alerta-icono--info {\r\n color: #2563eb;\r\n background: #dbeafe;\r\n }\r\n\r\n .td-alerta-icono--pregunta {\r\n color: #7c3aed;\r\n background: #ede9fe;\r\n }\r\n\r\n .td-alerta-titulo {\r\n margin: 0;\r\n color: #111827;\r\n font-size: 1.35rem;\r\n line-height: 1.25;\r\n font-weight: 800;\r\n }\r\n\r\n .td-alerta-mensaje {\r\n margin: 0.75rem 0 0;\r\n color: #4b5563;\r\n font-size: 0.96rem;\r\n line-height: 1.55;\r\n }\r\n\r\n .td-alerta-acciones {\r\n display: flex;\r\n justify-content: center;\r\n gap: 0.75rem;\r\n margin-top: 1.5rem;\r\n }\r\n\r\n .td-alerta-boton {\r\n border: 0;\r\n border-radius: 10px;\r\n padding: 0.7rem 1.2rem;\r\n color: #ffffff;\r\n font-size: 0.93rem;\r\n font-weight: 700;\r\n cursor: pointer;\r\n transition: transform 120ms ease, filter 120ms ease, background 120ms ease;\r\n }\r\n\r\n .td-alerta-boton:hover {\r\n filter: brightness(0.96);\r\n }\r\n\r\n .td-alerta-boton:active {\r\n transform: scale(0.98);\r\n }\r\n\r\n .td-alerta-boton:focus {\r\n outline: 3px solid rgba(37, 99, 235, 0.25);\r\n outline-offset: 2px;\r\n }\r\n\r\n .td-alerta-boton--exito {\r\n background: #22c55e;\r\n }\r\n\r\n .td-alerta-boton--error {\r\n background: #ef4444;\r\n }\r\n\r\n .td-alerta-boton--advertencia {\r\n background: #f59e0b;\r\n }\r\n\r\n .td-alerta-boton--info {\r\n background: #2563eb;\r\n }\r\n\r\n .td-alerta-boton--pregunta {\r\n background: #7c3aed;\r\n }\r\n\r\n .td-alerta-boton--cancelar {\r\n background: #6b7280;\r\n }\r\n\r\n .td-alerta-saliendo {\r\n animation: td-alerta-fondo-salida 140ms ease-in forwards;\r\n }\r\n\r\n .td-alerta-saliendo .td-alerta-modal {\r\n animation: td-alerta-modal-salida 140ms ease-in forwards;\r\n }\r\n\r\n @keyframes td-alerta-fondo-entrada {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n }\r\n\r\n @keyframes td-alerta-modal-entrada {\r\n from {\r\n opacity: 0;\r\n transform: translateY(12px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n\r\n @keyframes td-alerta-fondo-salida {\r\n from { opacity: 1; }\r\n to { opacity: 0; }\r\n }\r\n\r\n @keyframes td-alerta-modal-salida {\r\n from {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: translateY(8px) scale(0.97);\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n .td-alerta-modal {\r\n padding: 1.4rem;\r\n border-radius: 16px;\r\n }\r\n\r\n .td-alerta-acciones {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .td-alerta-boton {\r\n width: 100%;\r\n }\r\n }\r\n `;\r\n\r\n document.head.appendChild(style);\r\n }\r\n}","import { TdIconoDefinicion } from './td-icono.model';\n\nexport const TD_ICONOS = {\n home: {\n path: 'M3 10.5 12 3l9 7.5V21a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1V10.5Z',\n },\n dashboard: {\n path: 'M4 3h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm10 0h6a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm0 8h6a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1ZM4 14h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1Z',\n },\n folder: {\n path: 'M3 5a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5Z',\n },\n settings: {\n path: 'M12 8.5a3.5 3.5 0 1 0 0 7 3.5 3.5 0 0 0 0-7Zm8.5 3.5c0-.5-.05-.98-.14-1.45l2.02-1.57-2-3.46-2.47 1a8.7 8.7 0 0 0-2.5-1.45L15 2.5h-4l-.4 2.57a8.7 8.7 0 0 0-2.51 1.45l-2.47-1-2 3.46 2.02 1.57a7.7 7.7 0 0 0 0 2.9l-2.02 1.57 2 3.46 2.47-1a8.7 8.7 0 0 0 2.5 1.45L11 21.5h4l.4-2.57a8.7 8.7 0 0 0 2.51-1.45l2.47 1 2-3.46-2.02-1.57c.09-.47.14-.95.14-1.45Z',\n },\n people: {\n path: 'M16 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8ZM6.5 12a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7ZM16 13c-4 0-7 2-7 4.5V21h14v-3.5C23 15 20 13 16 13ZM6.5 14C2.9 14 1 15.8 1 18v3h6v-3.5c0-1.2.48-2.28 1.3-3.16A9.3 9.3 0 0 0 6.5 14Z',\n },\n person: {\n path: 'M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 2c-5 0-9 2.5-9 5.5V22h18v-2.5c0-3-4-5.5-9-5.5Z',\n },\n security: {\n path: 'M12 2 4 5v6c0 5.05 3.41 9.74 8 11 4.59-1.26 8-5.95 8-11V5l-8-3Zm-1 14-4-4 1.4-1.4 2.6 2.58 5.6-5.58L18 9l-7 7Z',\n },\n inventory: {\n path: 'm12 2 9 5-9 5-9-5 9-5Zm-7 8.5 6 3.33V22l-6-3.33V10.5Zm8 11.5v-8.17l6-3.33v8.17L13 22Z',\n },\n shopping_cart: {\n path: 'M7 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm10 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4ZM6.2 6l.8 2h11.6l-1.9 5H8.1L4.3 3H1v2h2l3.6 9.6A2 2 0 0 0 8.5 16H19v-2H8.5l-.4-1H18a2 2 0 0 0 1.86-1.27L22 6H6.2Z',\n },\n receipt: {\n path: 'M5 2v20l3-2 4 2 4-2 3 2V2l-3 2-4-2-4 2-3-2Zm3 6h8v2H8V8Zm0 4h8v2H8v-2Z',\n },\n assessment: {\n path: 'M4 20h16v2H4a2 2 0 0 1-2-2V4h2v16Zm3-2H5v-6h2v6Zm4 0H9V7h2v11Zm4 0h-2V4h2v14Zm4 0h-2v-9h2v9Z',\n },\n description: {\n path: 'M6 2h8l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm7 1.5V8h4.5L13 3.5ZM8 12v2h8v-2H8Zm0 4v2h8v-2H8Z',\n },\n business: {\n path: 'M3 21V3h10v5h8v13h-7v-4h-2v4H3Zm3-14h2V5H6v2Zm4 0h2V5h-2v2Zm-4 4h2V9H6v2Zm4 0h2V9h-2v2Zm6 1h2v-2h-2v2Zm0 4h2v-2h-2v2Z',\n },\n chevron_left: {\n path: 'M14.7 5.3a1 1 0 0 1 0 1.4L9.4 12l5.3 5.3a1 1 0 1 1-1.4 1.4l-6-6a1 1 0 0 1 0-1.4l6-6a1 1 0 0 1 1.4 0Z',\n },\n chevron_right: {\n path: 'M9.3 5.3a1 1 0 0 0 0 1.4l5.3 5.3-5.3 5.3a1 1 0 1 0 1.4 1.4l6-6a1 1 0 0 0 0-1.4l-6-6a1 1 0 0 0-1.4 0Z',\n },\n sun: {\n path: 'M12 7a5 5 0 1 0 0 10 5 5 0 0 0 0-10Zm0-5a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0V3a1 1 0 0 1 1-1Zm0 17a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0v-2a1 1 0 0 1 1-1ZM2 12a1 1 0 0 1 1-1h2a1 1 0 1 1 0 2H3a1 1 0 0 1-1-1Zm17 0a1 1 0 0 1 1-1h2a1 1 0 1 1 0 2h-2a1 1 0 0 1-1-1ZM4.22 4.22a1 1 0 0 1 1.42 0l1.41 1.42a1 1 0 0 1-1.41 1.41L4.22 5.64a1 1 0 0 1 0-1.42Zm12.73 12.73a1 1 0 0 1 1.41 0l1.42 1.41a1 1 0 0 1-1.42 1.42l-1.41-1.42a1 1 0 0 1 0-1.41Zm2.83-12.73a1 1 0 0 1 0 1.42l-1.42 1.41a1 1 0 0 1-1.41-1.41l1.41-1.42a1 1 0 0 1 1.42 0ZM7.05 16.95a1 1 0 0 1 0 1.41l-1.41 1.42a1 1 0 0 1-1.42-1.42l1.42-1.41a1 1 0 0 1 1.41 0Z',\n },\n moon: {\n path: 'M20.5 15.2A8.5 8.5 0 0 1 8.8 3.5 9 9 0 1 0 20.5 15.2Z',\n },\n alert: {\n path: 'M12 2 1 21h22L12 2Zm-1 7h2v6h-2V9Zm0 8h2v2h-2v-2Z',\n },\n check: {\n path: 'm9.2 16.2-4.4-4.4-1.6 1.6 6 6L21 7.6 19.4 6 9.2 16.2Z',\n },\n close: {\n path: 'M6.4 5 12 10.6 17.6 5 19 6.4 13.4 12l5.6 5.6-1.4 1.4-5.6-5.6L6.4 19 5 17.6l5.6-5.6L5 6.4 6.4 5Z',\n },\n menu: {\n path: 'M3 6h18v2H3V6Zm0 5h18v2H3v-2Zm0 5h18v2H3v-2Z',\n },\n search: {\n path: 'M10.5 3a7.5 7.5 0 1 0 4.73 13.32L20.91 22 22 20.91l-5.68-5.68A7.5 7.5 0 0 0 10.5 3Zm0 2a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11Z',\n },\n notifications: {\n path: 'M12 22a2.5 2.5 0 0 0 2.45-2h-4.9A2.5 2.5 0 0 0 12 22Zm7-6v-5a7 7 0 0 0-5.5-6.84V3a1.5 1.5 0 0 0-3 0v1.16A7 7 0 0 0 5 11v5l-2 2v1h18v-1l-2-2Z',\n },\n chevron_down: {\n path: 'M5.3 8.3a1 1 0 0 1 1.4 0l5.3 5.3 5.3-5.3a1 1 0 1 1 1.4 1.4l-6 6a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.4Z',\n },\n apps: {\n path: 'M4 3h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm12 0h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1ZM4 15h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1Zm12 0h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1Z',\n },\n help: {\n path: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16Zm0-4.5a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5Zm.2-9.5c-2 0-3.37 1.03-3.7 2.75l1.95.4c.17-.84.77-1.3 1.67-1.3 1 0 1.63.52 1.63 1.35 0 .67-.33 1.03-1.27 1.58-1.12.65-1.48 1.27-1.48 2.47V14h2v-.55c0-.67.2-.94 1.12-1.5 1.18-.72 1.88-1.58 1.88-2.9C16 7.25 14.5 6 12.2 6Z',\n },\n add: {\n path: 'M11 5h2v6h6v2h-6v6h-2v-6H5v-2h6V5Z',\n },\n edit: {\n path: 'm16.86 3.49 3.65 3.65L8.65 19H5v-3.65L16.86 3.49ZM19.73 2.27a1.75 1.75 0 0 0-2.47 0l-1.35 1.35 3.65 3.65 1.35-1.35a1.75 1.75 0 0 0 0-2.47l-1.18-1.18Z',\n },\n delete: {\n path: 'M8 3h8l1 2h4v2H3V5h4l1-2Zm-2 6h12l-1 12H7L6 9Zm4 2v7h2v-7h-2Zm4 0v7h2v-7h-2Z',\n },\n toggle_on: {\n path: 'M17 6H7a6 6 0 0 0 0 12h10a6 6 0 0 0 0-12Zm0 10a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z',\n },\n toggle_off: {\n path: 'M17 6H7a6 6 0 0 0 0 12h10a6 6 0 0 0 0-12ZM7 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z',\n },\n inbox: {\n path: 'M4 3h16l3 11v7H1v-7L4 3Zm1.5 2L3 14h5l1 2h6l1-2h5l-2.5-9h-13Z',\n },\n pdf: {\n path: 'M6 2h9l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm8 1.5V8h4.5L14 3.5ZM8 12v7h2v-2h1.2a2.5 2.5 0 0 0 0-5H8Zm2 2h1.2a.5.5 0 0 1 0 1H10v-1Zm4-2v7h2v-2h1v-2h-1v-1h2v-2h-4Z',\n },\n} satisfies Record<string, TdIconoDefinicion>;\n\nexport type TdIconoNombre = keyof typeof TD_ICONOS;\n\nexport const TD_ICONOS_NOMBRES = Object.freeze(\n Object.keys(TD_ICONOS) as TdIconoNombre[]\n);\n","import { Injectable } from '@angular/core';\nimport { TdIconoDefinicion, TdIconoPersonalizado } from './td-icono.model';\nimport { TD_ICONOS } from './td-iconos';\n\n@Injectable({ providedIn: 'root' })\nexport class TdIconoRegistry {\n private readonly iconos = new Map<string, TdIconoDefinicion>(\n Object.entries(TD_ICONOS)\n );\n\n registrar(iconos: TdIconoPersonalizado): void {\n for (const [nombre, definicion] of Object.entries(iconos)) {\n const clave = this.normalizar(nombre);\n if (!clave) continue;\n\n this.iconos.set(\n clave,\n typeof definicion === 'string' ? { path: definicion } : definicion\n );\n }\n }\n\n obtener(nombre: string | null | undefined): TdIconoDefinicion {\n return this.iconos.get(this.normalizar(nombre)) ?? this.iconos.get('folder')!;\n }\n\n existe(nombre: string): boolean {\n return this.iconos.has(this.normalizar(nombre));\n }\n\n nombres(): string[] {\n return [...this.iconos.keys()];\n }\n\n private normalizar(nombre: string | null | undefined): string {\n return (nombre ?? '').trim().toLowerCase();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n inject,\n} from '@angular/core';\nimport { TdIconoRegistry } from './td-icono-registry';\n\n@Component({\n selector: 'td-icon',\n template: `\n <svg\n [attr.viewBox]=\"definicion().viewBox || '0 0 24 24'\"\n [attr.aria-hidden]=\"titulo ? null : 'true'\"\n [attr.aria-label]=\"titulo || null\"\n [attr.role]=\"titulo ? 'img' : null\"\n focusable=\"false\"\n >\n <path [attr.d]=\"definicion().path\" />\n </svg>\n `,\n styles: `\n :host {\n display: inline-flex;\n width: var(--td-icon-size, 1.25rem);\n height: var(--td-icon-size, 1.25rem);\n flex: 0 0 auto;\n color: inherit;\n line-height: 0;\n vertical-align: middle;\n }\n svg { width: 100%; height: 100%; fill: currentColor; }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdIcon {\n private readonly registry = inject(TdIconoRegistry);\n\n @Input() nombre = 'folder';\n @Input() titulo = '';\n\n @Input()\n set tamano(value: string | number) {\n this.tamanoCss = typeof value === 'number' ? `${value}px` : value;\n }\n\n protected tamanoCss = '1.25rem';\n\n @HostBinding('style.--td-icon-size')\n protected get tamanoHost(): string {\n return this.tamanoCss;\n }\n\n protected definicion() {\n return this.registry.obtener(this.nombre);\n }\n}\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TdIcon } from '../iconos';\nimport {\n TdDataTableAccion,\n TdDataTableAccionEvento,\n TdDataTableBoton,\n TdDataTableColumna,\n TdDataTableTono,\n} from './td-data-table.model';\n\n@Component({\n selector: 'td-data-table',\n imports: [FormsModule, ScrollingModule, TdIcon],\n templateUrl: './td-data-table.html',\n styleUrl: './td-data-table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdDataTable<T extends object> implements OnChanges, OnDestroy {\n @ViewChild(CdkVirtualScrollViewport)\n private viewport?: CdkVirtualScrollViewport;\n\n @Input() datos: T[] = [];\n @Input() columnas: TdDataTableColumna<T>[] = [];\n @Input() acciones: TdDataTableAccion<T>[] = [];\n @Input() botones: TdDataTableBoton[] = [];\n @Input() total = 0;\n @Input() cargando = false;\n @Input() puedeCargarMas = false;\n @Input() itemSize = 65;\n @Input() altura = 'min(620px, calc(100dvh - 18rem))';\n @Input() campoId: keyof T & string = 'id' as keyof T & string;\n @Input() oscuro = false;\n @Input() mostrarBusqueda = true;\n @Input() mostrarAgregar = true;\n @Input() placeholderBusqueda = 'Buscar...';\n @Input() textoAgregar = 'Agregar';\n @Input() textoVacio = 'No hay registros disponibles';\n @Input() descripcionVacio = 'Comienza creando un nuevo registro.';\n @Input() debounceBusqueda = 250;\n\n @Output() readonly busquedaChange = new EventEmitter<string>();\n @Output() readonly agregar = new EventEmitter<void>();\n @Output() readonly accion = new EventEmitter<TdDataTableAccionEvento<T>>();\n @Output() readonly botonClick = new EventEmitter<TdDataTableBoton>();\n @Output() readonly cargarMas = new EventEmitter<void>();\n\n protected busqueda = '';\n private timeoutBusqueda: ReturnType<typeof setTimeout> | null = null;\n private ultimaLongitudSolicitada = -1;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['datos'] && this.datos.length !== this.ultimaLongitudSolicitada) {\n this.ultimaLongitudSolicitada = -1;\n }\n }\n\n ngOnDestroy(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n }\n\n protected columnasGrid(): string {\n const columnas = this.columnas.map((columna) => columna.ancho ?? 'minmax(10rem, 1fr)');\n if (this.acciones.length) columnas.push('minmax(9rem, auto)');\n return columnas.join(' ');\n }\n\n protected buscar(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n this.timeoutBusqueda = setTimeout(\n () => this.busquedaChange.emit(this.busqueda.trim()),\n this.debounceBusqueda\n );\n }\n\n protected limpiarBusqueda(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n this.busqueda = '';\n this.busquedaChange.emit('');\n }\n\n protected valor(fila: T, clave: keyof T & string): unknown {\n return (fila as Record<string, unknown>)[clave];\n }\n\n protected textoCelda(columna: TdDataTableColumna<T>, fila: T, indice: number): string {\n const valor = this.valor(fila, columna.clave);\n if (columna.formatear) return columna.formatear(valor, fila, indice);\n if (valor === null || valor === undefined || valor === '') return '—';\n if (columna.tipo === 'booleano') return valor ? 'Sí' : 'No';\n if (columna.tipo === 'estado') return valor ? 'Activo' : 'Inactivo';\n return String(valor);\n }\n\n protected tonoCelda(columna: TdDataTableColumna<T>, fila: T): TdDataTableTono {\n const valor = this.valor(fila, columna.clave);\n if (columna.tono) return columna.tono(valor, fila);\n if (columna.tipo === 'estado') return valor ? 'exito' : 'peligro';\n if (columna.tipo === 'booleano') return valor ? 'exito' : 'neutro';\n return 'neutro';\n }\n\n protected accionesVisibles(fila: T): TdDataTableAccion<T>[] {\n return this.acciones.filter((accion) => accion.visible?.(fila) ?? true);\n }\n\n protected botonesVisibles(): TdDataTableBoton[] {\n return this.botones.filter((boton) => boton.visible ?? true);\n }\n\n protected ejecutarAccion(\n accion: TdDataTableAccion<T>,\n fila: T,\n indice: number\n ): void {\n if (accion.deshabilitada?.(fila)) return;\n this.accion.emit({ accion, fila, indice });\n }\n\n protected alCambiarIndice(): void {\n if (!this.viewport) return;\n\n const distanciaAlFinal = this.viewport.measureScrollOffset('bottom');\n const umbralPx = this.itemSize * 2;\n\n if (\n distanciaAlFinal <= umbralPx &&\n this.datos.length > 0 &&\n this.puedeCargarMas &&\n !this.cargando &&\n this.ultimaLongitudSolicitada !== this.datos.length\n ) {\n this.ultimaLongitudSolicitada = this.datos.length;\n this.cargarMas.emit();\n }\n }\n\n protected readonly trackFila = (_indice: number, fila: T): unknown =>\n (fila as Record<string, unknown>)[this.campoId] ?? fila;\n}\n","<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar búsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n @if (cargando) {\n <span class=\"td-tabla__cargando-inline\"><i></i> Cargando...</span>\n }\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n @if (mostrarAgregar) {\n <button class=\"td-tabla__agregar\" type=\"button\" (click)=\"agregar.emit()\">\n <td-icon nombre=\"add\" />\n <span>{{ textoAgregar }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div\n class=\"td-tabla__encabezado\"\n role=\"row\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scrolledIndexChange)=\"alCambiarIndice()\"\n >\n <div\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span [class.td-tabla__numero]=\"columna.tipo === 'numero'\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + (accionFila.tono || 'neutro')\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"accionFila.icono\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n selector: 'td-footer',\n templateUrl: './td-footer.html',\n styleUrl: './td-footer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdFooter {\n @Input() empresa = 'TelcomDev';\n @Input() texto = 'Todos los derechos reservados.';\n @Input() version = '';\n @Input() oscuro = false;\n @Input() compacto = false;\n @Input() anio = new Date().getFullYear();\n}\n","<footer\n class=\"td-footer\"\n [class.td-footer--oscuro]=\"oscuro\"\n [class.td-footer--compacto]=\"compacto\"\n>\n <div class=\"td-footer__identidad\">\n <span>© {{ anio }} {{ empresa }}</span>\n @if (texto) {\n <small>{{ texto }}</small>\n }\n </div>\n\n <nav class=\"td-footer__enlaces\" aria-label=\"Enlaces del pie de página\">\n <ng-content select=\"[tdFooterLinks]\" />\n </nav>\n\n <div class=\"td-footer__final\">\n <ng-content select=\"[tdFooterActions]\" />\n @if (version) {\n <span class=\"td-footer__version\">v{{ version }}</span>\n }\n </div>\n</footer>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostListener,\n Input,\n Output,\n} from '@angular/core';\nimport { TdIcon } from '../iconos';\n\nexport interface TdHeaderNotificacion {\n id: string | number;\n titulo: string;\n descripcion?: string;\n fecha?: string;\n icono?: string;\n leida?: boolean;\n}\n\nexport type TdHeaderAccionPerfil = 'perfil' | 'configuracion' | 'salir';\n\n@Component({\n selector: 'td-header',\n imports: [TdIcon],\n templateUrl: './td-header.html',\n styleUrl: './td-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdHeader {\n @Input() menuAbierto = true;\n @Input() mostrarMenu = true;\n @Input() usuario = '';\n @Input() cargo = '';\n @Input() avatarUrl = '';\n @Input() notificaciones: TdHeaderNotificacion[] = [];\n @Input() oscuro = false;\n @Input() fijo = true;\n\n @Output() readonly menuToggle = new EventEmitter<void>();\n @Output() readonly notificacionSeleccionada = new EventEmitter<TdHeaderNotificacion>();\n @Output() readonly verTodasNotificaciones = new EventEmitter<void>();\n @Output() readonly accionPerfil = new EventEmitter<TdHeaderAccionPerfil>();\n\n protected panelNotificacionesAbierto = false;\n protected panelPerfilAbierto = false;\n\n protected alternarMenu(): void {\n this.menuToggle.emit();\n }\n\n protected alternarNotificaciones(): void {\n this.panelNotificacionesAbierto = !this.panelNotificacionesAbierto;\n this.panelPerfilAbierto = false;\n }\n\n protected alternarPerfil(): void {\n this.panelPerfilAbierto = !this.panelPerfilAbierto;\n this.panelNotificacionesAbierto = false;\n }\n\n protected seleccionarNotificacion(notificacion: TdHeaderNotificacion): void {\n this.notificacionSeleccionada.emit(notificacion);\n this.panelNotificacionesAbierto = false;\n }\n\n protected emitirAccionPerfil(accion: TdHeaderAccionPerfil): void {\n this.accionPerfil.emit(accion);\n this.panelPerfilAbierto = false;\n }\n\n protected notificacionesNoLeidas(): number {\n return this.notificaciones.filter((item) => !item.leida).length;\n }\n\n protected inicialesUsuario(): string {\n const partes = this.usuario.trim().split(/\\s+/).filter(Boolean);\n return (\n partes\n .slice(0, 2)\n .map((parte) => parte.charAt(0))\n .join('') || 'U'\n ).toUpperCase();\n }\n\n @HostListener('document:keydown.escape')\n protected cerrarConEscape(): void {\n this.panelNotificacionesAbierto = false;\n this.panelPerfilAbierto = false;\n }\n}\n","<header\n class=\"td-header\"\n [class.td-header--oscuro]=\"oscuro\"\n [class.td-header--fijo]=\"fijo\"\n>\n <div class=\"td-header__inicio\">\n @if (mostrarMenu) {\n <button\n class=\"td-header__boton td-header__menu\"\n type=\"button\"\n [attr.aria-label]=\"menuAbierto ? 'Cerrar sidebar' : 'Abrir sidebar'\"\n [attr.aria-expanded]=\"menuAbierto\"\n (click)=\"alternarMenu()\"\n >\n <td-icon [nombre]=\"menuAbierto ? 'close' : 'menu'\" />\n </button>\n }\n\n <ng-content select=\"[tdHeaderStart]\" />\n </div>\n\n <div class=\"td-header__centro\">\n <ng-content select=\"[tdHeaderCenter]\" />\n </div>\n\n <div class=\"td-header__acciones\">\n <ng-content select=\"[tdHeaderActions]\" />\n\n <div class=\"td-header__desplegable\">\n <button\n class=\"td-header__boton td-header__notificaciones\"\n type=\"button\"\n aria-label=\"Notificaciones\"\n [attr.aria-expanded]=\"panelNotificacionesAbierto\"\n (click)=\"alternarNotificaciones()\"\n >\n <td-icon nombre=\"notifications\" />\n @if (notificacionesNoLeidas() > 0) {\n <span>{{ notificacionesNoLeidas() > 99 ? '99+' : notificacionesNoLeidas() }}</span>\n }\n </button>\n\n @if (panelNotificacionesAbierto) {\n <section class=\"td-header__panel td-header__panel--notificaciones\">\n <header>\n <div>\n <strong>Notificaciones</strong>\n <small>{{ notificacionesNoLeidas() }} sin leer</small>\n </div>\n <td-icon nombre=\"notifications\" />\n </header>\n\n <div class=\"td-header__lista-notificaciones\">\n @for (notificacion of notificaciones; track notificacion.id) {\n <button\n type=\"button\"\n [class.td-header__notificacion--nueva]=\"!notificacion.leida\"\n (click)=\"seleccionarNotificacion(notificacion)\"\n >\n <span class=\"td-header__notificacion-icono\">\n <td-icon [nombre]=\"notificacion.icono || 'notifications'\" />\n </span>\n <span>\n <strong>{{ notificacion.titulo }}</strong>\n @if (notificacion.descripcion) {\n <small>{{ notificacion.descripcion }}</small>\n }\n @if (notificacion.fecha) {\n <time>{{ notificacion.fecha }}</time>\n }\n </span>\n </button>\n } @empty {\n <p class=\"td-header__vacio\">No tienes notificaciones.</p>\n }\n </div>\n\n @if (notificaciones.length) {\n <button\n class=\"td-header__ver-todas\"\n type=\"button\"\n (click)=\"verTodasNotificaciones.emit(); panelNotificacionesAbierto = false\"\n >\n Ver todas las notificaciones\n </button>\n }\n </section>\n }\n </div>\n\n @if (usuario) {\n <span class=\"td-header__separador\" aria-hidden=\"true\"></span>\n\n <div class=\"td-header__desplegable\">\n <button\n class=\"td-header__perfil\"\n type=\"button\"\n aria-label=\"Abrir perfil de usuario\"\n [attr.aria-expanded]=\"panelPerfilAbierto\"\n (click)=\"alternarPerfil()\"\n >\n <span class=\"td-header__avatar\">\n @if (avatarUrl) {\n <img [src]=\"avatarUrl\" [alt]=\"usuario\" />\n } @else {\n {{ inicialesUsuario() }}\n }\n </span>\n <span class=\"td-header__usuario\">\n <strong>{{ usuario }}</strong>\n @if (cargo) {\n <small>{{ cargo }}</small>\n }\n </span>\n <td-icon nombre=\"chevron_down\" tamano=\"0.85rem\" />\n </button>\n\n @if (panelPerfilAbierto) {\n <section class=\"td-header__panel td-header__panel--perfil\">\n <div class=\"td-header__perfil-resumen\">\n <span class=\"td-header__avatar td-header__avatar--grande\">{{ inicialesUsuario() }}</span>\n <div>\n <strong>{{ usuario }}</strong>\n <small>{{ cargo || 'Usuario' }}</small>\n </div>\n </div>\n <div class=\"td-header__perfil-opciones\">\n <button type=\"button\" (click)=\"emitirAccionPerfil('perfil')\">\n <td-icon nombre=\"person\" /> Mi perfil\n </button>\n <button type=\"button\" (click)=\"emitirAccionPerfil('configuracion')\">\n <td-icon nombre=\"settings\" /> Configuración\n </button>\n <button class=\"td-header__salir\" type=\"button\" (click)=\"emitirAccionPerfil('salir')\">\n <td-icon nombre=\"close\" /> Cerrar sesión\n </button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { TdIcon } from '../iconos';\nimport { MenuSidebar, TdSidebarSeleccion } from './menu-sidebar';\n\nexport type TdSidebarModoCerrado = 'compacto' | 'oculto';\n\n@Component({\n selector: 'td-sidebar',\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, TdIcon],\n templateUrl: './td-sidebar.html',\n styleUrl: './td-sidebar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdSidebar {\n @Input() titulo = 'Gestión Corporativa';\n @Input() subtitulo = 'Central Platform';\n @Input() etiquetaNavegacion = 'Navegación';\n @Input() logoUrl = '';\n @Input() logoAlt = 'Logo';\n @Input() textoCarga = 'Cargando menú...';\n @Input() mensajeVacio = 'No hay opciones disponibles.';\n @Input() error = '';\n @Input() cargando = false;\n @Input() oscuro = false;\n @Input() modoCerrado: TdSidebarModoCerrado = 'compacto';\n\n @Input()\n set abierto(value: boolean) {\n this.abiertoInterno.set(value);\n }\n get abierto(): boolean {\n return this.abiertoInterno();\n }\n\n @Input()\n set menu(value: MenuSidebar[] | null | undefined) {\n this.menuNormalizado.set(this.normalizarMenu(value ?? []));\n }\n get menu(): MenuSidebar[] {\n return this.menuNormalizado();\n }\n\n @Output() readonly abiertoChange = new EventEmitter<boolean>();\n @Output() readonly seleccionar = new EventEmitter<TdSidebarSeleccion>();\n\n protected readonly abiertoInterno = signal(true);\n protected readonly menuNormalizado = signal<MenuSidebar[]>([]);\n protected readonly expandidos = signal<ReadonlySet<string>>(new Set<string>());\n\n protected alternarGrupo(clave: string): void {\n if (!this.abiertoInterno()) {\n this.abiertoInterno.set(true);\n this.abiertoChange.emit(true);\n }\n\n this.expandidos.update((actuales) => {\n const siguientes = new Set(actuales);\n siguientes.has(clave) ? siguientes.delete(clave) : siguientes.add(clave);\n return siguientes;\n });\n }\n\n protected estaExpandido(clave: string): boolean {\n return this.expandidos().has(clave);\n }\n\n protected seleccionarItem(item: MenuSidebar, nivel: number): void {\n this.seleccionar.emit({ item, nivel });\n }\n\n protected claveItem(item: MenuSidebar, padre: string, indice: number): string {\n return `${padre}/${item.nombre}-${indice}`;\n }\n\n protected inicialMarca(): string {\n return (this.titulo.trim().charAt(0) || 'T').toUpperCase();\n }\n\n private normalizarMenu(items: MenuSidebar[]): MenuSidebar[] {\n return [...items]\n .sort((a, b) => a.orden - b.orden)\n .map((item) => ({\n ...item,\n icono: item.icono?.trim() || 'folder',\n subMenus: this.normalizarMenu(item.subMenus ?? []),\n }));\n }\n}\n","<aside\n class=\"td-sidebar\"\n [class.td-sidebar--compacto]=\"!abiertoInterno() && modoCerrado === 'compacto'\"\n [class.td-sidebar--oculto]=\"!abiertoInterno() && modoCerrado === 'oculto'\"\n [class.td-sidebar--oscuro]=\"oscuro\"\n [attr.aria-hidden]=\"!abiertoInterno() && modoCerrado === 'oculto'\"\n>\n <header class=\"td-sidebar__marca\">\n <div class=\"td-sidebar__logo\">\n @if (logoUrl) {\n <img [src]=\"logoUrl\" [alt]=\"logoAlt\" />\n } @else {\n <span>{{ inicialMarca() }}</span>\n }\n </div>\n\n @if (abiertoInterno()) {\n <div class=\"td-sidebar__marca-texto\">\n <small>{{ subtitulo }}</small>\n <strong>{{ titulo }}</strong>\n </div>\n }\n\n </header>\n\n <div class=\"td-sidebar__encabezado\">\n @if (abiertoInterno()) {\n <span>{{ etiquetaNavegacion }}</span>\n } @else {\n <span aria-hidden=\"true\">•••</span>\n }\n </div>\n\n <nav class=\"td-sidebar__nav\" aria-label=\"Menú principal\">\n @if (cargando) {\n <p class=\"td-sidebar__estado\">{{ textoCarga }}</p>\n } @else if (error) {\n <p class=\"td-sidebar__estado td-sidebar__estado--error\">{{ error }}</p>\n } @else if (!menuNormalizado().length) {\n <p class=\"td-sidebar__estado\">{{ mensajeVacio }}</p>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"listaMenu\"\n [ngTemplateOutletContext]=\"{ items: menuNormalizado(), nivel: 0, padre: 'raiz' }\"\n />\n }\n </nav>\n</aside>\n\n<ng-template #listaMenu let-items=\"items\" let-nivel=\"nivel\" let-padre=\"padre\">\n <ul class=\"td-sidebar__lista\" [class.td-sidebar__lista--anidada]=\"nivel > 0\">\n @for (item of items; track item) {\n @let clave = claveItem(item, padre, $index);\n @let tieneHijos = item.subMenus.length > 0;\n\n <li class=\"td-sidebar__item\">\n @if (tieneHijos) {\n <button\n class=\"td-sidebar__enlace\"\n type=\"button\"\n [class.td-sidebar__enlace--activo]=\"estaExpandido(clave)\"\n [attr.aria-expanded]=\"estaExpandido(clave)\"\n [attr.title]=\"!abiertoInterno() ? item.nombre : null\"\n (click)=\"alternarGrupo(clave)\"\n >\n <td-icon class=\"td-sidebar__icono\" [nombre]=\"item.icono || 'folder'\" />\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n <td-icon\n class=\"td-sidebar__flecha\"\n [class.td-sidebar__flecha--abierta]=\"estaExpandido(clave)\"\n nombre=\"chevron_right\"\n />\n }\n </button>\n } @else {\n <a\n class=\"td-sidebar__enlace\"\n [routerLink]=\"item.ruta || '/'\"\n routerLinkActive=\"td-sidebar__enlace--ruta-activa\"\n [routerLinkActiveOptions]=\"{ exact: item.ruta === '/' }\"\n [attr.title]=\"!abiertoInterno() ? item.nombre : null\"\n (click)=\"seleccionarItem(item, nivel)\"\n >\n <td-icon class=\"td-sidebar__icono\" [nombre]=\"item.icono || 'folder'\" />\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n }\n </a>\n }\n\n @if (abiertoInterno() && tieneHijos && estaExpandido(clave)) {\n <ng-container\n [ngTemplateOutlet]=\"listaMenu\"\n [ngTemplateOutletContext]=\"{\n items: item.subMenus,\n nivel: nivel + 1,\n padre: clave\n }\"\n />\n }\n </li>\n }\n </ul>\n</ng-template>\n","/*\n * Public API Surface of telcomdev-ui\n */\n\nexport * from './lib/telcomdev-ui';\nexport * from './lib/alerta';\nexport * from './lib/data-table';\nexport * from './lib/footer';\nexport * from './lib/header';\nexport * from './lib/iconos';\nexport * from './lib/sidebar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telcomdev-ui.mjs","sources":["../../../projects/telcomdev-ui/src/lib/telcomdev-ui.ts","../../../projects/telcomdev-ui/src/lib/alerta/td-alerta.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-iconos.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-icono-registry.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-icon.ts","../../../projects/telcomdev-ui/src/lib/data-table/td-data-table.ts","../../../projects/telcomdev-ui/src/lib/data-table/td-data-table.html","../../../projects/telcomdev-ui/src/lib/footer/td-footer.ts","../../../projects/telcomdev-ui/src/lib/footer/td-footer.html","../../../projects/telcomdev-ui/src/lib/header/td-header.ts","../../../projects/telcomdev-ui/src/lib/header/td-header.html","../../../projects/telcomdev-ui/src/lib/sidebar/td-sidebar.ts","../../../projects/telcomdev-ui/src/lib/sidebar/td-sidebar.html","../../../projects/telcomdev-ui/src/public-api.ts","../../../projects/telcomdev-ui/src/telcomdev-ui.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'td-telcomdev-ui',\n imports: [],\n template: ` <p>telcomdev-ui works!</p> `,\n styles: ``,\n})\nexport class TelcomdevUi {}\n","export type TdAlertaTipo = 'exito' | 'error' | 'advertencia' | 'info' | 'pregunta';\r\n\r\nexport interface TdAlertaOpciones {\r\n titulo?: string;\r\n mensaje?: string;\r\n tipo?: TdAlertaTipo;\r\n textoConfirmar?: string;\r\n textoCancelar?: string;\r\n mostrarCancelar?: boolean;\r\n cerrarConEscape?: boolean;\r\n cerrarConFondo?: boolean;\r\n}\r\n\r\nexport class TdAlerta {\r\n private static readonly estiloId = 'td-alerta-estilos';\r\n\r\n static exito(mensaje: string, titulo = '¡Operación exitosa!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'exito',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static error(mensaje: string, titulo = '¡Error!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'error',\r\n textoConfirmar: 'Cerrar',\r\n });\r\n }\r\n\r\n static errorSistema(mensaje: string, titulo = '¡Error de Sistema!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'error',\r\n textoConfirmar: 'Cerrar',\r\n });\r\n }\r\n\r\n static advertencia(mensaje: string, titulo = '¡Advertencia!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'advertencia',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static info(mensaje: string, titulo = 'Información'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'info',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static confirmar(\r\n mensaje: string,\r\n titulo = '¿Estás seguro?',\r\n textoConfirmar = 'Sí, continuar',\r\n textoCancelar = 'Cancelar'\r\n ): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'pregunta',\r\n textoConfirmar,\r\n textoCancelar,\r\n mostrarCancelar: true,\r\n });\r\n }\r\n\r\n static confirmarEliminar(\r\n mensaje = 'Esta acción no se puede deshacer.',\r\n titulo = '¿Eliminar registro?'\r\n ): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'advertencia',\r\n textoConfirmar: 'Sí, eliminar',\r\n textoCancelar: 'Cancelar',\r\n mostrarCancelar: true,\r\n });\r\n }\r\n\r\n static mostrar(opciones: TdAlertaOpciones): Promise<boolean> {\r\n if (typeof document === 'undefined') {\r\n return Promise.resolve(false);\r\n }\r\n\r\n this.inyectarEstilos();\r\n\r\n const config: Required<TdAlertaOpciones> = {\r\n titulo: opciones.titulo ?? '',\r\n mensaje: opciones.mensaje ?? '',\r\n tipo: opciones.tipo ?? 'info',\r\n textoConfirmar: opciones.textoConfirmar ?? 'Aceptar',\r\n textoCancelar: opciones.textoCancelar ?? 'Cancelar',\r\n mostrarCancelar: opciones.mostrarCancelar ?? false,\r\n cerrarConEscape: opciones.cerrarConEscape ?? true,\r\n cerrarConFondo: opciones.cerrarConFondo ?? false,\r\n };\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const fondo = document.createElement('div');\r\n fondo.className = 'td-alerta-fondo';\r\n\r\n const modal = document.createElement('div');\r\n modal.className = 'td-alerta-modal';\r\n modal.setAttribute('role', 'dialog');\r\n modal.setAttribute('aria-modal', 'true');\r\n\r\n const icono = document.createElement('div');\r\n icono.className = `td-alerta-icono td-alerta-icono--${config.tipo}`;\r\n icono.textContent = this.obtenerIcono(config.tipo);\r\n\r\n const titulo = document.createElement('h2');\r\n titulo.className = 'td-alerta-titulo';\r\n titulo.textContent = config.titulo;\r\n\r\n const mensaje = document.createElement('p');\r\n mensaje.className = 'td-alerta-mensaje';\r\n mensaje.textContent = config.mensaje;\r\n\r\n const acciones = document.createElement('div');\r\n acciones.className = 'td-alerta-acciones';\r\n\r\n const botonConfirmar = document.createElement('button');\r\n botonConfirmar.type = 'button';\r\n botonConfirmar.className = `td-alerta-boton td-alerta-boton--${config.tipo}`;\r\n botonConfirmar.textContent = config.textoConfirmar;\r\n\r\n const botonCancelar = document.createElement('button');\r\n botonCancelar.type = 'button';\r\n botonCancelar.className = 'td-alerta-boton td-alerta-boton--cancelar';\r\n botonCancelar.textContent = config.textoCancelar;\r\n\r\n const cerrar = (resultado: boolean): void => {\r\n document.removeEventListener('keydown', onKeyDown);\r\n fondo.classList.add('td-alerta-saliendo');\r\n\r\n window.setTimeout(() => {\r\n fondo.remove();\r\n resolve(resultado);\r\n }, 140);\r\n };\r\n\r\n const onKeyDown = (event: KeyboardEvent): void => {\r\n if (event.key === 'Escape' && config.cerrarConEscape) {\r\n cerrar(false);\r\n }\r\n };\r\n\r\n botonConfirmar.addEventListener('click', () => cerrar(true));\r\n botonCancelar.addEventListener('click', () => cerrar(false));\r\n\r\n if (config.cerrarConFondo) {\r\n fondo.addEventListener('click', (event) => {\r\n if (event.target === fondo) {\r\n cerrar(false);\r\n }\r\n });\r\n }\r\n\r\n document.addEventListener('keydown', onKeyDown);\r\n\r\n if (config.mostrarCancelar) {\r\n acciones.appendChild(botonCancelar);\r\n }\r\n\r\n acciones.appendChild(botonConfirmar);\r\n\r\n modal.appendChild(icono);\r\n modal.appendChild(titulo);\r\n\r\n if (config.mensaje) {\r\n modal.appendChild(mensaje);\r\n }\r\n\r\n modal.appendChild(acciones);\r\n fondo.appendChild(modal);\r\n document.body.appendChild(fondo);\r\n\r\n botonConfirmar.focus();\r\n });\r\n }\r\n\r\n private static obtenerIcono(tipo: TdAlertaTipo): string {\r\n const iconos: Record<TdAlertaTipo, string> = {\r\n exito: '✓',\r\n error: '!',\r\n advertencia: '!',\r\n info: 'i',\r\n pregunta: '?',\r\n };\r\n\r\n return iconos[tipo];\r\n }\r\n\r\n private static inyectarEstilos(): void {\r\n if (document.getElementById(this.estiloId)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = this.estiloId;\r\n style.textContent = `\r\n .td-alerta-fondo {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 99999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 1rem;\r\n background: rgba(15, 23, 42, 0.52);\r\n animation: td-alerta-fondo-entrada 160ms ease-out;\r\n }\r\n\r\n .td-alerta-modal {\r\n width: min(100%, 430px);\r\n border-radius: 18px;\r\n background: #ffffff;\r\n padding: 1.75rem;\r\n text-align: center;\r\n box-shadow: 0 22px 70px rgba(15, 23, 42, 0.28);\r\n animation: td-alerta-modal-entrada 180ms ease-out;\r\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n }\r\n\r\n .td-alerta-icono {\r\n width: 4.25rem;\r\n height: 4.25rem;\r\n margin: 0 auto 1rem;\r\n border-radius: 999px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 2.1rem;\r\n font-weight: 800;\r\n }\r\n\r\n .td-alerta-icono--exito {\r\n color: #16a34a;\r\n background: #dcfce7;\r\n }\r\n\r\n .td-alerta-icono--error {\r\n color: #ef4444;\r\n background: #fee2e2;\r\n }\r\n\r\n .td-alerta-icono--advertencia {\r\n color: #f59e0b;\r\n background: #fef3c7;\r\n }\r\n\r\n .td-alerta-icono--info {\r\n color: #2563eb;\r\n background: #dbeafe;\r\n }\r\n\r\n .td-alerta-icono--pregunta {\r\n color: #7c3aed;\r\n background: #ede9fe;\r\n }\r\n\r\n .td-alerta-titulo {\r\n margin: 0;\r\n color: #111827;\r\n font-size: 1.35rem;\r\n line-height: 1.25;\r\n font-weight: 800;\r\n }\r\n\r\n .td-alerta-mensaje {\r\n margin: 0.75rem 0 0;\r\n color: #4b5563;\r\n font-size: 0.96rem;\r\n line-height: 1.55;\r\n }\r\n\r\n .td-alerta-acciones {\r\n display: flex;\r\n justify-content: center;\r\n gap: 0.75rem;\r\n margin-top: 1.5rem;\r\n }\r\n\r\n .td-alerta-boton {\r\n border: 0;\r\n border-radius: 10px;\r\n padding: 0.7rem 1.2rem;\r\n color: #ffffff;\r\n font-size: 0.93rem;\r\n font-weight: 700;\r\n cursor: pointer;\r\n transition: transform 120ms ease, filter 120ms ease, background 120ms ease;\r\n }\r\n\r\n .td-alerta-boton:hover {\r\n filter: brightness(0.96);\r\n }\r\n\r\n .td-alerta-boton:active {\r\n transform: scale(0.98);\r\n }\r\n\r\n .td-alerta-boton:focus {\r\n outline: 3px solid rgba(37, 99, 235, 0.25);\r\n outline-offset: 2px;\r\n }\r\n\r\n .td-alerta-boton--exito {\r\n background: #22c55e;\r\n }\r\n\r\n .td-alerta-boton--error {\r\n background: #ef4444;\r\n }\r\n\r\n .td-alerta-boton--advertencia {\r\n background: #f59e0b;\r\n }\r\n\r\n .td-alerta-boton--info {\r\n background: #2563eb;\r\n }\r\n\r\n .td-alerta-boton--pregunta {\r\n background: #7c3aed;\r\n }\r\n\r\n .td-alerta-boton--cancelar {\r\n background: #6b7280;\r\n }\r\n\r\n .td-alerta-saliendo {\r\n animation: td-alerta-fondo-salida 140ms ease-in forwards;\r\n }\r\n\r\n .td-alerta-saliendo .td-alerta-modal {\r\n animation: td-alerta-modal-salida 140ms ease-in forwards;\r\n }\r\n\r\n @keyframes td-alerta-fondo-entrada {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n }\r\n\r\n @keyframes td-alerta-modal-entrada {\r\n from {\r\n opacity: 0;\r\n transform: translateY(12px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n\r\n @keyframes td-alerta-fondo-salida {\r\n from { opacity: 1; }\r\n to { opacity: 0; }\r\n }\r\n\r\n @keyframes td-alerta-modal-salida {\r\n from {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: translateY(8px) scale(0.97);\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n .td-alerta-modal {\r\n padding: 1.4rem;\r\n border-radius: 16px;\r\n }\r\n\r\n .td-alerta-acciones {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .td-alerta-boton {\r\n width: 100%;\r\n }\r\n }\r\n `;\r\n\r\n document.head.appendChild(style);\r\n }\r\n}","import { TdIconoDefinicion } from './td-icono.model';\n\nexport const TD_ICONOS = {\n home: {\n path: 'M3 10.5 12 3l9 7.5V21a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1V10.5Z',\n },\n dashboard: {\n path: 'M4 3h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm10 0h6a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm0 8h6a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1ZM4 14h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1Z',\n },\n folder: {\n path: 'M3 5a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5Z',\n },\n settings: {\n path: 'M12 8.5a3.5 3.5 0 1 0 0 7 3.5 3.5 0 0 0 0-7Zm8.5 3.5c0-.5-.05-.98-.14-1.45l2.02-1.57-2-3.46-2.47 1a8.7 8.7 0 0 0-2.5-1.45L15 2.5h-4l-.4 2.57a8.7 8.7 0 0 0-2.51 1.45l-2.47-1-2 3.46 2.02 1.57a7.7 7.7 0 0 0 0 2.9l-2.02 1.57 2 3.46 2.47-1a8.7 8.7 0 0 0 2.5 1.45L11 21.5h4l.4-2.57a8.7 8.7 0 0 0 2.51-1.45l2.47 1 2-3.46-2.02-1.57c.09-.47.14-.95.14-1.45Z',\n },\n people: {\n path: 'M16 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8ZM6.5 12a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7ZM16 13c-4 0-7 2-7 4.5V21h14v-3.5C23 15 20 13 16 13ZM6.5 14C2.9 14 1 15.8 1 18v3h6v-3.5c0-1.2.48-2.28 1.3-3.16A9.3 9.3 0 0 0 6.5 14Z',\n },\n person: {\n path: 'M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 2c-5 0-9 2.5-9 5.5V22h18v-2.5c0-3-4-5.5-9-5.5Z',\n },\n security: {\n path: 'M12 2 4 5v6c0 5.05 3.41 9.74 8 11 4.59-1.26 8-5.95 8-11V5l-8-3Zm-1 14-4-4 1.4-1.4 2.6 2.58 5.6-5.58L18 9l-7 7Z',\n },\n inventory: {\n path: 'm12 2 9 5-9 5-9-5 9-5Zm-7 8.5 6 3.33V22l-6-3.33V10.5Zm8 11.5v-8.17l6-3.33v8.17L13 22Z',\n },\n shopping_cart: {\n path: 'M7 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm10 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4ZM6.2 6l.8 2h11.6l-1.9 5H8.1L4.3 3H1v2h2l3.6 9.6A2 2 0 0 0 8.5 16H19v-2H8.5l-.4-1H18a2 2 0 0 0 1.86-1.27L22 6H6.2Z',\n },\n receipt: {\n path: 'M5 2v20l3-2 4 2 4-2 3 2V2l-3 2-4-2-4 2-3-2Zm3 6h8v2H8V8Zm0 4h8v2H8v-2Z',\n },\n assessment: {\n path: 'M4 20h16v2H4a2 2 0 0 1-2-2V4h2v16Zm3-2H5v-6h2v6Zm4 0H9V7h2v11Zm4 0h-2V4h2v14Zm4 0h-2v-9h2v9Z',\n },\n description: {\n path: 'M6 2h8l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm7 1.5V8h4.5L13 3.5ZM8 12v2h8v-2H8Zm0 4v2h8v-2H8Z',\n },\n business: {\n path: 'M3 21V3h10v5h8v13h-7v-4h-2v4H3Zm3-14h2V5H6v2Zm4 0h2V5h-2v2Zm-4 4h2V9H6v2Zm4 0h2V9h-2v2Zm6 1h2v-2h-2v2Zm0 4h2v-2h-2v2Z',\n },\n chevron_left: {\n path: 'M14.7 5.3a1 1 0 0 1 0 1.4L9.4 12l5.3 5.3a1 1 0 1 1-1.4 1.4l-6-6a1 1 0 0 1 0-1.4l6-6a1 1 0 0 1 1.4 0Z',\n },\n chevron_right: {\n path: 'M9.3 5.3a1 1 0 0 0 0 1.4l5.3 5.3-5.3 5.3a1 1 0 1 0 1.4 1.4l6-6a1 1 0 0 0 0-1.4l-6-6a1 1 0 0 0-1.4 0Z',\n },\n sun: {\n path: 'M12 7a5 5 0 1 0 0 10 5 5 0 0 0 0-10Zm0-5a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0V3a1 1 0 0 1 1-1Zm0 17a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0v-2a1 1 0 0 1 1-1ZM2 12a1 1 0 0 1 1-1h2a1 1 0 1 1 0 2H3a1 1 0 0 1-1-1Zm17 0a1 1 0 0 1 1-1h2a1 1 0 1 1 0 2h-2a1 1 0 0 1-1-1ZM4.22 4.22a1 1 0 0 1 1.42 0l1.41 1.42a1 1 0 0 1-1.41 1.41L4.22 5.64a1 1 0 0 1 0-1.42Zm12.73 12.73a1 1 0 0 1 1.41 0l1.42 1.41a1 1 0 0 1-1.42 1.42l-1.41-1.42a1 1 0 0 1 0-1.41Zm2.83-12.73a1 1 0 0 1 0 1.42l-1.42 1.41a1 1 0 0 1-1.41-1.41l1.41-1.42a1 1 0 0 1 1.42 0ZM7.05 16.95a1 1 0 0 1 0 1.41l-1.41 1.42a1 1 0 0 1-1.42-1.42l1.42-1.41a1 1 0 0 1 1.41 0Z',\n },\n moon: {\n path: 'M20.5 15.2A8.5 8.5 0 0 1 8.8 3.5 9 9 0 1 0 20.5 15.2Z',\n },\n alert: {\n path: 'M12 2 1 21h22L12 2Zm-1 7h2v6h-2V9Zm0 8h2v2h-2v-2Z',\n },\n check: {\n path: 'm9.2 16.2-4.4-4.4-1.6 1.6 6 6L21 7.6 19.4 6 9.2 16.2Z',\n },\n close: {\n path: 'M6.4 5 12 10.6 17.6 5 19 6.4 13.4 12l5.6 5.6-1.4 1.4-5.6-5.6L6.4 19 5 17.6l5.6-5.6L5 6.4 6.4 5Z',\n },\n menu: {\n path: 'M3 6h18v2H3V6Zm0 5h18v2H3v-2Zm0 5h18v2H3v-2Z',\n },\n search: {\n path: 'M10.5 3a7.5 7.5 0 1 0 4.73 13.32L20.91 22 22 20.91l-5.68-5.68A7.5 7.5 0 0 0 10.5 3Zm0 2a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11Z',\n },\n notifications: {\n path: 'M12 22a2.5 2.5 0 0 0 2.45-2h-4.9A2.5 2.5 0 0 0 12 22Zm7-6v-5a7 7 0 0 0-5.5-6.84V3a1.5 1.5 0 0 0-3 0v1.16A7 7 0 0 0 5 11v5l-2 2v1h18v-1l-2-2Z',\n },\n chevron_down: {\n path: 'M5.3 8.3a1 1 0 0 1 1.4 0l5.3 5.3 5.3-5.3a1 1 0 1 1 1.4 1.4l-6 6a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.4Z',\n },\n apps: {\n path: 'M4 3h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm12 0h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1ZM4 15h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1Zm12 0h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1Z',\n },\n help: {\n path: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16Zm0-4.5a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5Zm.2-9.5c-2 0-3.37 1.03-3.7 2.75l1.95.4c.17-.84.77-1.3 1.67-1.3 1 0 1.63.52 1.63 1.35 0 .67-.33 1.03-1.27 1.58-1.12.65-1.48 1.27-1.48 2.47V14h2v-.55c0-.67.2-.94 1.12-1.5 1.18-.72 1.88-1.58 1.88-2.9C16 7.25 14.5 6 12.2 6Z',\n },\n add: {\n path: 'M11 5h2v6h6v2h-6v6h-2v-6H5v-2h6V5Z',\n },\n edit: {\n path: 'm16.86 3.49 3.65 3.65L8.65 19H5v-3.65L16.86 3.49ZM19.73 2.27a1.75 1.75 0 0 0-2.47 0l-1.35 1.35 3.65 3.65 1.35-1.35a1.75 1.75 0 0 0 0-2.47l-1.18-1.18Z',\n },\n delete: {\n path: 'M8 3h8l1 2h4v2H3V5h4l1-2Zm-2 6h12l-1 12H7L6 9Zm4 2v7h2v-7h-2Zm4 0v7h2v-7h-2Z',\n },\n toggle_on: {\n path: 'M17 6H7a6 6 0 0 0 0 12h10a6 6 0 0 0 0-12Zm0 10a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z',\n },\n toggle_off: {\n path: 'M17 6H7a6 6 0 0 0 0 12h10a6 6 0 0 0 0-12ZM7 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z',\n },\n inbox: {\n path: 'M4 3h16l3 11v7H1v-7L4 3Zm1.5 2L3 14h5l1 2h6l1-2h5l-2.5-9h-13Z',\n },\n pdf: {\n path: 'M6 2h9l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm8 1.5V8h4.5L14 3.5ZM8 12v7h2v-2h1.2a2.5 2.5 0 0 0 0-5H8Zm2 2h1.2a.5.5 0 0 1 0 1H10v-1Zm4-2v7h2v-2h1v-2h-1v-1h2v-2h-4Z',\n },\n} satisfies Record<string, TdIconoDefinicion>;\n\nexport type TdIconoNombre = keyof typeof TD_ICONOS;\n\nexport const TD_ICONOS_NOMBRES = Object.freeze(\n Object.keys(TD_ICONOS) as TdIconoNombre[]\n);\n","import { Injectable } from '@angular/core';\nimport { TdIconoDefinicion, TdIconoPersonalizado } from './td-icono.model';\nimport { TD_ICONOS } from './td-iconos';\n\n@Injectable({ providedIn: 'root' })\nexport class TdIconoRegistry {\n private readonly iconos = new Map<string, TdIconoDefinicion>(\n Object.entries(TD_ICONOS)\n );\n\n registrar(iconos: TdIconoPersonalizado): void {\n for (const [nombre, definicion] of Object.entries(iconos)) {\n const clave = this.normalizar(nombre);\n if (!clave) continue;\n\n this.iconos.set(\n clave,\n typeof definicion === 'string' ? { path: definicion } : definicion\n );\n }\n }\n\n obtener(nombre: string | null | undefined): TdIconoDefinicion {\n return this.iconos.get(this.normalizar(nombre)) ?? this.iconos.get('folder')!;\n }\n\n existe(nombre: string): boolean {\n return this.iconos.has(this.normalizar(nombre));\n }\n\n nombres(): string[] {\n return [...this.iconos.keys()];\n }\n\n private normalizar(nombre: string | null | undefined): string {\n return (nombre ?? '').trim().toLowerCase();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n inject,\n} from '@angular/core';\nimport { TdIconoRegistry } from './td-icono-registry';\n\n@Component({\n selector: 'td-icon',\n template: `\n <svg\n [attr.viewBox]=\"definicion().viewBox || '0 0 24 24'\"\n [attr.aria-hidden]=\"titulo ? null : 'true'\"\n [attr.aria-label]=\"titulo || null\"\n [attr.role]=\"titulo ? 'img' : null\"\n focusable=\"false\"\n >\n <path [attr.d]=\"definicion().path\" />\n </svg>\n `,\n styles: `\n :host {\n display: inline-flex;\n width: var(--td-icon-size, 1.25rem);\n height: var(--td-icon-size, 1.25rem);\n flex: 0 0 auto;\n color: inherit;\n line-height: 0;\n vertical-align: middle;\n }\n svg { width: 100%; height: 100%; fill: currentColor; }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdIcon {\n private readonly registry = inject(TdIconoRegistry);\n\n @Input() nombre = 'folder';\n @Input() titulo = '';\n\n @Input()\n set tamano(value: string | number) {\n this.tamanoCss = typeof value === 'number' ? `${value}px` : value;\n }\n\n protected tamanoCss = '1.25rem';\n\n @HostBinding('style.--td-icon-size')\n protected get tamanoHost(): string {\n return this.tamanoCss;\n }\n\n protected definicion() {\n return this.registry.obtener(this.nombre);\n }\n}\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TdIcon } from '../iconos';\nimport {\n TdDataTableAccion,\n TdDataTableAccionEvento,\n TdDataTableBoton,\n TdDataTableColumna,\n TdDataTableTono,\n} from './td-data-table.model';\n\n@Component({\n selector: 'td-data-table',\n imports: [FormsModule, ScrollingModule, TdIcon],\n templateUrl: './td-data-table.html',\n styleUrl: './td-data-table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdDataTable<T extends object> implements OnChanges, OnDestroy {\n @ViewChild(CdkVirtualScrollViewport)\n private viewport?: CdkVirtualScrollViewport;\n\n @Input() datos: T[] = [];\n @Input() columnas: TdDataTableColumna<T>[] = [];\n @Input() acciones: TdDataTableAccion<T>[] = [];\n @Input() botones: TdDataTableBoton[] = [];\n @Input() total = 0;\n @Input() cargando = false;\n @Input() puedeCargarMas = false;\n @Input() itemSize = 65;\n @Input() filasAntesDeCargar = 2;\n @Input() altura = 'min(620px, calc(100dvh - 18rem))';\n @Input() campoId: keyof T & string = 'id' as keyof T & string;\n @Input() oscuro = false;\n @Input() mostrarBusqueda = true;\n @Input() placeholderBusqueda = 'Buscar...';\n @Input() textoVacio = 'No hay registros disponibles';\n @Input() descripcionVacio = 'Prueba cambiando los filtros o vuelve más tarde.';\n @Input() debounceBusqueda = 250;\n\n @Output() readonly busquedaChange = new EventEmitter<string>();\n @Output() readonly accion = new EventEmitter<TdDataTableAccionEvento<T>>();\n @Output() readonly botonClick = new EventEmitter<TdDataTableBoton>();\n @Output() readonly cargarMas = new EventEmitter<void>();\n\n protected busqueda = '';\n private timeoutBusqueda: ReturnType<typeof setTimeout> | null = null;\n private ultimaLongitudSolicitada = -1;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['datos'] && this.datos.length !== this.ultimaLongitudSolicitada) {\n this.ultimaLongitudSolicitada = -1;\n }\n }\n\n ngOnDestroy(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n }\n\n protected columnasGrid(): string {\n const columnas = this.columnas.map((columna) => columna.ancho ?? 'minmax(10rem, 1fr)');\n if (this.acciones.length) columnas.push('minmax(9rem, auto)');\n return columnas.join(' ');\n }\n\n protected buscar(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n this.timeoutBusqueda = setTimeout(\n () => this.busquedaChange.emit(this.busqueda.trim()),\n this.debounceBusqueda\n );\n }\n\n protected limpiarBusqueda(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n this.busqueda = '';\n this.busquedaChange.emit('');\n }\n\n protected valor(fila: T, clave: keyof T & string): unknown {\n return (fila as Record<string, unknown>)[clave];\n }\n\n protected textoCelda(columna: TdDataTableColumna<T>, fila: T, indice: number): string {\n const valor = this.valor(fila, columna.clave);\n if (columna.formatear) return columna.formatear(valor, fila, indice);\n if (valor === null || valor === undefined || valor === '') return '—';\n if (columna.tipo === 'booleano') return valor ? 'Sí' : 'No';\n if (columna.tipo === 'estado') return valor ? 'Activo' : 'Inactivo';\n return String(valor);\n }\n\n protected tonoCelda(columna: TdDataTableColumna<T>, fila: T): TdDataTableTono {\n const valor = this.valor(fila, columna.clave);\n if (columna.tono) return columna.tono(valor, fila);\n if (columna.tipo === 'estado') return valor ? 'exito' : 'peligro';\n if (columna.tipo === 'booleano') return valor ? 'exito' : 'neutro';\n return 'neutro';\n }\n\n protected accionesVisibles(fila: T): TdDataTableAccion<T>[] {\n return this.acciones.filter((accion) => accion.visible?.(fila) ?? true);\n }\n\n protected iconoAccion(accion: TdDataTableAccion<T>, fila: T): string {\n return typeof accion.icono === 'function' ? accion.icono(fila) : accion.icono;\n }\n\n protected tonoAccion(accion: TdDataTableAccion<T>, fila: T): TdDataTableTono {\n if (typeof accion.tono === 'function') return accion.tono(fila);\n return accion.tono ?? 'neutro';\n }\n\n protected botonesVisibles(): TdDataTableBoton[] {\n return this.botones.filter((boton) => boton.visible ?? true);\n }\n\n protected ejecutarAccion(\n accion: TdDataTableAccion<T>,\n fila: T,\n indice: number\n ): void {\n if (accion.deshabilitada?.(fila)) return;\n this.accion.emit({ accion, fila, indice });\n }\n\n protected alCambiarIndice(): void {\n if (!this.viewport) return;\n\n const distanciaAlFinal = this.viewport.measureScrollOffset('bottom');\n const umbralPx = this.itemSize * Math.max(0, this.filasAntesDeCargar);\n\n if (\n distanciaAlFinal <= umbralPx &&\n this.datos.length > 0 &&\n this.puedeCargarMas &&\n !this.cargando &&\n this.ultimaLongitudSolicitada !== this.datos.length\n ) {\n this.ultimaLongitudSolicitada = this.datos.length;\n this.cargarMas.emit();\n }\n }\n\n protected readonly trackFila = (_indice: number, fila: T): unknown =>\n (fila as Record<string, unknown>)[this.campoId] ?? fila;\n}\n","<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar búsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n @if (cargando) {\n <span class=\"td-tabla__cargando-inline\"><i></i> Cargando...</span>\n }\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div\n class=\"td-tabla__encabezado\"\n role=\"row\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scrolledIndexChange)=\"alCambiarIndice()\"\n >\n <div\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span [class.td-tabla__numero]=\"columna.tipo === 'numero'\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + tonoAccion(accionFila, fila)\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"iconoAccion(accionFila, fila)\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n selector: 'td-footer',\n templateUrl: './td-footer.html',\n styleUrl: './td-footer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdFooter {\n @Input() empresa = 'TelcomDev';\n @Input() texto = 'Todos los derechos reservados.';\n @Input() version = '';\n @Input() oscuro = false;\n @Input() compacto = false;\n @Input() anio = new Date().getFullYear();\n}\n","<footer\n class=\"td-footer\"\n [class.td-footer--oscuro]=\"oscuro\"\n [class.td-footer--compacto]=\"compacto\"\n>\n <div class=\"td-footer__identidad\">\n <span>© {{ anio }} {{ empresa }}</span>\n @if (texto) {\n <small>{{ texto }}</small>\n }\n </div>\n\n <nav class=\"td-footer__enlaces\" aria-label=\"Enlaces del pie de página\">\n <ng-content select=\"[tdFooterLinks]\" />\n </nav>\n\n <div class=\"td-footer__final\">\n <ng-content select=\"[tdFooterActions]\" />\n @if (version) {\n <span class=\"td-footer__version\">v{{ version }}</span>\n }\n </div>\n</footer>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostListener,\n Input,\n Output,\n} from '@angular/core';\nimport { TdIcon } from '../iconos';\n\nexport interface TdHeaderNotificacion {\n id: string | number;\n titulo: string;\n descripcion?: string;\n fecha?: string;\n icono?: string;\n leida?: boolean;\n}\n\nexport type TdHeaderAccionPerfil = 'perfil' | 'configuracion' | 'salir';\n\n@Component({\n selector: 'td-header',\n imports: [TdIcon],\n templateUrl: './td-header.html',\n styleUrl: './td-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdHeader {\n @Input() menuAbierto = true;\n @Input() mostrarMenu = true;\n @Input() usuario = '';\n @Input() cargo = '';\n @Input() avatarUrl = '';\n @Input() notificaciones: TdHeaderNotificacion[] = [];\n @Input() oscuro = false;\n @Input() fijo = true;\n\n @Output() readonly menuToggle = new EventEmitter<void>();\n @Output() readonly notificacionSeleccionada = new EventEmitter<TdHeaderNotificacion>();\n @Output() readonly verTodasNotificaciones = new EventEmitter<void>();\n @Output() readonly accionPerfil = new EventEmitter<TdHeaderAccionPerfil>();\n\n protected panelNotificacionesAbierto = false;\n protected panelPerfilAbierto = false;\n\n protected alternarMenu(): void {\n this.menuToggle.emit();\n }\n\n protected alternarNotificaciones(): void {\n this.panelNotificacionesAbierto = !this.panelNotificacionesAbierto;\n this.panelPerfilAbierto = false;\n }\n\n protected alternarPerfil(): void {\n this.panelPerfilAbierto = !this.panelPerfilAbierto;\n this.panelNotificacionesAbierto = false;\n }\n\n protected seleccionarNotificacion(notificacion: TdHeaderNotificacion): void {\n this.notificacionSeleccionada.emit(notificacion);\n this.panelNotificacionesAbierto = false;\n }\n\n protected emitirAccionPerfil(accion: TdHeaderAccionPerfil): void {\n this.accionPerfil.emit(accion);\n this.panelPerfilAbierto = false;\n }\n\n protected notificacionesNoLeidas(): number {\n return this.notificaciones.filter((item) => !item.leida).length;\n }\n\n protected inicialesUsuario(): string {\n const partes = this.usuario.trim().split(/\\s+/).filter(Boolean);\n return (\n partes\n .slice(0, 2)\n .map((parte) => parte.charAt(0))\n .join('') || 'U'\n ).toUpperCase();\n }\n\n @HostListener('document:keydown.escape')\n protected cerrarConEscape(): void {\n this.panelNotificacionesAbierto = false;\n this.panelPerfilAbierto = false;\n }\n}\n","<header\n class=\"td-header\"\n [class.td-header--oscuro]=\"oscuro\"\n [class.td-header--fijo]=\"fijo\"\n>\n <div class=\"td-header__inicio\">\n @if (mostrarMenu) {\n <button\n class=\"td-header__boton td-header__menu\"\n type=\"button\"\n [attr.aria-label]=\"menuAbierto ? 'Cerrar sidebar' : 'Abrir sidebar'\"\n [attr.aria-expanded]=\"menuAbierto\"\n (click)=\"alternarMenu()\"\n >\n <td-icon [nombre]=\"menuAbierto ? 'close' : 'menu'\" />\n </button>\n }\n\n <ng-content select=\"[tdHeaderStart]\" />\n </div>\n\n <div class=\"td-header__centro\">\n <ng-content select=\"[tdHeaderCenter]\" />\n </div>\n\n <div class=\"td-header__acciones\">\n <ng-content select=\"[tdHeaderActions]\" />\n\n <div class=\"td-header__desplegable\">\n <button\n class=\"td-header__boton td-header__notificaciones\"\n type=\"button\"\n aria-label=\"Notificaciones\"\n [attr.aria-expanded]=\"panelNotificacionesAbierto\"\n (click)=\"alternarNotificaciones()\"\n >\n <td-icon nombre=\"notifications\" />\n @if (notificacionesNoLeidas() > 0) {\n <span>{{ notificacionesNoLeidas() > 99 ? '99+' : notificacionesNoLeidas() }}</span>\n }\n </button>\n\n @if (panelNotificacionesAbierto) {\n <section class=\"td-header__panel td-header__panel--notificaciones\">\n <header>\n <div>\n <strong>Notificaciones</strong>\n <small>{{ notificacionesNoLeidas() }} sin leer</small>\n </div>\n <td-icon nombre=\"notifications\" />\n </header>\n\n <div class=\"td-header__lista-notificaciones\">\n @for (notificacion of notificaciones; track notificacion.id) {\n <button\n type=\"button\"\n [class.td-header__notificacion--nueva]=\"!notificacion.leida\"\n (click)=\"seleccionarNotificacion(notificacion)\"\n >\n <span class=\"td-header__notificacion-icono\">\n <td-icon [nombre]=\"notificacion.icono || 'notifications'\" />\n </span>\n <span>\n <strong>{{ notificacion.titulo }}</strong>\n @if (notificacion.descripcion) {\n <small>{{ notificacion.descripcion }}</small>\n }\n @if (notificacion.fecha) {\n <time>{{ notificacion.fecha }}</time>\n }\n </span>\n </button>\n } @empty {\n <p class=\"td-header__vacio\">No tienes notificaciones.</p>\n }\n </div>\n\n @if (notificaciones.length) {\n <button\n class=\"td-header__ver-todas\"\n type=\"button\"\n (click)=\"verTodasNotificaciones.emit(); panelNotificacionesAbierto = false\"\n >\n Ver todas las notificaciones\n </button>\n }\n </section>\n }\n </div>\n\n @if (usuario) {\n <span class=\"td-header__separador\" aria-hidden=\"true\"></span>\n\n <div class=\"td-header__desplegable\">\n <button\n class=\"td-header__perfil\"\n type=\"button\"\n aria-label=\"Abrir perfil de usuario\"\n [attr.aria-expanded]=\"panelPerfilAbierto\"\n (click)=\"alternarPerfil()\"\n >\n <span class=\"td-header__avatar\">\n @if (avatarUrl) {\n <img [src]=\"avatarUrl\" [alt]=\"usuario\" />\n } @else {\n {{ inicialesUsuario() }}\n }\n </span>\n <span class=\"td-header__usuario\">\n <strong>{{ usuario }}</strong>\n @if (cargo) {\n <small>{{ cargo }}</small>\n }\n </span>\n <td-icon nombre=\"chevron_down\" tamano=\"0.85rem\" />\n </button>\n\n @if (panelPerfilAbierto) {\n <section class=\"td-header__panel td-header__panel--perfil\">\n <div class=\"td-header__perfil-resumen\">\n <span class=\"td-header__avatar td-header__avatar--grande\">{{ inicialesUsuario() }}</span>\n <div>\n <strong>{{ usuario }}</strong>\n <small>{{ cargo || 'Usuario' }}</small>\n </div>\n </div>\n <div class=\"td-header__perfil-opciones\">\n <button type=\"button\" (click)=\"emitirAccionPerfil('perfil')\">\n <td-icon nombre=\"person\" /> Mi perfil\n </button>\n <button type=\"button\" (click)=\"emitirAccionPerfil('configuracion')\">\n <td-icon nombre=\"settings\" /> Configuración\n </button>\n <button class=\"td-header__salir\" type=\"button\" (click)=\"emitirAccionPerfil('salir')\">\n <td-icon nombre=\"close\" /> Cerrar sesión\n </button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { TdIcon } from '../iconos';\nimport { MenuSidebar, TdSidebarSeleccion } from './menu-sidebar';\n\nexport type TdSidebarModoCerrado = 'compacto' | 'oculto';\n\n@Component({\n selector: 'td-sidebar',\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, TdIcon],\n templateUrl: './td-sidebar.html',\n styleUrl: './td-sidebar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdSidebar {\n @Input() titulo = 'Gestión Corporativa';\n @Input() subtitulo = 'Central Platform';\n @Input() etiquetaNavegacion = 'Navegación';\n @Input() logoUrl = '';\n @Input() logoAlt = 'Logo';\n @Input() textoCarga = 'Cargando menú...';\n @Input() mensajeVacio = 'No hay opciones disponibles.';\n @Input() error = '';\n @Input() cargando = false;\n @Input() oscuro = false;\n @Input() modoCerrado: TdSidebarModoCerrado = 'compacto';\n\n @Input()\n set abierto(value: boolean) {\n this.abiertoInterno.set(value);\n }\n get abierto(): boolean {\n return this.abiertoInterno();\n }\n\n @Input()\n set menu(value: MenuSidebar[] | null | undefined) {\n this.menuNormalizado.set(this.normalizarMenu(value ?? []));\n }\n get menu(): MenuSidebar[] {\n return this.menuNormalizado();\n }\n\n @Output() readonly abiertoChange = new EventEmitter<boolean>();\n @Output() readonly seleccionar = new EventEmitter<TdSidebarSeleccion>();\n\n protected readonly abiertoInterno = signal(true);\n protected readonly menuNormalizado = signal<MenuSidebar[]>([]);\n protected readonly expandidos = signal<ReadonlySet<string>>(new Set<string>());\n\n protected alternarGrupo(clave: string): void {\n if (!this.abiertoInterno()) {\n this.abiertoInterno.set(true);\n this.abiertoChange.emit(true);\n }\n\n this.expandidos.update((actuales) => {\n const siguientes = new Set(actuales);\n siguientes.has(clave) ? siguientes.delete(clave) : siguientes.add(clave);\n return siguientes;\n });\n }\n\n protected estaExpandido(clave: string): boolean {\n return this.expandidos().has(clave);\n }\n\n protected seleccionarItem(item: MenuSidebar, nivel: number): void {\n this.seleccionar.emit({ item, nivel });\n }\n\n protected claveItem(item: MenuSidebar, padre: string, indice: number): string {\n return `${padre}/${item.nombre}-${indice}`;\n }\n\n protected inicialMarca(): string {\n return (this.titulo.trim().charAt(0) || 'T').toUpperCase();\n }\n\n private normalizarMenu(items: MenuSidebar[]): MenuSidebar[] {\n return [...items]\n .sort((a, b) => a.orden - b.orden)\n .map((item) => ({\n ...item,\n icono: item.icono?.trim() || 'folder',\n subMenus: this.normalizarMenu(item.subMenus ?? []),\n }));\n }\n}\n","<aside\n class=\"td-sidebar\"\n [class.td-sidebar--compacto]=\"!abiertoInterno() && modoCerrado === 'compacto'\"\n [class.td-sidebar--oculto]=\"!abiertoInterno() && modoCerrado === 'oculto'\"\n [class.td-sidebar--oscuro]=\"oscuro\"\n [attr.aria-hidden]=\"!abiertoInterno() && modoCerrado === 'oculto'\"\n>\n <header class=\"td-sidebar__marca\">\n <div class=\"td-sidebar__logo\">\n @if (logoUrl) {\n <img [src]=\"logoUrl\" [alt]=\"logoAlt\" />\n } @else {\n <span>{{ inicialMarca() }}</span>\n }\n </div>\n\n @if (abiertoInterno()) {\n <div class=\"td-sidebar__marca-texto\">\n <small>{{ subtitulo }}</small>\n <strong>{{ titulo }}</strong>\n </div>\n }\n\n </header>\n\n <div class=\"td-sidebar__encabezado\">\n @if (abiertoInterno()) {\n <span>{{ etiquetaNavegacion }}</span>\n } @else {\n <span aria-hidden=\"true\">•••</span>\n }\n </div>\n\n <nav class=\"td-sidebar__nav\" aria-label=\"Menú principal\">\n @if (cargando) {\n <p class=\"td-sidebar__estado\">{{ textoCarga }}</p>\n } @else if (error) {\n <p class=\"td-sidebar__estado td-sidebar__estado--error\">{{ error }}</p>\n } @else if (!menuNormalizado().length) {\n <p class=\"td-sidebar__estado\">{{ mensajeVacio }}</p>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"listaMenu\"\n [ngTemplateOutletContext]=\"{ items: menuNormalizado(), nivel: 0, padre: 'raiz' }\"\n />\n }\n </nav>\n</aside>\n\n<ng-template #listaMenu let-items=\"items\" let-nivel=\"nivel\" let-padre=\"padre\">\n <ul class=\"td-sidebar__lista\" [class.td-sidebar__lista--anidada]=\"nivel > 0\">\n @for (item of items; track item) {\n @let clave = claveItem(item, padre, $index);\n @let tieneHijos = item.subMenus.length > 0;\n\n <li class=\"td-sidebar__item\">\n @if (tieneHijos) {\n <button\n class=\"td-sidebar__enlace\"\n type=\"button\"\n [class.td-sidebar__enlace--activo]=\"estaExpandido(clave)\"\n [attr.aria-expanded]=\"estaExpandido(clave)\"\n [attr.title]=\"!abiertoInterno() ? item.nombre : null\"\n (click)=\"alternarGrupo(clave)\"\n >\n <td-icon class=\"td-sidebar__icono\" [nombre]=\"item.icono || 'folder'\" />\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n <td-icon\n class=\"td-sidebar__flecha\"\n [class.td-sidebar__flecha--abierta]=\"estaExpandido(clave)\"\n nombre=\"chevron_right\"\n />\n }\n </button>\n } @else {\n <a\n class=\"td-sidebar__enlace\"\n [routerLink]=\"item.ruta || '/'\"\n routerLinkActive=\"td-sidebar__enlace--ruta-activa\"\n [routerLinkActiveOptions]=\"{ exact: item.ruta === '/' }\"\n [attr.title]=\"!abiertoInterno() ? item.nombre : null\"\n (click)=\"seleccionarItem(item, nivel)\"\n >\n <td-icon class=\"td-sidebar__icono\" [nombre]=\"item.icono || 'folder'\" />\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n }\n </a>\n }\n\n @if (abiertoInterno() && tieneHijos && estaExpandido(clave)) {\n <ng-container\n [ngTemplateOutlet]=\"listaMenu\"\n [ngTemplateOutletContext]=\"{\n items: item.subMenus,\n nivel: nivel + 1,\n padre: clave\n }\"\n />\n }\n </li>\n }\n </ul>\n</ng-template>\n","/*\n * Public API Surface of telcomdev-ui\n */\n\nexport * from './lib/telcomdev-ui';\nexport * from './lib/alerta';\nexport * from './lib/data-table';\nexport * from './lib/footer';\nexport * from './lib/header';\nexport * from './lib/iconos';\nexport * from './lib/sidebar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/types/telcomdev-ui.d.ts
CHANGED
|
@@ -47,8 +47,8 @@ interface TdDataTableColumna<T> {
|
|
|
47
47
|
interface TdDataTableAccion<T> {
|
|
48
48
|
id: string;
|
|
49
49
|
etiqueta: string;
|
|
50
|
-
icono: string;
|
|
51
|
-
tono?: TdDataTableTono;
|
|
50
|
+
icono: string | ((fila: T) => string);
|
|
51
|
+
tono?: TdDataTableTono | ((fila: T) => TdDataTableTono);
|
|
52
52
|
visible?: (fila: T) => boolean;
|
|
53
53
|
deshabilitada?: (fila: T) => boolean;
|
|
54
54
|
}
|
|
@@ -76,18 +76,16 @@ declare class TdDataTable<T extends object> implements OnChanges, OnDestroy {
|
|
|
76
76
|
cargando: boolean;
|
|
77
77
|
puedeCargarMas: boolean;
|
|
78
78
|
itemSize: number;
|
|
79
|
+
filasAntesDeCargar: number;
|
|
79
80
|
altura: string;
|
|
80
81
|
campoId: keyof T & string;
|
|
81
82
|
oscuro: boolean;
|
|
82
83
|
mostrarBusqueda: boolean;
|
|
83
|
-
mostrarAgregar: boolean;
|
|
84
84
|
placeholderBusqueda: string;
|
|
85
|
-
textoAgregar: string;
|
|
86
85
|
textoVacio: string;
|
|
87
86
|
descripcionVacio: string;
|
|
88
87
|
debounceBusqueda: number;
|
|
89
88
|
readonly busquedaChange: EventEmitter<string>;
|
|
90
|
-
readonly agregar: EventEmitter<void>;
|
|
91
89
|
readonly accion: EventEmitter<TdDataTableAccionEvento<T>>;
|
|
92
90
|
readonly botonClick: EventEmitter<TdDataTableBoton>;
|
|
93
91
|
readonly cargarMas: EventEmitter<void>;
|
|
@@ -103,12 +101,14 @@ declare class TdDataTable<T extends object> implements OnChanges, OnDestroy {
|
|
|
103
101
|
protected textoCelda(columna: TdDataTableColumna<T>, fila: T, indice: number): string;
|
|
104
102
|
protected tonoCelda(columna: TdDataTableColumna<T>, fila: T): TdDataTableTono;
|
|
105
103
|
protected accionesVisibles(fila: T): TdDataTableAccion<T>[];
|
|
104
|
+
protected iconoAccion(accion: TdDataTableAccion<T>, fila: T): string;
|
|
105
|
+
protected tonoAccion(accion: TdDataTableAccion<T>, fila: T): TdDataTableTono;
|
|
106
106
|
protected botonesVisibles(): TdDataTableBoton[];
|
|
107
107
|
protected ejecutarAccion(accion: TdDataTableAccion<T>, fila: T, indice: number): void;
|
|
108
108
|
protected alCambiarIndice(): void;
|
|
109
109
|
protected readonly trackFila: (_indice: number, fila: T) => unknown;
|
|
110
110
|
static ɵfac: i0.ɵɵFactoryDeclaration<TdDataTable<any>, never>;
|
|
111
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TdDataTable<any>, "td-data-table", never, { "datos": { "alias": "datos"; "required": false; }; "columnas": { "alias": "columnas"; "required": false; }; "acciones": { "alias": "acciones"; "required": false; }; "botones": { "alias": "botones"; "required": false; }; "total": { "alias": "total"; "required": false; }; "cargando": { "alias": "cargando"; "required": false; }; "puedeCargarMas": { "alias": "puedeCargarMas"; "required": false; }; "itemSize": { "alias": "itemSize"; "required": false; }; "
|
|
111
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TdDataTable<any>, "td-data-table", never, { "datos": { "alias": "datos"; "required": false; }; "columnas": { "alias": "columnas"; "required": false; }; "acciones": { "alias": "acciones"; "required": false; }; "botones": { "alias": "botones"; "required": false; }; "total": { "alias": "total"; "required": false; }; "cargando": { "alias": "cargando"; "required": false; }; "puedeCargarMas": { "alias": "puedeCargarMas"; "required": false; }; "itemSize": { "alias": "itemSize"; "required": false; }; "filasAntesDeCargar": { "alias": "filasAntesDeCargar"; "required": false; }; "altura": { "alias": "altura"; "required": false; }; "campoId": { "alias": "campoId"; "required": false; }; "oscuro": { "alias": "oscuro"; "required": false; }; "mostrarBusqueda": { "alias": "mostrarBusqueda"; "required": false; }; "placeholderBusqueda": { "alias": "placeholderBusqueda"; "required": false; }; "textoVacio": { "alias": "textoVacio"; "required": false; }; "descripcionVacio": { "alias": "descripcionVacio"; "required": false; }; "debounceBusqueda": { "alias": "debounceBusqueda"; "required": false; }; }, { "busquedaChange": "busquedaChange"; "accion": "accion"; "botonClick": "botonClick"; "cargarMas": "cargarMas"; }, never, ["[tdDataTableFilters]", "[tdDataTableActions]"], true, never>;
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
declare class TdFooter {
|