@c80/ui 1.0.44 → 1.0.46
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/c80-ui.d.ts +5 -0
- package/esm2022/c80-ui.js +5 -0
- package/esm2022/c80-ui.js.map +1 -0
- package/esm2022/index.js +6 -0
- package/esm2022/index.js.map +1 -0
- package/esm2022/lib/card-level/card-level.component.js +56 -0
- package/esm2022/lib/card-level/card-level.component.js.map +1 -0
- package/esm2022/lib/card-level/card-level.interface.js +2 -0
- package/esm2022/lib/card-level/card-level.interface.js.map +1 -0
- package/esm2022/lib/card-level/index.js +3 -0
- package/esm2022/lib/card-level/index.js.map +1 -0
- package/esm2022/lib/icon/icon.component.js +48 -0
- package/esm2022/lib/icon/icon.component.js.map +1 -0
- package/esm2022/lib/icon/icon.constants.js +237 -0
- package/esm2022/lib/icon/icon.constants.js.map +1 -0
- package/esm2022/lib/icon/icon.types.js +2 -0
- package/esm2022/lib/icon/icon.types.js.map +1 -0
- package/esm2022/lib/icon/icon.utils.js +4 -0
- package/esm2022/lib/icon/icon.utils.js.map +1 -0
- package/esm2022/lib/icon/index.js +4 -0
- package/esm2022/lib/icon/index.js.map +1 -0
- package/esm2022/lib/modal/index.js +3 -0
- package/esm2022/lib/modal/index.js.map +1 -0
- package/esm2022/lib/modal/modal.component.js +86 -0
- package/esm2022/lib/modal/modal.component.js.map +1 -0
- package/esm2022/lib/modal/modal.service.js +83 -0
- package/esm2022/lib/modal/modal.service.js.map +1 -0
- package/esm2022/lib/stat-card/index.js +2 -0
- package/esm2022/lib/stat-card/index.js.map +1 -0
- package/esm2022/lib/stat-card/stat-card.component.js +13 -0
- package/esm2022/lib/stat-card/stat-card.component.js.map +1 -0
- package/esm2022/lib/table/index.js +9 -0
- package/esm2022/lib/table/index.js.map +1 -0
- package/esm2022/lib/table/table-column-visibility.service.js +105 -0
- package/esm2022/lib/table/table-column-visibility.service.js.map +1 -0
- package/esm2022/lib/table/table-crud-state.service.js +115 -0
- package/esm2022/lib/table/table-crud-state.service.js.map +1 -0
- package/esm2022/lib/table/table-data-converter.service.js +145 -0
- package/esm2022/lib/table/table-data-converter.service.js.map +1 -0
- package/esm2022/lib/table/table-data-utils.service.js +193 -0
- package/esm2022/lib/table/table-data-utils.service.js.map +1 -0
- package/esm2022/lib/table/table-selection.service.js +121 -0
- package/esm2022/lib/table/table-selection.service.js.map +1 -0
- package/esm2022/lib/table/table.component.js +413 -0
- package/esm2022/lib/table/table.component.js.map +1 -0
- package/esm2022/lib/table/table.types.js +5 -0
- package/esm2022/lib/table/table.types.js.map +1 -0
- package/esm2022/lib/table/table.utils.js +107 -0
- package/esm2022/lib/table/table.utils.js.map +1 -0
- package/lib/icon/icon.component.d.ts +2 -2
- package/lib/modal/index.d.ts +2 -3
- package/lib/stat-card/stat-card.component.d.ts +2 -2
- package/lib/table/table.component.d.ts +10 -13
- package/package.json +7 -9
- package/esm2022/c80-ui.mjs +0 -5
- package/esm2022/index.mjs +0 -6
- package/esm2022/lib/card-level/card-level.component.mjs +0 -57
- package/esm2022/lib/card-level/card-level.interface.mjs +0 -2
- package/esm2022/lib/card-level/index.mjs +0 -3
- package/esm2022/lib/icon/icon.component.mjs +0 -49
- package/esm2022/lib/icon/icon.constants.mjs +0 -237
- package/esm2022/lib/icon/icon.types.mjs +0 -2
- package/esm2022/lib/icon/icon.utils.mjs +0 -4
- package/esm2022/lib/icon/index.mjs +0 -4
- package/esm2022/lib/modal/index.mjs +0 -3
- package/esm2022/lib/modal/modal.component.mjs +0 -86
- package/esm2022/lib/modal/modal.service.mjs +0 -83
- package/esm2022/lib/stat-card/index.mjs +0 -2
- package/esm2022/lib/stat-card/stat-card.component.mjs +0 -16
- package/esm2022/lib/table/index.mjs +0 -9
- package/esm2022/lib/table/table-column-visibility.service.mjs +0 -105
- package/esm2022/lib/table/table-crud-state.service.mjs +0 -115
- package/esm2022/lib/table/table-data-converter.service.mjs +0 -145
- package/esm2022/lib/table/table-data-utils.service.mjs +0 -193
- package/esm2022/lib/table/table-selection.service.mjs +0 -121
- package/esm2022/lib/table/table.component.mjs +0 -432
- package/esm2022/lib/table/table.types.mjs +0 -5
- package/esm2022/lib/table/table.utils.mjs +0 -107
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import { TableDataConverterService } from './table-data-converter.service';
|
|
3
|
-
import { TableDataUtilsService } from './table-data-utils.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* Servicio para gestionar la lógica de visibilidad de columnas en tablas C80
|
|
7
|
-
*
|
|
8
|
-
* Maneja las reglas complejas de visibilidad basadas en:
|
|
9
|
-
* - Configuración explícita (visible: false)
|
|
10
|
-
* - Ocultación automática (hideIfAllValuesAreNull)
|
|
11
|
-
* - Estado de creación y edición
|
|
12
|
-
*/
|
|
13
|
-
export class TableColumnVisibilityService {
|
|
14
|
-
dataConverter = inject(TableDataConverterService);
|
|
15
|
-
dataUtils = inject(TableDataUtilsService);
|
|
16
|
-
/**
|
|
17
|
-
* Actualiza las keys de columnas visibles basándose en el estado actual
|
|
18
|
-
* @param columns - Definiciones de columnas
|
|
19
|
-
* @param data - Datos actuales de la tabla
|
|
20
|
-
* @param creating - Si está en modo creación
|
|
21
|
-
* @param editing - ID de fila en edición (null si no hay edición)
|
|
22
|
-
* @returns Array de accessors de columnas visibles
|
|
23
|
-
*/
|
|
24
|
-
updateVisibleKeys(columns, data, creating, editing) {
|
|
25
|
-
const visibleColumns = columns.filter(col => this.isColumnVisibleInHeader(col, data, creating, editing));
|
|
26
|
-
return visibleColumns.map(col => col.accessor);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Determina si una columna debe ser visible basándose en su configuración y datos
|
|
30
|
-
* Método unificado que maneja todos los casos de visibilidad
|
|
31
|
-
* @param column - La definición de la columna
|
|
32
|
-
* @param data - Datos actuales de la tabla
|
|
33
|
-
* @param options - Opciones de contexto (creación, edición, fila específica)
|
|
34
|
-
* @returns true si la columna debe ser visible
|
|
35
|
-
*/
|
|
36
|
-
isColumnVisible(column, data, options = {}) {
|
|
37
|
-
// PRIORIDAD 1: Si visible está explícitamente establecido en false, SIEMPRE ocultar
|
|
38
|
-
if (column.visible === false) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
// Si no tiene hideIfAllValuesAreNull, mostrar siempre
|
|
42
|
-
if (!column.hideIfAllValuesAreNull) {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
// PRIORIDAD 2: Para columnas con hideIfAllValuesAreNull, ocultar si el valor es falsy (excepto 0)
|
|
46
|
-
// Esto aplica tanto en modo creación como edición
|
|
47
|
-
// CONTEXTO: Modo creación
|
|
48
|
-
if (options.creating) {
|
|
49
|
-
// En creación, verificar el valor de la fila en creación si existe
|
|
50
|
-
const creatingRow = options.row;
|
|
51
|
-
if (creatingRow) {
|
|
52
|
-
const cellValue = this.dataUtils.getCellValue(creatingRow, column.accessor);
|
|
53
|
-
return !this.dataConverter.isValueEmpty(cellValue);
|
|
54
|
-
}
|
|
55
|
-
// Si no hay fila, ocultar (valor vacío por defecto)
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
// CONTEXTO: Fila en edición
|
|
59
|
-
if (options.editing !== undefined && options.editing !== null) {
|
|
60
|
-
const editingRow = options.row ?? data.find(r => r['id'] === options.editing);
|
|
61
|
-
if (editingRow) {
|
|
62
|
-
const cellValue = this.dataUtils.getCellValue(editingRow, column.accessor);
|
|
63
|
-
return !this.dataConverter.isValueEmpty(cellValue);
|
|
64
|
-
}
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
// CONTEXTO: Vista normal - verificar si todos los valores están vacíos
|
|
68
|
-
return !this.areAllColumnValuesEmpty(column, data);
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Determina si una columna debe ser visible en los headers
|
|
72
|
-
* Wrapper para mantener compatibilidad con API existente
|
|
73
|
-
*/
|
|
74
|
-
isColumnVisibleInHeader(column, data, creating, editing) {
|
|
75
|
-
return this.isColumnVisible(column, data, { creating, editing });
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Determina si una columna debe ser visible en una fila específica
|
|
79
|
-
* Wrapper para mantener compatibilidad con API existente
|
|
80
|
-
*/
|
|
81
|
-
isColumnVisibleForRow(column, row, data, editing) {
|
|
82
|
-
return this.isColumnVisible(column, data, { editing, row });
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Verifica si todos los valores de una columna están vacíos/nulos
|
|
86
|
-
*/
|
|
87
|
-
areAllColumnValuesEmpty(column, data) {
|
|
88
|
-
if (data.length === 0) {
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
return data.every(row => {
|
|
92
|
-
const value = this.dataUtils.getCellValue(row, column.accessor);
|
|
93
|
-
return this.dataConverter.isValueEmpty(value);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableColumnVisibilityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
97
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableColumnVisibilityService, providedIn: 'root' });
|
|
98
|
-
}
|
|
99
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableColumnVisibilityService, decorators: [{
|
|
100
|
-
type: Injectable,
|
|
101
|
-
args: [{
|
|
102
|
-
providedIn: 'root'
|
|
103
|
-
}]
|
|
104
|
-
}] });
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29sdW1uLXZpc2liaWxpdHkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS1jb2x1bW4tdmlzaWJpbGl0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVuRTs7Ozs7OztHQU9HO0FBSUgsTUFBTSxPQUFPLDRCQUE0QjtJQUV0QixhQUFhLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDbEQsU0FBUyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRTNEOzs7Ozs7O09BT0c7SUFDSCxpQkFBaUIsQ0FDZixPQUF5QixFQUN6QixJQUFTLEVBQ1QsUUFBaUIsRUFDakIsT0FBc0I7UUFFdEIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUMxQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQzNELENBQUM7UUFDRixPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxlQUFlLENBQ2IsTUFBc0IsRUFDdEIsSUFBUyxFQUNULFVBS0ksRUFBRTtRQUVOLG9GQUFvRjtRQUNwRixJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDN0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxrR0FBa0c7UUFDbEcsa0RBQWtEO1FBRWxELDBCQUEwQjtRQUMxQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixtRUFBbUU7WUFDbkUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoQyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1RSxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELG9EQUFvRDtZQUNwRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzlELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUUsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMzRSxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCLENBQ3JCLE1BQXNCLEVBQ3RCLElBQVMsRUFDVCxRQUFpQixFQUNqQixPQUFzQjtRQUV0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7O09BR0c7SUFDSCxxQkFBcUIsQ0FDbkIsTUFBc0IsRUFDdEIsR0FBTSxFQUNOLElBQVMsRUFDVCxPQUFzQjtRQUV0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNLLHVCQUF1QixDQUM3QixNQUFzQixFQUN0QixJQUFTO1FBRVQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTNIVSw0QkFBNEI7NEdBQTVCLDRCQUE0QixjQUYzQixNQUFNOzs0RkFFUCw0QkFBNEI7a0JBSHhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDODBUYWJsZUNvbERlZiB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgVGFibGVEYXRhQ29udmVydGVyU2VydmljZSB9IGZyb20gJy4vdGFibGUtZGF0YS1jb252ZXJ0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZURhdGFVdGlsc1NlcnZpY2UgfSBmcm9tICcuL3RhYmxlLWRhdGEtdXRpbHMuc2VydmljZSc7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBnZXN0aW9uYXIgbGEgbMOzZ2ljYSBkZSB2aXNpYmlsaWRhZCBkZSBjb2x1bW5hcyBlbiB0YWJsYXMgQzgwXG4gKlxuICogTWFuZWphIGxhcyByZWdsYXMgY29tcGxlamFzIGRlIHZpc2liaWxpZGFkIGJhc2FkYXMgZW46XG4gKiAtIENvbmZpZ3VyYWNpw7NuIGV4cGzDrWNpdGEgKHZpc2libGU6IGZhbHNlKVxuICogLSBPY3VsdGFjacOzbiBhdXRvbcOhdGljYSAoaGlkZUlmQWxsVmFsdWVzQXJlTnVsbClcbiAqIC0gRXN0YWRvIGRlIGNyZWFjacOzbiB5IGVkaWNpw7NuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29sdW1uVmlzaWJpbGl0eVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YUNvbnZlcnRlciA9IGluamVjdChUYWJsZURhdGFDb252ZXJ0ZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhVXRpbHMgPSBpbmplY3QoVGFibGVEYXRhVXRpbHNTZXJ2aWNlKTtcblxuICAvKipcbiAgICogQWN0dWFsaXphIGxhcyBrZXlzIGRlIGNvbHVtbmFzIHZpc2libGVzIGJhc8OhbmRvc2UgZW4gZWwgZXN0YWRvIGFjdHVhbFxuICAgKiBAcGFyYW0gY29sdW1ucyAtIERlZmluaWNpb25lcyBkZSBjb2x1bW5hc1xuICAgKiBAcGFyYW0gZGF0YSAtIERhdG9zIGFjdHVhbGVzIGRlIGxhIHRhYmxhXG4gICAqIEBwYXJhbSBjcmVhdGluZyAtIFNpIGVzdMOhIGVuIG1vZG8gY3JlYWNpw7NuXG4gICAqIEBwYXJhbSBlZGl0aW5nIC0gSUQgZGUgZmlsYSBlbiBlZGljacOzbiAobnVsbCBzaSBubyBoYXkgZWRpY2nDs24pXG4gICAqIEByZXR1cm5zIEFycmF5IGRlIGFjY2Vzc29ycyBkZSBjb2x1bW5hcyB2aXNpYmxlc1xuICAgKi9cbiAgdXBkYXRlVmlzaWJsZUtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLFxuICAgIGRhdGE6IFRbXSxcbiAgICBjcmVhdGluZzogYm9vbGVhbixcbiAgICBlZGl0aW5nOiBzdHJpbmcgfCBudWxsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGNvbCA9PlxuICAgICAgdGhpcy5pc0NvbHVtblZpc2libGVJbkhlYWRlcihjb2wsIGRhdGEsIGNyZWF0aW5nLCBlZGl0aW5nKVxuICAgICk7XG4gICAgcmV0dXJuIHZpc2libGVDb2x1bW5zLm1hcChjb2wgPT4gY29sLmFjY2Vzc29yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmEgc2kgdW5hIGNvbHVtbmEgZGViZSBzZXIgdmlzaWJsZSBiYXPDoW5kb3NlIGVuIHN1IGNvbmZpZ3VyYWNpw7NuIHkgZGF0b3NcbiAgICogTcOpdG9kbyB1bmlmaWNhZG8gcXVlIG1hbmVqYSB0b2RvcyBsb3MgY2Fzb3MgZGUgdmlzaWJpbGlkYWRcbiAgICogQHBhcmFtIGNvbHVtbiAtIExhIGRlZmluaWNpw7NuIGRlIGxhIGNvbHVtbmFcbiAgICogQHBhcmFtIGRhdGEgLSBEYXRvcyBhY3R1YWxlcyBkZSBsYSB0YWJsYVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wY2lvbmVzIGRlIGNvbnRleHRvIChjcmVhY2nDs24sIGVkaWNpw7NuLCBmaWxhIGVzcGVjw61maWNhKVxuICAgKiBAcmV0dXJucyB0cnVlIHNpIGxhIGNvbHVtbmEgZGViZSBzZXIgdmlzaWJsZVxuICAgKi9cbiAgaXNDb2x1bW5WaXNpYmxlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgY29sdW1uOiBDODBUYWJsZUNvbERlZixcbiAgICBkYXRhOiBUW10sXG4gICAgb3B0aW9uczoge1xuICAgICAgZm9yY2VTaG93SW5DcmVhdGlvbj86IGJvb2xlYW47XG4gICAgICBjcmVhdGluZz86IGJvb2xlYW47XG4gICAgICBlZGl0aW5nPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHJvdz86IFQ7XG4gICAgfSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIFBSSU9SSURBRCAxOiBTaSB2aXNpYmxlIGVzdMOhIGV4cGzDrWNpdGFtZW50ZSBlc3RhYmxlY2lkbyBlbiBmYWxzZSwgU0lFTVBSRSBvY3VsdGFyXG4gICAgaWYgKGNvbHVtbi52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNpIG5vIHRpZW5lIGhpZGVJZkFsbFZhbHVlc0FyZU51bGwsIG1vc3RyYXIgc2llbXByZVxuICAgIGlmICghY29sdW1uLmhpZGVJZkFsbFZhbHVlc0FyZU51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFBSSU9SSURBRCAyOiBQYXJhIGNvbHVtbmFzIGNvbiBoaWRlSWZBbGxWYWx1ZXNBcmVOdWxsLCBvY3VsdGFyIHNpIGVsIHZhbG9yIGVzIGZhbHN5IChleGNlcHRvIDApXG4gICAgLy8gRXN0byBhcGxpY2EgdGFudG8gZW4gbW9kbyBjcmVhY2nDs24gY29tbyBlZGljacOzblxuXG4gICAgLy8gQ09OVEVYVE86IE1vZG8gY3JlYWNpw7NuXG4gICAgaWYgKG9wdGlvbnMuY3JlYXRpbmcpIHtcbiAgICAgIC8vIEVuIGNyZWFjacOzbiwgdmVyaWZpY2FyIGVsIHZhbG9yIGRlIGxhIGZpbGEgZW4gY3JlYWNpw7NuIHNpIGV4aXN0ZVxuICAgICAgY29uc3QgY3JlYXRpbmdSb3cgPSBvcHRpb25zLnJvdztcbiAgICAgIGlmIChjcmVhdGluZ1Jvdykge1xuICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSB0aGlzLmRhdGFVdGlscy5nZXRDZWxsVmFsdWUoY3JlYXRpbmdSb3csIGNvbHVtbi5hY2Nlc3Nvcik7XG4gICAgICAgIHJldHVybiAhdGhpcy5kYXRhQ29udmVydGVyLmlzVmFsdWVFbXB0eShjZWxsVmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8gU2kgbm8gaGF5IGZpbGEsIG9jdWx0YXIgKHZhbG9yIHZhY8OtbyBwb3IgZGVmZWN0bylcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDT05URVhUTzogRmlsYSBlbiBlZGljacOzblxuICAgIGlmIChvcHRpb25zLmVkaXRpbmcgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmVkaXRpbmcgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGVkaXRpbmdSb3cgPSBvcHRpb25zLnJvdyA/PyBkYXRhLmZpbmQociA9PiByWydpZCddID09PSBvcHRpb25zLmVkaXRpbmcpO1xuICAgICAgaWYgKGVkaXRpbmdSb3cpIHtcbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gdGhpcy5kYXRhVXRpbHMuZ2V0Q2VsbFZhbHVlKGVkaXRpbmdSb3csIGNvbHVtbi5hY2Nlc3Nvcik7XG4gICAgICAgIHJldHVybiAhdGhpcy5kYXRhQ29udmVydGVyLmlzVmFsdWVFbXB0eShjZWxsVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENPTlRFWFRPOiBWaXN0YSBub3JtYWwgLSB2ZXJpZmljYXIgc2kgdG9kb3MgbG9zIHZhbG9yZXMgZXN0w6FuIHZhY8Otb3NcbiAgICByZXR1cm4gIXRoaXMuYXJlQWxsQ29sdW1uVmFsdWVzRW1wdHkoY29sdW1uLCBkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmEgc2kgdW5hIGNvbHVtbmEgZGViZSBzZXIgdmlzaWJsZSBlbiBsb3MgaGVhZGVyc1xuICAgKiBXcmFwcGVyIHBhcmEgbWFudGVuZXIgY29tcGF0aWJpbGlkYWQgY29uIEFQSSBleGlzdGVudGVcbiAgICovXG4gIGlzQ29sdW1uVmlzaWJsZUluSGVhZGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgY29sdW1uOiBDODBUYWJsZUNvbERlZixcbiAgICBkYXRhOiBUW10sXG4gICAgY3JlYXRpbmc6IGJvb2xlYW4sXG4gICAgZWRpdGluZzogc3RyaW5nIHwgbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbHVtblZpc2libGUoY29sdW1uLCBkYXRhLCB7IGNyZWF0aW5nLCBlZGl0aW5nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluYSBzaSB1bmEgY29sdW1uYSBkZWJlIHNlciB2aXNpYmxlIGVuIHVuYSBmaWxhIGVzcGVjw61maWNhXG4gICAqIFdyYXBwZXIgcGFyYSBtYW50ZW5lciBjb21wYXRpYmlsaWRhZCBjb24gQVBJIGV4aXN0ZW50ZVxuICAgKi9cbiAgaXNDb2x1bW5WaXNpYmxlRm9yUm93PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgY29sdW1uOiBDODBUYWJsZUNvbERlZixcbiAgICByb3c6IFQsXG4gICAgZGF0YTogVFtdLFxuICAgIGVkaXRpbmc6IHN0cmluZyB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb2x1bW5WaXNpYmxlKGNvbHVtbiwgZGF0YSwgeyBlZGl0aW5nLCByb3cgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgdG9kb3MgbG9zIHZhbG9yZXMgZGUgdW5hIGNvbHVtbmEgZXN0w6FuIHZhY8Otb3MvbnVsb3NcbiAgICovXG4gIHByaXZhdGUgYXJlQWxsQ29sdW1uVmFsdWVzRW1wdHk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICBjb2x1bW46IEM4MFRhYmxlQ29sRGVmLFxuICAgIGRhdGE6IFRbXVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhLmV2ZXJ5KHJvdyA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVV0aWxzLmdldENlbGxWYWx1ZShyb3csIGNvbHVtbi5hY2Nlc3Nvcik7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhQ29udmVydGVyLmlzVmFsdWVFbXB0eSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { Injectable, signal, inject } from '@angular/core';
|
|
2
|
-
import { TableColumnVisibilityService } from './table-column-visibility.service';
|
|
3
|
-
import { TableDataUtilsService } from './table-data-utils.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* Servicio para gestionar el estado CRUD (Crear, Leer, Actualizar, Eliminar) en tablas C80
|
|
7
|
-
*
|
|
8
|
-
* Maneja:
|
|
9
|
-
* - Estado de creación y edición
|
|
10
|
-
* - Gestión de datos temporales (newRow, editRow)
|
|
11
|
-
* - Aplicación de valores dinámicos
|
|
12
|
-
* - Validación y conversión de datos
|
|
13
|
-
*/
|
|
14
|
-
export class TableCrudStateService {
|
|
15
|
-
visibilityService = inject(TableColumnVisibilityService);
|
|
16
|
-
dataUtils = inject(TableDataUtilsService);
|
|
17
|
-
/**
|
|
18
|
-
* Filtra columnas visibles y editables
|
|
19
|
-
*/
|
|
20
|
-
getEditableColumns(columns, data, includeHiddenIfNull) {
|
|
21
|
-
return columns.filter(col => this.visibilityService.isColumnVisible(col, data, { forceShowInCreation: includeHiddenIfNull }) && !col.readOnly);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Inicializa row para creación con valores por defecto
|
|
25
|
-
*/
|
|
26
|
-
initializeNewRow(columns, data) {
|
|
27
|
-
const row = {};
|
|
28
|
-
for (const col of this.getEditableColumns(columns, data, true)) {
|
|
29
|
-
const defaultValue = col.default === undefined ? '' : col.default;
|
|
30
|
-
row[col.accessor] = defaultValue;
|
|
31
|
-
}
|
|
32
|
-
return row;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Inicializa row para edición con valores actuales
|
|
36
|
-
*/
|
|
37
|
-
initializeEditRow(row, columns, data) {
|
|
38
|
-
const edit = {};
|
|
39
|
-
for (const col of this.getEditableColumns(columns, data, true)) {
|
|
40
|
-
const value = this.dataUtils.getCellValue(row, col.accessor);
|
|
41
|
-
edit[col.accessor] = value;
|
|
42
|
-
}
|
|
43
|
-
return edit;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Inicializa el estado CRUD para una nueva tabla
|
|
47
|
-
* @returns Objeto con signals y métodos para gestión CRUD
|
|
48
|
-
*/
|
|
49
|
-
createCrudState() {
|
|
50
|
-
const creating = signal(false);
|
|
51
|
-
const newRow = signal(null);
|
|
52
|
-
const editing = signal(null);
|
|
53
|
-
const editRow = signal(null);
|
|
54
|
-
return {
|
|
55
|
-
creating: creating.asReadonly(),
|
|
56
|
-
newRow: newRow.asReadonly(),
|
|
57
|
-
editing: editing.asReadonly(),
|
|
58
|
-
editRow: editRow.asReadonly(),
|
|
59
|
-
startCreate: (columns, data) => this.startCreate(creating, newRow, columns, data),
|
|
60
|
-
cancelCreate: () => this.cancelCreate(creating, newRow),
|
|
61
|
-
updateNewRow: (key, value) => this.updateRow(newRow, key, value),
|
|
62
|
-
startEdit: (row, columns, data) => this.startEdit({ editing, editRow }, row, columns, data),
|
|
63
|
-
cancelEdit: () => this.cancelEdit(editing, editRow),
|
|
64
|
-
updateEditRow: (key, value) => this.updateRow(editRow, key, value),
|
|
65
|
-
applyInputValues: (partialValues) => this.applyInputValues({ creating, newRow, editing, editRow }, partialValues),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
startCreate(creating, newRow, columns, data) {
|
|
69
|
-
creating.set(true);
|
|
70
|
-
newRow.set(this.initializeNewRow(columns, data));
|
|
71
|
-
}
|
|
72
|
-
cancelCreate(creating, newRow) {
|
|
73
|
-
creating.set(false);
|
|
74
|
-
newRow.set(null);
|
|
75
|
-
}
|
|
76
|
-
updateRow(rowSignal, key, value) {
|
|
77
|
-
const current = rowSignal();
|
|
78
|
-
if (!current)
|
|
79
|
-
return;
|
|
80
|
-
rowSignal.set({ ...current, [key]: value });
|
|
81
|
-
}
|
|
82
|
-
startEdit(signals, row, columns, data) {
|
|
83
|
-
signals.editing.set(row['id']);
|
|
84
|
-
signals.editRow.set(this.initializeEditRow(row, columns, data));
|
|
85
|
-
}
|
|
86
|
-
cancelEdit(editing, editRow) {
|
|
87
|
-
editing.set(null);
|
|
88
|
-
editRow.set(null);
|
|
89
|
-
}
|
|
90
|
-
applyInputValues(signals, partialValues) {
|
|
91
|
-
if (!signals.creating() && signals.editing() === null)
|
|
92
|
-
return;
|
|
93
|
-
if (signals.creating()) {
|
|
94
|
-
const currentRow = signals.newRow();
|
|
95
|
-
if (currentRow) {
|
|
96
|
-
signals.newRow.set({ ...currentRow, ...partialValues });
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
const currentEditRow = signals.editRow();
|
|
101
|
-
if (currentEditRow) {
|
|
102
|
-
signals.editRow.set({ ...currentEditRow, ...partialValues });
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableCrudStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
107
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableCrudStateService, providedIn: 'root' });
|
|
108
|
-
}
|
|
109
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableCrudStateService, decorators: [{
|
|
110
|
-
type: Injectable,
|
|
111
|
-
args: [{
|
|
112
|
-
providedIn: 'root'
|
|
113
|
-
}]
|
|
114
|
-
}] });
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY3J1ZC1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLWNydWQtc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRW5FOzs7Ozs7OztHQVFHO0FBSUgsTUFBTSxPQUFPLHFCQUFxQjtJQUVmLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3pELFNBQVMsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUUzRDs7T0FFRztJQUNLLGtCQUFrQixDQUN4QixPQUF5QixFQUN6QixJQUFTLEVBQ1QsbUJBQTRCO1FBRTVCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FDbkIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUN4SCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQ3RCLE9BQXlCLEVBQ3pCLElBQVM7UUFFVCxNQUFNLEdBQUcsR0FBZSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEtBQUssU0FBUyxD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LENBQUM7Z0JBQ2YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxjQUFjLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzt3R0FqSlUscUJBQXFCOzRHQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDODBUYWJsZUNvbERlZiB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5WaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4vdGFibGUtY29sdW1uLXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZURhdGFVdGlsc1NlcnZpY2UgfSBmcm9tICcuL3RhYmxlLWRhdGEtdXRpbHMuc2VydmljZSc7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBnZXN0aW9uYXIgZWwgZXN0YWRvIENSVUQgKENyZWFyLCBMZWVyLCBBY3R1YWxpemFyLCBFbGltaW5hcikgZW4gdGFibGFzIEM4MFxuICpcbiAqIE1hbmVqYTpcbiAqIC0gRXN0YWRvIGRlIGNyZWFjacOzbiB5IGVkaWNpw7NuXG4gKiAtIEdlc3Rpw7NuIGRlIGRhdG9zIHRlbXBvcmFsZXMgKG5ld1JvdywgZWRpdFJvdylcbiAqIC0gQXBsaWNhY2nDs24gZGUgdmFsb3JlcyBkaW7DoW1pY29zXG4gKiAtIFZhbGlkYWNpw7NuIHkgY29udmVyc2nDs24gZGUgZGF0b3NcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDcnVkU3RhdGVTZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZpc2liaWxpdHlTZXJ2aWNlID0gaW5qZWN0KFRhYmxlQ29sdW1uVmlzaWJpbGl0eVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFVdGlscyA9IGluamVjdChUYWJsZURhdGFVdGlsc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBGaWx0cmEgY29sdW1uYXMgdmlzaWJsZXMgeSBlZGl0YWJsZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0RWRpdGFibGVDb2x1bW5zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgY29sdW1uczogQzgwVGFibGVDb2xEZWZbXSxcbiAgICBkYXRhOiBUW10sXG4gICAgaW5jbHVkZUhpZGRlbklmTnVsbDogYm9vbGVhblxuICApOiBDODBUYWJsZUNvbERlZltdIHtcbiAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoXG4gICAgICBjb2wgPT4gdGhpcy52aXNpYmlsaXR5U2VydmljZS5pc0NvbHVtblZpc2libGUoY29sLCBkYXRhLCB7IGZvcmNlU2hvd0luQ3JlYXRpb246IGluY2x1ZGVIaWRkZW5JZk51bGwgfSkgJiYgIWNvbC5yZWFkT25seVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSByb3cgcGFyYSBjcmVhY2nDs24gY29uIHZhbG9yZXMgcG9yIGRlZmVjdG9cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZU5ld1JvdzxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10sXG4gICAgZGF0YTogVFtdXG4gICk6IFBhcnRpYWw8VD4ge1xuICAgIGNvbnN0IHJvdzogUGFydGlhbDxUPiA9IHt9O1xuICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuZ2V0RWRpdGFibGVDb2x1bW5zKGNvbHVtbnMsIGRhdGEsIHRydWUpKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBjb2wuZGVmYXVsdCA9PT0gdW5kZWZpbmVkID8gJycgOiBjb2wuZGVmYXVsdDtcbiAgICAgIChyb3cgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByb3c7XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSByb3cgcGFyYSBlZGljacOzbiBjb24gdmFsb3JlcyBhY3R1YWxlc1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplRWRpdFJvdzxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIHJvdzogVCxcbiAgICBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLFxuICAgIGRhdGE6IFRbXVxuICApOiBQYXJ0aWFsPFQ+IHtcbiAgICBjb25zdCBlZGl0OiBQYXJ0aWFsPFQ+ID0ge307XG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5nZXRFZGl0YWJsZUNvbHVtbnMoY29sdW1ucywgZGF0YSwgdHJ1ZSkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVXRpbHMuZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKTtcbiAgICAgIChlZGl0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtjb2wuYWNjZXNzb3JdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBlZGl0O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaWNpYWxpemEgZWwgZXN0YWRvIENSVUQgcGFyYSB1bmEgbnVldmEgdGFibGFcbiAgICogQHJldHVybnMgT2JqZXRvIGNvbiBzaWduYWxzIHkgbcOpdG9kb3MgcGFyYSBnZXN0acOzbiBDUlVEXG4gICAqL1xuICBjcmVhdGVDcnVkU3RhdGU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpIHtcbiAgICBjb25zdCBjcmVhdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gICAgY29uc3QgbmV3Um93ID0gc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPihudWxsKTtcbiAgICBjb25zdCBlZGl0aW5nID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAgIGNvbnN0IGVkaXRSb3cgPSBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+KG51bGwpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0aW5nOiBjcmVhdGluZy5hc1JlYWRvbmx5KCksXG4gICAgICBuZXdSb3c6IG5ld1Jvdy5hc1JlYWRvbmx5KCksXG4gICAgICBlZGl0aW5nOiBlZGl0aW5nLmFzUmVhZG9ubHkoKSxcbiAgICAgIGVkaXRSb3c6IGVkaXRSb3cuYXNSZWFkb25seSgpLFxuICAgICAgc3RhcnRDcmVhdGU6IChjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLCBkYXRhOiBUW10pID0+IHRoaXMuc3RhcnRDcmVhdGUoY3JlYXRpbmcsIG5ld1JvdywgY29sdW1ucywgZGF0YSksXG4gICAgICBjYW5jZWxDcmVhdGU6ICgpID0+IHRoaXMuY2FuY2VsQ3JlYXRlKGNyZWF0aW5nLCBuZXdSb3cpLFxuICAgICAgdXBkYXRlTmV3Um93OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB0aGlzLnVwZGF0ZVJvdyhuZXdSb3csIGtleSwgdmFsdWUpLFxuICAgICAgc3RhcnRFZGl0OiAocm93OiBULCBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLCBkYXRhOiBUW10pID0+IHRoaXMuc3RhcnRFZGl0KHsgZWRpdGluZywgZWRpdFJvdyB9LCByb3csIGNvbHVtbnMsIGRhdGEpLFxuICAgICAgY2FuY2VsRWRpdDogKCkgPT4gdGhpcy5jYW5jZWxFZGl0KGVkaXRpbmcsIGVkaXRSb3cpLFxuICAgICAgdXBkYXRlRWRpdFJvdzogKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4gdGhpcy51cGRhdGVSb3coZWRpdFJvdywga2V5LCB2YWx1ZSksXG4gICAgICBhcHBseUlucHV0VmFsdWVzOiAocGFydGlhbFZhbHVlczogUGFydGlhbDxUPikgPT4gdGhpcy5hcHBseUlucHV0VmFsdWVzKHsgY3JlYXRpbmcsIG5ld1JvdywgZWRpdGluZywgZWRpdFJvdyB9LCBwYXJ0aWFsVmFsdWVzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENyZWF0ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIGNyZWF0aW5nOiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8Ym9vbGVhbj4+LFxuICAgIG5ld1JvdzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj4sXG4gICAgY29sdW1uczogQzgwVGFibGVDb2xEZWZbXSxcbiAgICBkYXRhOiBUW11cbiAgKTogdm9pZCB7XG4gICAgY3JlYXRpbmcuc2V0KHRydWUpO1xuICAgIG5ld1Jvdy5zZXQodGhpcy5pbml0aWFsaXplTmV3Um93KGNvbHVtbnMsIGRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsQ3JlYXRlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgY3JlYXRpbmc6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxib29sZWFuPj4sXG4gICAgbmV3Um93OiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+PlxuICApOiB2b2lkIHtcbiAgICBjcmVhdGluZy5zZXQoZmFsc2UpO1xuICAgIG5ld1Jvdy5zZXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVJvdzxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIHJvd1NpZ25hbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd25cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHJvd1NpZ25hbCgpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIHJvd1NpZ25hbC5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogdmFsdWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RWRpdDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIHNpZ25hbHM6IHtcbiAgICAgIGVkaXRpbmc6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxzdHJpbmcgfCBudWxsPj47XG4gICAgICBlZGl0Um93OiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+PjtcbiAgICB9LFxuICAgIHJvdzogVCxcbiAgICBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLFxuICAgIGRhdGE6IFRbXVxuICApOiB2b2lkIHtcbiAgICBzaWduYWxzLmVkaXRpbmcuc2V0KHJvd1snaWQnXSBhcyBzdHJpbmcpO1xuICAgIHNpZ25hbHMuZWRpdFJvdy5zZXQodGhpcy5pbml0aWFsaXplRWRpdFJvdyhyb3csIGNvbHVtbnMsIGRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsRWRpdDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIGVkaXRpbmc6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxzdHJpbmcgfCBudWxsPj4sXG4gICAgZWRpdFJvdzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj5cbiAgKTogdm9pZCB7XG4gICAgZWRpdGluZy5zZXQobnVsbCk7XG4gICAgZWRpdFJvdy5zZXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5wdXRWYWx1ZXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICBzaWduYWxzOiB7XG4gICAgICBjcmVhdGluZzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPGJvb2xlYW4+PjtcbiAgICAgIG5ld1JvdzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj47XG4gICAgICBlZGl0aW5nOiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8c3RyaW5nIHwgbnVsbD4+O1xuICAgICAgZWRpdFJvdzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj47XG4gICAgfSxcbiAgICBwYXJ0aWFsVmFsdWVzOiBQYXJ0aWFsPFQ+XG4gICk6IHZvaWQge1xuICAgIGlmICghc2lnbmFscy5jcmVhdGluZygpICYmIHNpZ25hbHMuZWRpdGluZygpID09PSBudWxsKSByZXR1cm47XG5cbiAgICBpZiAoc2lnbmFscy5jcmVhdGluZygpKSB7XG4gICAgICBjb25zdCBjdXJyZW50Um93ID0gc2lnbmFscy5uZXdSb3coKTtcbiAgICAgIGlmIChjdXJyZW50Um93KSB7XG4gICAgICAgIHNpZ25hbHMubmV3Um93LnNldCh7IC4uLmN1cnJlbnRSb3csIC4uLnBhcnRpYWxWYWx1ZXMgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFZGl0Um93ID0gc2lnbmFscy5lZGl0Um93KCk7XG4gICAgICBpZiAoY3VycmVudEVkaXRSb3cpIHtcbiAgICAgICAgc2lnbmFscy5lZGl0Um93LnNldCh7IC4uLmN1cnJlbnRFZGl0Um93LCAuLi5wYXJ0aWFsVmFsdWVzIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1,145 +0,0 @@
|
|
|
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 Number.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 Number.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 y booleanos, siempre son valores válidos
|
|
123
|
-
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
// Para arrays vacíos
|
|
127
|
-
if (Array.isArray(value)) {
|
|
128
|
-
return value.length === 0;
|
|
129
|
-
}
|
|
130
|
-
// Para objetos vacíos
|
|
131
|
-
if (typeof value === 'object' && value !== null) {
|
|
132
|
-
return Object.keys(value).length === 0;
|
|
133
|
-
}
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
137
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataConverterService, providedIn: 'root' });
|
|
138
|
-
}
|
|
139
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataConverterService, decorators: [{
|
|
140
|
-
type: Injectable,
|
|
141
|
-
args: [{
|
|
142
|
-
providedIn: 'root'
|
|
143
|
-
}]
|
|
144
|
-
}] });
|
|
145
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1jb252ZXJ0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS1kYXRhLWNvbnZlcnRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFPLHlCQUF5QjtJQUVsQzs7Ozs7O09BTUc7SUFDSCxnQkFBZ0IsQ0FBQyxLQUFjLEVBQUUsR0FBbUIsRUFBRSxXQUFxQjtRQUN2RSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssVUFBVTtZQUNoRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckMsdURBQXVEO1FBQ3ZELElBQUksV0FBVyxFQUFFLENBQUM7WUFDZCxJQUFJLE9BQU8sV0FBVyxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25FLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUTtnQkFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakUsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRO2dCQUFFLE9B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bUVBQW1FO1FBQ25FLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsS0FBYztRQUN2Qix3Q0FBd0M7UUFDeEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3hELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzlDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO3dHQXpIUSx5QkFBeUI7NEdBQXpCLHlCQUF5QixjQUZ0QixNQUFNOzs0RkFFVCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQzgwVGFibGVDb2xEZWYgfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBwYXJhIGNvbnZlcnNpw7NuIHkgdmFsaWRhY2nDs24gZGUgdGlwb3MgZGUgZGF0b3MgZW4gdGFibGFzIEM4MFxuICpcbiAqIE1hbmVqYSBsYSBjb252ZXJzacOzbiBlbnRyZSBkaWZlcmVudGVzIHRpcG9zIGRlIGRhdG9zIHkgbGEgdmFsaWRhY2nDs24gZGUgdmFsb3JlcyB2YWPDrW9zLlxuICogU29wb3J0YSBsb3MgdGlwb3M6IHN0cmluZywgbnVtYmVyLCBpbnRlZ2VyLCBib29sZWFuLCBwYXNzd29yZCwgZW51bVxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlRGF0YUNvbnZlcnRlclNlcnZpY2Uge1xuXG4gICAgLyoqXG4gICAgICogQ29udmllcnRlIHVuIHZhbG9yIGRlIGNlbGRhIGJhc8OhbmRvc2UgZW4gZWwgdGlwbyBkZSBjb2x1bW5hIG8gZGF0b3MgZGUgbXVlc3RyYVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGEgY29udmVydGlyXG4gICAgICogQHBhcmFtIGNvbCAtIERlZmluaWNpw7NuIGRlIGxhIGNvbHVtbmFcbiAgICAgKiBAcGFyYW0gc2FtcGxlVmFsdWUgLSBWYWxvciBkZSBtdWVzdHJhIHBhcmEgaW5mZXJpciBlbCB0aXBvIChvcGNpb25hbClcbiAgICAgKiBAcmV0dXJucyBWYWxvciBjb252ZXJ0aWRvIGFsIHRpcG8gYXByb3BpYWRvXG4gICAgICovXG4gICAgY29udmVydENlbGxWYWx1ZSh2YWx1ZTogdW5rbm93biwgY29sOiBDODBUYWJsZUNvbERlZiwgc2FtcGxlVmFsdWU/OiB1bmtub3duKTogdW5rbm93biB7XG4gICAgICAgIGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdGhpcy50b0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICBpZiAoY29sLnR5cGUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy50b051bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmIChjb2wudHlwZSA9PT0gJ2ludGVnZXInKSByZXR1cm4gdGhpcy50b0ludGVnZXIodmFsdWUpO1xuICAgICAgICBpZiAoY29sLnR5cGUgPT09ICdzdHJpbmcnIHx8IGNvbC50eXBlID09PSAncGFzc3dvcmQnKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmdWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gRmFsbGJhY2s6IHVzYXIgZGF0b3MgZGUgbXVlc3RyYSBzaSBlc3TDoW4gZGlzcG9uaWJsZXNcbiAgICAgICAgaWYgKHNhbXBsZVZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB0aGlzLnRvQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHRoaXMudG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnRvU3RyaW5nVmFsdWUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZpZXJ0ZSB1biB2YWxvciBhIGJvb2xlYW4gdXNhbmRvIG1lam9yZXMgcHLDoWN0aWNhc1xuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGEgY29udmVydGlyXG4gICAgICogQHJldHVybnMgVmFsb3IgYm9vbGVhbm9cbiAgICAgKi9cbiAgICB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHwgdmFsdWUudHJpbSgpID09PSAnMSc7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdmFsdWUgPT09IDE7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252aWVydGUgdW4gdmFsb3IgYSBudW1iZXIgdXNhbmRvIG1lam9yZXMgcHLDoWN0aWNhc1xuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGEgY29udmVydGlyXG4gICAgICogQHJldHVybnMgTsO6bWVybyBvIHVuZGVmaW5lZCBzaSBubyBlcyB2w6FsaWRvXG4gICAgICovXG4gICAgdG9OdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIGlmICh0cmltbWVkID09PSAnJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih0cmltbWVkKTtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IHVuZGVmaW5lZCA6IG51bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZSA/IDEgOiAwO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZpZXJ0ZSB1biB2YWxvciBhIGludGVnZXIgdXNhbmRvIG1lam9yZXMgcHLDoWN0aWNhc1xuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGEgY29udmVydGlyXG4gICAgICogQHJldHVybnMgRW50ZXJvIG8gdW5kZWZpbmVkIHNpIG5vIGVzIHbDoWxpZG9cbiAgICAgKi9cbiAgICB0b0ludGVnZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIGlmICh0cmltbWVkID09PSAnJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih0cmltbWVkKTtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IHVuZGVmaW5lZCA6IE1hdGguZmxvb3IobnVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZSA/IDEgOiAwO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZpZXJ0ZSB1biB2YWxvciBhIHN0cmluZyB1c2FuZG8gbWVqb3JlcyBwcsOhY3RpY2FzLCBzaWVtcHJlIHN0cmluZ2lmaWNhIG9iamV0b3NcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWxvciBhIGNvbnZlcnRpclxuICAgICAqIEByZXR1cm5zIENhZGVuYSBkZSB0ZXh0b1xuICAgICAqL1xuICAgIHRvU3RyaW5nVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuICcnO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IE9iamVjdF0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFBhcmEgZnVuY2lvbmVzLCBzw61tYm9sb3MsIHVuZGVmaW5lZCwgZXRjLiwgZGV2b2x2ZXIgY2FkZW5hIHZhY8OtYVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpY2Egc2kgdW4gdmFsb3IgaW5kaXZpZHVhbCBlc3TDoSB2YWPDrW8vbnVsb1xuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGEgdmVyaWZpY2FyXG4gICAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB2YWxvciBzZSBjb25zaWRlcmEgdmFjw61vXG4gICAgICovXG4gICAgaXNWYWx1ZUVtcHR5KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIENvbnNpZGVyYXIgdmFjw61vOiBudWxsLCB1bmRlZmluZWQsICcnXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJhIG7Dum1lcm9zIHkgYm9vbGVhbm9zLCBzaWVtcHJlIHNvbiB2YWxvcmVzIHbDoWxpZG9zXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJhIGFycmF5cyB2YWPDrW9zXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcmEgb2JqZXRvcyB2YWPDrW9zXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,193 +0,0 @@
|
|
|
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
|
-
* @param col - Definición de columna (opcional) para formateo específico por tipo
|
|
40
|
-
* @returns Cadena formateada para display
|
|
41
|
-
*/
|
|
42
|
-
getDisplayValue(value, col) {
|
|
43
|
-
return this.formatValueByType(value, col);
|
|
44
|
-
}
|
|
45
|
-
formatValueByType(value, col) {
|
|
46
|
-
if (value === 0)
|
|
47
|
-
return '0';
|
|
48
|
-
if (value === false)
|
|
49
|
-
return 'false';
|
|
50
|
-
if (col?.type === 'date' && value)
|
|
51
|
-
return this.formatDateValue(value);
|
|
52
|
-
if (typeof value === 'object' && value !== null)
|
|
53
|
-
return this.formatObjectValue(value);
|
|
54
|
-
if (!value)
|
|
55
|
-
return '-';
|
|
56
|
-
return this.formatPrimitiveValue(value);
|
|
57
|
-
}
|
|
58
|
-
formatPrimitiveValue(value) {
|
|
59
|
-
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
60
|
-
return String(value);
|
|
61
|
-
}
|
|
62
|
-
return '-';
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Formatea un valor de fecha a formato legible
|
|
66
|
-
* @param value - Valor de fecha (Date, string ISO, timestamp)
|
|
67
|
-
* @returns Fecha formateada como DD/MM/YYYY HH:MM
|
|
68
|
-
*/
|
|
69
|
-
formatDateValue(value) {
|
|
70
|
-
try {
|
|
71
|
-
const date = this.parseDate(value);
|
|
72
|
-
if (!date || Number.isNaN(date.getTime()))
|
|
73
|
-
return '-';
|
|
74
|
-
const day = String(date.getDate()).padStart(2, '0');
|
|
75
|
-
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
76
|
-
const year = date.getFullYear();
|
|
77
|
-
const hours = String(date.getHours()).padStart(2, '0');
|
|
78
|
-
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
79
|
-
return `${day}/${month}/${year} ${hours}:${minutes}`;
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
return '-';
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
parseDate(value) {
|
|
86
|
-
if (value instanceof Date)
|
|
87
|
-
return value;
|
|
88
|
-
if (typeof value === 'string' || typeof value === 'number')
|
|
89
|
-
return new Date(value);
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
formatObjectValue(value) {
|
|
93
|
-
try {
|
|
94
|
-
return JSON.stringify(value);
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
return '[object Object]';
|
|
98
|
-
}
|
|
99
|
-
} /**
|
|
100
|
-
* Obtiene el texto de display para un valor enum
|
|
101
|
-
* @param value - Valor del enum
|
|
102
|
-
* @param col - Definición de la columna
|
|
103
|
-
* @returns Texto formateado del enum
|
|
104
|
-
*/
|
|
105
|
-
getEnumDisplayValue(value, col) {
|
|
106
|
-
if (!col.enum || (value !== 0 && !value)) {
|
|
107
|
-
return '-';
|
|
108
|
-
}
|
|
109
|
-
const displayValue = col.enum[value];
|
|
110
|
-
return (displayValue ||
|
|
111
|
-
(typeof value === 'string' || typeof value === 'number'
|
|
112
|
-
? String(value)
|
|
113
|
-
: '-'));
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Obtiene las opciones del enum como array para dropdowns select
|
|
117
|
-
* @param col - Definición de la columna
|
|
118
|
-
* @returns Array de opciones con value y label
|
|
119
|
-
*/
|
|
120
|
-
getEnumOptions(col) {
|
|
121
|
-
if (!col.enum)
|
|
122
|
-
return [];
|
|
123
|
-
return Object.entries(col.enum).map(([value, label]) => ({
|
|
124
|
-
value: Number.isNaN(Number(value)) ? value : Number(value),
|
|
125
|
-
label,
|
|
126
|
-
}));
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Obtiene el color CSS para un valor de celda basado en la configuración de color de la columna
|
|
130
|
-
* @param value - Valor de la celda
|
|
131
|
-
* @param col - Definición de la columna
|
|
132
|
-
* @returns Color CSS o undefined si no hay configuración
|
|
133
|
-
*/
|
|
134
|
-
getCellColor(value, col) {
|
|
135
|
-
if (!col.color || (value !== 0 && !value)) {
|
|
136
|
-
return undefined;
|
|
137
|
-
}
|
|
138
|
-
return col.color[value];
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Aplica ordenamiento a los items basándose en las columnas con configuración de orden
|
|
142
|
-
* @param items - Array de items a ordenar (se modifica in-place)
|
|
143
|
-
* @param columns - Definiciones de columnas
|
|
144
|
-
*/
|
|
145
|
-
applySorting(items, columns) {
|
|
146
|
-
const orderedColumns = columns.filter((col) => col.order);
|
|
147
|
-
if (orderedColumns.length > 0) {
|
|
148
|
-
for (const col of orderedColumns) {
|
|
149
|
-
items.sort((a, b) => {
|
|
150
|
-
const valueA = this.getCellValue(a, col.accessor);
|
|
151
|
-
const valueB = this.getCellValue(b, col.accessor);
|
|
152
|
-
if (col.order === 'ASC') {
|
|
153
|
-
if (valueA > valueB)
|
|
154
|
-
return 1;
|
|
155
|
-
if (valueA < valueB)
|
|
156
|
-
return -1;
|
|
157
|
-
return 0;
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
if (valueA < valueB)
|
|
161
|
-
return 1;
|
|
162
|
-
if (valueA > valueB)
|
|
163
|
-
return -1;
|
|
164
|
-
return 0;
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Calcula el max-height de la tabla basado en el tamaño
|
|
172
|
-
* @param size - Tamaño configurado (0 = sin límite)
|
|
173
|
-
* @returns String CSS para max-height o undefined si sin límite
|
|
174
|
-
*/
|
|
175
|
-
getTableMaxHeight(size) {
|
|
176
|
-
if (size <= 0) {
|
|
177
|
-
return undefined; // Sin límite de altura
|
|
178
|
-
}
|
|
179
|
-
// Altura base de 400px * size
|
|
180
|
-
const baseHeight = 400;
|
|
181
|
-
const maxHeight = Math.round(baseHeight * size);
|
|
182
|
-
return `${maxHeight}px`;
|
|
183
|
-
}
|
|
184
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataUtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
185
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataUtilsService, providedIn: 'root' });
|
|
186
|
-
}
|
|
187
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableDataUtilsService, decorators: [{
|
|
188
|
-
type: Injectable,
|
|
189
|
-
args: [{
|
|
190
|
-
providedIn: 'root'
|
|
191
|
-
}]
|
|
192
|
-
}] });
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS11dGlscy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLWRhdGEtdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQzs7Ozs7Ozs7R0FRRztBQUlILE1BQU0sT0FBTyxxQkFBcUI7SUFFaEM7Ozs7O09BS0c7SUFDSCxZQUFZLENBQW9DLEdBQU0sRUFBRSxRQUFnQjtRQUN0RSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFRLEdBQStCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLEdBQTRCLEVBQUUsUUFBZ0I7UUFDM0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNqRCxPQUFPLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFFLE9BQW1DLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4RyxDQUFDLEVBQUUsR0FBYyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLEtBQWMsRUFBRSxHQUFvQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQWMsRUFBRSxHQUFvQjtRQUM1RCxJQUFJLEtBQUss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QUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNoRCxPQUFPLEdBQUcsU0FBUyxJQUFJLENBQUM7SUFDMUIsQ0FBQzt3R0E1S1UscUJBQXFCOzRHQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEM4MFRhYmxlQ29sRGVmIH0gZnJvbSAnLi90YWJsZS50eXBlcyc7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSB1dGlsaWRhZGVzIGRlIG1hbmlwdWxhY2nDs24gZGUgZGF0b3MgZW4gdGFibGFzIEM4MFxuICpcbiAqIFByb3BvcmNpb25hIG3DqXRvZG9zIHBhcmE6XG4gKiAtIEFjY2VzbyBhIHZhbG9yZXMgZGUgY2VsZGFzIChpbmNsdXllbmRvIHByb3BpZWRhZGVzIGFuaWRhZGFzKVxuICogLSBGb3JtYXRlbyBkZSB2YWxvcmVzIHBhcmEgZGlzcGxheVxuICogLSBHZXN0acOzbiBkZSBlbnVtcyB5IGNvbG9yZXNcbiAqIC0gT3JkZW5hbWllbnRvIGRlIGRhdG9zXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlRGF0YVV0aWxzU2VydmljZSB7XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgdmFsb3IgZGUgdW5hIGNlbGRhIHVzYW5kbyBlbCBhY2Nlc3Nvciwgc29wb3J0YW5kbyBub3RhY2nDs24gZGUgcHVudG8gcGFyYSBwcm9waWVkYWRlcyBhbmlkYWRhc1xuICAgKiBAcGFyYW0gcm93IC0gTGEgZmlsYSBkZSBkYXRvc1xuICAgKiBAcGFyYW0gYWNjZXNzb3IgLSBFbCBhY2Nlc3NvciBkZSBsYSBjb2x1bW5hXG4gICAqIEByZXR1cm5zIEVsIHZhbG9yIGRlIGxhIGNlbGRhXG4gICAqL1xuICBnZXRDZWxsVmFsdWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pihyb3c6IFQsIGFjY2Vzc29yOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBpZiAoYWNjZXNzb3IuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmVzdGVkVmFsdWUocm93LCBhY2Nlc3Nvcik7XG4gICAgfVxuICAgIHJldHVybiAocm93IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVthY2Nlc3Nvcl07XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBlbCB2YWxvciBkZSB1biBvYmpldG8gdXNhbmRvIG5vdGFjacOzbiBkZSBwdW50byAoZWo6ICd0YXNrLm5hbWUnKVxuICAgKiBAcGFyYW0gb2JqIC0gT2JqZXRvIGRlbCBjdWFsIG9idGVuZXIgZWwgdmFsb3JcbiAgICogQHBhcmFtIGFjY2Vzc29yIC0gUnV0YSBkZSBhY2Nlc28gdXNhbmRvIG5vdGFjacOzbiBkZSBwdW50b1xuICAgKiBAcmV0dXJucyBFbCB2YWxvciBhbmlkYWRvIG8gdW5kZWZpbmVkXG4gICAqL1xuICBnZXROZXN0ZWRWYWx1ZShvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBhY2Nlc3Nvcjogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIGFjY2Vzc29yLnNwbGl0KCcuJykucmVkdWNlKChjdXJyZW50LCBrZXkpID0+IHtcbiAgICAgIHJldHVybiBjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0JyA/IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldIDogdW5kZWZpbmVkO1xuICAgIH0sIG9iaiBhcyB1bmtub3duKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXZ1ZWx2ZSBlbCB2YWxvciBkZSBkaXNwbGF5IHBhcmEgdW5hIGNlbGRhLCBtb3N0cmFuZG8gJy0nIHBhcmEgdmFsb3JlcyBmYWxzeSBleGNlcHRvIDAsIGZhbHNlIHkgb2JqZXRvcy9hcnJheXMgdmFjw61vc1xuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWxvciBhIGZvcm1hdGVhclxuICAgKiBAcGFyYW0gY29sIC0gRGVmaW5pY2nDs24gZGUgY29sdW1uYSAob3BjaW9uYWwpIHBhcmEgZm9ybWF0ZW8gZXNwZWPDrWZpY28gcG9yIHRpcG9cbiAgICogQHJldHVybnMgQ2FkZW5hIGZvcm1hdGVhZGEgcGFyYSBkaXNwbGF5XG4gICAqL1xuICBnZXREaXNwbGF5VmFsdWUodmFsdWU6IHVua25vd24sIGNvbD86IEM4MFRhYmxlQ29sRGVmKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5VHlwZSh2YWx1ZSwgY29sKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VmFsdWVCeVR5cGUodmFsdWU6IHVua25vd24sIGNvbD86IEM4MFRhYmxlQ29sRGVmKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHJldHVybiAnMCc7XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuICdmYWxzZSc7XG4gICAgaWYgKGNvbD8udHlwZSA9PT0gJ2RhdGUnICYmIHZhbHVlKSByZXR1cm4gdGhpcy5mb3JtYXREYXRlVmFsdWUodmFsdWUpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSByZXR1cm4gdGhpcy5mb3JtYXRPYmplY3RWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICctJztcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRQcmltaXRpdmVWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFByaW1pdGl2ZVZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRlYSB1biB2YWxvciBkZSBmZWNoYSBhIGZvcm1hdG8gbGVnaWJsZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWxvciBkZSBmZWNoYSAoRGF0ZSwgc3RyaW5nIElTTywgdGltZXN0YW1wKVxuICAgKiBAcmV0dXJucyBGZWNoYSBmb3JtYXRlYWRhIGNvbW8gREQvTU0vWVlZWSBISDpNTVxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXREYXRlVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuICAgICAgaWYgKCFkYXRlIHx8IE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiAnLSc7XG5cbiAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgaG91cnMgPSBTdHJpbmcoZGF0ZS5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgY29uc3QgbWludXRlcyA9IFN0cmluZyhkYXRlLmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwgJzAnKTtcblxuICAgICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfSAke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZURhdGUodmFsdWU6IHVua25vd24pOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE9iamVjdFZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAnW29iamVjdCBPYmplY3RdJztcbiAgICB9XG4gIH0gICAgLyoqXG4gICAgICogT2J0aWVuZSBlbCB0ZXh0byBkZSBkaXNwbGF5IHBhcmEgdW4gdmFsb3IgZW51bVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGRlbCBlbnVtXG4gICAgICogQHBhcmFtIGNvbCAtIERlZmluaWNpw7NuIGRlIGxhIGNvbHVtbmFcbiAgICAgKiBAcmV0dXJucyBUZXh0byBmb3JtYXRlYWRvIGRlbCBlbnVtXG4gICAgICovXG4gIGdldEVudW1EaXNwbGF5VmFsdWUodmFsdWU6IHVua25vd24sIGNvbDogQzgwVGFibGVDb2xEZWYpOiBzdHJpbmcge1xuICAgIGlmICghY29sLmVudW0gfHwgKHZhbHVlICE9PSAwICYmICF2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGNvbC5lbnVtW3ZhbHVlIGFzIHN0cmluZyB8IG51bWJlcl07XG4gICAgcmV0dXJuIChcbiAgICAgIGRpc3BsYXlWYWx1ZSB8fFxuICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuICAgICAgICA/IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgOiAnLScpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhcyBvcGNpb25lcyBkZWwgZW51bSBjb21vIGFycmF5IHBhcmEgZHJvcGRvd25zIHNlbGVjdFxuICAgKiBAcGFyYW0gY29sIC0gRGVmaW5pY2nDs24gZGUgbGEgY29sdW1uYVxuICAgKiBAcmV0dXJucyBBcnJheSBkZSBvcGNpb25lcyBjb24gdmFsdWUgeSBsYWJlbFxuICAgKi9cbiAgZ2V0RW51bU9wdGlvbnMoY29sOiBDODBUYWJsZUNvbERlZik6IHsgdmFsdWU6IHN0cmluZyB8IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9W10ge1xuICAgIGlmICghY29sLmVudW0pIHJldHVybiBbXTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sLmVudW0pLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7XG4gICAgICB2YWx1ZTogTnVtYmVyLmlzTmFOKE51bWJlcih2YWx1ZSkpID8gdmFsdWUgOiBOdW1iZXIodmFsdWUpLFxuICAgICAgbGFiZWwsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgY29sb3IgQ1NTIHBhcmEgdW4gdmFsb3IgZGUgY2VsZGEgYmFzYWRvIGVuIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIGNvbG9yIGRlIGxhIGNvbHVtbmFcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsb3IgZGUgbGEgY2VsZGFcbiAgICogQHBhcmFtIGNvbCAtIERlZmluaWNpw7NuIGRlIGxhIGNvbHVtbmFcbiAgICogQHJldHVybnMgQ29sb3IgQ1NTIG8gdW5kZWZpbmVkIHNpIG5vIGhheSBjb25maWd1cmFjacOzblxuICAgKi9cbiAgZ2V0Q2VsbENvbG9yKHZhbHVlOiB1bmtub3duLCBjb2w6IEM4MFRhYmxlQ29sRGVmKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNvbC5jb2xvciB8fCAodmFsdWUgIT09IDAgJiYgIXZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5jb2xvclt2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwbGljYSBvcmRlbmFtaWVudG8gYSBsb3MgaXRlbXMgYmFzw6FuZG9zZSBlbiBsYXMgY29sdW1uYXMgY29uIGNvbmZpZ3VyYWNpw7NuIGRlIG9yZGVuXG4gICAqIEBwYXJhbSBpdGVtcyAtIEFycmF5IGRlIGl0ZW1zIGEgb3JkZW5hciAoc2UgbW9kaWZpY2EgaW4tcGxhY2UpXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gRGVmaW5pY2lvbmVzIGRlIGNvbHVtbmFzXG4gICAqL1xuICBhcHBseVNvcnRpbmc8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihpdGVtczogVFtdLCBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdKTogdm9pZCB7XG4gICAgY29uc3Qgb3JkZXJlZENvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wub3JkZXIpO1xuICAgIGlmIChvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiBvcmRlcmVkQ29sdW1ucykge1xuICAgICAgICBpdGVtcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWVBID0gdGhpcy5nZXRDZWxsVmFsdWUoYSwgY29sLmFjY2Vzc29yKSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgICAgICAgY29uc3QgdmFsdWVCID0gdGhpcy5nZXRDZWxsVmFsdWUoYiwgY29sLmFjY2Vzc29yKSBhcyBzdHJpbmcgfCBudW1iZXI7XG5cbiAgICAgICAgICBpZiAoY29sLm9yZGVyID09PSAnQVNDJykge1xuICAgICAgICAgICAgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmV0dXJuIDE7XG4gICAgICAgICAgICBpZiAodmFsdWVBIDwgdmFsdWVCKSByZXR1cm4gLTE7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZhbHVlQSA8IHZhbHVlQikgcmV0dXJuIDE7XG4gICAgICAgICAgICBpZiAodmFsdWVBID4gdmFsdWVCKSByZXR1cm4gLTE7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhIGVsIG1heC1oZWlnaHQgZGUgbGEgdGFibGEgYmFzYWRvIGVuIGVsIHRhbWHDsW9cbiAgICogQHBhcmFtIHNpemUgLSBUYW1hw7FvIGNvbmZpZ3VyYWRvICgwID0gc2luIGzDrW1pdGUpXG4gICAqIEByZXR1cm5zIFN0cmluZyBDU1MgcGFyYSBtYXgtaGVpZ2h0IG8gdW5kZWZpbmVkIHNpIHNpbiBsw61taXRlXG4gICAqL1xuICBnZXRUYWJsZU1heEhlaWdodChzaXplOiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChzaXplIDw9IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFNpbiBsw61taXRlIGRlIGFsdHVyYVxuICAgIH1cbiAgICAvLyBBbHR1cmEgYmFzZSBkZSA0MDBweCAqIHNpemVcbiAgICBjb25zdCBiYXNlSGVpZ2h0ID0gNDAwO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IE1hdGgucm91bmQoYmFzZUhlaWdodCAqIHNpemUpO1xuICAgIHJldHVybiBgJHttYXhIZWlnaHR9cHhgO1xuICB9XG59XG4iXX0=
|