@c80/ui 1.0.32 → 1.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/card-level/card-level.component.mjs +34 -5
- package/esm2022/lib/table/index.mjs +7 -1
- package/esm2022/lib/table/table-column-visibility.service.mjs +156 -0
- package/esm2022/lib/table/table-crud-state.service.mjs +165 -0
- package/esm2022/lib/table/table-data-converter.service.mjs +149 -0
- package/esm2022/lib/table/table-data-utils.service.mjs +166 -0
- package/esm2022/lib/table/table-selection.service.mjs +151 -0
- package/esm2022/lib/table/table.component.mjs +59 -500
- package/esm2022/lib/table/table.types.mjs +5 -0
- package/lib/card-level/card-level.component.d.ts +4 -0
- package/lib/table/index.d.ts +6 -0
- package/lib/table/table-column-visibility.service.d.ts +71 -0
- package/lib/table/table-crud-state.service.d.ts +44 -0
- package/lib/table/table-data-converter.service.d.ts +50 -0
- package/lib/table/table-data-utils.service.d.ts +70 -0
- package/lib/table/table-selection.service.d.ts +39 -0
- package/lib/table/table.component.d.ts +14 -99
- package/lib/table/table.types.d.ts +16 -0
- package/package.json +1 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Servicio para conversión y validación de tipos de datos en tablas C80
|
|
5
|
+
*
|
|
6
|
+
* Maneja la conversión entre diferentes tipos de datos y la validación de valores vacíos.
|
|
7
|
+
* Soporta los tipos: string, number, integer, boolean, password, enum
|
|
8
|
+
*/
|
|
9
|
+
export class TableDataConverterService {
|
|
10
|
+
/**
|
|
11
|
+
* Convierte un valor de celda basándose en el tipo de columna o datos de muestra
|
|
12
|
+
* @param value - Valor a convertir
|
|
13
|
+
* @param col - Definición de la columna
|
|
14
|
+
* @param sampleValue - Valor de muestra para inferir el tipo (opcional)
|
|
15
|
+
* @returns Valor convertido al tipo apropiado
|
|
16
|
+
*/
|
|
17
|
+
convertCellValue(value, col, sampleValue) {
|
|
18
|
+
if (col.type === 'boolean')
|
|
19
|
+
return this.toBoolean(value);
|
|
20
|
+
if (col.type === 'number')
|
|
21
|
+
return this.toNumber(value);
|
|
22
|
+
if (col.type === 'integer')
|
|
23
|
+
return this.toInteger(value);
|
|
24
|
+
if (col.type === 'string' || col.type === 'password')
|
|
25
|
+
return this.toStringValue(value);
|
|
26
|
+
// Fallback: usar datos de muestra si están disponibles
|
|
27
|
+
if (sampleValue) {
|
|
28
|
+
if (typeof sampleValue === 'boolean')
|
|
29
|
+
return this.toBoolean(value);
|
|
30
|
+
if (typeof sampleValue === 'number')
|
|
31
|
+
return this.toNumber(value);
|
|
32
|
+
if (typeof sampleValue === 'string')
|
|
33
|
+
return this.toStringValue(value);
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Convierte un valor a boolean usando mejores prácticas
|
|
39
|
+
* @param value - Valor a convertir
|
|
40
|
+
* @returns Valor booleano
|
|
41
|
+
*/
|
|
42
|
+
toBoolean(value) {
|
|
43
|
+
if (typeof value === 'boolean')
|
|
44
|
+
return value;
|
|
45
|
+
if (typeof value === 'string')
|
|
46
|
+
return value.trim().toLowerCase() === 'true' || value.trim() === '1';
|
|
47
|
+
if (typeof value === 'number')
|
|
48
|
+
return value === 1;
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convierte un valor a number usando mejores prácticas
|
|
53
|
+
* @param value - Valor a convertir
|
|
54
|
+
* @returns Número o undefined si no es válido
|
|
55
|
+
*/
|
|
56
|
+
toNumber(value) {
|
|
57
|
+
if (typeof value === 'number')
|
|
58
|
+
return value;
|
|
59
|
+
if (typeof value === 'string') {
|
|
60
|
+
const trimmed = value.trim();
|
|
61
|
+
if (trimmed === '')
|
|
62
|
+
return undefined;
|
|
63
|
+
const num = Number(trimmed);
|
|
64
|
+
return isNaN(num) ? undefined : num;
|
|
65
|
+
}
|
|
66
|
+
if (typeof value === 'boolean')
|
|
67
|
+
return value ? 1 : 0;
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Convierte un valor a integer usando mejores prácticas
|
|
72
|
+
* @param value - Valor a convertir
|
|
73
|
+
* @returns Entero o undefined si no es válido
|
|
74
|
+
*/
|
|
75
|
+
toInteger(value) {
|
|
76
|
+
if (typeof value === 'number')
|
|
77
|
+
return Math.floor(value);
|
|
78
|
+
if (typeof value === 'string') {
|
|
79
|
+
const trimmed = value.trim();
|
|
80
|
+
if (trimmed === '')
|
|
81
|
+
return undefined;
|
|
82
|
+
const num = Number(trimmed);
|
|
83
|
+
return isNaN(num) ? undefined : Math.floor(num);
|
|
84
|
+
}
|
|
85
|
+
if (typeof value === 'boolean')
|
|
86
|
+
return value ? 1 : 0;
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Convierte un valor a string usando mejores prácticas, siempre stringifica objetos
|
|
91
|
+
* @param value - Valor a convertir
|
|
92
|
+
* @returns Cadena de texto
|
|
93
|
+
*/
|
|
94
|
+
toStringValue(value) {
|
|
95
|
+
if (value == null)
|
|
96
|
+
return '';
|
|
97
|
+
if (typeof value === 'string')
|
|
98
|
+
return value;
|
|
99
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
100
|
+
return String(value);
|
|
101
|
+
if (typeof value === 'object') {
|
|
102
|
+
try {
|
|
103
|
+
return JSON.stringify(value);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return '[object Object]';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Para funciones, símbolos, undefined, etc., devolver cadena vacía
|
|
110
|
+
return '';
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Verifica si un valor individual está vacío/nulo
|
|
114
|
+
* @param value - Valor a verificar
|
|
115
|
+
* @returns true si el valor se considera vacío
|
|
116
|
+
*/
|
|
117
|
+
isValueEmpty(value) {
|
|
118
|
+
// Considerar vacío: null, undefined, ''
|
|
119
|
+
if (value === null || value === undefined || value === '') {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
// Para números, 0 se considera como valor válido, no vacío
|
|
123
|
+
if (typeof value === 'number') {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
// Para booleanos, false se considera como valor válido, no vacío
|
|
127
|
+
if (typeof value === 'boolean') {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
// Para arrays vacíos
|
|
131
|
+
if (Array.isArray(value) && value.length === 0) {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
// Para objetos vacíos
|
|
135
|
+
if (typeof value === 'object' && value !== null && Object.keys(value).length === 0) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
141
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataConverterService, providedIn: 'root' });
|
|
142
|
+
}
|
|
143
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataConverterService, decorators: [{
|
|
144
|
+
type: Injectable,
|
|
145
|
+
args: [{
|
|
146
|
+
providedIn: 'root'
|
|
147
|
+
}]
|
|
148
|
+
}] });
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1jb252ZXJ0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS1kYXRhLWNvbnZlcnRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFPLHlCQUF5QjtJQUVsQzs7Ozs7O09BTUc7SUFDSCxnQkFBZ0IsQ0FBQyxLQUFjLEVBQUUsR0FBbUIsRUFBRSxXQUFxQjtRQUN2RSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssVUFBVTtZQUNoRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckMsdURBQXVEO1FBQ3ZELElBQUksV0FBVyxFQUFFLENBQUM7WUFDZCxJQUFJLE9BQU8sV0FBVyxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25FLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUTtnQkFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakUsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRO2dCQUFFLE9B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QUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLEtBQWM7UUFDdkIsd0NBQXdDO1FBQ3hDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsMkRBQTJEO1FBQzNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELGlFQUFpRTtRQUNqRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO3dHQTlIUSx5QkFBeUI7NEdBQXpCLHlCQUF5QixjQUZ0QixNQUFNOzs0RkFFVCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQzgwVGFibGVDb2xEZWYgfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBwYXJhIGNvbnZlcnNpw7NuIHkgdmFsaWRhY2nDs24gZGUgdGlwb3MgZGUgZGF0b3MgZW4gdGFibGFzIEM4MFxuICpcbiAqIE1hbmVqYSBsYSBjb252ZXJzacOzbiBlbnRyZSBkaWZlcmVudGVzIHRpcG9zIGRlIGRhdG9zIHkgbGEgdmFsaWRhY2nDs24gZGUgdmFsb3JlcyB2YWPDrW9zLlxuICogU29wb3J0YSBsb3MgdGlwb3M6IHN0cmluZywgbnVtYmVyLCBpbnRlZ2VyLCBib29sZWFuLCBwYXNzd29yZCwgZW51bVxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlRGF0YUNvbnZlcnRlclNlcnZpY2Uge1xuXG4gICAgLyoqXG4gICAgICogQ29udmllcnRlIHVuIHZhbG9yIGRlIGNlbGRhIGJhc8OhbmRvc2UgZW4gZWwgdGlwbyBkZSBjb2x1bW5hIG8gZGF0b3MgZGUgbXVlc3RyYVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGEgY29udmVydGlyXG4gICAgICogQHBhcmFtIGNvbCAtIERlZmluaWNpw7NuIGRlIGxhIGNvbHVtbmFcbiAgICAgKiBAcGFyYW0gc2FtcGxlVmFsdWUgLSBWYWxvciBkZSBtdWVzdHJhIHBhcmEgaW5mZXJpciBlbCB0aXBvIChvcGNpb25hbClcbiAgICAgKiBAcmV0dXJucyBWYWxvciBjb252ZXJ0aWRvIGFsIHRpcG8gYXByb3BpYWRvXG4gICAgICovXG4gICAgY29udmVydENlbGxWYWx1ZSh2YWx1ZTogdW5rbm93biwgY29sOiBDODBUYWJsZUNvbERlZiwgc2FtcGxlVmFsdWU/OiB1bmtub3duKTogdW5rbm93biB7XG4gICAgICAgIGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdGhpcy50b0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICBpZiAoY29sLnR5cGUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy50b051bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmIChjb2wudHlwZSA9PT0gJ2ludGVnZXInKSByZXR1cm4gdGhpcy50b0ludGVnZXIodmFsdWUpO1xuICAgICAgICBpZiAoY29sLnR5cGUgPT09ICdzdHJpbmcnIHx8IGNvbC50eXBlID09PSAncGFzc3dvcmQnKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmdWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gRmFsbGJhY2s6IHVzYXIgZGF0b3MgZGUgbXVlc3RyYSBzaSBlc3TDoW4gZGlzcG9uaWJsZXNcbiAgICAgICAgaWYgKHNhbXBsZVZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB0aGlzLnRvQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHRoaXMudG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnRvU3RyaW5nVmFsdWUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZpZXJ0ZSB1biB2YWxvciBhIGJvb2xlYW4gdXNhbmRvIG1lam9yZXMgcHLDoWN0aWNhc1xuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGEgY29udmVydGlyXG4gICAgICogQHJldHVybnMgVmFsb3IgYm9vbGVhbm9cbiAgICAgKi9cbiAgICB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHwgdmFsdWUudHJpbSgpID09PSAnMSc7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdmFsdWUgPT09IDE7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252aWVydGUgdW4gdmFsb3IgYSBudW1iZXIgdXNhbmRvIG1lam9yZXMgcHLDoWN0aWNhc1xuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGEgY29udmVydGlyXG4gICAgICogQHJldHVybnMgTsO6bWVybyBvIHVuZGVmaW5lZCBzaSBubyBlcyB2w6FsaWRvXG4gICAgICovXG4gICAgdG9OdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIGlmICh0cmltbWVkID09PSAnJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih0cmltbWVkKTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihudW0pID8gdW5kZWZpbmVkIDogbnVtO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlID8gMSA6IDA7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmllcnRlIHVuIHZhbG9yIGEgaW50ZWdlciB1c2FuZG8gbWVqb3JlcyBwcsOhY3RpY2FzXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVmFsb3IgYSBjb252ZXJ0aXJcbiAgICAgKiBAcmV0dXJucyBFbnRlcm8gbyB1bmRlZmluZWQgc2kgbm8gZXMgdsOhbGlkb1xuICAgICAqL1xuICAgIHRvSW50ZWdlcih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gTWF0aC5mbG9vcih2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRyaW1tZWQgPT09ICcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHRyaW1tZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKG51bSkgPyB1bmRlZmluZWQgOiBNYXRoLmZsb29yKG51bSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWUgPyAxIDogMDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252aWVydGUgdW4gdmFsb3IgYSBzdHJpbmcgdXNhbmRvIG1lam9yZXMgcHLDoWN0aWNhcywgc2llbXByZSBzdHJpbmdpZmljYSBvYmpldG9zXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVmFsb3IgYSBjb252ZXJ0aXJcbiAgICAgKiBAcmV0dXJucyBDYWRlbmEgZGUgdGV4dG9cbiAgICAgKi9cbiAgICB0b1N0cmluZ1ZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiAnJztcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBPYmplY3RdJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJhIGZ1bmNpb25lcywgc8OtbWJvbG9zLCB1bmRlZmluZWQsIGV0Yy4sIGRldm9sdmVyIGNhZGVuYSB2YWPDrWFcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWNhIHNpIHVuIHZhbG9yIGluZGl2aWR1YWwgZXN0w6EgdmFjw61vL251bG9cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWxvciBhIHZlcmlmaWNhclxuICAgICAqIEByZXR1cm5zIHRydWUgc2kgZWwgdmFsb3Igc2UgY29uc2lkZXJhIHZhY8Otb1xuICAgICAqL1xuICAgIGlzVmFsdWVFbXB0eSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICAvLyBDb25zaWRlcmFyIHZhY8OtbzogbnVsbCwgdW5kZWZpbmVkLCAnJ1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyYSBuw7ptZXJvcywgMCBzZSBjb25zaWRlcmEgY29tbyB2YWxvciB2w6FsaWRvLCBubyB2YWPDrW9cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcmEgYm9vbGVhbm9zLCBmYWxzZSBzZSBjb25zaWRlcmEgY29tbyB2YWxvciB2w6FsaWRvLCBubyB2YWPDrW9cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJhIGFycmF5cyB2YWPDrW9zXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyYSBvYmpldG9zIHZhY8Otb3NcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS11dGlscy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLWRhdGEtdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQzs7Ozs7Ozs7R0FRRztBQUlILE1BQU0sT0FBTyxxQkFBcUI7SUFFOUI7Ozs7O09BS0c7SUFDSCxZQUFZLENBQW9DLEdBQU0sRUFBRSxRQUFnQjtRQUNwRSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFRLEdBQStCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLEdBQVEsRUFBRSxRQUFnQjtRQUNyQyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9DLE9BQU8sT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0UsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsS0FBYztRQUMxQiw4QkFBOEI7UUFDOUIsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDZCxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUM7UUFDRCxtRkFBbUY7UUFDbkYsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDbEIs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XG5pbXBvcnQgeyBDODBUYWJsZUNvbERlZiB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgdXRpbGlkYWRlcyBkZSBtYW5pcHVsYWNpw7NuIGRlIGRhdG9zIGVuIHRhYmxhcyBDODBcbiAqXG4gKiBQcm9wb3JjaW9uYSBtw6l0b2RvcyBwYXJhOlxuICogLSBBY2Nlc28gYSB2YWxvcmVzIGRlIGNlbGRhcyAoaW5jbHV5ZW5kbyBwcm9waWVkYWRlcyBhbmlkYWRhcylcbiAqIC0gRm9ybWF0ZW8gZGUgdmFsb3JlcyBwYXJhIGRpc3BsYXlcbiAqIC0gR2VzdGnDs24gZGUgZW51bXMgeSBjb2xvcmVzXG4gKiAtIE9yZGVuYW1pZW50byBkZSBkYXRvc1xuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlRGF0YVV0aWxzU2VydmljZSB7XG5cbiAgICAvKipcbiAgICAgKiBPYnRpZW5lIGVsIHZhbG9yIGRlIHVuYSBjZWxkYSB1c2FuZG8gZWwgYWNjZXNzb3IsIHNvcG9ydGFuZG8gbm90YWNpw7NuIGRlIHB1bnRvIHBhcmEgcHJvcGllZGFkZXMgYW5pZGFkYXNcbiAgICAgKiBAcGFyYW0gcm93IC0gTGEgZmlsYSBkZSBkYXRvc1xuICAgICAqIEBwYXJhbSBhY2Nlc3NvciAtIEVsIGFjY2Vzc29yIGRlIGxhIGNvbHVtbmFcbiAgICAgKiBAcmV0dXJucyBFbCB2YWxvciBkZSBsYSBjZWxkYVxuICAgICAqL1xuICAgIGdldENlbGxWYWx1ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+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=
|