ngx-redi-core 18.0.13 → 18.0.14

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.
@@ -324,7 +324,7 @@ export class RediTableComponent {
324
324
  });
325
325
  }
326
326
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediTableComponent, deps: [{ token: i1.CsvService }], target: i0.ɵɵFactoryTarget.Component }); }
327
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: RediTableComponent, isStandalone: true, selector: "redi-table", inputs: { seleccionarFilas: "seleccionarFilas", filtrarDatos: "filtrarDatos", paginar: "paginar", ordenarDatos: "ordenarDatos", dataTable: "dataTable" }, outputs: { onRowClick: "onRowClick" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "compoFiltro", first: true, predicate: ["filtro"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selecci\u00F3n -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selecci\u00F3n de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selecci\u00F3n -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definici\u00F3n de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creaci\u00F3n de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definici\u00F3n de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definici\u00F3n de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuraci\u00F3n de botones de acci\u00F3n -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono din\u00E1mico de la acci\u00F3n -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definici\u00F3n de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuraci\u00F3n de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".container{display:grid}tbody{box-shadow:#0000003d 0 3px 8px}.section{overflow:auto;background-color:#fff;max-height:90vh;border:1px solid #c5c7d1}table{width:100%;color:#676a6f;overflow:auto;padding:0;background-color:#f7f7f7}.odd{background-color:#f4f4f4;font-size:1.05em}.even{background-color:#fff}.odd,.even{height:2.5em;cursor:pointer}td.mat-cell{border:0px;color:#676a6f;font-size:1.05em}.odd:hover,.even:hover{background-color:#cddce9}th{font-size:1.2em}th button{display:none}th div{display:flex;align-items:center}th div div{display:inline-block}th div div:last-child{min-width:40px}th:hover button{display:inline-block;cursor:pointer}tr.mat-header-row{height:35px}input{min-width:250px;border:solid 2px #dadada;float:right;margin-bottom:8px;outline:0;padding-right:2em}mat-icon{color:#676a6f}.icon{float:right;margin-left:-3em;position:relative;margin-top:1px}.visible{display:contents}.hidden{display:none}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#ccc;width:6px}caption{display:none}.disabled-button{color:#cecece}::ng-deep .mat-sort-header-stem{height:8px}::ng-deep .mat-sort-header-arrow{color:#797979;margin:0 0 20px}.checkCol{max-width:72px;width:50px}.inputFilter{min-width:50px;width:100px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i9.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: FilterDataComponent, selector: "filter-data", inputs: ["filtrosColumnas"], outputs: ["filterEnd"] }] }); }
327
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: RediTableComponent, isStandalone: true, selector: "redi-table", inputs: { seleccionarFilas: "seleccionarFilas", filtrarDatos: "filtrarDatos", paginar: "paginar", ordenarDatos: "ordenarDatos", dataTable: "dataTable" }, outputs: { onRowClick: "onRowClick" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "compoFiltro", first: true, predicate: ["filtro"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selecci\u00F3n -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selecci\u00F3n de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selecci\u00F3n -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definici\u00F3n de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creaci\u00F3n de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definici\u00F3n de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definici\u00F3n de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuraci\u00F3n de botones de acci\u00F3n -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono din\u00E1mico de la acci\u00F3n -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definici\u00F3n de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuraci\u00F3n de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".container{display:grid}tbody{box-shadow:#0000003d 0 3px 8px}.section{overflow:auto;background-color:#fff;max-height:90vh;border:1px solid #c5c7d1}table{width:100%;color:#676a6f;overflow:auto;padding:0;background-color:#f7f7f7}.odd{background-color:#f4f4f4;font-size:1.05em}.even{background-color:#fff}.odd,.even{height:2.5em;cursor:pointer}td.mat-cell{border:0px;color:#676a6f;font-size:1.05em}.odd:hover,.even:hover{background-color:#cddce9}th{font-size:1.2em}th button{display:none}th div{display:flex;align-items:center}th div div{display:inline-block}th div div:last-child{min-width:40px;min-height:40px}th:hover button{display:inline-block;cursor:pointer}tr.mat-header-row{height:35px}input{min-width:250px;border:solid 2px #dadada;float:right;margin-bottom:8px;outline:0;padding-right:2em}mat-icon{color:#676a6f}.icon{float:right;margin-left:-3em;position:relative;margin-top:1px}.visible{display:contents}.hidden{display:none}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#ccc;width:6px}caption{display:none}.disabled-button{color:#cecece}::ng-deep .mat-sort-header-stem{height:8px}::ng-deep .mat-sort-header-arrow{color:#797979;margin:0 0 20px}.checkCol{max-width:72px;width:50px}.inputFilter{min-width:50px;width:100px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i9.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: FilterDataComponent, selector: "filter-data", inputs: ["filtrosColumnas"], outputs: ["filterEnd"] }] }); }
328
328
  }
329
329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediTableComponent, decorators: [{
330
330
  type: Component,
@@ -341,7 +341,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
341
341
  MatCheckboxModule,
342
342
  MatButtonModule,
343
343
  FilterDataComponent
344
- ], template: "<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selecci\u00F3n -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selecci\u00F3n de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selecci\u00F3n -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definici\u00F3n de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creaci\u00F3n de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definici\u00F3n de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definici\u00F3n de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuraci\u00F3n de botones de acci\u00F3n -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono din\u00E1mico de la acci\u00F3n -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definici\u00F3n de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuraci\u00F3n de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".container{display:grid}tbody{box-shadow:#0000003d 0 3px 8px}.section{overflow:auto;background-color:#fff;max-height:90vh;border:1px solid #c5c7d1}table{width:100%;color:#676a6f;overflow:auto;padding:0;background-color:#f7f7f7}.odd{background-color:#f4f4f4;font-size:1.05em}.even{background-color:#fff}.odd,.even{height:2.5em;cursor:pointer}td.mat-cell{border:0px;color:#676a6f;font-size:1.05em}.odd:hover,.even:hover{background-color:#cddce9}th{font-size:1.2em}th button{display:none}th div{display:flex;align-items:center}th div div{display:inline-block}th div div:last-child{min-width:40px}th:hover button{display:inline-block;cursor:pointer}tr.mat-header-row{height:35px}input{min-width:250px;border:solid 2px #dadada;float:right;margin-bottom:8px;outline:0;padding-right:2em}mat-icon{color:#676a6f}.icon{float:right;margin-left:-3em;position:relative;margin-top:1px}.visible{display:contents}.hidden{display:none}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#ccc;width:6px}caption{display:none}.disabled-button{color:#cecece}::ng-deep .mat-sort-header-stem{height:8px}::ng-deep .mat-sort-header-arrow{color:#797979;margin:0 0 20px}.checkCol{max-width:72px;width:50px}.inputFilter{min-width:50px;width:100px}\n"] }]
344
+ ], template: "<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selecci\u00F3n -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selecci\u00F3n de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selecci\u00F3n -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definici\u00F3n de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creaci\u00F3n de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definici\u00F3n de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definici\u00F3n de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuraci\u00F3n de botones de acci\u00F3n -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono din\u00E1mico de la acci\u00F3n -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definici\u00F3n de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuraci\u00F3n de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".container{display:grid}tbody{box-shadow:#0000003d 0 3px 8px}.section{overflow:auto;background-color:#fff;max-height:90vh;border:1px solid #c5c7d1}table{width:100%;color:#676a6f;overflow:auto;padding:0;background-color:#f7f7f7}.odd{background-color:#f4f4f4;font-size:1.05em}.even{background-color:#fff}.odd,.even{height:2.5em;cursor:pointer}td.mat-cell{border:0px;color:#676a6f;font-size:1.05em}.odd:hover,.even:hover{background-color:#cddce9}th{font-size:1.2em}th button{display:none}th div{display:flex;align-items:center}th div div{display:inline-block}th div div:last-child{min-width:40px;min-height:40px}th:hover button{display:inline-block;cursor:pointer}tr.mat-header-row{height:35px}input{min-width:250px;border:solid 2px #dadada;float:right;margin-bottom:8px;outline:0;padding-right:2em}mat-icon{color:#676a6f}.icon{float:right;margin-left:-3em;position:relative;margin-top:1px}.visible{display:contents}.hidden{display:none}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#ccc;width:6px}caption{display:none}.disabled-button{color:#cecece}::ng-deep .mat-sort-header-stem{height:8px}::ng-deep .mat-sort-header-arrow{color:#797979;margin:0 0 20px}.checkCol{max-width:72px;width:50px}.inputFilter{min-width:50px;width:100px}\n"] }]
345
345
  }], ctorParameters: () => [{ type: i1.CsvService }], propDecorators: { seleccionarFilas: [{
346
346
  type: Input
347
347
  }], filtrarDatos: [{
@@ -364,4 +364,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
364
364
  }], onRowClick: [{
365
365
  type: Output
366
366
  }] } });
367
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVkaS1jb3JlL1JlZGlUYWJsZS9zcmMvY29tcG9uZW50cy9yZWRpLXRhYmxlL3JlZGktdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZGktY29yZS9SZWRpVGFibGUvc3JjL2NvbXBvbmVudHMvcmVkaS10YWJsZS9yZWRpLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdCQUF3QjtBQUN4QixPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSSxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU8xRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFrQixNQUFNLHdCQUF3QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0Is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QUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ25HLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzs4R0F0V1Usa0JBQWtCO2tHQUFsQixrQkFBa0IsNlNBdUNsQixPQUFPLDRFQUtQLFlBQVksNkpDNUZ6Qiw4Mk1BdUdNLDZ3Q0R6RUYsWUFBWSw2VkFDWixhQUFhLG1MQUNiLGNBQWMsc2dDQUNkLGlCQUFpQiw2V0FDakIsa0JBQWtCLG1TQUNsQixhQUFhLDBQQUNiLGFBQWEsNnZCQUViLGdCQUFnQixrSUFDaEIsZ0JBQWdCLDhCQUVoQixlQUFlLDZJQUVmLG1CQUFtQjs7MkZBS1Ysa0JBQWtCO2tCQXRCOUIsU0FBUzsrQkFDRSxZQUFZLGNBQ1YsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGFBQWE7d0JBRWIsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFFZixtQkFBbUI7cUJBQ3BCOytFQVNNLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFPQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLE9BQU87c0JBRGIsS0FBSztnQkFPQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkFXYyxJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBS08sU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQWFoQixXQUFXO3NCQURqQixTQUFTO3VCQUFDLFFBQVE7Z0JBcVFaLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiogTGlicmVyw61hcyBhbmd1bGFyICovXHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSwgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcblxyXG4vKiogTW9kZWxvICovXHJcbmltcG9ydCB7IERhdGFUYWJsZSB9IGZyb20gJy4uLy4uL21vZGVscy9pbnRlcmZhY2VzL2RhdGEtdGFibGUnO1xyXG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ludGVyZmFjZXMvY29sdW1uLWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBDc3ZTZXJ2aWNlIH0gZnJvbSAnbmd4LXJlZGktY29yZS9IZWxwZXInO1xyXG5pbXBvcnQgeyBSb3dBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvaW50ZXJmYWNlcy9yb3ctYWN0aW9uJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSwgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xyXG5pbXBvcnQgeyBGaWx0ZXJJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ludGVyZmFjZXMvZmlsdGVyLWl0ZW0nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IEZpbHRlckRhdGFDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXItZGF0YS9maWx0ZXItZGF0YS5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgcXVlIG11ZXN0cmEgbG9zIGRhdG9zIGVuIHVuYSB0YWJsYVxyXG4gKiBAZGVjb3JhdG9ycyDCtEBDb21wb25lbnTCtFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyZWRpLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRUYWJsZU1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxyXG4gICAgTWF0U29ydE1vZHVsZSxcclxuICAgIE1hdE1lbnVNb2R1bGUsXHJcblxyXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuXHJcbiAgICBGaWx0ZXJEYXRhQ29tcG9uZW50XHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVkaS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3JlZGktdGFibGUuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlZGlUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgb2JqZWN0PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAvKipcclxuICAgKiBQcm9waWVkYWQgcXVlIGluZGljYSBzaSBzZSBwdWVkZW4gc2VsZWNjaW9uYXIgbGFzIGZpbGFzXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2VsZWNjaW9uYXJGaWxhcyA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb3BpZWRhZCBxdWUgaW5kaWNhIHNpIHNlIGhhYmlsaXRhbiBsb3MgZmlsdHJvcyBwYXJhIGxhIHRhYmxhXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZmlsdHJhckRhdG9zID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJvcGllZGFkIHF1ZSBpbmRpY2Egc2kgc2UgcGFnaW5hbiBsb3MgZGF0b3NcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBwYWdpbmFyID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJvcGllZGFkIHF1ZSBpbmRpY2Egc2kgc2UgaGFiaWxpdGEgZWwgb3JkZW5hbWllbnRvIGRlIGRhdG9zXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgb3JkZW5hckRhdG9zID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGF0b3MgeSBjb25maWd1cmFjacOzbiBkZSBsYSB0YWJsYVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRhdGFUYWJsZTogRGF0YVRhYmxlPFQ+O1xyXG5cclxuICAvKipcclxuICAgKiBPcmlnZW4gZGUgZGF0b3MgcGFyYSBlbCBNYXRUYWJsZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8VD47XHJcblxyXG4gIC8qKlxyXG4gICAqIE9iamV0byBkZSBsYSB2aXN0YSBwYXJhIGVsIG9yZGVuYW1pZW50b1xyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9iamV0byBkZSBsYSB2aXN0YSBwYXJhIGxhIHBhZ2luYWNpw7NuXHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcclxuXHJcbiAgLyoqXHJcbiAgKiBDb250aWVuZSBsYXMgY29sdW1uYXMgcXVlIHNlIG1vc3RyYXJhbiBlbiBsYSB0YWJsYVxyXG4gICovXHJcbiAgcHVibGljIGNvbHVtbmFzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRpZW5lIGxvcyBkYXRvcyBkZSBsYXMgY29sdW1uYXNcclxuICAgKi9cclxuICBwdWJsaWMgZGF0b3NDb2x1bW5hOiBBcnJheTxDb2x1bW5EZWZpbml0aW9uPiA9IFtdO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWx0cm8nKVxyXG4gIHB1YmxpYyBjb21wb0ZpbHRybyE6IEZpbHRlckRhdGFDb21wb25lbnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWEgdW4gbnVldm8gY29tcG9uZW50ZSBUYWJsYVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY3N2OiBDc3ZTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZSA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogW10gYXMgQXJyYXk8VD4sXHJcbiAgICAgIGFjY2lvbmVzOiBbXSBhcyBBcnJheTxSb3dBY3Rpb248VD4+XHJcbiAgICB9IGFzIERhdGFUYWJsZTxUPjtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VNZW51KCkge1xyXG4gICAgaWYgKHRoaXMuY29tcG9GaWx0cm8pIHtcclxuICAgICAgdGhpcy5jb21wb0ZpbHRyby5sb2FkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBFdmVudG9zIHF1ZSBzZSBlamVjdXRhbiBhbCBpbmljaWFzXHJcbiAgKi9cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMubGltcGlhckNvbHVtbmFzKCk7XHJcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmRhdGFUYWJsZS5kYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5jb25zdHJ1aURhdG9zQ29sdW1uYSgpO1xyXG4gICAgICB0aGlzLm1vc3RyYXJDb2x1bW5hcygpO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gKGY6IFQsIHU6IHN0cmluZykgPT4geyByZXR1cm4gdGhpcy5jdXN0b21QYXJhbWV0ZXIoZiwgdSkgfTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pY2lhbGl6YXJQYWdpbmFkb3IoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnV5ZSBsb3MgZGF0b3MgZGUgbGFzIGNvbHVtbmFzIHBhcmEgbGEgdGFibGFcclxuICAgKi9cclxuICBwcml2YXRlIGNvbnN0cnVpRGF0b3NDb2x1bW5hKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlLmNvbHVtbmFzICYmXHJcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbHVtbmFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kYXRvc0NvbHVtbmEucHVzaCguLi50aGlzLmRhdGFUYWJsZS5jb2x1bW5hcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlPy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVRhYmxlLmRhdGFTb3VyY2UubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRvc0NvbHVtbmEucHVzaCguLi5PYmplY3Qua2V5cyh0aGlzLmRhdGFUYWJsZS5kYXRhU291cmNlWzBdKVxyXG4gICAgICAgICAgLm1hcCh4ID0+IHsgcmV0dXJuIHsgaWRlbnRpZmljYWRvcjogeCwgZXRpcXVldGE6IHgsIGZpbHRlcnM6IFtdIH0gYXMgQ29sdW1uRGVmaW5pdGlvbjsgfSkpO1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVGaWx0ZXJEYXRhKHRoaXMuZGF0b3NDb2x1bW5hKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUZpbHRlckRhdGEoY29sdW1uYXM6IEFycmF5PENvbHVtbkRlZmluaXRpb24+KSB7XHJcbiAgICBsZXQgcmVzdWx0ID0ge307XHJcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YVNvdXJjZS5kYXRhWzBdKTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEubWFwKChkOiBUKSA9PiB7XHJcbiAgICAgIGtleXMubWFwKChrKSA9PiB7XHJcbiAgICAgICAgbGV0IHByb3A6IEFycmF5PGFueT4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlc3VsdCwgayk/LnZhbHVlID8/IFtdO1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZCwgayk/LnZhbHVlO1xyXG4gICAgICAgIGlmICh2YWx1ZSAmJiAhcHJvcC5maW5kKGkgPT4gaS5uYW1lID09IHZhbHVlKSkge1xyXG4gICAgICAgICAgcHJvcC5wdXNoKHsgbmFtZTogdmFsdWUsIGlzU2VsZWN0ZWQ6IHRydWUsIGlzVmlzaWJsZTogdHJ1ZSB9IGFzIEZpbHRlckl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBrLCB7IHZhbHVlOiBwcm9wIH0pXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29sdW1uYXMubWFwKGMgPT4ge1xyXG4gICAgICBjLmZpbHRlcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlc3VsdCwgYy5pZGVudGlmaWNhZG9yKT8udmFsdWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdGl2YSBsYXMgY29sdW1uYXMgcXVlIHNlIHZhbiBhIG1vc3RyYXJcclxuICAgKi9cclxuICBwcml2YXRlIG1vc3RyYXJDb2x1bW5hcygpIHtcclxuICAgIHRoaXMuY29sdW1uYXMucHVzaCguLi50aGlzLmRhdG9zQ29sdW1uYVxyXG4gICAgICAubWFwKGl0ZW0gPT4geyByZXR1cm4gaXRlbS5pZGVudGlmaWNhZG9yOyB9KSk7XHJcbiAgICBpZiAodGhpcy5kYXRhVGFibGU/LmFjY2lvbmVzICYmIHRoaXMudmVyQWNjaW9uZXMoKSkge1xyXG4gICAgICB0aGlzLmNvbHVtbmFzLnB1c2goJ2FjdGlvbnMnKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBxdWUgZWplY3V0YSBsb3MgY2FtYmlvcyBlbiBsYSBzZWxlY2Npw7NuIGRlIGZpbGFzXHJcbiAgICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAtIFZhbG9yIGFjdHVhbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hhbmdlU2VsZWN0aW9uKGN1cnJlbnRWYWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmNvbHVtbmFzLnVuc2hpZnQoJ3NlbGVjdCcpO1xyXG4gICAgICB0aGlzLmRhdGFUYWJsZS5zZWxlY2Npb24gPSB0aGlzLmRhdGFUYWJsZS5zZWxlY2Npb24gPz8gbmV3IFNlbGVjdGlvbk1vZGVsPFQ+KHRydWUsIFtdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5hcy5pbmRleE9mKCdzZWxlY3QnKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLmNvbHVtbmFzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcXVlIHZhbGlkYSBsb3MgY2FtYmlvcyBlbiBsb3MgZGF0b3MgZGUgZW50cmFkYVxyXG4gICAqIEBwYXJhbSBjaGFuZ2VyIC0gQ2FtYmlvcyByZWFsaXphZG9zIGVuIGxhIHZpc3RhXHJcbiAgICovXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3R1YWxpemFyU2VsZWNjaW9uKGNoYW5nZXMpO1xyXG4gICAgdGhpcy5hY3R1YWxpemFyRmlsdHJvKGNoYW5nZXMpO1xyXG4gICAgdGhpcy5hY3R1YWxpemFyUGFnaW5hY2lvbihjaGFuZ2VzKTtcclxuICAgIHRoaXMuYWN0dWFsaXphckRhdGFUYWJsZShjaGFuZ2VzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWN0dWFsaXphclNlbGVjY2lvbihjYW1iaW9zOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBjb25zdCBjaGFuZ2VTZWxlY3RlZFJvdyA9IGNhbWJpb3NbJ3NlbGVjY2lvbmFyRmlsYXMnXTtcclxuICAgIGlmIChjaGFuZ2VTZWxlY3RlZFJvdyAmJiB0aGlzLmRhdGFUYWJsZSkge1xyXG4gICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbihjaGFuZ2VTZWxlY3RlZFJvdy5jdXJyZW50VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhY3R1YWxpemFyRmlsdHJvKGNhbWJpb3M6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IGNoYW5nZUZpbHRlciA9IGNhbWJpb3NbJ2ZpbHRyYXJEYXRvcyddO1xyXG4gICAgaWYgKGNoYW5nZUZpbHRlciAmJiAhY2hhbmdlRmlsdGVyLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gJyc7XHJcbiAgICAgIHRoaXMucmVhc2lnbmFyUGFnaW5hY2lvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFzaWduYXJQYWdpbmFjaW9uKCkge1xyXG4gICAgaWYgKHRoaXMucGFnaW5hcikge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFjdHVhbGl6YXJQYWdpbmFjaW9uKGNhbWJpb3M6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IGNoYW5nZVBhZ2luYXRpb24gPSBjYW1iaW9zWydwYWdpbmFyJ107XHJcbiAgICBpZiAoY2hhbmdlUGFnaW5hdGlvbikge1xyXG4gICAgICBpZiAoY2hhbmdlUGFnaW5hdGlvbi5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBhY3R1YWxpemFyRGF0YVRhYmxlKGNhbWJpb3M6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IGRhdG9zID0gY2FtYmlvc1snZGF0YVRhYmxlJ107XHJcbiAgICBpZiAoZGF0b3MgJiYgZGF0b3MuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gZGF0b3MuY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICAgIHRoaXMucmVhc2lnbmFyUGFnaW5hY2lvbigpO1xyXG4gICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbih0aGlzLnNlbGVjY2lvbmFyRmlsYXMpO1xyXG4gICAgICB0aGlzLmRhdGFUYWJsZS5hY2Npb25lcyA9IHRoaXMuZGF0YVRhYmxlLmFjY2lvbmVzID8/IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBxdWUgYXBsaWNhIGVsIGZpbHRybyBhIGxvcyBkYXRvcyBkZSBsYSB0YWJsYVxyXG4gICAqIEBwYXJhbSBmaWx0cm8gLSBFdmVudG8gZGUgZmlsdHJhZG9cclxuICAgKi9cclxuICBwdWJsaWMgYXBwbHlGaWx0ZXIoZmlsdHJvOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSBmaWx0cm8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLnBhZ2luYXRvcikge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaW1waWFyQ29sdW1uYXMoKSB7XHJcbiAgICB0aGlzLmRhdG9zQ29sdW1uYS5zcGxpY2UoMCk7XHJcbiAgICB0aGlzLmNvbHVtbmFzLnNwbGljZSgwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcXVlIGluZGljYSBzaSBzZSBkZWJlIG1vc3RyYXIgbGEgY29sdW1uYSBkZSBhY2Npb25lc1xyXG4gICAqIEByZXR1cm5zIFRydWUgc2kgc2UgZGViZSBtb3N0cmFyIGxhcyBhY2Npb25lc1xyXG4gICAqL1xyXG4gIHB1YmxpYyB2ZXJBY2Npb25lcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5hY2Npb25lcyAmJiB0aGlzLmRhdGFUYWJsZS5hY2Npb25lcy5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBxdWUgaW5pY2lhbGl6YSBlbCBQYWdpbmFkb3JcclxuICAgKi9cclxuICBwcml2YXRlIGluaWNpYWxpemFyUGFnaW5hZG9yKCkge1xyXG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLml0ZW1zUGVyUGFnZUxhYmVsID0gJ0VsZW1lbnRvcyBwb3IgcGFnaW5hJztcclxuICAgICAgdGhpcy5wYWdpbmF0b3IuX2ludGwuZmlyc3RQYWdlTGFiZWwgPSAnUHJpbWVyYSBwYWdpbmEnO1xyXG4gICAgICB0aGlzLnBhZ2luYXRvci5faW50bC5pdGVtc1BlclBhZ2VMYWJlbCA9ICdFbGVtZW50b3MgcG9yIHBhZ2luYSc7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLmxhc3RQYWdlTGFiZWwgPSAnVWx0aW1hIHBhZ2luYSc7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLm5leHRQYWdlTGFiZWwgPSAnU2lndWllbnRlIHBhZ2luYSc7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLnByZXZpb3VzUGFnZUxhYmVsID0gJ1BhZ2luYSBhbnRlcmlvcic7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLmdldFJhbmdlTGFiZWwgPSAocGFnZTogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyLCBsZW5ndGg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHJldHVybiBgUGFnaW5hOiR7cGFnZSArIDF9IGRlICR7cGFnZVNpemUgPD0gbGVuZ3RoID8gTWF0aC5jZWlsKGxlbmd0aCAvIHBhZ2VTaXplKSA6IDF9YDtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBzaSBlbCBvcmRlbmFtaWVudG8gZXN0YSBhY3Rpdm9cclxuICAgKi9cclxuICBwdWJsaWMgb3JkZW5hbWllbnRvQWN0aXZvKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLm9yZGVuYXJEYXRvcyAmJiB0aGlzLnNvcnQpIHtcclxuICAgICAgdGhpcy5zb3J0LmRpcmVjdGlvbiA9ICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMub3JkZW5hckRhdG9zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzaWduYXJPcmRlbihjb2x1bW46IHN0cmluZywgb3JkZW46IFNvcnREaXJlY3Rpb24pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNvcnQpIHtcclxuICAgICAgdGhpcy5zb3J0LmFjdGl2ZSA9IGNvbHVtbjtcclxuICAgICAgdGhpcy5zb3J0LmRpcmVjdGlvbiA9IG9yZGVuO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBBbHRlcm5hIGxhIHNlbGVjY2nDs24gZGUgcmVnaXN0cm9zIGRlIGxhIHRhYmxhICovXHJcbiAgcHVibGljIGFsdGVybmFyU2VsZWNjaW9uKCkge1xyXG4gICAgaWYgKHRoaXMudG9kb1NlbGVjY2lvbmFkbygpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnNlbGVjY2lvbi5jbGVhcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5zZWxlY2Npb24uc2VsZWN0KC4uLnRoaXMuZGF0YVNvdXJjZS5kYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBzaSB0b2RvIGVsIGNvbnRlbmlkbyBlc3RhIHNlbGVjY2lvbmFkb1xyXG4gICAqIEByZXR1cm5zIFRydWUgc2kgdG9kbyBlbCBjb250ZW5pZG8gZXN0YSBzZWxlY2Npb25hZG9cclxuICAgKi9cclxuICBwdWJsaWMgdG9kb1NlbGVjY2lvbmFkbygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5kYXRhVGFibGUuc2VsZWNjaW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGVsIGVzdGFkbyBkZSBsYSBldGlxdWV0YSBkZSBzZWxlY2Npb25hZG9cclxuICAgKiBAcGFyYW0gZmlsYSAtIEZpbGEgcXVlIHNlIHZhbGlkYXJhXHJcbiAgICogQHJldHVybnMgRXN0YWRvIGRlIHNlbGVjY2nDs24gZW4gbW9kbyB0ZXh0b1xyXG4gICAqL1xyXG4gIHB1YmxpYyB2YWxpZGFyRXRpcXVldGEoZmlsYT86IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWZpbGEpIHtcclxuICAgICAgcmV0dXJuIGAke3RoaXMudG9kb1NlbGVjY2lvbmFkbygpID8gJ2Rlc2VsZWN0JyA6ICdzZWxlY3QnfSBhbGxgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3RoaXMuZGF0YVRhYmxlLnNlbGVjY2lvbi5pc1NlbGVjdGVkKGZpbGEpID8gJ2Rlc2VsZWN0JyA6ICdzZWxlY3QnfSByb3cgJHtOdW1iZXIoZmlsYS5wb3NpdGlvbikgKyAxfWA7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGRlc2NhcmdhckNzdihhcmNoaXZvOiBzdHJpbmcsIHNvbG9TZWxlY2Npb25hZG9zPzogYm9vbGVhbikge1xyXG4gICAgaWYgKCFzb2xvU2VsZWNjaW9uYWRvcykge1xyXG4gICAgICB0aGlzLmNzdi5kZXNjYXJnYXJDc3YoYXJjaGl2bywgdGhpcy5kYXRhVGFibGUuZGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5jc3YuZGVzY2FyZ2FyQ3N2KGFyY2hpdm8sIHRoaXMuZGF0YVRhYmxlLnNlbGVjY2lvbi5zZWxlY3RlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Sb3dTZWxlY3QoZXZlbnQ6IFQpIHtcclxuICAgIHRoaXMub25Sb3dDbGljay5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvblJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xyXG5cclxuXHJcbiAgcHJvdGVjdGVkIGRlc2hhYmlsaXRhckFjY2lvbihhY3Rpb246IFJvd0FjdGlvbjxUPiwgZWxlbWVudDogYW55KSB7XHJcbiAgICBpZiAoYWN0aW9uLmRlc2hhYmlsaXRhcikge1xyXG4gICAgICByZXR1cm4gYWN0aW9uLmRlc2hhYmlsaXRhcjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFjdGlvbi5kZXNhYmlsaXRhckFjdGlvblBvclZhbG9yZXMpIHtcclxuICAgICAgY29uc3QgdmFsb3IgPSBlbGVtZW50W2FjdGlvbi5kZXNhYmlsaXRhckFjdGlvblBvclZhbG9yZXMuY29sdW1uYVJlZl07XHJcbiAgICAgIGNvbnN0IHZhbG9yZXMgPSBhY3Rpb24uZGVzYWJpbGl0YXJBY3Rpb25Qb3JWYWxvcmVzLnZhbG9yZXNBRGVzaGFiaWxpdGFyO1xyXG5cclxuICAgICAgaWYgKHZhbG9yZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB2YWxvcmVzLnNvbWUodmFsdWUgPT4gdmFsdWUgPT09IHZhbG9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RvcFByb3BhZ2F0aW9uKGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGNsaWNrRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjbGlja0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FtYmlvRmlsdHJvKG1lbnU6IE1hdE1lbnVUcmlnZ2VyLCBpc0NoYW5nZTogYm9vbGVhbikge1xyXG4gICAgbWVudS5jbG9zZU1lbnUoKTtcclxuICAgIGlmIChpc0NoYW5nZSkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGN1c3RvbVBhcmFtZXRlcihkYXRhOiBULCBmaWx0ZXI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0b3NDb2x1bW5hLmV2ZXJ5KGRjID0+IHtcclxuICAgICAgbGV0IHZhbHVlID0gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGF0YSwgZGMuaWRlbnRpZmljYWRvcik/LnZhbHVlPy50b1N0cmluZygpID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgbGV0IGlzQWxsU2VsZWN0ZWQgPSBkYy5maWx0ZXJzLmV2ZXJ5KGYgPT4gZi5pc1NlbGVjdGVkKTtcclxuICAgICAgaWYgKCFpc0FsbFNlbGVjdGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIGRjLmZpbHRlcnMuZmlsdGVyKGYgPT4gZi5pc1NlbGVjdGVkKS5zb21lKGYgPT4gdmFsdWUuaW5kZXhPZihmLm5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSlcclxuICB9XHJcbn1cclxuIiwiPCEtLSBDb250ZW5lZG9yIHByaW5jaXBhbCBkZWwgY29tcG9uZW50ZSAtLT5cclxuPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgPCEtLSBGaWx0cm8gZGUgZGF0b3MgcGFyYSBsYSB0YWJsYSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJmaWx0cmFyRGF0b3NcIj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uXCI+IHNlYXJjaCA8L21hdC1pY29uPlxyXG4gICAgICAgIDxpbnB1dCAjZmlsdHJvSW5wdXQgcGxhY2Vob2xkZXI9XCJCdXNjYXJcIiAoa2V5dXApPVwiYXBwbHlGaWx0ZXIoZmlsdHJvSW5wdXQudmFsdWUpXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBUYWJsYSBkZSBkYXRvcyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XHJcbiAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgbWF0U29ydD5cclxuICAgICAgICAgICAgPGNhcHRpb24+IFJlZGlUYWJsZUNvbXBvbmVudCA8L2NhcHRpb24+XHJcbiAgICAgICAgICAgIDwhLS0gQ29udGVuZWRvciBkZSBzZWxlY2Npw7NuIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWNjaW9uYXJGaWxhc1wiIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBFbmNhYmV6YWRvIGRlIHRhYmxhIGNvbiBzZWxlY2Npw7NuIGRlIHJlZ2lzdHJvcyAtLT5cclxuICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbnRyb2xlcyBkZSBzZWxlY2Npw7NuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBhbHRlcm5hclNlbGVjY2lvbigpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImRhdGFUYWJsZS5zZWxlY2Npb24uaGFzVmFsdWUoKSAmJiB0b2RvU2VsZWNjaW9uYWRvKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJkYXRhVGFibGUuc2VsZWNjaW9uLmhhc1ZhbHVlKCkgJiYgIXRvZG9TZWxlY2Npb25hZG8oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0b3IgZGUgZmlsYSAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cImNoZWNrQ29sXCIgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFUYWJsZS5zZWxlY2Npb24udG9nZ2xlKHJvdykgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZGF0YVRhYmxlLnNlbGVjY2lvbi5pc1NlbGVjdGVkKHJvdylcIiBbYXJpYS1sYWJlbF09XCJ2YWxpZGFyRXRpcXVldGEocm93KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwhLS0gT3JkZW5hbWllbnRvIGRlIGVuY2FiZXphZG9zIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5pZGVudGlmaWNhZG9yXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBkYXRvc0NvbHVtbmFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERlZmluaWNpw7NuIGRlIGVuY2FiZXphZG8gcG9yIGNvbHVtbmEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbHVtbi5ldGlxdWV0YSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pZGVudGlmaWNhZG9yfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRoaXMub3JkZW5hbWllbnRvQWN0aXZvKCkgfHwgdGhpcy5maWx0cmFyRGF0b3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICNtZW51VHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCIgKG9uTWVudUNsb3NlKT1cImNsb3NlTWVudSgpXCIgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgYXJpYS1sYWJlbD1cIk9wY2lvbmVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0aGlzLm9yZGVuYW1pZW50b0FjdGl2bygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYXNpZ25hck9yZGVuKGNvbHVtbi5pZGVudGlmaWNhZG9yLCcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnNvcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UXVpdGFyIG9yZGVuYW1pZW50bzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYXNpZ25hck9yZGVuKGNvbHVtbi5pZGVudGlmaWNhZG9yLCdhc2MnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnRleHRfcm90YXRlX3VwPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk9yZGVuIGFzY2VuZGVudGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFzaWduYXJPcmRlbihjb2x1bW4uaWRlbnRpZmljYWRvciwnZGVzYycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+dGV4dF9yb3RhdGlvbl9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk9yZGVuIGRlc2NlbmRlbnRlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHRoaXMuZmlsdHJhckRhdG9zKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlci1kYXRhICNmaWx0cm8gW2ZpbHRyb3NDb2x1bW5hc109XCJjb2x1bW4uZmlsdGVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RvcFByb3BhZ2F0aW9uKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlckVuZCk9XCJjYW1iaW9GaWx0cm8obWVudVRyaWdnZXIsJGV2ZW50KVwiPjwvZmlsdGVyLWRhdGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYWNpw7NuIGRlIGlkZW50aWZpY2Fkb3JlcyBkZSB0YWJsYSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnRbY29sdW1uLmlkZW50aWZpY2Fkb3JdfX0gPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSBEZWZpbmljacOzbiBkZSBhY2Npb25lcyAgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2ZXJBY2Npb25lcygpXCIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiIHN0aWNreUVuZD5cclxuICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBhcmlhLWxhYmVsPVwicm93IGFjdGlvbnNcIj4mbmJzcDs8L3RoPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBEZWZpbmljacOzbiBkZSBhY2Npb25lcyBwb3IgZmlsYSAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDb25maWd1cmFjacOzbiBkZSBib3RvbmVzIGRlIGFjY2nDs24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBkYXRhVGFibGUuYWNjaW9uZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uPy5lbWl0ZXI/LmVtaXQoe3RhcmdldDplbGVtZW50LHNvdXJjZTpkYXRhU291cmNlfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGVzaGFiaWxpdGFyQWNjaW9uKGFjdGlvbixlbGVtZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEljb25vIGRpbsOhbWljbyBkZSBsYSBhY2Npw7NuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW25nQ2xhc3NdPVwiZGVzaGFiaWxpdGFyQWNjaW9uKGFjdGlvbixlbGVtZW50KSA/ICdkaXNhYmxlZC1idXR0b24nIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YWN0aW9uLmljb25vIHx8ICdhcHBzJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSBEZWZpbmljacOzbiBkZSBjb2x1bW5hcyAtLT5cclxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5hczsgc3RpY2t5OnRydWVcIj48L3RyPlxyXG4gICAgICAgICAgICA8IS0tIEVzdGlsaXphZG9zIGFsdGVybmFkbyBkZSBmaWxhcyAtLT5cclxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbmFzO2xldCByb3dOdW0gPSBpbmRleFwiIFtjbGFzcy5vZGRdPVwicm93TnVtJTJcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmV2ZW5dPVwiIShyb3dOdW0lMilcIiAoY2xpY2spPVwib25Sb3dTZWxlY3Qocm93KVwiPjwvdHI+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBQYWdpbmFkb3IgZGUgZGF0b3MgLS0+XHJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInBhZ2luYXIgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiPlxyXG4gICAgICAgIDwhLS0gQ29uZmlndXJhY2nDs24gZGUgUGFnaW5hZG9yIC0tPlxyXG4gICAgICAgIDxtYXQtcGFnaW5hdG9yIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzUsMTAsMjAsNTAsMTAwXVwiIHNob3dGaXJzdExhc3RCdXR0b25zIGFyaWEtbGFiZWw9XCJTZWxlY2Npb25lIHVuYSBwYWdpbmFcIj5cclxuICAgICAgICA8L21hdC1wYWdpbmF0b3I+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVkaS1jb3JlL1JlZGlUYWJsZS9zcmMvY29tcG9uZW50cy9yZWRpLXRhYmxlL3JlZGktdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZGktY29yZS9SZWRpVGFibGUvc3JjL2NvbXBvbmVudHMvcmVkaS10YWJsZS9yZWRpLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdCQUF3QjtBQUN4QixPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSSxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU8xRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFrQixNQUFNLHdCQUF3QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0Is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QUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ25HLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzs4R0F0V1Usa0JBQWtCO2tHQUFsQixrQkFBa0IsNlNBdUNsQixPQUFPLDRFQUtQLFlBQVksNkpDNUZ6Qiw4Mk1BdUdNLDZ4Q0R6RUYsWUFBWSw2VkFDWixhQUFhLG1MQUNiLGNBQWMsc2dDQUNkLGlCQUFpQiw2V0FDakIsa0JBQWtCLG1TQUNsQixhQUFhLDBQQUNiLGFBQWEsNnZCQUViLGdCQUFnQixrSUFDaEIsZ0JBQWdCLDhCQUVoQixlQUFlLDZJQUVmLG1CQUFtQjs7MkZBS1Ysa0JBQWtCO2tCQXRCOUIsU0FBUzsrQkFDRSxZQUFZLGNBQ1YsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGFBQWE7d0JBRWIsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFFZixtQkFBbUI7cUJBQ3BCOytFQVNNLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFPQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLE9BQU87c0JBRGIsS0FBSztnQkFPQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkFXYyxJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBS08sU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQWFoQixXQUFXO3NCQURqQixTQUFTO3VCQUFDLFFBQVE7Z0JBcVFaLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiogTGlicmVyw61hcyBhbmd1bGFyICovXHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSwgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcblxyXG4vKiogTW9kZWxvICovXHJcbmltcG9ydCB7IERhdGFUYWJsZSB9IGZyb20gJy4uLy4uL21vZGVscy9pbnRlcmZhY2VzL2RhdGEtdGFibGUnO1xyXG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ludGVyZmFjZXMvY29sdW1uLWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBDc3ZTZXJ2aWNlIH0gZnJvbSAnbmd4LXJlZGktY29yZS9IZWxwZXInO1xyXG5pbXBvcnQgeyBSb3dBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvaW50ZXJmYWNlcy9yb3ctYWN0aW9uJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSwgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xyXG5pbXBvcnQgeyBGaWx0ZXJJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ludGVyZmFjZXMvZmlsdGVyLWl0ZW0nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IEZpbHRlckRhdGFDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXItZGF0YS9maWx0ZXItZGF0YS5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgcXVlIG11ZXN0cmEgbG9zIGRhdG9zIGVuIHVuYSB0YWJsYVxyXG4gKiBAZGVjb3JhdG9ycyDCtEBDb21wb25lbnTCtFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyZWRpLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRUYWJsZU1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxyXG4gICAgTWF0U29ydE1vZHVsZSxcclxuICAgIE1hdE1lbnVNb2R1bGUsXHJcblxyXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuXHJcbiAgICBGaWx0ZXJEYXRhQ29tcG9uZW50XHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVkaS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3JlZGktdGFibGUuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlZGlUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgb2JqZWN0PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAvKipcclxuICAgKiBQcm9waWVkYWQgcXVlIGluZGljYSBzaSBzZSBwdWVkZW4gc2VsZWNjaW9uYXIgbGFzIGZpbGFzXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2VsZWNjaW9uYXJGaWxhcyA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb3BpZWRhZCBxdWUgaW5kaWNhIHNpIHNlIGhhYmlsaXRhbiBsb3MgZmlsdHJvcyBwYXJhIGxhIHRhYmxhXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZmlsdHJhckRhdG9zID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJvcGllZGFkIHF1ZSBpbmRpY2Egc2kgc2UgcGFnaW5hbiBsb3MgZGF0b3NcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBwYWdpbmFyID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJvcGllZGFkIHF1ZSBpbmRpY2Egc2kgc2UgaGFiaWxpdGEgZWwgb3JkZW5hbWllbnRvIGRlIGRhdG9zXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgb3JkZW5hckRhdG9zID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGF0b3MgeSBjb25maWd1cmFjacOzbiBkZSBsYSB0YWJsYVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRhdGFUYWJsZTogRGF0YVRhYmxlPFQ+O1xyXG5cclxuICAvKipcclxuICAgKiBPcmlnZW4gZGUgZGF0b3MgcGFyYSBlbCBNYXRUYWJsZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8VD47XHJcblxyXG4gIC8qKlxyXG4gICAqIE9iamV0byBkZSBsYSB2aXN0YSBwYXJhIGVsIG9yZGVuYW1pZW50b1xyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9iamV0byBkZSBsYSB2aXN0YSBwYXJhIGxhIHBhZ2luYWNpw7NuXHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcclxuXHJcbiAgLyoqXHJcbiAgKiBDb250aWVuZSBsYXMgY29sdW1uYXMgcXVlIHNlIG1vc3RyYXJhbiBlbiBsYSB0YWJsYVxyXG4gICovXHJcbiAgcHVibGljIGNvbHVtbmFzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRpZW5lIGxvcyBkYXRvcyBkZSBsYXMgY29sdW1uYXNcclxuICAgKi9cclxuICBwdWJsaWMgZGF0b3NDb2x1bW5hOiBBcnJheTxDb2x1bW5EZWZpbml0aW9uPiA9IFtdO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWx0cm8nKVxyXG4gIHB1YmxpYyBjb21wb0ZpbHRybyE6IEZpbHRlckRhdGFDb21wb25lbnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWEgdW4gbnVldm8gY29tcG9uZW50ZSBUYWJsYVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY3N2OiBDc3ZTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZSA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogW10gYXMgQXJyYXk8VD4sXHJcbiAgICAgIGFjY2lvbmVzOiBbXSBhcyBBcnJheTxSb3dBY3Rpb248VD4+XHJcbiAgICB9IGFzIERhdGFUYWJsZTxUPjtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VNZW51KCkge1xyXG4gICAgaWYgKHRoaXMuY29tcG9GaWx0cm8pIHtcclxuICAgICAgdGhpcy5jb21wb0ZpbHRyby5sb2FkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBFdmVudG9zIHF1ZSBzZSBlamVjdXRhbiBhbCBpbmljaWFzXHJcbiAgKi9cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMubGltcGlhckNvbHVtbmFzKCk7XHJcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmRhdGFUYWJsZS5kYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5jb25zdHJ1aURhdG9zQ29sdW1uYSgpO1xyXG4gICAgICB0aGlzLm1vc3RyYXJDb2x1bW5hcygpO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gKGY6IFQsIHU6IHN0cmluZykgPT4geyByZXR1cm4gdGhpcy5jdXN0b21QYXJhbWV0ZXIoZiwgdSkgfTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pY2lhbGl6YXJQYWdpbmFkb3IoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnV5ZSBsb3MgZGF0b3MgZGUgbGFzIGNvbHVtbmFzIHBhcmEgbGEgdGFibGFcclxuICAgKi9cclxuICBwcml2YXRlIGNvbnN0cnVpRGF0b3NDb2x1bW5hKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlLmNvbHVtbmFzICYmXHJcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbHVtbmFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kYXRvc0NvbHVtbmEucHVzaCguLi50aGlzLmRhdGFUYWJsZS5jb2x1bW5hcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlPy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVRhYmxlLmRhdGFTb3VyY2UubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRvc0NvbHVtbmEucHVzaCguLi5PYmplY3Qua2V5cyh0aGlzLmRhdGFUYWJsZS5kYXRhU291cmNlWzBdKVxyXG4gICAgICAgICAgLm1hcCh4ID0+IHsgcmV0dXJuIHsgaWRlbnRpZmljYWRvcjogeCwgZXRpcXVldGE6IHgsIGZpbHRlcnM6IFtdIH0gYXMgQ29sdW1uRGVmaW5pdGlvbjsgfSkpO1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVGaWx0ZXJEYXRhKHRoaXMuZGF0b3NDb2x1bW5hKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUZpbHRlckRhdGEoY29sdW1uYXM6IEFycmF5PENvbHVtbkRlZmluaXRpb24+KSB7XHJcbiAgICBsZXQgcmVzdWx0ID0ge307XHJcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YVNvdXJjZS5kYXRhWzBdKTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEubWFwKChkOiBUKSA9PiB7XHJcbiAgICAgIGtleXMubWFwKChrKSA9PiB7XHJcbiAgICAgICAgbGV0IHByb3A6IEFycmF5PGFueT4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlc3VsdCwgayk/LnZhbHVlID8/IFtdO1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZCwgayk/LnZhbHVlO1xyXG4gICAgICAgIGlmICh2YWx1ZSAmJiAhcHJvcC5maW5kKGkgPT4gaS5uYW1lID09IHZhbHVlKSkge1xyXG4gICAgICAgICAgcHJvcC5wdXNoKHsgbmFtZTogdmFsdWUsIGlzU2VsZWN0ZWQ6IHRydWUsIGlzVmlzaWJsZTogdHJ1ZSB9IGFzIEZpbHRlckl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBrLCB7IHZhbHVlOiBwcm9wIH0pXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29sdW1uYXMubWFwKGMgPT4ge1xyXG4gICAgICBjLmZpbHRlcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlc3VsdCwgYy5pZGVudGlmaWNhZG9yKT8udmFsdWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdGl2YSBsYXMgY29sdW1uYXMgcXVlIHNlIHZhbiBhIG1vc3RyYXJcclxuICAgKi9cclxuICBwcml2YXRlIG1vc3RyYXJDb2x1bW5hcygpIHtcclxuICAgIHRoaXMuY29sdW1uYXMucHVzaCguLi50aGlzLmRhdG9zQ29sdW1uYVxyXG4gICAgICAubWFwKGl0ZW0gPT4geyByZXR1cm4gaXRlbS5pZGVudGlmaWNhZG9yOyB9KSk7XHJcbiAgICBpZiAodGhpcy5kYXRhVGFibGU/LmFjY2lvbmVzICYmIHRoaXMudmVyQWNjaW9uZXMoKSkge1xyXG4gICAgICB0aGlzLmNvbHVtbmFzLnB1c2goJ2FjdGlvbnMnKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBxdWUgZWplY3V0YSBsb3MgY2FtYmlvcyBlbiBsYSBzZWxlY2Npw7NuIGRlIGZpbGFzXHJcbiAgICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAtIFZhbG9yIGFjdHVhbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hhbmdlU2VsZWN0aW9uKGN1cnJlbnRWYWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmNvbHVtbmFzLnVuc2hpZnQoJ3NlbGVjdCcpO1xyXG4gICAgICB0aGlzLmRhdGFUYWJsZS5zZWxlY2Npb24gPSB0aGlzLmRhdGFUYWJsZS5zZWxlY2Npb24gPz8gbmV3IFNlbGVjdGlvbk1vZGVsPFQ+KHRydWUsIFtdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5hcy5pbmRleE9mKCdzZWxlY3QnKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLmNvbHVtbmFzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcXVlIHZhbGlkYSBsb3MgY2FtYmlvcyBlbiBsb3MgZGF0b3MgZGUgZW50cmFkYVxyXG4gICAqIEBwYXJhbSBjaGFuZ2VyIC0gQ2FtYmlvcyByZWFsaXphZG9zIGVuIGxhIHZpc3RhXHJcbiAgICovXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3R1YWxpemFyU2VsZWNjaW9uKGNoYW5nZXMpO1xyXG4gICAgdGhpcy5hY3R1YWxpemFyRmlsdHJvKGNoYW5nZXMpO1xyXG4gICAgdGhpcy5hY3R1YWxpemFyUGFnaW5hY2lvbihjaGFuZ2VzKTtcclxuICAgIHRoaXMuYWN0dWFsaXphckRhdGFUYWJsZShjaGFuZ2VzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWN0dWFsaXphclNlbGVjY2lvbihjYW1iaW9zOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBjb25zdCBjaGFuZ2VTZWxlY3RlZFJvdyA9IGNhbWJpb3NbJ3NlbGVjY2lvbmFyRmlsYXMnXTtcclxuICAgIGlmIChjaGFuZ2VTZWxlY3RlZFJvdyAmJiB0aGlzLmRhdGFUYWJsZSkge1xyXG4gICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbihjaGFuZ2VTZWxlY3RlZFJvdy5jdXJyZW50VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhY3R1YWxpemFyRmlsdHJvKGNhbWJpb3M6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IGNoYW5nZUZpbHRlciA9IGNhbWJpb3NbJ2ZpbHRyYXJEYXRvcyddO1xyXG4gICAgaWYgKGNoYW5nZUZpbHRlciAmJiAhY2hhbmdlRmlsdGVyLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gJyc7XHJcbiAgICAgIHRoaXMucmVhc2lnbmFyUGFnaW5hY2lvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFzaWduYXJQYWdpbmFjaW9uKCkge1xyXG4gICAgaWYgKHRoaXMucGFnaW5hcikge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFjdHVhbGl6YXJQYWdpbmFjaW9uKGNhbWJpb3M6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IGNoYW5nZVBhZ2luYXRpb24gPSBjYW1iaW9zWydwYWdpbmFyJ107XHJcbiAgICBpZiAoY2hhbmdlUGFnaW5hdGlvbikge1xyXG4gICAgICBpZiAoY2hhbmdlUGFnaW5hdGlvbi5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBhY3R1YWxpemFyRGF0YVRhYmxlKGNhbWJpb3M6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IGRhdG9zID0gY2FtYmlvc1snZGF0YVRhYmxlJ107XHJcbiAgICBpZiAoZGF0b3MgJiYgZGF0b3MuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gZGF0b3MuY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICAgIHRoaXMucmVhc2lnbmFyUGFnaW5hY2lvbigpO1xyXG4gICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbih0aGlzLnNlbGVjY2lvbmFyRmlsYXMpO1xyXG4gICAgICB0aGlzLmRhdGFUYWJsZS5hY2Npb25lcyA9IHRoaXMuZGF0YVRhYmxlLmFjY2lvbmVzID8/IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBxdWUgYXBsaWNhIGVsIGZpbHRybyBhIGxvcyBkYXRvcyBkZSBsYSB0YWJsYVxyXG4gICAqIEBwYXJhbSBmaWx0cm8gLSBFdmVudG8gZGUgZmlsdHJhZG9cclxuICAgKi9cclxuICBwdWJsaWMgYXBwbHlGaWx0ZXIoZmlsdHJvOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSBmaWx0cm8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLnBhZ2luYXRvcikge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaW1waWFyQ29sdW1uYXMoKSB7XHJcbiAgICB0aGlzLmRhdG9zQ29sdW1uYS5zcGxpY2UoMCk7XHJcbiAgICB0aGlzLmNvbHVtbmFzLnNwbGljZSgwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcXVlIGluZGljYSBzaSBzZSBkZWJlIG1vc3RyYXIgbGEgY29sdW1uYSBkZSBhY2Npb25lc1xyXG4gICAqIEByZXR1cm5zIFRydWUgc2kgc2UgZGViZSBtb3N0cmFyIGxhcyBhY2Npb25lc1xyXG4gICAqL1xyXG4gIHB1YmxpYyB2ZXJBY2Npb25lcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5hY2Npb25lcyAmJiB0aGlzLmRhdGFUYWJsZS5hY2Npb25lcy5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBxdWUgaW5pY2lhbGl6YSBlbCBQYWdpbmFkb3JcclxuICAgKi9cclxuICBwcml2YXRlIGluaWNpYWxpemFyUGFnaW5hZG9yKCkge1xyXG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLml0ZW1zUGVyUGFnZUxhYmVsID0gJ0VsZW1lbnRvcyBwb3IgcGFnaW5hJztcclxuICAgICAgdGhpcy5wYWdpbmF0b3IuX2ludGwuZmlyc3RQYWdlTGFiZWwgPSAnUHJpbWVyYSBwYWdpbmEnO1xyXG4gICAgICB0aGlzLnBhZ2luYXRvci5faW50bC5pdGVtc1BlclBhZ2VMYWJlbCA9ICdFbGVtZW50b3MgcG9yIHBhZ2luYSc7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLmxhc3RQYWdlTGFiZWwgPSAnVWx0aW1hIHBhZ2luYSc7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLm5leHRQYWdlTGFiZWwgPSAnU2lndWllbnRlIHBhZ2luYSc7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLnByZXZpb3VzUGFnZUxhYmVsID0gJ1BhZ2luYSBhbnRlcmlvcic7XHJcbiAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLmdldFJhbmdlTGFiZWwgPSAocGFnZTogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyLCBsZW5ndGg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHJldHVybiBgUGFnaW5hOiR7cGFnZSArIDF9IGRlICR7cGFnZVNpemUgPD0gbGVuZ3RoID8gTWF0aC5jZWlsKGxlbmd0aCAvIHBhZ2VTaXplKSA6IDF9YDtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBzaSBlbCBvcmRlbmFtaWVudG8gZXN0YSBhY3Rpdm9cclxuICAgKi9cclxuICBwdWJsaWMgb3JkZW5hbWllbnRvQWN0aXZvKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLm9yZGVuYXJEYXRvcyAmJiB0aGlzLnNvcnQpIHtcclxuICAgICAgdGhpcy5zb3J0LmRpcmVjdGlvbiA9ICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMub3JkZW5hckRhdG9zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzaWduYXJPcmRlbihjb2x1bW46IHN0cmluZywgb3JkZW46IFNvcnREaXJlY3Rpb24pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNvcnQpIHtcclxuICAgICAgdGhpcy5zb3J0LmFjdGl2ZSA9IGNvbHVtbjtcclxuICAgICAgdGhpcy5zb3J0LmRpcmVjdGlvbiA9IG9yZGVuO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBBbHRlcm5hIGxhIHNlbGVjY2nDs24gZGUgcmVnaXN0cm9zIGRlIGxhIHRhYmxhICovXHJcbiAgcHVibGljIGFsdGVybmFyU2VsZWNjaW9uKCkge1xyXG4gICAgaWYgKHRoaXMudG9kb1NlbGVjY2lvbmFkbygpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnNlbGVjY2lvbi5jbGVhcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5zZWxlY2Npb24uc2VsZWN0KC4uLnRoaXMuZGF0YVNvdXJjZS5kYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBzaSB0b2RvIGVsIGNvbnRlbmlkbyBlc3RhIHNlbGVjY2lvbmFkb1xyXG4gICAqIEByZXR1cm5zIFRydWUgc2kgdG9kbyBlbCBjb250ZW5pZG8gZXN0YSBzZWxlY2Npb25hZG9cclxuICAgKi9cclxuICBwdWJsaWMgdG9kb1NlbGVjY2lvbmFkbygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5kYXRhVGFibGUuc2VsZWNjaW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGVsIGVzdGFkbyBkZSBsYSBldGlxdWV0YSBkZSBzZWxlY2Npb25hZG9cclxuICAgKiBAcGFyYW0gZmlsYSAtIEZpbGEgcXVlIHNlIHZhbGlkYXJhXHJcbiAgICogQHJldHVybnMgRXN0YWRvIGRlIHNlbGVjY2nDs24gZW4gbW9kbyB0ZXh0b1xyXG4gICAqL1xyXG4gIHB1YmxpYyB2YWxpZGFyRXRpcXVldGEoZmlsYT86IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWZpbGEpIHtcclxuICAgICAgcmV0dXJuIGAke3RoaXMudG9kb1NlbGVjY2lvbmFkbygpID8gJ2Rlc2VsZWN0JyA6ICdzZWxlY3QnfSBhbGxgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3RoaXMuZGF0YVRhYmxlLnNlbGVjY2lvbi5pc1NlbGVjdGVkKGZpbGEpID8gJ2Rlc2VsZWN0JyA6ICdzZWxlY3QnfSByb3cgJHtOdW1iZXIoZmlsYS5wb3NpdGlvbikgKyAxfWA7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGRlc2NhcmdhckNzdihhcmNoaXZvOiBzdHJpbmcsIHNvbG9TZWxlY2Npb25hZG9zPzogYm9vbGVhbikge1xyXG4gICAgaWYgKCFzb2xvU2VsZWNjaW9uYWRvcykge1xyXG4gICAgICB0aGlzLmNzdi5kZXNjYXJnYXJDc3YoYXJjaGl2bywgdGhpcy5kYXRhVGFibGUuZGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5jc3YuZGVzY2FyZ2FyQ3N2KGFyY2hpdm8sIHRoaXMuZGF0YVRhYmxlLnNlbGVjY2lvbi5zZWxlY3RlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Sb3dTZWxlY3QoZXZlbnQ6IFQpIHtcclxuICAgIHRoaXMub25Sb3dDbGljay5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvblJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xyXG5cclxuXHJcbiAgcHJvdGVjdGVkIGRlc2hhYmlsaXRhckFjY2lvbihhY3Rpb246IFJvd0FjdGlvbjxUPiwgZWxlbWVudDogYW55KSB7XHJcbiAgICBpZiAoYWN0aW9uLmRlc2hhYmlsaXRhcikge1xyXG4gICAgICByZXR1cm4gYWN0aW9uLmRlc2hhYmlsaXRhcjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFjdGlvbi5kZXNhYmlsaXRhckFjdGlvblBvclZhbG9yZXMpIHtcclxuICAgICAgY29uc3QgdmFsb3IgPSBlbGVtZW50W2FjdGlvbi5kZXNhYmlsaXRhckFjdGlvblBvclZhbG9yZXMuY29sdW1uYVJlZl07XHJcbiAgICAgIGNvbnN0IHZhbG9yZXMgPSBhY3Rpb24uZGVzYWJpbGl0YXJBY3Rpb25Qb3JWYWxvcmVzLnZhbG9yZXNBRGVzaGFiaWxpdGFyO1xyXG5cclxuICAgICAgaWYgKHZhbG9yZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB2YWxvcmVzLnNvbWUodmFsdWUgPT4gdmFsdWUgPT09IHZhbG9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RvcFByb3BhZ2F0aW9uKGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGNsaWNrRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjbGlja0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FtYmlvRmlsdHJvKG1lbnU6IE1hdE1lbnVUcmlnZ2VyLCBpc0NoYW5nZTogYm9vbGVhbikge1xyXG4gICAgbWVudS5jbG9zZU1lbnUoKTtcclxuICAgIGlmIChpc0NoYW5nZSkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGN1c3RvbVBhcmFtZXRlcihkYXRhOiBULCBmaWx0ZXI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0b3NDb2x1bW5hLmV2ZXJ5KGRjID0+IHtcclxuICAgICAgbGV0IHZhbHVlID0gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGF0YSwgZGMuaWRlbnRpZmljYWRvcik/LnZhbHVlPy50b1N0cmluZygpID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgbGV0IGlzQWxsU2VsZWN0ZWQgPSBkYy5maWx0ZXJzLmV2ZXJ5KGYgPT4gZi5pc1NlbGVjdGVkKTtcclxuICAgICAgaWYgKCFpc0FsbFNlbGVjdGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIGRjLmZpbHRlcnMuZmlsdGVyKGYgPT4gZi5pc1NlbGVjdGVkKS5zb21lKGYgPT4gdmFsdWUuaW5kZXhPZihmLm5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSlcclxuICB9XHJcbn1cclxuIiwiPCEtLSBDb250ZW5lZG9yIHByaW5jaXBhbCBkZWwgY29tcG9uZW50ZSAtLT5cclxuPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgPCEtLSBGaWx0cm8gZGUgZGF0b3MgcGFyYSBsYSB0YWJsYSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJmaWx0cmFyRGF0b3NcIj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uXCI+IHNlYXJjaCA8L21hdC1pY29uPlxyXG4gICAgICAgIDxpbnB1dCAjZmlsdHJvSW5wdXQgcGxhY2Vob2xkZXI9XCJCdXNjYXJcIiAoa2V5dXApPVwiYXBwbHlGaWx0ZXIoZmlsdHJvSW5wdXQudmFsdWUpXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBUYWJsYSBkZSBkYXRvcyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XHJcbiAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgbWF0U29ydD5cclxuICAgICAgICAgICAgPGNhcHRpb24+IFJlZGlUYWJsZUNvbXBvbmVudCA8L2NhcHRpb24+XHJcbiAgICAgICAgICAgIDwhLS0gQ29udGVuZWRvciBkZSBzZWxlY2Npw7NuIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWNjaW9uYXJGaWxhc1wiIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBFbmNhYmV6YWRvIGRlIHRhYmxhIGNvbiBzZWxlY2Npw7NuIGRlIHJlZ2lzdHJvcyAtLT5cclxuICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbnRyb2xlcyBkZSBzZWxlY2Npw7NuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBhbHRlcm5hclNlbGVjY2lvbigpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImRhdGFUYWJsZS5zZWxlY2Npb24uaGFzVmFsdWUoKSAmJiB0b2RvU2VsZWNjaW9uYWRvKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJkYXRhVGFibGUuc2VsZWNjaW9uLmhhc1ZhbHVlKCkgJiYgIXRvZG9TZWxlY2Npb25hZG8oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0b3IgZGUgZmlsYSAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cImNoZWNrQ29sXCIgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFUYWJsZS5zZWxlY2Npb24udG9nZ2xlKHJvdykgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZGF0YVRhYmxlLnNlbGVjY2lvbi5pc1NlbGVjdGVkKHJvdylcIiBbYXJpYS1sYWJlbF09XCJ2YWxpZGFyRXRpcXVldGEocm93KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwhLS0gT3JkZW5hbWllbnRvIGRlIGVuY2FiZXphZG9zIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5pZGVudGlmaWNhZG9yXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBkYXRvc0NvbHVtbmFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERlZmluaWNpw7NuIGRlIGVuY2FiZXphZG8gcG9yIGNvbHVtbmEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbHVtbi5ldGlxdWV0YSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pZGVudGlmaWNhZG9yfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRoaXMub3JkZW5hbWllbnRvQWN0aXZvKCkgfHwgdGhpcy5maWx0cmFyRGF0b3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICNtZW51VHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCIgKG9uTWVudUNsb3NlKT1cImNsb3NlTWVudSgpXCIgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgYXJpYS1sYWJlbD1cIk9wY2lvbmVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0aGlzLm9yZGVuYW1pZW50b0FjdGl2bygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYXNpZ25hck9yZGVuKGNvbHVtbi5pZGVudGlmaWNhZG9yLCcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnNvcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UXVpdGFyIG9yZGVuYW1pZW50bzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYXNpZ25hck9yZGVuKGNvbHVtbi5pZGVudGlmaWNhZG9yLCdhc2MnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnRleHRfcm90YXRlX3VwPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk9yZGVuIGFzY2VuZGVudGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFzaWduYXJPcmRlbihjb2x1bW4uaWRlbnRpZmljYWRvciwnZGVzYycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+dGV4dF9yb3RhdGlvbl9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk9yZGVuIGRlc2NlbmRlbnRlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHRoaXMuZmlsdHJhckRhdG9zKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlci1kYXRhICNmaWx0cm8gW2ZpbHRyb3NDb2x1bW5hc109XCJjb2x1bW4uZmlsdGVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RvcFByb3BhZ2F0aW9uKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlckVuZCk9XCJjYW1iaW9GaWx0cm8obWVudVRyaWdnZXIsJGV2ZW50KVwiPjwvZmlsdGVyLWRhdGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYWNpw7NuIGRlIGlkZW50aWZpY2Fkb3JlcyBkZSB0YWJsYSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnRbY29sdW1uLmlkZW50aWZpY2Fkb3JdfX0gPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSBEZWZpbmljacOzbiBkZSBhY2Npb25lcyAgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2ZXJBY2Npb25lcygpXCIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiIHN0aWNreUVuZD5cclxuICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBhcmlhLWxhYmVsPVwicm93IGFjdGlvbnNcIj4mbmJzcDs8L3RoPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBEZWZpbmljacOzbiBkZSBhY2Npb25lcyBwb3IgZmlsYSAtLT5cclxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDb25maWd1cmFjacOzbiBkZSBib3RvbmVzIGRlIGFjY2nDs24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBkYXRhVGFibGUuYWNjaW9uZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uPy5lbWl0ZXI/LmVtaXQoe3RhcmdldDplbGVtZW50LHNvdXJjZTpkYXRhU291cmNlfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGVzaGFiaWxpdGFyQWNjaW9uKGFjdGlvbixlbGVtZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEljb25vIGRpbsOhbWljbyBkZSBsYSBhY2Npw7NuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW25nQ2xhc3NdPVwiZGVzaGFiaWxpdGFyQWNjaW9uKGFjdGlvbixlbGVtZW50KSA/ICdkaXNhYmxlZC1idXR0b24nIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YWN0aW9uLmljb25vIHx8ICdhcHBzJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSBEZWZpbmljacOzbiBkZSBjb2x1bW5hcyAtLT5cclxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5hczsgc3RpY2t5OnRydWVcIj48L3RyPlxyXG4gICAgICAgICAgICA8IS0tIEVzdGlsaXphZG9zIGFsdGVybmFkbyBkZSBmaWxhcyAtLT5cclxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbmFzO2xldCByb3dOdW0gPSBpbmRleFwiIFtjbGFzcy5vZGRdPVwicm93TnVtJTJcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmV2ZW5dPVwiIShyb3dOdW0lMilcIiAoY2xpY2spPVwib25Sb3dTZWxlY3Qocm93KVwiPjwvdHI+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBQYWdpbmFkb3IgZGUgZGF0b3MgLS0+XHJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInBhZ2luYXIgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiPlxyXG4gICAgICAgIDwhLS0gQ29uZmlndXJhY2nDs24gZGUgUGFnaW5hZG9yIC0tPlxyXG4gICAgICAgIDxtYXQtcGFnaW5hdG9yIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzUsMTAsMjAsNTAsMTAwXVwiIHNob3dGaXJzdExhc3RCdXR0b25zIGFyaWEtbGFiZWw9XCJTZWxlY2Npb25lIHVuYSBwYWdpbmFcIj5cclxuICAgICAgICA8L21hdC1wYWdpbmF0b3I+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
@@ -397,7 +397,7 @@ class RediTableComponent {
397
397
  });
