@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.
@@ -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=