ngx-redi-core 18.0.2 → 18.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/Helper/index.d.ts +5 -0
  2. package/Helper/public-api.d.ts +1 -0
  3. package/Helper/src/helpers/csv.service.d.ts +33 -0
  4. package/RediTable/index.d.ts +5 -0
  5. package/RediTable/{public-api.ts → public-api.d.ts} +6 -9
  6. package/RediTable/src/components/filter-data/filter-data.component.d.ts +22 -0
  7. package/RediTable/src/components/redi-table/redi-table.component.d.ts +136 -0
  8. package/RediTable/src/models/interfaces/{column-definition.ts → column-definition.d.ts} +15 -18
  9. package/RediTable/src/models/interfaces/{data-table.ts → data-table.d.ts} +24 -28
  10. package/RediTable/src/models/interfaces/filter-item.d.ts +5 -0
  11. package/RediTable/src/models/interfaces/{row-action.ts → row-action.d.ts} +24 -32
  12. package/RediTable/src/models/types/event-table.type.d.ts +5 -0
  13. package/esm2022/Helper/ngx-redi-core-Helper.mjs +5 -0
  14. package/esm2022/Helper/public-api.mjs +2 -0
  15. package/esm2022/Helper/src/helpers/csv.service.mjs +69 -0
  16. package/esm2022/RediTable/ngx-redi-core-RediTable.mjs +5 -0
  17. package/esm2022/RediTable/public-api.mjs +9 -0
  18. package/esm2022/RediTable/src/components/filter-data/filter-data.component.mjs +75 -0
  19. package/esm2022/RediTable/src/components/redi-table/redi-table.component.mjs +367 -0
  20. package/esm2022/RediTable/src/models/interfaces/column-definition.mjs +2 -0
  21. package/esm2022/RediTable/src/models/interfaces/data-table.mjs +2 -0
  22. package/esm2022/RediTable/src/models/interfaces/filter-item.mjs +2 -0
  23. package/esm2022/RediTable/src/models/interfaces/row-action.mjs +2 -0
  24. package/esm2022/RediTable/src/models/types/event-table.type.mjs +2 -0
  25. package/esm2022/ngx-redi-core.mjs +5 -0
  26. package/esm2022/public-api.mjs +8 -0
  27. package/fesm2022/ngx-redi-core-Helper.mjs +76 -0
  28. package/fesm2022/ngx-redi-core-Helper.mjs.map +1 -0
  29. package/fesm2022/ngx-redi-core-RediTable.mjs +450 -0
  30. package/fesm2022/ngx-redi-core-RediTable.mjs.map +1 -0
  31. package/fesm2022/ngx-redi-core.mjs +14 -0
  32. package/fesm2022/ngx-redi-core.mjs.map +1 -0
  33. package/index.d.ts +5 -0
  34. package/package.json +37 -12
  35. package/public-api.d.ts +4 -0
  36. package/Helper/index.ts +0 -2
  37. package/Helper/ng-package.json +0 -6
  38. package/Helper/public-api.ts +0 -1
  39. package/Helper/src/helpers/csv.service.spec.ts +0 -16
  40. package/Helper/src/helpers/csv.service.ts +0 -67
  41. package/RediTable/index.ts +0 -2
  42. package/RediTable/ng-package.json +0 -6
  43. package/RediTable/src/components/filter-data/filter-data.component.css +0 -26
  44. package/RediTable/src/components/filter-data/filter-data.component.html +0 -17
  45. package/RediTable/src/components/filter-data/filter-data.component.spec.ts +0 -23
  46. package/RediTable/src/components/filter-data/filter-data.component.ts +0 -88
  47. package/RediTable/src/components/redi-table/redi-table.component.css +0 -133
  48. package/RediTable/src/components/redi-table/redi-table.component.html +0 -95
  49. package/RediTable/src/components/redi-table/redi-table.component.spec.ts +0 -23
  50. package/RediTable/src/components/redi-table/redi-table.component.ts +0 -408
  51. package/RediTable/src/models/interfaces/filter-item.ts +0 -5
  52. package/RediTable/src/models/types/event-table.type.spec.ts +0 -7
  53. package/RediTable/src/models/types/event-table.type.ts +0 -3
  54. package/ng-package.json +0 -7
  55. package/public-api.ts +0 -8
  56. package/tsconfig.lib.json +0 -14
  57. package/tsconfig.lib.prod.json +0 -10
  58. package/tsconfig.spec.json +0 -14
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="ngx-redi-core/Helper" />
5
+ export * from './public-api';
@@ -0,0 +1 @@
1
+ export * from './src/helpers/csv.service';
@@ -0,0 +1,33 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Servicio que provee métodos para trabajar con datos CSV
4
+ */
5
+ export declare class CsvService {
6
+ /**
7
+ * Genera el texto CSV a partir de un archivo
8
+ * @param data- Datos a construir
9
+ * @returns CSV texto
10
+ */
11
+ generarCsv<T extends {}>(data: Array<T>): string;
12
+ /**
13
+ * Método que indica si la propiedad es serializable
14
+ * @param propiedad - Propiedad a validar
15
+ * @returns True si es una propiedad serializable
16
+ */
17
+ private tipoSerializable;
18
+ /**
19
+ * Descarga el CSV a partir de los datos establecidos
20
+ * @param archivo - Nombre del archivo a descargar
21
+ * @param data - Arreglo de datos a descargar
22
+ */
23
+ descargarCsv<T extends {}>(archivo: string, data: Array<T>): void;
24
+ /**
25
+ * Genera el link para el blob y archivo establecidos
26
+ * @param archivo - Nombre del archivo a descargar
27
+ * @param blob - Contenido del blob
28
+ * @returns link
29
+ */
30
+ private generarLink;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<CsvService, never>;
32
+ static ɵprov: i0.ɵɵInjectableDeclaration<CsvService>;
33
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="ngx-redi-core/RediTable" />
5
+ export * from './public-api';
@@ -1,9 +1,6 @@
1
- /** Componentes */
2
- export * from './src/components/redi-table/redi-table.component';
3
-
4
- /** Modelos */
5
- export * from './src/models/interfaces/column-definition';
6
- export * from './src/models/interfaces/data-table';
7
- export * from './src/models/interfaces/row-action';
8
- // /** Tipos */
9
- // export * from './src/models/types/event-table.type';
1
+ /** Componentes */
2
+ export * from './src/components/redi-table/redi-table.component';
3
+ /** Modelos */
4
+ export * from './src/models/interfaces/column-definition';
5
+ export * from './src/models/interfaces/data-table';
6
+ export * from './src/models/interfaces/row-action';
@@ -0,0 +1,22 @@
1
+ import { AfterViewInit, EventEmitter } from '@angular/core';
2
+ import { MatListOption } from '@angular/material/list';
3
+ import { FilterItem } from '../../models/interfaces/filter-item';
4
+ import * as i0 from "@angular/core";
5
+ export declare class FilterDataComponent implements AfterViewInit {
6
+ set filtrosColumnas(value: Array<FilterItem>);
7
+ _refFiltro: Array<FilterItem>;
8
+ filtros: Array<FilterItem>;
9
+ allItemControl: MatListOption;
10
+ filterEnd: EventEmitter<boolean>;
11
+ constructor();
12
+ ngAfterViewInit(): void;
13
+ selectedChange(): void;
14
+ setAllCheck(value: boolean): void;
15
+ isAllChecked(filters: Array<FilterItem>): boolean;
16
+ filter(event: KeyboardEvent): void;
17
+ aplicarFiltros(): void;
18
+ cancelarFiltro(): void;
19
+ loadData(): void;
20
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilterDataComponent, never>;
21
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilterDataComponent, "filter-data", never, { "filtrosColumnas": { "alias": "filtrosColumnas"; "required": false; }; }, { "filterEnd": "filterEnd"; }, never, never, true, never>;
22
+ }
@@ -0,0 +1,136 @@
1
+ /** Librerías angular */
2
+ import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
3
+ import { MatPaginator } from '@angular/material/paginator';
4
+ import { MatSort, SortDirection } from '@angular/material/sort';
5
+ import { MatTableDataSource } from '@angular/material/table';
6
+ /** Modelo */
7
+ import { DataTable } from '../../models/interfaces/data-table';
8
+ import { ColumnDefinition } from '../../models/interfaces/column-definition';
9
+ import { CsvService } from 'ngx-redi-core/Helper';
10
+ import { RowAction } from '../../models/interfaces/row-action';
11
+ import { MatMenuTrigger } from '@angular/material/menu';
12
+ import { FilterDataComponent } from '../filter-data/filter-data.component';
13
+ import * as i0 from "@angular/core";
14
+ /**
15
+ * Componente que muestra los datos en una tabla
16
+ * @decorators ´@Component´
17
+ */
18
+ export declare class RediTableComponent<T extends object> implements OnInit, OnChanges {
19
+ private csv;
20
+ /**
21
+ * Propiedad que indica si se pueden seleccionar las filas
22
+ */
23
+ seleccionarFilas: boolean;
24
+ /**
25
+ * Propiedad que indica si se habilitan los filtros para la tabla
26
+ */
27
+ filtrarDatos: boolean;
28
+ /**
29
+ * Propiedad que indica si se paginan los datos
30
+ */
31
+ paginar: boolean;
32
+ /**
33
+ * Propiedad que indica si se habilita el ordenamiento de datos
34
+ */
35
+ ordenarDatos: boolean;
36
+ /**
37
+ * Datos y configuración de la tabla
38
+ */
39
+ dataTable: DataTable<T>;
40
+ /**
41
+ * Origen de datos para el MatTable
42
+ */
43
+ dataSource: MatTableDataSource<T>;
44
+ /**
45
+ * Objeto de la vista para el ordenamiento
46
+ */
47
+ sort: MatSort;
48
+ /**
49
+ * Objeto de la vista para la paginación
50
+ */
51
+ paginator: MatPaginator;
52
+ /**
53
+ * Contiene las columnas que se mostraran en la tabla
54
+ */
55
+ columnas: Array<string>;
56
+ /**
57
+ * Contiene los datos de las columnas
58
+ */
59
+ datosColumna: Array<ColumnDefinition>;
60
+ compoFiltro: FilterDataComponent;
61
+ /**
62
+ * Crea un nuevo componente Tabla
63
+ */
64
+ constructor(csv: CsvService);
65
+ closeMenu(): void;
66
+ /**
67
+ * Eventos que se ejecutan al inicias
68
+ */
69
+ ngOnInit(): void;
70
+ /**
71
+ * Construye los datos de las columnas para la tabla
72
+ */
73
+ private construiDatosColumna;
74
+ private generateFilterData;
75
+ /**
76
+ * Activa las columnas que se van a mostrar
77
+ */
78
+ private mostrarColumnas;
79
+ /**
80
+ * Método que ejecuta los cambios en la selección de filas
81
+ * @param currentValue - Valor actual
82
+ */
83
+ private changeSelection;
84
+ /**
85
+ * Método que valida los cambios en los datos de entrada
86
+ * @param changer - Cambios realizados en la vista
87
+ */
88
+ ngOnChanges(changes: SimpleChanges): void;
89
+ private actualizarSeleccion;
90
+ private actualizarFiltro;
91
+ private reasignarPaginacion;
92
+ private actualizarPaginacion;
93
+ private actualizarDataTable;
94
+ /**
95
+ * Método que aplica el filtro a los datos de la tabla
96
+ * @param filtro - Evento de filtrado
97
+ */
98
+ applyFilter(filtro: string): void;
99
+ private limpiarColumnas;
100
+ /**
101
+ * Método que indica si se debe mostrar la columna de acciones
102
+ * @returns True si se debe mostrar las acciones
103
+ */
104
+ verAcciones(): boolean;
105
+ /**
106
+ * Método que inicializa el Paginador
107
+ */
108
+ private inicializarPaginador;
109
+ /**
110
+ * Indica si el ordenamiento esta activo
111
+ */
112
+ ordenamientoActivo(): boolean;
113
+ asignarOrden(column: string, orden: SortDirection): void;
114
+ /** Alterna la selección de registros de la tabla */
115
+ alternarSeleccion(): void;
116
+ /**
117
+ * Indica si todo el contenido esta seleccionado
118
+ * @returns True si todo el contenido esta seleccionado
119
+ */
120
+ todoSeleccionado(): boolean;
121
+ /**
122
+ * Obtiene el estado de la etiqueta de seleccionado
123
+ * @param fila - Fila que se validara
124
+ * @returns Estado de selección en modo texto
125
+ */
126
+ validarEtiqueta(fila?: any): string;
127
+ descargarCsv(archivo: string, soloSeleccionados?: boolean): void;
128
+ onRowSelect(event: T): void;
129
+ onRowClick: EventEmitter<T>;
130
+ protected deshabilitarAccion(action: RowAction<T>, element: any): boolean;
131
+ stopPropagation(clickEvent: MouseEvent): void;
132
+ cambioFiltro(menu: MatMenuTrigger, isChange: boolean): void;
133
+ customParameter(data: T, filter: string): boolean;
134
+ static ɵfac: i0.ɵɵFactoryDeclaration<RediTableComponent<any>, never>;
135
+ static ɵcmp: i0.ɵɵComponentDeclaration<RediTableComponent<any>, "redi-table", never, { "seleccionarFilas": { "alias": "seleccionarFilas"; "required": false; }; "filtrarDatos": { "alias": "filtrarDatos"; "required": false; }; "paginar": { "alias": "paginar"; "required": false; }; "ordenarDatos": { "alias": "ordenarDatos"; "required": false; }; "dataTable": { "alias": "dataTable"; "required": false; }; }, { "onRowClick": "onRowClick"; }, never, never, true, never>;
136
+ }
@@ -1,18 +1,15 @@
1
- import { FilterItem } from "./filter-item";
2
-
3
- /**
4
- * Interface que define una columna
5
- */
6
- export interface ColumnDefinition {
7
- /**
8
- Contiene la etiqueta para la columna
9
- */
10
- etiqueta: string;
11
-
12
- /**
13
- * Contiene el identificador de la columna
14
- */
15
- identificador: string;
16
-
17
- filters: Array<FilterItem>
18
- }
1
+ import { FilterItem } from "./filter-item";
2
+ /**
3
+ * Interface que define una columna
4
+ */
5
+ export interface ColumnDefinition {
6
+ /**
7
+ Contiene la etiqueta para la columna
8
+ */
9
+ etiqueta: string;
10
+ /**
11
+ * Contiene el identificador de la columna
12
+ */
13
+ identificador: string;
14
+ filters: Array<FilterItem>;
15
+ }
@@ -1,28 +1,24 @@
1
- import { ColumnDefinition } from './column-definition';
2
- import { RowAction } from './row-action';
3
- import { SelectionModel } from '@angular/cdk/collections';
4
-
5
- /**
6
- * Interfaz que define la estructura de configuración y datos para una tabla
7
- */
8
- export interface DataTable<T> {
9
- /**
10
- * Contiene el arreglo con los datos
11
- */
12
- dataSource: Array<T>;
13
-
14
- /**
15
- * Contiene la definición de las columnas que se mostraran en la tabla
16
- */
17
- columnas: Array<ColumnDefinition>;
18
-
19
- /**
20
- * Contiene las acciones a realizar para los datos de la tabla
21
- */
22
- acciones: Array<RowAction<T>>;
23
-
24
- /**
25
- * Contiene los elementos seleccionados
26
- */
27
- seleccion: SelectionModel<T>;
28
- }
1
+ import { ColumnDefinition } from './column-definition';
2
+ import { RowAction } from './row-action';
3
+ import { SelectionModel } from '@angular/cdk/collections';
4
+ /**
5
+ * Interfaz que define la estructura de configuración y datos para una tabla
6
+ */
7
+ export interface DataTable<T> {
8
+ /**
9
+ * Contiene el arreglo con los datos
10
+ */
11
+ dataSource: Array<T>;
12
+ /**
13
+ * Contiene la definición de las columnas que se mostraran en la tabla
14
+ */
15
+ columnas: Array<ColumnDefinition>;
16
+ /**
17
+ * Contiene las acciones a realizar para los datos de la tabla
18
+ */
19
+ acciones: Array<RowAction<T>>;
20
+ /**
21
+ * Contiene los elementos seleccionados
22
+ */
23
+ seleccion: SelectionModel<T>;
24
+ }
@@ -0,0 +1,5 @@
1
+ export interface FilterItem {
2
+ name: string;
3
+ isSelected: boolean;
4
+ isVisible: boolean;
5
+ }
@@ -1,32 +1,24 @@
1
- import { EventEmitter } from '@angular/core';
2
- import { eventTable } from '../types/event-table.type';
3
-
4
- /**
5
- * Interface que define una acción en el row
6
- */
7
- export interface RowAction<T> {
8
- /**
9
- * Contiene el icono para la acción
10
- */
11
- icono: string;
12
-
13
- /**
14
- * Contiene la función o acción a realizar con los datos
15
- */
16
- //accion: fnRowAction<T>;
17
-
18
- /**
19
- * Emitter
20
- */
21
- emiter: EventEmitter<eventTable<T>>;
22
-
23
- deshabilitar?: boolean;
24
-
25
- desabilitarActionPorValores?: DeshabilitaAction;
26
- }
27
-
28
- export interface DeshabilitaAction {
29
- columnaRef: string;
30
- valoresADeshabilitar: Array<string>;
31
- }
32
-
1
+ import { EventEmitter } from '@angular/core';
2
+ import { eventTable } from '../types/event-table.type';
3
+ /**
4
+ * Interface que define una acción en el row
5
+ */
6
+ export interface RowAction<T> {
7
+ /**
8
+ * Contiene el icono para la acción
9
+ */
10
+ icono: string;
11
+ /**
12
+ * Contiene la función o acción a realizar con los datos
13
+ */
14
+ /**
15
+ * Emitter
16
+ */
17
+ emiter: EventEmitter<eventTable<T>>;
18
+ deshabilitar?: boolean;
19
+ desabilitarActionPorValores?: DeshabilitaAction;
20
+ }
21
+ export interface DeshabilitaAction {
22
+ columnaRef: string;
23
+ valoresADeshabilitar: Array<string>;
24
+ }
@@ -0,0 +1,5 @@
1
+ import { MatTableDataSource } from "@angular/material/table";
2
+ export type eventTable<T> = {
3
+ target: T;
4
+ source: MatTableDataSource<T>;
5
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJlZGktY29yZS1IZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVkaS1jb3JlL0hlbHBlci9uZ3gtcmVkaS1jb3JlLUhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,2 @@
1
+ export * from './src/helpers/csv.service';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWRpLWNvcmUvSGVscGVyL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc3JjL2hlbHBlcnMvY3N2LnNlcnZpY2UnOyJdfQ==
@@ -0,0 +1,69 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Servicio que provee métodos para trabajar con datos CSV
5
+ */
6
+ export class CsvService {
7
+ /**
8
+ * Genera el texto CSV a partir de un archivo
9
+ * @param data- Datos a construir
10
+ * @returns CSV texto
11
+ */
12
+ generarCsv(data) {
13
+ const datos = data.map(d => {
14
+ return Object.values(d)
15
+ .filter(p => this.tipoSerializable(p))
16
+ .map(v => v.includes(',') ? `"${v}"` : v);
17
+ });
18
+ return datos.map(d => { return Object.values(d).join(','); }).join('\n');
19
+ }
20
+ /**
21
+ * Método que indica si la propiedad es serializable
22
+ * @param propiedad - Propiedad a validar
23
+ * @returns True si es una propiedad serializable
24
+ */
25
+ tipoSerializable(propiedad) {
26
+ return typeof (propiedad) !== 'object' &&
27
+ typeof (propiedad) !== 'function';
28
+ }
29
+ /**
30
+ * Descarga el CSV a partir de los datos establecidos
31
+ * @param archivo - Nombre del archivo a descargar
32
+ * @param data - Arreglo de datos a descargar
33
+ */
34
+ descargarCsv(archivo, data) {
35
+ const blob = new Blob([BOM_CSV, this.generarCsv(data)], { type: TYPE_CSV });
36
+ const link = this.generarLink(archivo, blob);
37
+ document.body.appendChild(link);
38
+ link.click();
39
+ document.body.removeChild(link);
40
+ }
41
+ /**
42
+ * Genera el link para el blob y archivo establecidos
43
+ * @param archivo - Nombre del archivo a descargar
44
+ * @param blob - Contenido del blob
45
+ * @returns link
46
+ */
47
+ generarLink(archivo, blob) {
48
+ const link = document.createElement('a');
49
+ if (link.download !== undefined) {
50
+ link.setAttribute('href', URL.createObjectURL(blob));
51
+ link.setAttribute('download', archivo);
52
+ link.style.visibility = 'hidden';
53
+ }
54
+ return link;
55
+ }
56
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CsvService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
57
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CsvService, providedIn: 'root' }); }
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CsvService, decorators: [{
60
+ type: Injectable,
61
+ args: [{
62
+ providedIn: 'root'
63
+ }]
64
+ }] });
65
+ /** Tipo MIME CSV + Encode */
66
+ const TYPE_CSV = 'text/csv;charset=utf-8;';
67
+ /** BOM CSV */
68
+ const BOM_CSV = new Uint8Array([0xEF, 0xBB, 0xBF]);
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVkaS1jb3JlL0hlbHBlci9zcmMvaGVscGVycy9jc3Yuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUMzQzs7R0FFRztBQUlILE1BQU0sT0FBTyxVQUFVO0lBQ3JCOzs7O1NBSUs7SUFDRSxVQUFVLENBQWUsSUFBYztRQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQ3BCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQUMsU0FBa0I7UUFDekMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssUUFBUTtZQUNwQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssVUFBVSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFlLE9BQWUsRUFBRSxJQUFjO1FBQy9ELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLFdBQVcsQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUM3QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBc0IsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzhHQXBEVSxVQUFVO2tIQUFWLFVBQVUsY0FGVCxNQUFNOzsyRkFFUCxVQUFVO2tCQUh0QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUF5REQsNkJBQTZCO0FBQzdCLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDO0FBQzNDLGNBQWM7QUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuLyoqXHJcbiAqIFNlcnZpY2lvIHF1ZSBwcm92ZWUgbcOpdG9kb3MgcGFyYSB0cmFiYWphciBjb24gZGF0b3MgQ1NWXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDc3ZTZXJ2aWNlIHtcclxuICAvKipcclxuICAgICAqIEdlbmVyYSBlbCB0ZXh0byBDU1YgYSBwYXJ0aXIgZGUgdW4gYXJjaGl2b1xyXG4gICAgICogQHBhcmFtIGRhdGEtIERhdG9zIGEgY29uc3RydWlyXHJcbiAgICAgKiBAcmV0dXJucyBDU1YgdGV4dG9cclxuICAgICAqL1xyXG4gIHB1YmxpYyBnZW5lcmFyQ3N2PFQgZXh0ZW5kcyB7fT4oZGF0YTogQXJyYXk8VD4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGF0b3MgPSBkYXRhLm1hcChkID0+IHtcclxuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZClcclxuICAgICAgICAuZmlsdGVyKHAgPT4gdGhpcy50aXBvU2VyaWFsaXphYmxlKHApKVxyXG4gICAgICAgIC5tYXAodiA9PiAodiBhcyBzdHJpbmcpLmluY2x1ZGVzKCcsJykgPyBgXCIke3Z9XCJgIDogdik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkYXRvcy5tYXAoZCA9PiB7IHJldHVybiBPYmplY3QudmFsdWVzKGQpLmpvaW4oJywnKTsgfSkuam9pbignXFxuJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNw6l0b2RvIHF1ZSBpbmRpY2Egc2kgbGEgcHJvcGllZGFkIGVzIHNlcmlhbGl6YWJsZVxyXG4gICAqIEBwYXJhbSBwcm9waWVkYWQgLSBQcm9waWVkYWQgYSB2YWxpZGFyXHJcbiAgICogQHJldHVybnMgVHJ1ZSBzaSBlcyB1bmEgcHJvcGllZGFkIHNlcmlhbGl6YWJsZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdGlwb1NlcmlhbGl6YWJsZShwcm9waWVkYWQ6IHVua25vd24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0eXBlb2YgKHByb3BpZWRhZCkgIT09ICdvYmplY3QnICYmXHJcbiAgICAgIHR5cGVvZiAocHJvcGllZGFkKSAhPT0gJ2Z1bmN0aW9uJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc2NhcmdhIGVsIENTViBhIHBhcnRpciBkZSBsb3MgZGF0b3MgZXN0YWJsZWNpZG9zXHJcbiAgICogQHBhcmFtIGFyY2hpdm8gLSBOb21icmUgZGVsIGFyY2hpdm8gYSBkZXNjYXJnYXJcclxuICAgKiBAcGFyYW0gZGF0YSAtIEFycmVnbG8gZGUgZGF0b3MgYSBkZXNjYXJnYXJcclxuICAgKi9cclxuICBwdWJsaWMgZGVzY2FyZ2FyQ3N2PFQgZXh0ZW5kcyB7fT4oYXJjaGl2bzogc3RyaW5nLCBkYXRhOiBBcnJheTxUPik6IHZvaWQge1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtCT01fQ1NWLCB0aGlzLmdlbmVyYXJDc3YoZGF0YSldLCB7IHR5cGU6IFRZUEVfQ1NWIH0pO1xyXG4gICAgY29uc3QgbGluayA9IHRoaXMuZ2VuZXJhckxpbmsoYXJjaGl2bywgYmxvYik7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYSBlbCBsaW5rIHBhcmEgZWwgYmxvYiB5IGFyY2hpdm8gZXN0YWJsZWNpZG9zXHJcbiAgICogQHBhcmFtIGFyY2hpdm8gLSBOb21icmUgZGVsIGFyY2hpdm8gYSBkZXNjYXJnYXJcclxuICAgKiBAcGFyYW0gYmxvYiAtIENvbnRlbmlkbyBkZWwgYmxvYlxyXG4gICAqIEByZXR1cm5zIGxpbmtcclxuICAgKi9cclxuICBwcml2YXRlIGdlbmVyYXJMaW5rKGFyY2hpdm86IHN0cmluZywgYmxvYjogQmxvYik6IEhUTUxBbmNob3JFbGVtZW50IHtcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICBpZiAobGluay5kb3dubG9hZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSk7XHJcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGFyY2hpdm8pO1xyXG4gICAgICBsaW5rLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgIH1cclxuICAgIHJldHVybiBsaW5rO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbi8qKiBUaXBvIE1JTUUgQ1NWICsgRW5jb2RlICovXHJcbmNvbnN0IFRZUEVfQ1NWID0gJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTg7JztcclxuLyoqIEJPTSBDU1YgKi9cclxuY29uc3QgQk9NX0NTViA9IG5ldyBVaW50OEFycmF5KFsweEVGLCAweEJCLCAweEJGXSk7XHJcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJlZGktY29yZS1SZWRpVGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVkaS1jb3JlL1JlZGlUYWJsZS9uZ3gtcmVkaS1jb3JlLVJlZGlUYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,9 @@
1
+ /** Componentes */
2
+ export * from './src/components/redi-table/redi-table.component';
3
+ /** Modelos */
4
+ export * from './src/models/interfaces/column-definition';
5
+ export * from './src/models/interfaces/data-table';
6
+ export * from './src/models/interfaces/row-action';
7
+ // /** Tipos */
8
+ // export * from './src/models/types/event-table.type';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWRpLWNvcmUvUmVkaVRhYmxlL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCO0FBQ2xCLGNBQWMsa0RBQWtELENBQUM7QUFFakUsY0FBYztBQUNkLGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGVBQWU7QUFDZix1REFBdUQiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQ29tcG9uZW50ZXMgKi9cclxuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29tcG9uZW50cy9yZWRpLXRhYmxlL3JlZGktdGFibGUuY29tcG9uZW50JztcclxuXHJcbi8qKiBNb2RlbG9zICovXHJcbmV4cG9ydCAqIGZyb20gJy4vc3JjL21vZGVscy9pbnRlcmZhY2VzL2NvbHVtbi1kZWZpbml0aW9uJztcclxuZXhwb3J0ICogZnJvbSAnLi9zcmMvbW9kZWxzL2ludGVyZmFjZXMvZGF0YS10YWJsZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vc3JjL21vZGVscy9pbnRlcmZhY2VzL3Jvdy1hY3Rpb24nO1xyXG4vLyAvKiogVGlwb3MgKi9cclxuLy8gZXhwb3J0ICogZnJvbSAnLi9zcmMvbW9kZWxzL3R5cGVzL2V2ZW50LXRhYmxlLnR5cGUnOyJdfQ==
@@ -0,0 +1,75 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { MatFormFieldModule } from '@angular/material/form-field';
4
+ import { MatInputModule } from '@angular/material/input';
5
+ import { MatListModule } from '@angular/material/list';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/form-field";
8
+ import * as i2 from "@angular/material/input";
9
+ import * as i3 from "@angular/material/list";
10
+ export class FilterDataComponent {
11
+ set filtrosColumnas(value) {
12
+ this._refFiltro = value;
13
+ this.filtros = [...value.map(f => { return { ...f }; })];
14
+ }
15
+ constructor() {
16
+ this.filterEnd = new EventEmitter();
17
+ this._refFiltro = [];
18
+ this.filtros = [];
19
+ }
20
+ ngAfterViewInit() {
21
+ if (this.allItemControl) {
22
+ setTimeout(() => {
23
+ this.allItemControl.selected = this.isAllChecked(this.filtros);
24
+ });
25
+ }
26
+ }
27
+ selectedChange() {
28
+ if (this.allItemControl) {
29
+ this.allItemControl.selected = this.isAllChecked(this.filtros);
30
+ }
31
+ }
32
+ setAllCheck(value) {
33
+ this.filtros.map(f => f.isSelected = value);
34
+ }
35
+ isAllChecked(filters) {
36
+ return filters.every(f => f.isSelected);
37
+ }
38
+ filter(event) {
39
+ let control = event.target;
40
+ if (control) {
41
+ let value = control?.value ?? '';
42
+ this.filtros.map(f => f.isVisible = value === '' ||
43
+ f.name.trim().toLowerCase().indexOf(value.trim().toLowerCase()) !== -1);
44
+ }
45
+ }
46
+ aplicarFiltros() {
47
+ this._refFiltro.map((d, i) => { this._refFiltro[i].isSelected = this.filtros[i].isSelected; });
48
+ this.filterEnd.emit(true);
49
+ }
50
+ cancelarFiltro() {
51
+ this.filterEnd.emit();
52
+ }
53
+ loadData() {
54
+ this._refFiltro.map((d, i) => { this.filtros[i].isSelected = this._refFiltro[i].isSelected; });
55
+ }
56
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FilterDataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
57
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: FilterDataComponent, isStandalone: true, selector: "filter-data", inputs: { filtrosColumnas: "filtrosColumnas" }, outputs: { filterEnd: "filterEnd" }, viewQueries: [{ propertyName: "allItemControl", first: true, predicate: ["mainControl"], descendants: true }], ngImport: i0, template: "<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>", styles: ["mat-selection-list{max-height:40vh;height:20vh;overflow-y:scroll;border:solid 1px gray;margin-top:10px;margin-bottom:10px;background-color:#fff}input,mat-label{width:90%;margin-left:5px}:host{padding:5px}button{float:right;margin-right:5px}mat-list-option{max-height:35px}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i3.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }] }); }
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FilterDataComponent, decorators: [{
60
+ type: Component,
61
+ args: [{ selector: 'filter-data', standalone: true, imports: [
62
+ MatFormFieldModule,
63
+ FormsModule,
64
+ MatInputModule,
65
+ MatListModule
66
+ ], template: "<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>", styles: ["mat-selection-list{max-height:40vh;height:20vh;overflow-y:scroll;border:solid 1px gray;margin-top:10px;margin-bottom:10px;background-color:#fff}input,mat-label{width:90%;margin-left:5px}:host{padding:5px}button{float:right;margin-right:5px}mat-list-option{max-height:35px}\n"] }]
67
+ }], ctorParameters: () => [], propDecorators: { filtrosColumnas: [{
68
+ type: Input
69
+ }], allItemControl: [{
70
+ type: ViewChild,
71
+ args: ['mainControl']
72
+ }], filterEnd: [{
73
+ type: Output
74
+ }] } });
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZGktY29yZS9SZWRpVGFibGUvc3JjL2NvbXBvbmVudHMvZmlsdGVyLWRhdGEvZmlsdGVyLWRhdGEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZGktY29yZS9SZWRpVGFibGUvc3JjL2NvbXBvbmVudHMvZmlsdGVyLWRhdGEvZmlsdGVyLWRhdGEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBaUIsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFnQnRFLE1BQU0sT0FBTyxtQkFBbUI7SUFFOUIsSUFDVyxlQUFlLENBQUMsS0FBd0I7UUFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBV0Q7UUFGTyxjQUFTLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFHcEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE9B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b3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRMaXN0TW9kdWxlLCBNYXRMaXN0T3B0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XHJcbmltcG9ydCB7IEZpbHRlckl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaW50ZXJmYWNlcy9maWx0ZXItaXRlbSc7XHJcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZpbHRlci1kYXRhJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBNYXRMaXN0TW9kdWxlXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVyLWRhdGEuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9maWx0ZXItZGF0YS5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsdGVyRGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgZmlsdHJvc0NvbHVtbmFzKHZhbHVlOiBBcnJheTxGaWx0ZXJJdGVtPikge1xyXG4gICAgdGhpcy5fcmVmRmlsdHJvID0gdmFsdWU7XHJcbiAgICB0aGlzLmZpbHRyb3MgPSBbLi4udmFsdWUubWFwKGYgPT4geyByZXR1cm4geyAuLi5mIH0gfSldO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIF9yZWZGaWx0cm86IEFycmF5PEZpbHRlckl0ZW0+O1xyXG4gIHB1YmxpYyBmaWx0cm9zOiBBcnJheTxGaWx0ZXJJdGVtPjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnbWFpbkNvbnRyb2wnKVxyXG4gIHB1YmxpYyBhbGxJdGVtQ29udHJvbCE6IE1hdExpc3RPcHRpb25cclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGZpbHRlckVuZDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX3JlZkZpbHRybyA9IFtdO1xyXG4gICAgdGhpcy5maWx0cm9zID0gW107XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hbGxJdGVtQ29udHJvbCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFsbEl0ZW1Db250cm9sLnNlbGVjdGVkID0gdGhpcy5pc0FsbENoZWNrZWQodGhpcy5maWx0cm9zKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIHNlbGVjdGVkQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuYWxsSXRlbUNvbnRyb2wpIHtcclxuICAgICAgdGhpcy5hbGxJdGVtQ29udHJvbC5zZWxlY3RlZCA9IHRoaXMuaXNBbGxDaGVja2VkKHRoaXMuZmlsdHJvcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0QWxsQ2hlY2sodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdHJvcy5tYXAoZiA9PiBmLmlzU2VsZWN0ZWQgPSB2YWx1ZSlcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgaXNBbGxDaGVja2VkKGZpbHRlcnM6IEFycmF5PEZpbHRlckl0ZW0+KSB7XHJcbiAgICByZXR1cm4gZmlsdGVycy5ldmVyeShmID0+IGYuaXNTZWxlY3RlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBsZXQgY29udHJvbCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgbGV0IHZhbHVlID0gY29udHJvbD8udmFsdWUgPz8gJyc7XHJcbiAgICAgIHRoaXMuZmlsdHJvcy5tYXAoZiA9PiBmLmlzVmlzaWJsZSA9IHZhbHVlID09PSAnJyB8fFxyXG4gICAgICAgIGYubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFwbGljYXJGaWx0cm9zKCkge1xyXG4gICAgdGhpcy5fcmVmRmlsdHJvLm1hcCgoZCxpKT0+e3RoaXMuX3JlZkZpbHRyb1tpXS5pc1NlbGVjdGVkID0gdGhpcy5maWx0cm9zW2ldLmlzU2VsZWN0ZWR9KTtcclxuICAgIHRoaXMuZmlsdGVyRW5kLmVtaXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsYXJGaWx0cm8oKSB7XHJcbiAgICB0aGlzLmZpbHRlckVuZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZERhdGEoKXtcclxuICAgIHRoaXMuX3JlZkZpbHRyby5tYXAoKGQsaSk9PnsgdGhpcy5maWx0cm9zW2ldLmlzU2VsZWN0ZWQgPXRoaXMuX3JlZkZpbHRyb1tpXS5pc1NlbGVjdGVkfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtbGFiZWw+RmlsdHJvPC9tYXQtbGFiZWw+XHJcbjxkaXY+XHJcbiAgICA8aW5wdXQgI3RleHRGaWx0ZXIgY2xhc3M9XCJpbnB1dEZpbHRlclwiIChrZXl1cCk9XCJmaWx0ZXIoJGV2ZW50KVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJCdXNjYXJcIiBhcmlhLWxhYmVsPVwiRmlsdHJvXCJcclxuICAgICAgICBtYXRJbnB1dD5cclxuPC9kaXY+XHJcbjxtYXQtc2VsZWN0aW9uLWxpc3QgI2VsZW1lbnRvcz5cclxuICAgIDxtYXQtbGlzdC1vcHRpb24gI21haW5Db250cm9sIChjbGljayk9XCJzZXRBbGxDaGVjayhtYWluQ29udHJvbC5zZWxlY3RlZClcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJ0ZXh0RmlsdGVyLnZhbHVlICE9PSAnJ1wiPihTZWxlY2Npb25hciB0b2RvKTwvbWF0LWxpc3Qtb3B0aW9uPlxyXG4gICAgQGZvciAoZmlsdHJvIG9mIGZpbHRyb3M7IHRyYWNrIGZpbHRybykge1xyXG4gICAgQGlmKGZpbHRyby5pc1Zpc2libGUpe1xyXG4gICAgPG1hdC1saXN0LW9wdGlvbiBbKHNlbGVjdGVkKV09XCJmaWx0cm8uaXNTZWxlY3RlZFwiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cInNlbGVjdGVkQ2hhbmdlKClcIj57e2ZpbHRyby5uYW1lfX08L21hdC1saXN0LW9wdGlvbj5cclxuICAgIH1cclxuICAgIH1cclxuPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XHJcbjxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJhcGxpY2FyRmlsdHJvcygpXCI+QWNlcHRhcjwvYnV0dG9uPlxyXG48YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIChjbGljayk9XCJjYW5jZWxhckZpbHRybygpXCI+Q2FuY2VsYXI8L2J1dHRvbj4iXX0=