398
398
  }
399
399
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediTableComponent, deps: [{ token: i1$1.CsvService }], target: i0.ɵɵFactoryTarget.Component }); }
400
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: RediTableComponent, isStandalone: true, selector: "redi-table", inputs: { seleccionarFilas: "seleccionarFilas", filtrarDatos: "filtrarDatos", paginar: "paginar", ordenarDatos: "ordenarDatos", dataTable: "dataTable" }, outputs: { onRowClick: "onRowClick" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "compoFiltro", first: true, predicate: ["filtro"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selecci\u00F3n -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selecci\u00F3n de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selecci\u00F3n -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definici\u00F3n de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creaci\u00F3n de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definici\u00F3n de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definici\u00F3n de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuraci\u00F3n de botones de acci\u00F3n -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono din\u00E1mico de la acci\u00F3n -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definici\u00F3n de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuraci\u00F3n de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".container{display:grid}tbody{box-shadow:#0000003d 0 3px 8px}.section{overflow:auto;background-color:#fff;max-height:90vh;border:1px solid #c5c7d1}table{width:100%;color:#676a6f;overflow:auto;padding:0;background-color:#f7f7f7}.odd{background-color:#f4f4f4;font-size:1.05em}.even{background-color:#fff}.odd,.even{height:2.5em;cursor:pointer}td.mat-cell{border:0px;color:#676a6f;font-size:1.05em}.odd:hover,.even:hover{background-color:#cddce9}th{font-size:1.2em}th button{display:none}th div{display:flex;align-items:center}th div div{display:inline-block}th div div:last-child{min-width:40px}th:hover button{display:inline-block;cursor:pointer}tr.mat-header-row{height:35px}input{min-width:250px;border:solid 2px #dadada;float:right;margin-bottom:8px;outline:0;padding-right:2em}mat-icon{color:#676a6f}.icon{float:right;margin-left:-3em;position:relative;margin-top:1px}.visible{display:contents}.hidden{display:none}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#ccc;width:6px}caption{display:none}.disabled-button{color:#cecece}::ng-deep .mat-sort-header-stem{height:8px}::ng-deep .mat-sort-header-arrow{color:#797979;margin:0 0 20px}.checkCol{max-width:72px;width:50px}.inputFilter{min-width:50px;width:100px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i9.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: FilterDataComponent, selector: "filter-data", inputs: ["filtrosColumnas"], outputs: ["filterEnd"] }] }); }
400
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: RediTableComponent, isStandalone: true, selector: "redi-table", inputs: { seleccionarFilas: "seleccionarFilas", filtrarDatos: "filtrarDatos", paginar: "paginar", ordenarDatos: "ordenarDatos", dataTable: "dataTable" }, outputs: { onRowClick: "onRowClick" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "compoFiltro", first: true, predicate: ["filtro"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selecci\u00F3n -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selecci\u00F3n de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selecci\u00F3n -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definici\u00F3n de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creaci\u00F3n de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definici\u00F3n de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definici\u00F3n de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuraci\u00F3n de botones de acci\u00F3n -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono din\u00E1mico de la acci\u00F3n -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definici\u00F3n de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuraci\u00F3n de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".container{display:grid}tbody{box-shadow:#0000003d 0 3px 8px}.section{overflow:auto;background-color:#fff;max-height:90vh;border:1px solid #c5c7d1}table{width:100%;color:#676a6f;overflow:auto;padding:0;background-color:#f7f7f7}.odd{background-color:#f4f4f4;font-size:1.05em}.even{background-color:#fff}.odd,.even{height:2.5em;cursor:pointer}td.mat-cell{border:0px;color:#676a6f;font-size:1.05em}.odd:hover,.even:hover{background-color:#cddce9}th{font-size:1.2em}th button{display:none}th div{display:flex;align-items:center}th div div{display:inline-block}th div div:last-child{min-width:40px;min-height:40px}th:hover button{display:inline-block;cursor:pointer}tr.mat-header-row{height:35px}input{min-width:250px;border:solid 2px #dadada;float:right;margin-bottom:8px;outline:0;padding-right:2em}mat-icon{color:#676a6f}.icon{float:right;margin-left:-3em;position:relative;margin-top:1px}.visible{display:contents}.hidden{display:none}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#ccc;width:6px}caption{display:none}.disabled-button{color:#cecece}::ng-deep .mat-sort-header-stem{height:8px}::ng-deep .mat-sort-header-arrow{color:#797979;margin:0 0 20px}.checkCol{max-width:72px;width:50px}.inputFilter{min-width:50px;width:100px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i9.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: FilterDataComponent, selector: "filter-data", inputs: ["filtrosColumnas"], outputs: ["filterEnd"] }] }); }
401
401
  }
402
402
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediTableComponent, decorators: [{
403
403
  type: Component,
@@ -414,7 +414,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
414
414
  MatCheckboxModule,
415
415
  MatButtonModule,
416
416
  FilterDataComponent
417
- ], template: "<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selecci\u00F3n -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selecci\u00F3n de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selecci\u00F3n -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definici\u00F3n de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creaci\u00F3n de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definici\u00F3n de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definici\u00F3n de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuraci\u00F3n de botones de acci\u00F3n -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono din\u00E1mico de la acci\u00F3n -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definici\u00F3n de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuraci\u00F3n de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".container{display:grid}tbody{box-shadow:#0000003d 0 3px 8px}.section{overflow:auto;background-color:#fff;max-height:90vh;border:1px solid #c5c7d1}table{width:100%;color:#676a6f;overflow:auto;padding:0;background-color:#f7f7f7}.odd{background-color:#f4f4f4;font-size:1.05em}.even{background-color:#fff}.odd,.even{height:2.5em;cursor:pointer}td.mat-cell{border:0px;color:#676a6f;font-size:1.05em}.odd:hover,.even:hover{background-color:#cddce9}th{font-size:1.2em}th button{display:none}th div{display:flex;align-items:center}th div div{display:inline-block}th div div:last-child{min-width:40px}th:hover button{display:inline-block;cursor:pointer}tr.mat-header-row{height:35px}input{min-width:250px;border:solid 2px #dadada;float:right;margin-bottom:8px;outline:0;padding-right:2em}mat-icon{color:#676a6f}.icon{float:right;margin-left:-3em;position:relative;margin-top:1px}.visible{display:contents}.hidden{display:none}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#ccc;width:6px}caption{display:none}.disabled-button{color:#cecece}::ng-deep .mat-sort-header-stem{height:8px}::ng-deep .mat-sort-header-arrow{color:#797979;margin:0 0 20px}.checkCol{max-width:72px;width:50px}.inputFilter{min-width:50px;width:100px}\n"] }]
417
+ ], template: "<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selecci\u00F3n -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selecci\u00F3n de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selecci\u00F3n -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definici\u00F3n de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creaci\u00F3n de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definici\u00F3n de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definici\u00F3n de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuraci\u00F3n de botones de acci\u00F3n -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono din\u00E1mico de la acci\u00F3n -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definici\u00F3n de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuraci\u00F3n de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".container{display:grid}tbody{box-shadow:#0000003d 0 3px 8px}.section{overflow:auto;background-color:#fff;max-height:90vh;border:1px solid #c5c7d1}table{width:100%;color:#676a6f;overflow:auto;padding:0;background-color:#f7f7f7}.odd{background-color:#f4f4f4;font-size:1.05em}.even{background-color:#fff}.odd,.even{height:2.5em;cursor:pointer}td.mat-cell{border:0px;color:#676a6f;font-size:1.05em}.odd:hover,.even:hover{background-color:#cddce9}th{font-size:1.2em}th button{display:none}th div{display:flex;align-items:center}th div div{display:inline-block}th div div:last-child{min-width:40px;min-height:40px}th:hover button{display:inline-block;cursor:pointer}tr.mat-header-row{height:35px}input{min-width:250px;border:solid 2px #dadada;float:right;margin-bottom:8px;outline:0;padding-right:2em}mat-icon{color:#676a6f}.icon{float:right;margin-left:-3em;position:relative;margin-top:1px}.visible{display:contents}.hidden{display:none}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#ccc;width:6px}caption{display:none}.disabled-button{color:#cecece}::ng-deep .mat-sort-header-stem{height:8px}::ng-deep .mat-sort-header-arrow{color:#797979;margin:0 0 20px}.checkCol{max-width:72px;width:50px}.inputFilter{min-width:50px;width:100px}\n"] }]
418
418
  }], ctorParameters: () => [{ type: i1$1.CsvService }], propDecorators: { seleccionarFilas: [{
419
419
  type: Input
420
420
  }], filtrarDatos: [{
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-redi-core-RediTable.mjs","sources":["../../../projects/ngx-redi-core/RediTable/src/components/filter-data/filter-data.component.ts","../../../projects/ngx-redi-core/RediTable/src/components/filter-data/filter-data.component.html","../../../projects/ngx-redi-core/RediTable/src/components/redi-table/redi-table.component.ts","../../../projects/ngx-redi-core/RediTable/src/components/redi-table/redi-table.component.html","../../../projects/ngx-redi-core/RediTable/public-api.ts","../../../projects/ngx-redi-core/RediTable/ngx-redi-core-RediTable.ts"],"sourcesContent":["import { AfterViewInit, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatListModule, MatListOption } from '@angular/material/list';\r\nimport { FilterItem } from '../../models/interfaces/filter-item';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\n\r\n@Component({\r\n selector: 'filter-data',\r\n standalone: true,\r\n imports: [\r\n MatFormFieldModule,\r\n FormsModule,\r\n MatInputModule,\r\n MatListModule\r\n ],\r\n templateUrl: './filter-data.component.html',\r\n styleUrl: './filter-data.component.css'\r\n})\r\nexport class FilterDataComponent implements AfterViewInit {\r\n\r\n @Input()\r\n public set filtrosColumnas(value: Array<FilterItem>) {\r\n this._refFiltro = value;\r\n this.filtros = [...value.map(f => { return { ...f } })];\r\n }\r\n\r\n public _refFiltro: Array<FilterItem>;\r\n public filtros: Array<FilterItem>;\r\n\r\n @ViewChild('mainControl')\r\n public allItemControl!: MatListOption\r\n\r\n @Output()\r\n public filterEnd: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n\r\n constructor() {\r\n this._refFiltro = [];\r\n this.filtros = [];\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.allItemControl) {\r\n setTimeout(() => {\r\n this.allItemControl.selected = this.isAllChecked(this.filtros);\r\n });\r\n }\r\n }\r\n\r\n\r\n public selectedChange() {\r\n if (this.allItemControl) {\r\n this.allItemControl.selected = this.isAllChecked(this.filtros);\r\n }\r\n }\r\n\r\n public setAllCheck(value: boolean) {\r\n this.filtros.map(f => f.isSelected = value)\r\n }\r\n\r\n\r\n public isAllChecked(filters: Array<FilterItem>) {\r\n return filters.every(f => f.isSelected);\r\n }\r\n\r\n public filter(event: KeyboardEvent) {\r\n let control = event.target as HTMLInputElement;\r\n if (control) {\r\n let value = control?.value ?? '';\r\n this.filtros.map(f => f.isVisible = value === '' ||\r\n f.name.trim().toLowerCase().indexOf(value.trim().toLowerCase()) !== -1);\r\n }\r\n }\r\n\r\n public aplicarFiltros() {\r\n this._refFiltro.map((d,i)=>{this._refFiltro[i].isSelected = this.filtros[i].isSelected});\r\n this.filterEnd.emit(true);\r\n }\r\n\r\n public cancelarFiltro() {\r\n this.filterEnd.emit();\r\n }\r\n\r\n public loadData(){\r\n this._refFiltro.map((d,i)=>{ this.filtros[i].isSelected =this._refFiltro[i].isSelected});\r\n }\r\n}\r\n","<mat-label>Filtro</mat-label>\r\n<div>\r\n <input #textFilter class=\"inputFilter\" (keyup)=\"filter($event)\" type=\"text\" placeholder=\"Buscar\" aria-label=\"Filtro\"\r\n matInput>\r\n</div>\r\n<mat-selection-list #elementos>\r\n <mat-list-option #mainControl (click)=\"setAllCheck(mainControl.selected)\"\r\n [disabled]=\"textFilter.value !== ''\">(Seleccionar todo)</mat-list-option>\r\n @for (filtro of filtros; track filtro) {\r\n @if(filtro.isVisible){\r\n <mat-list-option [(selected)]=\"filtro.isSelected\"\r\n (selectedChange)=\"selectedChange()\">{{filtro.name}}</mat-list-option>\r\n }\r\n }\r\n</mat-selection-list>\r\n<button mat-flat-button color=\"primary\" (click)=\"aplicarFiltros()\">Aceptar</button>\r\n<button mat-flat-button color=\"accent\" (click)=\"cancelarFiltro()\">Cancelar</button>","/** Librerías angular */\r\nimport { AfterViewInit, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSort, MatSortModule, SortDirection } from '@angular/material/sort';\r\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\n\r\n/** Modelo */\r\nimport { DataTable } from '../../models/interfaces/data-table';\r\nimport { ColumnDefinition } from '../../models/interfaces/column-definition';\r\nimport { CsvService } from 'ngx-redi-core/Helper';\r\nimport { RowAction } from '../../models/interfaces/row-action';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { FilterItem } from '../../models/interfaces/filter-item';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { FilterDataComponent } from '../filter-data/filter-data.component';\r\n\r\n/**\r\n * Componente que muestra los datos en una tabla\r\n * @decorators ´@Component´\r\n */\r\n@Component({\r\n selector: 'redi-table',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatTableModule,\r\n MatCheckboxModule,\r\n MatPaginatorModule,\r\n MatSortModule,\r\n MatMenuModule,\r\n\r\n MatDividerModule,\r\n MatTooltipModule,\r\n MatCheckboxModule,\r\n MatButtonModule,\r\n\r\n FilterDataComponent\r\n ],\r\n templateUrl: './redi-table.component.html',\r\n styleUrl: './redi-table.component.css'\r\n})\r\nexport class RediTableComponent<T extends object> implements OnInit, OnChanges {\r\n /**\r\n * Propiedad que indica si se pueden seleccionar las filas\r\n */\r\n @Input()\r\n public seleccionarFilas = true;\r\n\r\n /**\r\n * Propiedad que indica si se habilitan los filtros para la tabla\r\n */\r\n @Input()\r\n public filtrarDatos = true;\r\n\r\n /**\r\n * Propiedad que indica si se paginan los datos\r\n */\r\n @Input()\r\n public paginar = true;\r\n\r\n /**\r\n * Propiedad que indica si se habilita el ordenamiento de datos\r\n */\r\n @Input()\r\n public ordenarDatos = true;\r\n\r\n /**\r\n * Datos y configuración de la tabla\r\n */\r\n @Input()\r\n public dataTable: DataTable<T>;\r\n\r\n /**\r\n * Origen de datos para el MatTable\r\n */\r\n public dataSource: MatTableDataSource<T>;\r\n\r\n /**\r\n * Objeto de la vista para el ordenamiento\r\n */\r\n @ViewChild(MatSort) sort!: MatSort;\r\n\r\n /**\r\n * Objeto de la vista para la paginación\r\n */\r\n @ViewChild(MatPaginator) paginator!: MatPaginator;\r\n\r\n /**\r\n * Contiene las columnas que se mostraran en la tabla\r\n */\r\n public columnas: Array<string> = [];\r\n\r\n /**\r\n * Contiene los datos de las columnas\r\n */\r\n public datosColumna: Array<ColumnDefinition> = [];\r\n\r\n @ViewChild('filtro')\r\n public compoFiltro!: FilterDataComponent;\r\n\r\n /**\r\n * Crea un nuevo componente Tabla\r\n */\r\n constructor(private csv: CsvService) {\r\n this.dataTable = {\r\n dataSource: [] as Array<T>,\r\n acciones: [] as Array<RowAction<T>>\r\n } as DataTable<T>;\r\n this.dataSource = new MatTableDataSource();\r\n this.dataSource.data = [];\r\n }\r\n\r\n public closeMenu() {\r\n if (this.compoFiltro) {\r\n this.compoFiltro.loadData();\r\n }\r\n }\r\n\r\n /**\r\n * Eventos que se ejecutan al inicias\r\n */\r\n ngOnInit() {\r\n this.limpiarColumnas();\r\n if (this.dataTable) {\r\n this.dataSource = new MatTableDataSource(this.dataTable.dataSource);\r\n this.construiDatosColumna();\r\n this.mostrarColumnas();\r\n this.dataSource.filterPredicate = (f: T, u: string) => { return this.customParameter(f, u) };\r\n }\r\n this.inicializarPaginador();\r\n }\r\n\r\n /**\r\n * Construye los datos de las columnas para la tabla\r\n */\r\n private construiDatosColumna() {\r\n if (this.dataTable.columnas &&\r\n this.dataTable.columnas.length > 0) {\r\n this.datosColumna.push(...this.dataTable.columnas);\r\n }\r\n else {\r\n if (this.dataTable?.dataSource && this.dataTable.dataSource.length) {\r\n this.datosColumna.push(...Object.keys(this.dataTable.dataSource[0])\r\n .map(x => { return { identificador: x, etiqueta: x, filters: [] } as ColumnDefinition; }));\r\n this.generateFilterData(this.datosColumna);\r\n }\r\n }\r\n }\r\n\r\n private generateFilterData(columnas: Array<ColumnDefinition>) {\r\n let result = {};\r\n let keys = Object.keys(this.dataSource.data[0]);\r\n this.dataSource.filteredData.map((d: T) => {\r\n keys.map((k) => {\r\n let prop: Array<any> = Object.getOwnPropertyDescriptor(result, k)?.value ?? [];\r\n let value = Object.getOwnPropertyDescriptor(d, k)?.value;\r\n if (value && !prop.find(i => i.name == value)) {\r\n prop.push({ name: value, isSelected: true, isVisible: true } as FilterItem);\r\n }\r\n Object.defineProperty(result, k, { value: prop })\r\n });\r\n });\r\n\r\n columnas.map(c => {\r\n c.filters = Object.getOwnPropertyDescriptor(result, c.identificador)?.value;\r\n });\r\n }\r\n\r\n /**\r\n * Activa las columnas que se van a mostrar\r\n */\r\n private mostrarColumnas() {\r\n this.columnas.push(...this.datosColumna\r\n .map(item => { return item.identificador; }));\r\n if (this.dataTable?.acciones && this.verAcciones()) {\r\n this.columnas.push('actions');\r\n }\r\n this.dataSource.sort = this.sort;\r\n }\r\n\r\n /**\r\n * Método que ejecuta los cambios en la selección de filas\r\n * @param currentValue - Valor actual\r\n */\r\n private changeSelection(currentValue: boolean): void {\r\n if (currentValue) {\r\n this.columnas.unshift('select');\r\n this.dataTable.seleccion = this.dataTable.seleccion ?? new SelectionModel<T>(true, []);\r\n } else {\r\n const index = this.columnas.indexOf('select');\r\n if (index > -1) {\r\n this.columnas.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Método que valida los cambios en los datos de entrada\r\n * @param changer - Cambios realizados en la vista\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.actualizarSeleccion(changes);\r\n this.actualizarFiltro(changes);\r\n this.actualizarPaginacion(changes);\r\n this.actualizarDataTable(changes);\r\n }\r\n\r\n private actualizarSeleccion(cambios: SimpleChanges) {\r\n const changeSelectedRow = cambios['seleccionarFilas'];\r\n if (changeSelectedRow && this.dataTable) {\r\n this.changeSelection(changeSelectedRow.currentValue);\r\n }\r\n }\r\n\r\n private actualizarFiltro(cambios: SimpleChanges) {\r\n const changeFilter = cambios['filtrarDatos'];\r\n if (changeFilter && !changeFilter.currentValue) {\r\n this.dataSource.filter = '';\r\n this.reasignarPaginacion();\r\n }\r\n }\r\n\r\n private reasignarPaginacion() {\r\n if (this.paginar) {\r\n this.dataSource.paginator = this.paginator;\r\n }\r\n else {\r\n this.dataSource.paginator = null;\r\n }\r\n }\r\n\r\n private actualizarPaginacion(cambios: SimpleChanges) {\r\n const changePagination = cambios['paginar'];\r\n if (changePagination) {\r\n if (changePagination.currentValue) {\r\n this.dataSource.paginator = this.paginator;\r\n }\r\n else {\r\n this.dataSource.paginator = null;\r\n }\r\n }\r\n }\r\n private actualizarDataTable(cambios: SimpleChanges) {\r\n const datos = cambios['dataTable'];\r\n if (datos && datos.currentValue) {\r\n this.dataTable = datos.currentValue;\r\n this.ngOnInit();\r\n this.reasignarPaginacion();\r\n this.changeSelection(this.seleccionarFilas);\r\n this.dataTable.acciones = this.dataTable.acciones ?? [];\r\n }\r\n }\r\n\r\n /**\r\n * Método que aplica el filtro a los datos de la tabla\r\n * @param filtro - Evento de filtrado\r\n */\r\n public applyFilter(filtro: string) {\r\n this.dataSource.filter = filtro.trim().toLowerCase();\r\n if (this.dataSource.paginator) {\r\n this.dataSource.paginator.firstPage();\r\n }\r\n }\r\n\r\n private limpiarColumnas() {\r\n this.datosColumna.splice(0);\r\n this.columnas.splice(0);\r\n }\r\n\r\n /**\r\n * Método que indica si se debe mostrar la columna de acciones\r\n * @returns True si se debe mostrar las acciones\r\n */\r\n public verAcciones(): boolean {\r\n return this.dataTable && this.dataTable.acciones && this.dataTable.acciones.length > 0;\r\n }\r\n\r\n /**\r\n * Método que inicializa el Paginador\r\n */\r\n private inicializarPaginador() {\r\n if (this.paginator) {\r\n this.paginator._intl.itemsPerPageLabel = 'Elementos por pagina';\r\n this.paginator._intl.firstPageLabel = 'Primera pagina';\r\n this.paginator._intl.itemsPerPageLabel = 'Elementos por pagina';\r\n this.paginator._intl.lastPageLabel = 'Ultima pagina';\r\n this.paginator._intl.nextPageLabel = 'Siguiente pagina';\r\n this.paginator._intl.previousPageLabel = 'Pagina anterior';\r\n this.paginator._intl.getRangeLabel = (page: number, pageSize: number, length: number) => {\r\n return `Pagina:${page + 1} de ${pageSize <= length ? Math.ceil(length / pageSize) : 1}`;\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Indica si el ordenamiento esta activo\r\n */\r\n public ordenamientoActivo(): boolean {\r\n if (!this.ordenarDatos && this.sort) {\r\n this.sort.direction = '';\r\n }\r\n return this.ordenarDatos;\r\n }\r\n\r\n public asignarOrden(column: string, orden: SortDirection): void {\r\n if (this.sort) {\r\n this.sort.active = column;\r\n this.sort.direction = orden;\r\n this.dataSource.sort = this.sort;\r\n }\r\n }\r\n\r\n /** Alterna la selección de registros de la tabla */\r\n public alternarSeleccion() {\r\n if (this.todoSeleccionado()) {\r\n this.dataTable.seleccion.clear();\r\n return;\r\n }\r\n this.dataTable.seleccion.select(...this.dataSource.data);\r\n }\r\n\r\n /**\r\n * Indica si todo el contenido esta seleccionado\r\n * @returns True si todo el contenido esta seleccionado\r\n */\r\n public todoSeleccionado(): boolean {\r\n const numSelected = this.dataTable.seleccion.selected.length;\r\n const numRows = this.dataSource.data.length;\r\n return numSelected === numRows;\r\n }\r\n\r\n /**\r\n * Obtiene el estado de la etiqueta de seleccionado\r\n * @param fila - Fila que se validara\r\n * @returns Estado de selección en modo texto\r\n */\r\n public validarEtiqueta(fila?: any): string {\r\n if (!fila) {\r\n return `${this.todoSeleccionado() ? 'deselect' : 'select'} all`;\r\n }\r\n return `${this.dataTable.seleccion.isSelected(fila) ? 'deselect' : 'select'} row ${Number(fila.position) + 1}`;\r\n }\r\n\r\n\r\n public descargarCsv(archivo: string, soloSeleccionados?: boolean) {\r\n if (!soloSeleccionados) {\r\n this.csv.descargarCsv(archivo, this.dataTable.dataSource);\r\n }\r\n else {\r\n this.csv.descargarCsv(archivo, this.dataTable.seleccion.selected);\r\n }\r\n }\r\n\r\n public onRowSelect(event: T) {\r\n this.onRowClick.emit(event);\r\n }\r\n\r\n @Output()\r\n public onRowClick = new EventEmitter<T>();\r\n\r\n\r\n protected deshabilitarAccion(action: RowAction<T>, element: any) {\r\n if (action.deshabilitar) {\r\n return action.deshabilitar;\r\n }\r\n else if (action.desabilitarActionPorValores) {\r\n const valor = element[action.desabilitarActionPorValores.columnaRef];\r\n const valores = action.desabilitarActionPorValores.valoresADeshabilitar;\r\n\r\n if (valores.length === 0) {\r\n return false;\r\n } else {\r\n return valores.some(value => value === valor);\r\n }\r\n }\r\n return false\r\n }\r\n\r\n public stopPropagation(clickEvent: MouseEvent) {\r\n clickEvent.stopPropagation();\r\n clickEvent.preventDefault();\r\n }\r\n\r\n public cambioFiltro(menu: MatMenuTrigger, isChange: boolean) {\r\n menu.closeMenu();\r\n if (isChange) {\r\n this.dataSource.filter = Date.now().toString();\r\n }\r\n }\r\n\r\n public customParameter(data: T, filter: string) {\r\n return this.datosColumna.every(dc => {\r\n let value = (Object.getOwnPropertyDescriptor(data, dc.identificador)?.value?.toString() ?? '').trim().toLowerCase();\r\n let isAllSelected = dc.filters.every(f => f.isSelected);\r\n if (!isAllSelected) {\r\n return dc.filters.filter(f => f.isSelected).some(f => value.indexOf(f.name.toLowerCase()) !== -1)\r\n }\r\n return true;\r\n })\r\n }\r\n}\r\n","<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selección -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selección de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selección -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definición de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creación de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definición de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definición de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuración de botones de acción -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono dinámico de la acción -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definición de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuración de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>","/** Componentes */\r\nexport * from './src/components/redi-table/redi-table.component';\r\n\r\n/** Modelos */\r\nexport * from './src/models/interfaces/column-definition';\r\nexport * from './src/models/interfaces/data-table';\r\nexport * from './src/models/interfaces/row-action';\r\n// /** Tipos */\r\n// export * from './src/models/types/event-table.type';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-redi-core-RediTable.mjs","sources":["../../../projects/ngx-redi-core/RediTable/src/components/filter-data/filter-data.component.ts","../../../projects/ngx-redi-core/RediTable/src/components/filter-data/filter-data.component.html","../../../projects/ngx-redi-core/RediTable/src/components/redi-table/redi-table.component.ts","../../../projects/ngx-redi-core/RediTable/src/components/redi-table/redi-table.component.html","../../../projects/ngx-redi-core/RediTable/public-api.ts","../../../projects/ngx-redi-core/RediTable/ngx-redi-core-RediTable.ts"],"sourcesContent":["import { AfterViewInit, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatListModule, MatListOption } from '@angular/material/list';\r\nimport { FilterItem } from '../../models/interfaces/filter-item';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\n\r\n@Component({\r\n selector: 'filter-data',\r\n standalone: true,\r\n imports: [\r\n MatFormFieldModule,\r\n FormsModule,\r\n MatInputModule,\r\n MatListModule\r\n ],\r\n templateUrl: './filter-data.component.html',\r\n styleUrl: './filter-data.component.css'\r\n})\r\nexport class FilterDataComponent implements AfterViewInit {\r\n\r\n @Input()\r\n public set filtrosColumnas(value: Array<FilterItem>) {\r\n this._refFiltro = value;\r\n this.filtros = [...value.map(f => { return { ...f } })];\r\n }\r\n\r\n public _refFiltro: Array<FilterItem>;\r\n public filtros: Array<FilterItem>;\r\n\r\n @ViewChild('mainControl')\r\n public allItemControl!: MatListOption\r\n\r\n @Output()\r\n public filterEnd: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n\r\n constructor() {\r\n this._refFiltro = [];\r\n this.filtros = [];\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.allItemControl) {\r\n setTimeout(() => {\r\n this.allItemControl.selected = this.isAllChecked(this.filtros);\r\n });\r\n }\r\n }\r\n\r\n\r\n public selectedChange() {\r\n if (this.allItemControl) {\r\n this.allItemControl.selected = this.isAllChecked(this.filtros);\r\n }\r\n }\r\n\r\n public setAllCheck(value: boolean) {\r\n this.filtros.map(f => f.isSelected = value)\r\n }\r\n\r\n\r\n public isAllChecked(filters: Array<FilterItem>) {\r\n return filters.every(f => f.isSelected);\r\n }\r\n\r\n public filter(event: KeyboardEvent) {\r\n let control = event.target as HTMLInputElement;\r\n if (control) {\r\n let value = control?.value ?? '';\r\n this.filtros.map(f => f.isVisible = value === '' ||\r\n f.name.trim().toLowerCase().indexOf(value.trim().toLowerCase()) !== -1);\r\n }\r\n }\r\n\r\n public aplicarFiltros() {\r\n this._refFiltro.map((d,i)=>{this._refFiltro[i].isSelected = this.filtros[i].isSelected});\r\n this.filterEnd.emit(true);\r\n }\r\n\r\n public cancelarFiltro() {\r\n this.filterEnd.emit();\r\n }\r\n\r\n public loadData(){\r\n this._refFiltro.map((d,i)=>{ this.filtros[i].isSelected =this._refFiltro[i].isSelected});\r\n }\r\n}\r\n","<mat-label>Filtro</mat-label>\r\n<div>\r\n <input #textFilter class=\"inputFilter\" (keyup)=\"filter($event)\" type=\"text\" placeholder=\"Buscar\" aria-label=\"Filtro\"\r\n matInput>\r\n</div>\r\n<mat-selection-list #elementos>\r\n <mat-list-option #mainControl (click)=\"setAllCheck(mainControl.selected)\"\r\n [disabled]=\"textFilter.value !== ''\">(Seleccionar todo)</mat-list-option>\r\n @for (filtro of filtros; track filtro) {\r\n @if(filtro.isVisible){\r\n <mat-list-option [(selected)]=\"filtro.isSelected\"\r\n (selectedChange)=\"selectedChange()\">{{filtro.name}}</mat-list-option>\r\n }\r\n }\r\n</mat-selection-list>\r\n<button mat-flat-button color=\"primary\" (click)=\"aplicarFiltros()\">Aceptar</button>\r\n<button mat-flat-button color=\"accent\" (click)=\"cancelarFiltro()\">Cancelar</button>","/** Librerías angular */\r\nimport { AfterViewInit, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSort, MatSortModule, SortDirection } from '@angular/material/sort';\r\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\n\r\n/** Modelo */\r\nimport { DataTable } from '../../models/interfaces/data-table';\r\nimport { ColumnDefinition } from '../../models/interfaces/column-definition';\r\nimport { CsvService } from 'ngx-redi-core/Helper';\r\nimport { RowAction } from '../../models/interfaces/row-action';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { FilterItem } from '../../models/interfaces/filter-item';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { FilterDataComponent } from '../filter-data/filter-data.component';\r\n\r\n/**\r\n * Componente que muestra los datos en una tabla\r\n * @decorators ´@Component´\r\n */\r\n@Component({\r\n selector: 'redi-table',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatTableModule,\r\n MatCheckboxModule,\r\n MatPaginatorModule,\r\n MatSortModule,\r\n MatMenuModule,\r\n\r\n MatDividerModule,\r\n MatTooltipModule,\r\n MatCheckboxModule,\r\n MatButtonModule,\r\n\r\n FilterDataComponent\r\n ],\r\n templateUrl: './redi-table.component.html',\r\n styleUrl: './redi-table.component.css'\r\n})\r\nexport class RediTableComponent<T extends object> implements OnInit, OnChanges {\r\n /**\r\n * Propiedad que indica si se pueden seleccionar las filas\r\n */\r\n @Input()\r\n public seleccionarFilas = true;\r\n\r\n /**\r\n * Propiedad que indica si se habilitan los filtros para la tabla\r\n */\r\n @Input()\r\n public filtrarDatos = true;\r\n\r\n /**\r\n * Propiedad que indica si se paginan los datos\r\n */\r\n @Input()\r\n public paginar = true;\r\n\r\n /**\r\n * Propiedad que indica si se habilita el ordenamiento de datos\r\n */\r\n @Input()\r\n public ordenarDatos = true;\r\n\r\n /**\r\n * Datos y configuración de la tabla\r\n */\r\n @Input()\r\n public dataTable: DataTable<T>;\r\n\r\n /**\r\n * Origen de datos para el MatTable\r\n */\r\n public dataSource: MatTableDataSource<T>;\r\n\r\n /**\r\n * Objeto de la vista para el ordenamiento\r\n */\r\n @ViewChild(MatSort) sort!: MatSort;\r\n\r\n /**\r\n * Objeto de la vista para la paginación\r\n */\r\n @ViewChild(MatPaginator) paginator!: MatPaginator;\r\n\r\n /**\r\n * Contiene las columnas que se mostraran en la tabla\r\n */\r\n public columnas: Array<string> = [];\r\n\r\n /**\r\n * Contiene los datos de las columnas\r\n */\r\n public datosColumna: Array<ColumnDefinition> = [];\r\n\r\n @ViewChild('filtro')\r\n public compoFiltro!: FilterDataComponent;\r\n\r\n /**\r\n * Crea un nuevo componente Tabla\r\n */\r\n constructor(private csv: CsvService) {\r\n this.dataTable = {\r\n dataSource: [] as Array<T>,\r\n acciones: [] as Array<RowAction<T>>\r\n } as DataTable<T>;\r\n this.dataSource = new MatTableDataSource();\r\n this.dataSource.data = [];\r\n }\r\n\r\n public closeMenu() {\r\n if (this.compoFiltro) {\r\n this.compoFiltro.loadData();\r\n }\r\n }\r\n\r\n /**\r\n * Eventos que se ejecutan al inicias\r\n */\r\n ngOnInit() {\r\n this.limpiarColumnas();\r\n if (this.dataTable) {\r\n this.dataSource = new MatTableDataSource(this.dataTable.dataSource);\r\n this.construiDatosColumna();\r\n this.mostrarColumnas();\r\n this.dataSource.filterPredicate = (f: T, u: string) => { return this.customParameter(f, u) };\r\n }\r\n this.inicializarPaginador();\r\n }\r\n\r\n /**\r\n * Construye los datos de las columnas para la tabla\r\n */\r\n private construiDatosColumna() {\r\n if (this.dataTable.columnas &&\r\n this.dataTable.columnas.length > 0) {\r\n this.datosColumna.push(...this.dataTable.columnas);\r\n }\r\n else {\r\n if (this.dataTable?.dataSource && this.dataTable.dataSource.length) {\r\n this.datosColumna.push(...Object.keys(this.dataTable.dataSource[0])\r\n .map(x => { return { identificador: x, etiqueta: x, filters: [] } as ColumnDefinition; }));\r\n this.generateFilterData(this.datosColumna);\r\n }\r\n }\r\n }\r\n\r\n private generateFilterData(columnas: Array<ColumnDefinition>) {\r\n let result = {};\r\n let keys = Object.keys(this.dataSource.data[0]);\r\n this.dataSource.filteredData.map((d: T) => {\r\n keys.map((k) => {\r\n let prop: Array<any> = Object.getOwnPropertyDescriptor(result, k)?.value ?? [];\r\n let value = Object.getOwnPropertyDescriptor(d, k)?.value;\r\n if (value && !prop.find(i => i.name == value)) {\r\n prop.push({ name: value, isSelected: true, isVisible: true } as FilterItem);\r\n }\r\n Object.defineProperty(result, k, { value: prop })\r\n });\r\n });\r\n\r\n columnas.map(c => {\r\n c.filters = Object.getOwnPropertyDescriptor(result, c.identificador)?.value;\r\n });\r\n }\r\n\r\n /**\r\n * Activa las columnas que se van a mostrar\r\n */\r\n private mostrarColumnas() {\r\n this.columnas.push(...this.datosColumna\r\n .map(item => { return item.identificador; }));\r\n if (this.dataTable?.acciones && this.verAcciones()) {\r\n this.columnas.push('actions');\r\n }\r\n this.dataSource.sort = this.sort;\r\n }\r\n\r\n /**\r\n * Método que ejecuta los cambios en la selección de filas\r\n * @param currentValue - Valor actual\r\n */\r\n private changeSelection(currentValue: boolean): void {\r\n if (currentValue) {\r\n this.columnas.unshift('select');\r\n this.dataTable.seleccion = this.dataTable.seleccion ?? new SelectionModel<T>(true, []);\r\n } else {\r\n const index = this.columnas.indexOf('select');\r\n if (index > -1) {\r\n this.columnas.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Método que valida los cambios en los datos de entrada\r\n * @param changer - Cambios realizados en la vista\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.actualizarSeleccion(changes);\r\n this.actualizarFiltro(changes);\r\n this.actualizarPaginacion(changes);\r\n this.actualizarDataTable(changes);\r\n }\r\n\r\n private actualizarSeleccion(cambios: SimpleChanges) {\r\n const changeSelectedRow = cambios['seleccionarFilas'];\r\n if (changeSelectedRow && this.dataTable) {\r\n this.changeSelection(changeSelectedRow.currentValue);\r\n }\r\n }\r\n\r\n private actualizarFiltro(cambios: SimpleChanges) {\r\n const changeFilter = cambios['filtrarDatos'];\r\n if (changeFilter && !changeFilter.currentValue) {\r\n this.dataSource.filter = '';\r\n this.reasignarPaginacion();\r\n }\r\n }\r\n\r\n private reasignarPaginacion() {\r\n if (this.paginar) {\r\n this.dataSource.paginator = this.paginator;\r\n }\r\n else {\r\n this.dataSource.paginator = null;\r\n }\r\n }\r\n\r\n private actualizarPaginacion(cambios: SimpleChanges) {\r\n const changePagination = cambios['paginar'];\r\n if (changePagination) {\r\n if (changePagination.currentValue) {\r\n this.dataSource.paginator = this.paginator;\r\n }\r\n else {\r\n this.dataSource.paginator = null;\r\n }\r\n }\r\n }\r\n private actualizarDataTable(cambios: SimpleChanges) {\r\n const datos = cambios['dataTable'];\r\n if (datos && datos.currentValue) {\r\n this.dataTable = datos.currentValue;\r\n this.ngOnInit();\r\n this.reasignarPaginacion();\r\n this.changeSelection(this.seleccionarFilas);\r\n this.dataTable.acciones = this.dataTable.acciones ?? [];\r\n }\r\n }\r\n\r\n /**\r\n * Método que aplica el filtro a los datos de la tabla\r\n * @param filtro - Evento de filtrado\r\n */\r\n public applyFilter(filtro: string) {\r\n this.dataSource.filter = filtro.trim().toLowerCase();\r\n if (this.dataSource.paginator) {\r\n this.dataSource.paginator.firstPage();\r\n }\r\n }\r\n\r\n private limpiarColumnas() {\r\n this.datosColumna.splice(0);\r\n this.columnas.splice(0);\r\n }\r\n\r\n /**\r\n * Método que indica si se debe mostrar la columna de acciones\r\n * @returns True si se debe mostrar las acciones\r\n */\r\n public verAcciones(): boolean {\r\n return this.dataTable && this.dataTable.acciones && this.dataTable.acciones.length > 0;\r\n }\r\n\r\n /**\r\n * Método que inicializa el Paginador\r\n */\r\n private inicializarPaginador() {\r\n if (this.paginator) {\r\n this.paginator._intl.itemsPerPageLabel = 'Elementos por pagina';\r\n this.paginator._intl.firstPageLabel = 'Primera pagina';\r\n this.paginator._intl.itemsPerPageLabel = 'Elementos por pagina';\r\n this.paginator._intl.lastPageLabel = 'Ultima pagina';\r\n this.paginator._intl.nextPageLabel = 'Siguiente pagina';\r\n this.paginator._intl.previousPageLabel = 'Pagina anterior';\r\n this.paginator._intl.getRangeLabel = (page: number, pageSize: number, length: number) => {\r\n return `Pagina:${page + 1} de ${pageSize <= length ? Math.ceil(length / pageSize) : 1}`;\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Indica si el ordenamiento esta activo\r\n */\r\n public ordenamientoActivo(): boolean {\r\n if (!this.ordenarDatos && this.sort) {\r\n this.sort.direction = '';\r\n }\r\n return this.ordenarDatos;\r\n }\r\n\r\n public asignarOrden(column: string, orden: SortDirection): void {\r\n if (this.sort) {\r\n this.sort.active = column;\r\n this.sort.direction = orden;\r\n this.dataSource.sort = this.sort;\r\n }\r\n }\r\n\r\n /** Alterna la selección de registros de la tabla */\r\n public alternarSeleccion() {\r\n if (this.todoSeleccionado()) {\r\n this.dataTable.seleccion.clear();\r\n return;\r\n }\r\n this.dataTable.seleccion.select(...this.dataSource.data);\r\n }\r\n\r\n /**\r\n * Indica si todo el contenido esta seleccionado\r\n * @returns True si todo el contenido esta seleccionado\r\n */\r\n public todoSeleccionado(): boolean {\r\n const numSelected = this.dataTable.seleccion.selected.length;\r\n const numRows = this.dataSource.data.length;\r\n return numSelected === numRows;\r\n }\r\n\r\n /**\r\n * Obtiene el estado de la etiqueta de seleccionado\r\n * @param fila - Fila que se validara\r\n * @returns Estado de selección en modo texto\r\n */\r\n public validarEtiqueta(fila?: any): string {\r\n if (!fila) {\r\n return `${this.todoSeleccionado() ? 'deselect' : 'select'} all`;\r\n }\r\n return `${this.dataTable.seleccion.isSelected(fila) ? 'deselect' : 'select'} row ${Number(fila.position) + 1}`;\r\n }\r\n\r\n\r\n public descargarCsv(archivo: string, soloSeleccionados?: boolean) {\r\n if (!soloSeleccionados) {\r\n this.csv.descargarCsv(archivo, this.dataTable.dataSource);\r\n }\r\n else {\r\n this.csv.descargarCsv(archivo, this.dataTable.seleccion.selected);\r\n }\r\n }\r\n\r\n public onRowSelect(event: T) {\r\n this.onRowClick.emit(event);\r\n }\r\n\r\n @Output()\r\n public onRowClick = new EventEmitter<T>();\r\n\r\n\r\n protected deshabilitarAccion(action: RowAction<T>, element: any) {\r\n if (action.deshabilitar) {\r\n return action.deshabilitar;\r\n }\r\n else if (action.desabilitarActionPorValores) {\r\n const valor = element[action.desabilitarActionPorValores.columnaRef];\r\n const valores = action.desabilitarActionPorValores.valoresADeshabilitar;\r\n\r\n if (valores.length === 0) {\r\n return false;\r\n } else {\r\n return valores.some(value => value === valor);\r\n }\r\n }\r\n return false\r\n }\r\n\r\n public stopPropagation(clickEvent: MouseEvent) {\r\n clickEvent.stopPropagation();\r\n clickEvent.preventDefault();\r\n }\r\n\r\n public cambioFiltro(menu: MatMenuTrigger, isChange: boolean) {\r\n menu.closeMenu();\r\n if (isChange) {\r\n this.dataSource.filter = Date.now().toString();\r\n }\r\n }\r\n\r\n public customParameter(data: T, filter: string) {\r\n return this.datosColumna.every(dc => {\r\n let value = (Object.getOwnPropertyDescriptor(data, dc.identificador)?.value?.toString() ?? '').trim().toLowerCase();\r\n let isAllSelected = dc.filters.every(f => f.isSelected);\r\n if (!isAllSelected) {\r\n return dc.filters.filter(f => f.isSelected).some(f => value.indexOf(f.name.toLowerCase()) !== -1)\r\n }\r\n return true;\r\n })\r\n }\r\n}\r\n","<!-- Contenedor principal del componente -->\r\n<div class=\"container\">\r\n <!-- Filtro de datos para la tabla -->\r\n <div *ngIf=\"filtrarDatos\">\r\n <mat-icon class=\"icon\"> search </mat-icon>\r\n <input #filtroInput placeholder=\"Buscar\" (keyup)=\"applyFilter(filtroInput.value)\" />\r\n </div>\r\n <!-- Tabla de datos -->\r\n <div class=\"section\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n <caption> RediTableComponent </caption>\r\n <!-- Contenedor de selección -->\r\n <ng-container *ngIf=\"seleccionarFilas\" matColumnDef=\"select\">\r\n <!-- Encabezado de tabla con selección de registros -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <!-- controles de selección -->\r\n <mat-checkbox (change)=\"$event ? alternarSeleccion() : null\"\r\n [checked]=\"dataTable.seleccion.hasValue() && todoSeleccionado()\"\r\n [indeterminate]=\"dataTable.seleccion.hasValue() && !todoSeleccionado()\">\r\n </mat-checkbox>\r\n </th>\r\n <!-- Selector de fila -->\r\n <td mat-cell class=\"checkCol\" *matCellDef=\"let row\">\r\n <mat-checkbox (change)=\"$event ? dataTable.seleccion.toggle(row) : null\"\r\n [checked]=\"dataTable.seleccion.isSelected(row)\" [aria-label]=\"validarEtiqueta(row)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <!-- Ordenamiento de encabezados -->\r\n <ng-container>\r\n <ng-container [matColumnDef]=\"column.identificador\" *ngFor=\"let column of datosColumna\">\r\n <!-- Definición de encabezado por columna -->\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef>\r\n <div>\r\n <div>\r\n {{column.etiqueta ||\r\n column.identificador}}\r\n </div>\r\n <div>\r\n @if (this.ordenamientoActivo() || this.filtrarDatos) {\r\n <button #menuTrigger=\"matMenuTrigger\" (onMenuClose)=\"closeMenu()\" mat-icon-button\r\n [matMenuTriggerFor]=\"menu\" aria-label=\"Opciones\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n @if (this.ordenamientoActivo()) {\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'')\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Quitar ordenamiento</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'asc')\">\r\n <mat-icon>text_rotate_up</mat-icon>\r\n <span>Orden ascendente</span>\r\n </button>\r\n <button mat-menu-item (click)=\"asignarOrden(column.identificador,'desc')\">\r\n <mat-icon>text_rotation_down</mat-icon>\r\n <span>Orden descendente</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n }\r\n @if(this.filtrarDatos){\r\n <filter-data #filtro [filtrosColumnas]=\"column.filters\"\r\n (click)=\"stopPropagation($event)\"\r\n (filterEnd)=\"cambioFiltro(menuTrigger,$event)\"></filter-data>\r\n }\r\n </mat-menu>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n <!-- Creación de identificadores de tabla -->\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.identificador]}} </td>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Definición de acciones -->\r\n <ng-container *ngIf=\"verAcciones()\" matColumnDef=\"actions\" stickyEnd>\r\n <th scope=\"col\" mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\r\n <!-- Definición de acciones por fila -->\r\n <td mat-cell *matCellDef=\"let element\">\r\n <!-- Configuración de botones de acción -->\r\n <button mat-icon-button color=\"primary\" *ngFor=\"let action of dataTable.acciones\"\r\n (click)=\"action?.emiter?.emit({target:element,source:dataSource})\"\r\n [disabled]=\"deshabilitarAccion(action,element)\">\r\n <!-- Icono dinámico de la acción -->\r\n <mat-icon [ngClass]=\"deshabilitarAccion(action,element) ? 'disabled-button' : ''\">\r\n {{action.icono || 'apps'}}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <!-- Definición de columnas -->\r\n <tr mat-header-row *matHeaderRowDef=\"columnas; sticky:true\"></tr>\r\n <!-- Estilizados alternado de filas -->\r\n <tr mat-row *matRowDef=\"let row; columns: columnas;let rowNum = index\" [class.odd]=\"rowNum%2\"\r\n [class.even]=\"!(rowNum%2)\" (click)=\"onRowSelect(row)\"></tr>\r\n </table>\r\n </div>\r\n <!-- Paginador de datos -->\r\n <div [ngClass]=\"paginar ? 'visible' : 'hidden'\">\r\n <!-- Configuración de Paginador -->\r\n <mat-paginator [pageSizeOptions]=\"[5,10,20,50,100]\" showFirstLastButtons aria-label=\"Seleccione una pagina\">\r\n </mat-paginator>\r\n </div>\r\n</div>","/** Componentes */\r\nexport * from './src/components/redi-table/redi-table.component';\r\n\r\n/** Modelos */\r\nexport * from './src/models/interfaces/column-definition';\r\nexport * from './src/models/interfaces/data-table';\r\nexport * from './src/models/interfaces/row-action';\r\n// /** Tipos */\r\n// export * from './src/models/types/event-table.type';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-redi-core",
3
- "version": "18.0.13",
3
+ "version": "18.0.14",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^18.0.0",
6
6
  "@angular/core": "^18.0.0",