@c80/ui 1.0.31 → 1.0.33

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.
@@ -0,0 +1,166 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Servicio para utilidades de manipulación de datos en tablas C80
5
+ *
6
+ * Proporciona métodos para:
7
+ * - Acceso a valores de celdas (incluyendo propiedades anidadas)
8
+ * - Formateo de valores para display
9
+ * - Gestión de enums y colores
10
+ * - Ordenamiento de datos
11
+ */
12
+ export class TableDataUtilsService {
13
+ /**
14
+ * Obtiene el valor de una celda usando el accessor, soportando notación de punto para propiedades anidadas
15
+ * @param row - La fila de datos
16
+ * @param accessor - El accessor de la columna
17
+ * @returns El valor de la celda
18
+ */
19
+ getCellValue(row, accessor) {
20
+ if (accessor.includes('.')) {
21
+ return this.getNestedValue(row, accessor);
22
+ }
23
+ return row[accessor];
24
+ }
25
+ /**
26
+ * Obtiene el valor de un objeto usando notación de punto (ej: 'task.name')
27
+ * @param obj - Objeto del cual obtener el valor
28
+ * @param accessor - Ruta de acceso usando notación de punto
29
+ * @returns El valor anidado o undefined
30
+ */
31
+ getNestedValue(obj, accessor) {
32
+ return accessor.split('.').reduce((current, key) => {
33
+ return current && typeof current === 'object' ? current[key] : undefined;
34
+ }, obj);
35
+ }
36
+ /**
37
+ * Devuelve el valor de display para una celda, mostrando '-' para valores falsy excepto 0, false y objetos/arrays vacíos
38
+ * @param value - Valor a formatear
39
+ * @returns Cadena formateada para display
40
+ */
41
+ getDisplayValue(value) {
42
+ // Si el valor es 0, mostrarlo
43
+ if (value === 0) {
44
+ return '0';
45
+ }
46
+ // Si el valor es false, debe ser manejado por lógica booleana en template, no aquí
47
+ if (value === false) {
48
+ return 'false';
49
+ }
50
+ // Manejar objetos y arrays (incluyendo los vacíos)
51
+ if (typeof value === 'object' && value !== null) {
52
+ try {
53
+ return JSON.stringify(value);
54
+ }
55
+ catch {
56
+ return '[object Object]';
57
+ }
58
+ }
59
+ // Si el valor son otros falsy values (null, undefined, ''), mostrar '-'
60
+ if (!value) {
61
+ return '-';
62
+ }
63
+ // Manejar otros tipos explícitamente
64
+ if (typeof value === 'string' ||
65
+ typeof value === 'number' ||
66
+ typeof value === 'boolean') {
67
+ return String(value);
68
+ }
69
+ // Para cualquier otro tipo (función, símbolo, etc.), devolver un fallback seguro
70
+ return '-';
71
+ }
72
+ /**
73
+ * Obtiene el texto de display para un valor enum
74
+ * @param value - Valor del enum
75
+ * @param col - Definición de la columna
76
+ * @returns Texto formateado del enum
77
+ */
78
+ getEnumDisplayValue(value, col) {
79
+ if (!col.enum || (value !== 0 && !value)) {
80
+ return '-';
81
+ }
82
+ const displayValue = col.enum[value];
83
+ return (displayValue ||
84
+ (typeof value === 'string' || typeof value === 'number'
85
+ ? String(value)
86
+ : '-'));
87
+ }
88
+ /**
89
+ * Obtiene las opciones del enum como array para dropdowns select
90
+ * @param col - Definición de la columna
91
+ * @returns Array de opciones con value y label
92
+ */
93
+ getEnumOptions(col) {
94
+ if (!col.enum)
95
+ return [];
96
+ return Object.entries(col.enum).map(([value, label]) => ({
97
+ value: isNaN(Number(value)) ? value : Number(value),
98
+ label,
99
+ }));
100
+ }
101
+ /**
102
+ * Obtiene el color CSS para un valor de celda basado en la configuración de color de la columna
103
+ * @param value - Valor de la celda
104
+ * @param col - Definición de la columna
105
+ * @returns Color CSS o undefined si no hay configuración
106
+ */
107
+ getCellColor(value, col) {
108
+ if (!col.color || (value !== 0 && !value)) {
109
+ return undefined;
110
+ }
111
+ return col.color[value];
112
+ }
113
+ /**
114
+ * Aplica ordenamiento a los items basándose en las columnas con configuración de orden
115
+ * @param items - Array de items a ordenar (se modifica in-place)
116
+ * @param columns - Definiciones de columnas
117
+ */
118
+ applySorting(items, columns) {
119
+ const orderedColumns = columns.filter((col) => col.order);
120
+ if (orderedColumns.length > 0) {
121
+ orderedColumns.forEach((col) => {
122
+ items.sort((a, b) => {
123
+ const valueA = this.getCellValue(a, col.accessor);
124
+ const valueB = this.getCellValue(b, col.accessor);
125
+ if (col.order === 'ASC') {
126
+ if (valueA > valueB)
127
+ return 1;
128
+ if (valueA < valueB)
129
+ return -1;
130
+ return 0;
131
+ }
132
+ else {
133
+ if (valueA < valueB)
134
+ return 1;
135
+ if (valueA > valueB)
136
+ return -1;
137
+ return 0;
138
+ }
139
+ });
140
+ });
141
+ }
142
+ }
143
+ /**
144
+ * Calcula el max-height de la tabla basado en el tamaño
145
+ * @param size - Tamaño configurado (0 = sin límite)
146
+ * @returns String CSS para max-height o undefined si sin límite
147
+ */
148
+ getTableMaxHeight(size) {
149
+ if (size <= 0) {
150
+ return undefined; // Sin límite de altura
151
+ }
152
+ // Altura base de 400px * size
153
+ const baseHeight = 400;
154
+ const maxHeight = Math.round(baseHeight * size);
155
+ return `${maxHeight}px`;
156
+ }
157
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataUtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
158
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataUtilsService, providedIn: 'root' });
159
+ }
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataUtilsService, decorators: [{
161
+ type: Injectable,
162
+ args: [{
163
+ providedIn: 'root'
164
+ }]
165
+ }] });
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS11dGlscy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLWRhdGEtdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQzs7Ozs7Ozs7R0FRRztBQUlILE1BQU0sT0FBTyxxQkFBcUI7SUFFOUI7Ozs7O09BS0c7SUFDSCxZQUFZLENBQW9DLEdBQU0sRUFBRSxRQUFnQjtRQUNwRSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFRLEdBQStCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLEdBQVEsRUFBRSxRQUFnQjtRQUNyQyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9DLE9BQU8sT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0UsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsS0FBYztRQUMxQiw4QkFBOEI7UUFDOUIsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDZCxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUM7UUFDRCxtRkFBbUY7UUFDbkYsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDbEIsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQztRQUNELG1EQUFtRDtRQUNuRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNMLE9BQU8saUJBQWlCLENBQUM7WUFDN0IsQ0FBQztRQUNMLENBQUM7UUFDRCx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsT0FBTyxHQUFHLENBQUM7UUFDZixDQUFDO1FBQ0QscUNBQXFDO1FBQ3JDLElBQ0ksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3pCLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFDNUIsQ0FBQztZQUNDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxpRkFBaUY7UUFDakYsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxLQUFjLEVBQUUsR0FBbUI7UUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQXdCLENBQUMsQ0FBQztRQUN4RCxPQUFPLENBQ0gsWUFBWTtZQUNaLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ25ELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNmLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FDYixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsR0FBbUI7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyRCxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbkQsS0FBSztTQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLEtBQWMsRUFBRSxHQUFtQjtRQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBd0IsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFvQyxLQUFVLEVBQUUsT0FBeUI7UUFDakYsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQW9CLENBQUM7b0JBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQW9CLENBQUM7b0JBRXJFLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQzt3QkFDdEIsSUFBSSxNQUFNLEdBQUcsTUFBTTs0QkFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDOUIsSUFBSSxNQUFNLEdBQUcsTUFBTTs0QkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUMvQixPQUFPLENBQUMsQ0FBQztvQkFDYixDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBSSxNQUFNLEdBQUcsTUFBTTs0QkFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDOUIsSUFBSSxNQUFNLEdBQUcsTUFBTTs0QkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUMvQixPQUFPLENBQUMsQ0FBQztvQkFDYixDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxJQUFZO1FBQzFCLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTyxTQUFTLENBQUMsQ0FBQyx1QkFBdUI7UUFDN0MsQ0FBQztRQUNELDhCQUE4QjtRQUM5QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDaEQsT0FBTyxHQUFHLFNBQVMsSUFBSSxDQUFDO0lBQzVCLENBQUM7d0dBdEpRLHFCQUFxQjs0R0FBckIscUJBQXFCLGNBRmxCLE1BQU07OzRGQUVULHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDODBUYWJsZUNvbERlZiB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgdXRpbGlkYWRlcyBkZSBtYW5pcHVsYWNpw7NuIGRlIGRhdG9zIGVuIHRhYmxhcyBDODBcbiAqXG4gKiBQcm9wb3JjaW9uYSBtw6l0b2RvcyBwYXJhOlxuICogLSBBY2Nlc28gYSB2YWxvcmVzIGRlIGNlbGRhcyAoaW5jbHV5ZW5kbyBwcm9waWVkYWRlcyBhbmlkYWRhcylcbiAqIC0gRm9ybWF0ZW8gZGUgdmFsb3JlcyBwYXJhIGRpc3BsYXlcbiAqIC0gR2VzdGnDs24gZGUgZW51bXMgeSBjb2xvcmVzXG4gKiAtIE9yZGVuYW1pZW50byBkZSBkYXRvc1xuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlRGF0YVV0aWxzU2VydmljZSB7XG5cbiAgICAvKipcbiAgICAgKiBPYnRpZW5lIGVsIHZhbG9yIGRlIHVuYSBjZWxkYSB1c2FuZG8gZWwgYWNjZXNzb3IsIHNvcG9ydGFuZG8gbm90YWNpw7NuIGRlIHB1bnRvIHBhcmEgcHJvcGllZGFkZXMgYW5pZGFkYXNcbiAgICAgKiBAcGFyYW0gcm93IC0gTGEgZmlsYSBkZSBkYXRvc1xuICAgICAqIEBwYXJhbSBhY2Nlc3NvciAtIEVsIGFjY2Vzc29yIGRlIGxhIGNvbHVtbmFcbiAgICAgKiBAcmV0dXJucyBFbCB2YWxvciBkZSBsYSBjZWxkYVxuICAgICAqL1xuICAgIGdldENlbGxWYWx1ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHJvdzogVCwgYWNjZXNzb3I6IHN0cmluZyk6IHVua25vd24ge1xuICAgICAgICBpZiAoYWNjZXNzb3IuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmVzdGVkVmFsdWUocm93LCBhY2Nlc3Nvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChyb3cgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2FjY2Vzc29yXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnRpZW5lIGVsIHZhbG9yIGRlIHVuIG9iamV0byB1c2FuZG8gbm90YWNpw7NuIGRlIHB1bnRvIChlajogJ3Rhc2submFtZScpXG4gICAgICogQHBhcmFtIG9iaiAtIE9iamV0byBkZWwgY3VhbCBvYnRlbmVyIGVsIHZhbG9yXG4gICAgICogQHBhcmFtIGFjY2Vzc29yIC0gUnV0YSBkZSBhY2Nlc28gdXNhbmRvIG5vdGFjacOzbiBkZSBwdW50b1xuICAgICAqIEByZXR1cm5zIEVsIHZhbG9yIGFuaWRhZG8gbyB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgYWNjZXNzb3I6IHN0cmluZyk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gYWNjZXNzb3Iuc3BsaXQoJy4nKS5yZWR1Y2UoKGN1cnJlbnQsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnID8gY3VycmVudFtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgICB9LCBvYmopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldnVlbHZlIGVsIHZhbG9yIGRlIGRpc3BsYXkgcGFyYSB1bmEgY2VsZGEsIG1vc3RyYW5kbyAnLScgcGFyYSB2YWxvcmVzIGZhbHN5IGV4Y2VwdG8gMCwgZmFsc2UgeSBvYmpldG9zL2FycmF5cyB2YWPDrW9zXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVmFsb3IgYSBmb3JtYXRlYXJcbiAgICAgKiBAcmV0dXJucyBDYWRlbmEgZm9ybWF0ZWFkYSBwYXJhIGRpc3BsYXlcbiAgICAgKi9cbiAgICBnZXREaXNwbGF5VmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgICAvLyBTaSBlbCB2YWxvciBlcyAwLCBtb3N0cmFybG9cbiAgICAgICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJzAnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpIGVsIHZhbG9yIGVzIGZhbHNlLCBkZWJlIHNlciBtYW5lamFkbyBwb3IgbMOzZ2ljYSBib29sZWFuYSBlbiB0ZW1wbGF0ZSwgbm8gYXF1w61cbiAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFuZWphciBvYmpldG9zIHkgYXJyYXlzIChpbmNsdXllbmRvIGxvcyB2YWPDrW9zKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IE9iamVjdF0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNpIGVsIHZhbG9yIHNvbiBvdHJvcyBmYWxzeSB2YWx1ZXMgKG51bGwsIHVuZGVmaW5lZCwgJycpLCBtb3N0cmFyICctJ1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gJy0nO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1hbmVqYXIgb3Ryb3MgdGlwb3MgZXhwbMOtY2l0YW1lbnRlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFyYSBjdWFscXVpZXIgb3RybyB0aXBvIChmdW5jacOzbiwgc8OtbWJvbG8sIGV0Yy4pLCBkZXZvbHZlciB1biBmYWxsYmFjayBzZWd1cm9cbiAgICAgICAgcmV0dXJuICctJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnRpZW5lIGVsIHRleHRvIGRlIGRpc3BsYXkgcGFyYSB1biB2YWxvciBlbnVtXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVmFsb3IgZGVsIGVudW1cbiAgICAgKiBAcGFyYW0gY29sIC0gRGVmaW5pY2nDs24gZGUgbGEgY29sdW1uYVxuICAgICAqIEByZXR1cm5zIFRleHRvIGZvcm1hdGVhZG8gZGVsIGVudW1cbiAgICAgKi9cbiAgICBnZXRFbnVtRGlzcGxheVZhbHVlKHZhbHVlOiB1bmtub3duLCBjb2w6IEM4MFRhYmxlQ29sRGVmKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFjb2wuZW51bSB8fCAodmFsdWUgIT09IDAgJiYgIXZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuICctJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBjb2wuZW51bVt2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXJdO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlIHx8XG4gICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBTdHJpbmcodmFsdWUpXG4gICAgICAgICAgICAgICAgOiAnLScpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2J0aWVuZSBsYXMgb3BjaW9uZXMgZGVsIGVudW0gY29tbyBhcnJheSBwYXJhIGRyb3Bkb3ducyBzZWxlY3RcbiAgICAgKiBAcGFyYW0gY29sIC0gRGVmaW5pY2nDs24gZGUgbGEgY29sdW1uYVxuICAgICAqIEByZXR1cm5zIEFycmF5IGRlIG9wY2lvbmVzIGNvbiB2YWx1ZSB5IGxhYmVsXG4gICAgICovXG4gICAgZ2V0RW51bU9wdGlvbnMoY29sOiBDODBUYWJsZUNvbERlZik6IHsgdmFsdWU6IHN0cmluZyB8IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9W10ge1xuICAgICAgICBpZiAoIWNvbC5lbnVtKSByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjb2wuZW51bSkubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHtcbiAgICAgICAgICAgIHZhbHVlOiBpc05hTihOdW1iZXIodmFsdWUpKSA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKSxcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2J0aWVuZSBlbCBjb2xvciBDU1MgcGFyYSB1biB2YWxvciBkZSBjZWxkYSBiYXNhZG8gZW4gbGEgY29uZmlndXJhY2nDs24gZGUgY29sb3IgZGUgbGEgY29sdW1uYVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGRlIGxhIGNlbGRhXG4gICAgICogQHBhcmFtIGNvbCAtIERlZmluaWNpw7NuIGRlIGxhIGNvbHVtbmFcbiAgICAgKiBAcmV0dXJucyBDb2xvciBDU1MgbyB1bmRlZmluZWQgc2kgbm8gaGF5IGNvbmZpZ3VyYWNpw7NuXG4gICAgICovXG4gICAgZ2V0Q2VsbENvbG9yKHZhbHVlOiB1bmtub3duLCBjb2w6IEM4MFRhYmxlQ29sRGVmKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCFjb2wuY29sb3IgfHwgKHZhbHVlICE9PSAwICYmICF2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbC5jb2xvclt2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXJdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwbGljYSBvcmRlbmFtaWVudG8gYSBsb3MgaXRlbXMgYmFzw6FuZG9zZSBlbiBsYXMgY29sdW1uYXMgY29uIGNvbmZpZ3VyYWNpw7NuIGRlIG9yZGVuXG4gICAgICogQHBhcmFtIGl0ZW1zIC0gQXJyYXkgZGUgaXRlbXMgYSBvcmRlbmFyIChzZSBtb2RpZmljYSBpbi1wbGFjZSlcbiAgICAgKiBAcGFyYW0gY29sdW1ucyAtIERlZmluaWNpb25lcyBkZSBjb2x1bW5hc1xuICAgICAqL1xuICAgIGFwcGx5U29ydGluZzxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGl0ZW1zOiBUW10sIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZENvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wub3JkZXIpO1xuICAgICAgICBpZiAob3JkZXJlZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb3JkZXJlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUEgPSB0aGlzLmdldENlbGxWYWx1ZShhLCBjb2wuYWNjZXNzb3IpIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVCID0gdGhpcy5nZXRDZWxsVmFsdWUoYiwgY29sLmFjY2Vzc29yKSBhcyBzdHJpbmcgfCBudW1iZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5vcmRlciA9PT0gJ0FTQycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlQSA8IHZhbHVlQikgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVBIDwgdmFsdWVCKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGEgZWwgbWF4LWhlaWdodCBkZSBsYSB0YWJsYSBiYXNhZG8gZW4gZWwgdGFtYcOxb1xuICAgICAqIEBwYXJhbSBzaXplIC0gVGFtYcOxbyBjb25maWd1cmFkbyAoMCA9IHNpbiBsw61taXRlKVxuICAgICAqIEByZXR1cm5zIFN0cmluZyBDU1MgcGFyYSBtYXgtaGVpZ2h0IG8gdW5kZWZpbmVkIHNpIHNpbiBsw61taXRlXG4gICAgICovXG4gICAgZ2V0VGFibGVNYXhIZWlnaHQoc2l6ZTogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHNpemUgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gU2luIGzDrW1pdGUgZGUgYWx0dXJhXG4gICAgICAgIH1cbiAgICAgICAgLy8gQWx0dXJhIGJhc2UgZGUgNDAwcHggKiBzaXplXG4gICAgICAgIGNvbnN0IGJhc2VIZWlnaHQgPSA0MDA7XG4gICAgICAgIGNvbnN0IG1heEhlaWdodCA9IE1hdGgucm91bmQoYmFzZUhlaWdodCAqIHNpemUpO1xuICAgICAgICByZXR1cm4gYCR7bWF4SGVpZ2h0fXB4YDtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,151 @@
1
+ import { Injectable, signal } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Servicio para gestionar la selección de elementos en tablas C80
5
+ *
6
+ * Maneja:
7
+ * - Selección simple y múltiple
8
+ * - Estado de selección completa
9
+ * - Preservación de selección tras actualizaciones de datos
10
+ * - Emisión de eventos de selección
11
+ */
12
+ export class TableSelectionService {
13
+ /**
14
+ * Inicializa el estado de selección para una nueva tabla
15
+ * @returns Objeto con signals y métodos de selección
16
+ */
17
+ createSelectionState() {
18
+ const selectedItems = signal(new Set());
19
+ const selectAllChecked = signal(false);
20
+ const selectAllIndeterminate = signal(false);
21
+ const clearSelection = () => {
22
+ selectedItems.set(new Set());
23
+ updateSelectAllState();
24
+ };
25
+ const updateSelectAllState = () => {
26
+ // Esta función será actualizada cuando se tengan los datos disponibles
27
+ selectAllChecked.set(false);
28
+ selectAllIndeterminate.set(false);
29
+ };
30
+ const toggleSelectAll = (allItems) => {
31
+ const currentSelection = selectedItems();
32
+ if (currentSelection.size === allItems.length) {
33
+ // Desmarcar todos los elementos
34
+ clearSelection();
35
+ }
36
+ else {
37
+ // Marcar todos los elementos
38
+ const allIds = new Set(allItems.map(item => item['id']));
39
+ selectedItems.set(allIds);
40
+ updateSelectAllStateWithData(allItems);
41
+ }
42
+ };
43
+ const toggleItemSelection = (item, multiple) => {
44
+ const id = item['id'];
45
+ const currentSelection = new Set(selectedItems());
46
+ if (!multiple) {
47
+ // Selección simple: solo permitir un elemento seleccionado
48
+ if (currentSelection.has(id)) {
49
+ // Deseleccionar el elemento actual
50
+ currentSelection.clear();
51
+ }
52
+ else {
53
+ // Seleccionar solo este elemento
54
+ currentSelection.clear();
55
+ currentSelection.add(id);
56
+ }
57
+ }
58
+ else if (currentSelection.has(id)) {
59
+ // Selección múltiple: deseleccionar elemento existente
60
+ currentSelection.delete(id);
61
+ }
62
+ else {
63
+ // Selección múltiple: agregar nuevo elemento
64
+ currentSelection.add(id);
65
+ }
66
+ selectedItems.set(currentSelection);
67
+ };
68
+ const isItemSelected = (item) => {
69
+ const id = item['id'];
70
+ return selectedItems().has(id);
71
+ };
72
+ const updateSelectAllStateWithData = (allItems) => {
73
+ const selectedCount = selectedItems().size;
74
+ const totalCount = allItems.length;
75
+ if (selectedCount === 0) {
76
+ selectAllChecked.set(false);
77
+ selectAllIndeterminate.set(false);
78
+ }
79
+ else if (selectedCount === totalCount) {
80
+ selectAllChecked.set(true);
81
+ selectAllIndeterminate.set(false);
82
+ }
83
+ else {
84
+ selectAllChecked.set(false);
85
+ selectAllIndeterminate.set(true);
86
+ }
87
+ };
88
+ const preserveSelection = (newData) => {
89
+ const currentSelection = selectedItems();
90
+ if (currentSelection.size === 0 || newData.length === 0) {
91
+ // Si no hay selección o no hay datos, limpiar la selección
92
+ clearSelection();
93
+ return;
94
+ }
95
+ // Obtener los IDs disponibles en los nuevos datos
96
+ const availableIds = new Set(newData.map(item => item['id']));
97
+ // Filtrar la selección actual para mantener solo los IDs que aún existen
98
+ const preservedSelection = new Set(Array.from(currentSelection).filter(id => availableIds.has(id)));
99
+ // Actualizar la selección con los IDs preservados
100
+ selectedItems.set(preservedSelection);
101
+ updateSelectAllStateWithData(newData);
102
+ };
103
+ const getSelectedItems = (allData) => {
104
+ const selectedIds = selectedItems();
105
+ return allData.filter(item => selectedIds.has(item['id']));
106
+ };
107
+ // Redefinir updateSelectAllState con acceso a los datos
108
+ const originalUpdateSelectAllState = updateSelectAllState;
109
+ const updateSelectAllStateWrapper = (allItems) => {
110
+ if (allItems) {
111
+ updateSelectAllStateWithData(allItems);
112
+ }
113
+ else {
114
+ originalUpdateSelectAllState();
115
+ }
116
+ };
117
+ return {
118
+ // Signals
119
+ selectedItems: selectedItems.asReadonly(),
120
+ selectAllChecked: selectAllChecked.asReadonly(),
121
+ selectAllIndeterminate: selectAllIndeterminate.asReadonly(),
122
+ // Métodos
123
+ clearSelection,
124
+ toggleSelectAll,
125
+ toggleItemSelection,
126
+ isItemSelected,
127
+ preserveSelection,
128
+ getSelectedItems,
129
+ updateSelectAllState: updateSelectAllStateWrapper,
130
+ };
131
+ }
132
+ /**
133
+ * Emite los elementos seleccionados a través del EventEmitter proporcionado
134
+ * @param selectionState - Estado de selección
135
+ * @param allData - Todos los datos de la tabla
136
+ * @param selectableEmitter - EventEmitter para emitir la selección
137
+ */
138
+ emitSelection(selectionState, allData, selectableEmitter) {
139
+ const selectedItems = selectionState.getSelectedItems(allData);
140
+ selectableEmitter.emit(selectedItems);
141
+ }
142
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
143
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableSelectionService, providedIn: 'root' });
144
+ }
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableSelectionService, decorators: [{
146
+ type: Injectable,
147
+ args: [{
148
+ providedIn: 'root'
149
+ }]
150
+ }] });
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3VpL3NyYy9saWIvdGFibGUvdGFibGUtc2VsZWN0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQWdCLE1BQU0sZUFBZSxDQUFDOztBQUdqRTs7Ozs7Ozs7R0FRRztBQUlILE1BQU0sT0FBTyxxQkFBcUI7SUFFOUI7OztPQUdHO0lBQ0gsb0JBQW9CO1FBQ2hCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBVSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0MsTUFBTSxjQUFjLEdBQUcsR0FBUyxFQUFFO1lBQzlCLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLG9CQUFvQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDO1FBRUYsTUFBTSxvQkFBb0IsR0FBRyxHQUFTLEVBQUU7WUFDcEMsdUVBQXVFO1lBQ3ZFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixzQkFBc0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFhLEVBQVEsRUFBRTtZQUM1QyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsRUFBRSxDQUFDO1lBRXpDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDNUMsZ0NBQWdDO2dCQUNoQyxjQUFjLEVBQUUsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JB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QkFBZ0IsQ0FBQyxVQUFVLEVBQUU7WUFDL0Msc0JBQXNCLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFO1lBRTNELFVBQVU7WUFDVixjQUFjO1lBQ2QsZUFBZTtZQUNmLG1CQUFtQjtZQUNuQixjQUFjO1lBQ2QsaUJBQWlCO1lBQ2pCLGdCQUFnQjtZQUNoQixvQkFBb0IsRUFBRSwyQkFBMkI7U0FDcEQsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FDVCxjQUErRCxFQUMvRCxPQUFZLEVBQ1osaUJBQW9DO1FBRXBDLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvRCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsQ0FBQzt3R0FySlEscUJBQXFCOzRHQUFyQixxQkFBcUIsY0FGbEIsTUFBTTs7NEZBRVQscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJRCB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgZ2VzdGlvbmFyIGxhIHNlbGVjY2nDs24gZGUgZWxlbWVudG9zIGVuIHRhYmxhcyBDODBcbiAqXG4gKiBNYW5lamE6XG4gKiAtIFNlbGVjY2nDs24gc2ltcGxlIHkgbcO6bHRpcGxlXG4gKiAtIEVzdGFkbyBkZSBzZWxlY2Npw7NuIGNvbXBsZXRhXG4gKiAtIFByZXNlcnZhY2nDs24gZGUgc2VsZWNjacOzbiB0cmFzIGFjdHVhbGl6YWNpb25lcyBkZSBkYXRvc1xuICogLSBFbWlzacOzbiBkZSBldmVudG9zIGRlIHNlbGVjY2nDs25cbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVNlbGVjdGlvblNlcnZpY2Uge1xuXG4gICAgLyoqXG4gICAgICogSW5pY2lhbGl6YSBlbCBlc3RhZG8gZGUgc2VsZWNjacOzbiBwYXJhIHVuYSBudWV2YSB0YWJsYVxuICAgICAqIEByZXR1cm5zIE9iamV0byBjb24gc2lnbmFscyB5IG3DqXRvZG9zIGRlIHNlbGVjY2nDs25cbiAgICAgKi9cbiAgICBjcmVhdGVTZWxlY3Rpb25TdGF0ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gc2lnbmFsPFNldDxJRD4+KG5ldyBTZXQoKSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdEFsbENoZWNrZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgICAgICBjb25zdCBzZWxlY3RBbGxJbmRldGVybWluYXRlID0gc2lnbmFsKGZhbHNlKTtcblxuICAgICAgICBjb25zdCBjbGVhclNlbGVjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMuc2V0KG5ldyBTZXQoKSk7XG4gICAgICAgICAgICB1cGRhdGVTZWxlY3RBbGxTdGF0ZSgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZVNlbGVjdEFsbFN0YXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgLy8gRXN0YSBmdW5jacOzbiBzZXLDoSBhY3R1YWxpemFkYSBjdWFuZG8gc2UgdGVuZ2FuIGxvcyBkYXRvcyBkaXNwb25pYmxlc1xuICAgICAgICAgICAgc2VsZWN0QWxsQ2hlY2tlZC5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQoZmFsc2UpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRvZ2dsZVNlbGVjdEFsbCA9IChhbGxJdGVtczogVFtdKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0ZWRJdGVtcygpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFNlbGVjdGlvbi5zaXplID09PSBhbGxJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBEZXNtYXJjYXIgdG9kb3MgbG9zIGVsZW1lbnRvc1xuICAgICAgICAgICAgICAgIGNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1hcmNhciB0b2RvcyBsb3MgZWxlbWVudG9zXG4gICAgICAgICAgICAgICAgY29uc3QgYWxsSWRzID0gbmV3IFNldChhbGxJdGVtcy5tYXAoaXRlbSA9PiBpdGVtWydpZCddIGFzIElEKSk7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5zZXQoYWxsSWRzKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RBbGxTdGF0ZVdpdGhEYXRhKGFsbEl0ZW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0b2dnbGVJdGVtU2VsZWN0aW9uID0gKGl0ZW06IFQsIG11bHRpcGxlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1bJ2lkJ10gYXMgSUQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gbmV3IFNldChzZWxlY3RlZEl0ZW1zKCkpO1xuXG4gICAgICAgICAgICBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgLy8gU2VsZWNjacOzbiBzaW1wbGU6IHNvbG8gcGVybWl0aXIgdW4gZWxlbWVudG8gc2VsZWNjaW9uYWRvXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3Rpb24uaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEZXNlbGVjY2lvbmFyIGVsIGVsZW1lbnRvIGFjdHVhbFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWNjaW9uYXIgc29sbyBlc3RlIGVsZW1lbnRvXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGlvbi5hZGQoaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFNlbGVjdGlvbi5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2VsZWNjacOzbiBtw7psdGlwbGU6IGRlc2VsZWNjaW9uYXIgZWxlbWVudG8gZXhpc3RlbnRlXG4gICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGlvbi5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTZWxlY2Npw7NuIG3Dumx0aXBsZTogYWdyZWdhciBudWV2byBlbGVtZW50b1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5zZXQoY3VycmVudFNlbGVjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaXNJdGVtU2VsZWN0ZWQgPSAoaXRlbTogVCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBpdGVtWydpZCddIGFzIElEO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbXMoKS5oYXMoaWQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZVNlbGVjdEFsbFN0YXRlV2l0aERhdGEgPSAoYWxsSXRlbXM6IFRbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHNlbGVjdGVkSXRlbXMoKS5zaXplO1xuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IGFsbEl0ZW1zLmxlbmd0aDtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxDaGVja2VkLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50ID09PSB0b3RhbENvdW50KSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsQ2hlY2tlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxDaGVja2VkLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcHJlc2VydmVTZWxlY3Rpb24gPSAobmV3RGF0YTogVFtdKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0ZWRJdGVtcygpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFNlbGVjdGlvbi5zaXplID09PSAwIHx8IG5ld0RhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gU2kgbm8gaGF5IHNlbGVjY2nDs24gbyBubyBoYXkgZGF0b3MsIGxpbXBpYXIgbGEgc2VsZWNjacOzblxuICAgICAgICAgICAgICAgIGNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPYnRlbmVyIGxvcyBJRHMgZGlzcG9uaWJsZXMgZW4gbG9zIG51ZXZvcyBkYXRvc1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlSWRzID0gbmV3IFNldChuZXdEYXRhLm1hcChpdGVtID0+IGl0ZW1bJ2lkJ10gYXMgSUQpKTtcblxuICAgICAgICAgICAgLy8gRmlsdHJhciBsYSBzZWxlY2Npw7NuIGFjdHVhbCBwYXJhIG1hbnRlbmVyIHNvbG8gbG9zIElEcyBxdWUgYcO6biBleGlzdGVuXG4gICAgICAgICAgICBjb25zdCBwcmVzZXJ2ZWRTZWxlY3Rpb24gPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20oY3VycmVudFNlbGVjdGlvbikuZmlsdGVyKGlkID0+IGF2YWlsYWJsZUlkcy5oYXMoaWQpKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWN0dWFsaXphciBsYSBzZWxlY2Npw7NuIGNvbiBsb3MgSURzIHByZXNlcnZhZG9zXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLnNldChwcmVzZXJ2ZWRTZWxlY3Rpb24pO1xuICAgICAgICAgICAgdXBkYXRlU2VsZWN0QWxsU3RhdGVXaXRoRGF0YShuZXdEYXRhKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBnZXRTZWxlY3RlZEl0ZW1zID0gKGFsbERhdGE6IFRbXSk6IFRbXSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgIHJldHVybiBhbGxEYXRhLmZpbHRlcihpdGVtID0+IHNlbGVjdGVkSWRzLmhhcyhpdGVtWydpZCddIGFzIElEKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVkZWZpbmlyIHVwZGF0ZVNlbGVjdEFsbFN0YXRlIGNvbiBhY2Nlc28gYSBsb3MgZGF0b3NcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxVcGRhdGVTZWxlY3RBbGxTdGF0ZSA9IHVwZGF0ZVNlbGVjdEFsbFN0YXRlO1xuICAgICAgICBjb25zdCB1cGRhdGVTZWxlY3RBbGxTdGF0ZVdyYXBwZXIgPSAoYWxsSXRlbXM/OiBUW10pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChhbGxJdGVtcykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNlbGVjdEFsbFN0YXRlV2l0aERhdGEoYWxsSXRlbXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFVwZGF0ZVNlbGVjdEFsbFN0YXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIFNpZ25hbHNcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM6IHNlbGVjdGVkSXRlbXMuYXNSZWFkb25seSgpLFxuICAgICAgICAgICAgc2VsZWN0QWxsQ2hlY2tlZDogc2VsZWN0QWxsQ2hlY2tlZC5hc1JlYWRvbmx5KCksXG4gICAgICAgICAgICBzZWxlY3RBbGxJbmRldGVybWluYXRlOiBzZWxlY3RBbGxJbmRldGVybWluYXRlLmFzUmVhZG9ubHkoKSxcblxuICAgICAgICAgICAgLy8gTcOpdG9kb3NcbiAgICAgICAgICAgIGNsZWFyU2VsZWN0aW9uLFxuICAgICAgICAgICAgdG9nZ2xlU2VsZWN0QWxsLFxuICAgICAgICAgICAgdG9nZ2xlSXRlbVNlbGVjdGlvbixcbiAgICAgICAgICAgIGlzSXRlbVNlbGVjdGVkLFxuICAgICAgICAgICAgcHJlc2VydmVTZWxlY3Rpb24sXG4gICAgICAgICAgICBnZXRTZWxlY3RlZEl0ZW1zLFxuICAgICAgICAgICAgdXBkYXRlU2VsZWN0QWxsU3RhdGU6IHVwZGF0ZVNlbGVjdEFsbFN0YXRlV3JhcHBlcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0ZSBsb3MgZWxlbWVudG9zIHNlbGVjY2lvbmFkb3MgYSB0cmF2w6lzIGRlbCBFdmVudEVtaXR0ZXIgcHJvcG9yY2lvbmFkb1xuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25TdGF0ZSAtIEVzdGFkbyBkZSBzZWxlY2Npw7NuXG4gICAgICogQHBhcmFtIGFsbERhdGEgLSBUb2RvcyBsb3MgZGF0b3MgZGUgbGEgdGFibGFcbiAgICAgKiBAcGFyYW0gc2VsZWN0YWJsZUVtaXR0ZXIgLSBFdmVudEVtaXR0ZXIgcGFyYSBlbWl0aXIgbGEgc2VsZWNjacOzblxuICAgICAqL1xuICAgIGVtaXRTZWxlY3Rpb248VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgICAgc2VsZWN0aW9uU3RhdGU6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuY3JlYXRlU2VsZWN0aW9uU3RhdGU8VD4+LFxuICAgICAgICBhbGxEYXRhOiBUW10sXG4gICAgICAgIHNlbGVjdGFibGVFbWl0dGVyOiBFdmVudEVtaXR0ZXI8VFtdPlxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gc2VsZWN0aW9uU3RhdGUuZ2V0U2VsZWN0ZWRJdGVtcyhhbGxEYXRhKTtcbiAgICAgICAgc2VsZWN0YWJsZUVtaXR0ZXIuZW1pdChzZWxlY3RlZEl0ZW1zKTtcbiAgICB9XG59XG4iXX0=