@c80/ui 1.0.42 → 1.0.45
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 +1 -1
- package/lib/modal/index.d.ts +2 -3
- package/lib/stat-card/stat-card.component.d.ts +2 -2
- package/lib/table/index.d.ts +1 -0
- package/lib/table/table-column-visibility.service.d.ts +17 -35
- package/lib/table/table-crud-state.service.d.ts +10 -27
- package/lib/table/table-data-utils.service.d.ts +15 -5
- package/lib/table/table-selection.service.d.ts +19 -18
- package/lib/table/table.component.d.ts +123 -98
- package/lib/table/table.types.d.ts +25 -2
- package/lib/table/table.utils.d.ts +42 -0
- 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 -8
- package/esm2022/lib/table/table-column-visibility.service.mjs +0 -156
- package/esm2022/lib/table/table-crud-state.service.mjs +0 -186
- package/esm2022/lib/table/table-data-converter.service.mjs +0 -145
- package/esm2022/lib/table/table-data-utils.service.mjs +0 -166
- package/esm2022/lib/table/table-selection.service.mjs +0 -138
- package/esm2022/lib/table/table.component.mjs +0 -476
- package/esm2022/lib/table/table.types.mjs +0 -5
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import { TableDataConverterService } from './table-data-converter.service';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Servicio para gestionar la lógica de visibilidad de columnas en tablas C80
|
|
6
|
-
*
|
|
7
|
-
* Maneja las reglas complejas de visibilidad basadas en:
|
|
8
|
-
* - Configuración explícita (visible: false)
|
|
9
|
-
* - Ocultación automática (hideIfAllValuesAreNull)
|
|
10
|
-
* - Estado de creación y edición
|
|
11
|
-
*/
|
|
12
|
-
export class TableColumnVisibilityService {
|
|
13
|
-
dataConverter = inject(TableDataConverterService);
|
|
14
|
-
/**
|
|
15
|
-
* Actualiza las keys de columnas visibles basándose en el estado actual
|
|
16
|
-
* @param columns - Definiciones de columnas
|
|
17
|
-
* @param data - Datos actuales de la tabla
|
|
18
|
-
* @param creating - Si está en modo creación
|
|
19
|
-
* @param editing - ID de fila en edición (null si no hay edición)
|
|
20
|
-
* @returns Array de accessors de columnas visibles
|
|
21
|
-
*/
|
|
22
|
-
updateVisibleKeys(columns, data, creating, editing) {
|
|
23
|
-
const visibleColumns = columns.filter(col => this.isColumnVisibleInHeader(col, data, creating, editing));
|
|
24
|
-
return visibleColumns.map(col => col.accessor);
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Determina si una columna debe ser visible basándose en su configuración y datos
|
|
28
|
-
* @param column - La definición de la columna
|
|
29
|
-
* @param data - Datos actuales de la tabla
|
|
30
|
-
* @param forceShowInCreation - Si es true, ignora hideIfAllValuesAreNull (usado en modo creación)
|
|
31
|
-
* @returns true si la columna debe ser visible
|
|
32
|
-
*/
|
|
33
|
-
isColumnVisible(column, data, forceShowInCreation = false) {
|
|
34
|
-
// PRIORIDAD 1: Si visible está explícitamente establecido en false, SIEMPRE ocultar
|
|
35
|
-
if (column.visible === false) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
// PRIORIDAD 2: Si hideIfAllValuesAreNull es true y todos los valores están vacíos, ocultar
|
|
39
|
-
// EXCEPCIÓN: En modo creación, mostramos estas columnas para permitir entrada de datos
|
|
40
|
-
if (column.hideIfAllValuesAreNull === true && !forceShowInCreation && this.areAllColumnValuesEmpty(column, data)) {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
// Por defecto: mostrar
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Determina si una columna debe ser visible en los headers
|
|
48
|
-
* @param column - La definición de la columna
|
|
49
|
-
* @param data - Datos actuales de la tabla
|
|
50
|
-
* @param creating - Si está en modo creación
|
|
51
|
-
* @param editing - ID de fila en edición (null si no hay edición)
|
|
52
|
-
* @returns true si el header debe ser visible
|
|
53
|
-
*/
|
|
54
|
-
isColumnVisibleInHeader(column, data, creating, editing) {
|
|
55
|
-
// PRIORIDAD 1: Si visible está explícitamente establecido en false, SIEMPRE ocultar
|
|
56
|
-
if (column.visible === false) {
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
// Si estamos en modo creación, mostrar columnas con hideIfAllValuesAreNull
|
|
60
|
-
if (creating && column.hideIfAllValuesAreNull === true) {
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
// Si hay una fila en modo edición y la columna tiene hideIfAllValuesAreNull
|
|
64
|
-
if (editing !== null && column.hideIfAllValuesAreNull === true) {
|
|
65
|
-
// Buscar la fila que se está editando
|
|
66
|
-
const editingRow = data.find(row => row['id'] === editing);
|
|
67
|
-
if (editingRow) {
|
|
68
|
-
// Solo mostrar el header si la fila en edición tiene valor en esta columna
|
|
69
|
-
const cellValue = this.getCellValue(editingRow, column.accessor);
|
|
70
|
-
return !this.dataConverter.isValueEmpty(cellValue);
|
|
71
|
-
}
|
|
72
|
-
// Si no se encuentra la fila, no mostrar el header
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
// Si hideIfAllValuesAreNull es true y todos los valores están vacíos, ocultar
|
|
76
|
-
if (column.hideIfAllValuesAreNull === true && this.areAllColumnValuesEmpty(column, data)) {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
// Por defecto: mostrar
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Determina si una columna debe ser visible en una fila específica considerando el modo edición
|
|
84
|
-
* @param column - La definición de la columna
|
|
85
|
-
* @param row - La fila actual
|
|
86
|
-
* @param data - Datos actuales de la tabla
|
|
87
|
-
* @param editing - ID de fila en edición (null si no hay edición)
|
|
88
|
-
* @returns true si la columna debe ser visible para esta fila
|
|
89
|
-
*/
|
|
90
|
-
isColumnVisibleForRow(column, row, data, editing) {
|
|
91
|
-
// PRIORIDAD 1: Si visible está explícitamente establecido en false, SIEMPRE ocultar
|
|
92
|
-
if (column.visible === false) {
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
// PRIORIDAD 2: Si esta fila específica está en modo edición y la columna tiene hideIfAllValuesAreNull
|
|
96
|
-
const isEditingThisRow = editing === row['id'];
|
|
97
|
-
if (isEditingThisRow && column.hideIfAllValuesAreNull === true) {
|
|
98
|
-
// En edición, solo mostrar si esta fila específica tiene valor en esta columna
|
|
99
|
-
const cellValue = this.getCellValue(row, column.accessor);
|
|
100
|
-
return !this.dataConverter.isValueEmpty(cellValue);
|
|
101
|
-
}
|
|
102
|
-
// PRIORIDAD 3: Si hideIfAllValuesAreNull es true y todos los valores están vacíos, ocultar
|
|
103
|
-
if (column.hideIfAllValuesAreNull === true && this.areAllColumnValuesEmpty(column, data)) {
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
// Por defecto: mostrar
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Verifica si todos los valores de una columna están vacíos/nulos
|
|
111
|
-
* @param column - La definición de la columna
|
|
112
|
-
* @param data - Datos actuales de la tabla
|
|
113
|
-
* @returns true si todos los valores están vacíos
|
|
114
|
-
*/
|
|
115
|
-
areAllColumnValuesEmpty(column, data) {
|
|
116
|
-
if (data.length === 0) {
|
|
117
|
-
return true; // Si no hay datos, consideramos la columna como vacía
|
|
118
|
-
}
|
|
119
|
-
return data.every(row => {
|
|
120
|
-
const value = this.getCellValue(row, column.accessor);
|
|
121
|
-
return this.dataConverter.isValueEmpty(value);
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Obtiene el valor de una celda usando el accessor, soportando notación de punto para propiedades anidadas
|
|
126
|
-
* @param row - La fila de datos
|
|
127
|
-
* @param accessor - El accessor de la columna
|
|
128
|
-
* @returns El valor de la celda
|
|
129
|
-
*/
|
|
130
|
-
getCellValue(row, accessor) {
|
|
131
|
-
if (accessor.includes('.')) {
|
|
132
|
-
return this.getNestedValue(row, accessor);
|
|
133
|
-
}
|
|
134
|
-
return row[accessor];
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Obtiene el valor de un objeto usando notación de punto (ej: 'task.name')
|
|
138
|
-
* @param obj - Objeto del cual obtener el valor
|
|
139
|
-
* @param accessor - Ruta de acceso usando notación de punto
|
|
140
|
-
* @returns El valor anidado o undefined
|
|
141
|
-
*/
|
|
142
|
-
getNestedValue(obj, accessor) {
|
|
143
|
-
return accessor.split('.').reduce((current, key) => {
|
|
144
|
-
return current && typeof current === 'object' ? current[key] : undefined;
|
|
145
|
-
}, obj);
|
|
146
|
-
}
|
|
147
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableColumnVisibilityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
148
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableColumnVisibilityService, providedIn: 'root' });
|
|
149
|
-
}
|
|
150
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableColumnVisibilityService, decorators: [{
|
|
151
|
-
type: Injectable,
|
|
152
|
-
args: [{
|
|
153
|
-
providedIn: 'root'
|
|
154
|
-
}]
|
|
155
|
-
}] });
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29sdW1uLXZpc2liaWxpdHkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS1jb2x1bW4tdmlzaWJpbGl0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUUzRTs7Ozs7OztHQU9HO0FBSUgsTUFBTSxPQUFPLDRCQUE0QjtJQUVwQixhQUFhLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFFbkU7Ozs7Ozs7T0FPRztJQUNILGlCQUFpQixDQUNiLE9BQXlCLEVBQ3pCLElBQVMsRUFDVCxRQUFpQixFQUNqQixPQUFrQjtRQUVsQixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ3hDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FDN0QsQ0FBQztRQUNGLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZUFBZSxDQUNYLE1BQXNCLEVBQ3RCLElBQVMsRUFDVCxtQkFBbUIsR0FBRyxLQUFLO1FBRTNCLG9GQUFvRjtRQUNwRixJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDM0IsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELDJGQUEyRjtRQUMzRix1RkFBdUY7UUFDdkYsSUFBSSxNQUFNLENBQUMsc0JBQXNCLEtBQUssSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUks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S0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFvQyxHQUFNLEVBQUUsUUFBZ0I7UUFDNUUsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBUSxHQUErQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGNBQWMsQ0FBQyxHQUE0QixFQUFFLFFBQWdCO1FBQ2pFLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDL0MsT0FBTyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxPQUFtQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDMUcsQ0FBQyxFQUFFLEdBQWMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7d0dBbExRLDRCQUE0Qjs0R0FBNUIsNEJBQTRCLGNBRnpCLE1BQU07OzRGQUVULDRCQUE0QjtrQkFIeEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEM4MFRhYmxlQ29sRGVmLCBJRCB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgVGFibGVEYXRhQ29udmVydGVyU2VydmljZSB9IGZyb20gJy4vdGFibGUtZGF0YS1jb252ZXJ0ZXIuc2VydmljZSc7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBnZXN0aW9uYXIgbGEgbMOzZ2ljYSBkZSB2aXNpYmlsaWRhZCBkZSBjb2x1bW5hcyBlbiB0YWJsYXMgQzgwXG4gKlxuICogTWFuZWphIGxhcyByZWdsYXMgY29tcGxlamFzIGRlIHZpc2liaWxpZGFkIGJhc2FkYXMgZW46XG4gKiAtIENvbmZpZ3VyYWNpw7NuIGV4cGzDrWNpdGEgKHZpc2libGU6IGZhbHNlKVxuICogLSBPY3VsdGFjacOzbiBhdXRvbcOhdGljYSAoaGlkZUlmQWxsVmFsdWVzQXJlTnVsbClcbiAqIC0gRXN0YWRvIGRlIGNyZWFjacOzbiB5IGVkaWNpw7NuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb2x1bW5WaXNpYmlsaXR5U2VydmljZSB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGFDb252ZXJ0ZXIgPSBpbmplY3QoVGFibGVEYXRhQ29udmVydGVyU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiBBY3R1YWxpemEgbGFzIGtleXMgZGUgY29sdW1uYXMgdmlzaWJsZXMgYmFzw6FuZG9zZSBlbiBlbCBlc3RhZG8gYWN0dWFsXG4gICAgICogQHBhcmFtIGNvbHVtbnMgLSBEZWZpbmljaW9uZXMgZGUgY29sdW1uYXNcbiAgICAgKiBAcGFyYW0gZGF0YSAtIERhdG9zIGFjdHVhbGVzIGRlIGxhIHRhYmxhXG4gICAgICogQHBhcmFtIGNyZWF0aW5nIC0gU2kgZXN0w6EgZW4gbW9kbyBjcmVhY2nDs25cbiAgICAgKiBAcGFyYW0gZWRpdGluZyAtIElEIGRlIGZpbGEgZW4gZWRpY2nDs24gKG51bGwgc2kgbm8gaGF5IGVkaWNpw7NuKVxuICAgICAqIEByZXR1cm5zIEFycmF5IGRlIGFjY2Vzc29ycyBkZSBjb2x1bW5hcyB2aXNpYmxlc1xuICAgICAqL1xuICAgIHVwZGF0ZVZpc2libGVLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICAgIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10sXG4gICAgICAgIGRhdGE6IFRbXSxcbiAgICAgICAgY3JlYXRpbmc6IGJvb2xlYW4sXG4gICAgICAgIGVkaXRpbmc6IElEIHwgbnVsbFxuICAgICk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihjb2wgPT5cbiAgICAgICAgICAgIHRoaXMuaXNDb2x1bW5WaXNpYmxlSW5IZWFkZXIoY29sLCBkYXRhLCBjcmVhdGluZywgZWRpdGluZylcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHZpc2libGVDb2x1bW5zLm1hcChjb2wgPT4gY29sLmFjY2Vzc29yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmEgc2kgdW5hIGNvbHVtbmEgZGViZSBzZXIgdmlzaWJsZSBiYXPDoW5kb3NlIGVuIHN1IGNvbmZpZ3VyYWNpw7NuIHkgZGF0b3NcbiAgICAgKiBAcGFyYW0gY29sdW1uIC0gTGEgZGVmaW5pY2nDs24gZGUgbGEgY29sdW1uYVxuICAgICAqIEBwYXJhbSBkYXRhIC0gRGF0b3MgYWN0dWFsZXMgZGUgbGEgdGFibGFcbiAgICAgKiBAcGFyYW0gZm9yY2VTaG93SW5DcmVhdGlvbiAtIFNpIGVzIHRydWUsIGlnbm9yYSBoaWRlSWZBbGxWYWx1ZXNBcmVOdWxsICh1c2FkbyBlbiBtb2RvIGNyZWFjacOzbilcbiAgICAgKiBAcmV0dXJucyB0cnVlIHNpIGxhIGNvbHVtbmEgZGViZSBzZXIgdmlzaWJsZVxuICAgICAqL1xuICAgIGlzQ29sdW1uVmlzaWJsZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjb2x1bW46IEM4MFRhYmxlQ29sRGVmLFxuICAgICAgICBkYXRhOiBUW10sXG4gICAgICAgIGZvcmNlU2hvd0luQ3JlYXRpb24gPSBmYWxzZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBQUklPUklEQUQgMTogU2kgdmlzaWJsZSBlc3TDoSBleHBsw61jaXRhbWVudGUgZXN0YWJsZWNpZG8gZW4gZmFsc2UsIFNJRU1QUkUgb2N1bHRhclxuICAgICAgICBpZiAoY29sdW1uLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQUklPUklEQUQgMjogU2kgaGlkZUlmQWxsVmFsdWVzQXJlTnVsbCBlcyB0cnVlIHkgdG9kb3MgbG9zIHZhbG9yZXMgZXN0w6FuIHZhY8Otb3MsIG9jdWx0YXJcbiAgICAgICAgLy8gRVhDRVBDScOTTjogRW4gbW9kbyBjcmVhY2nDs24sIG1vc3RyYW1vcyBlc3RhcyBjb2x1bW5hcyBwYXJhIHBlcm1pdGlyIGVudHJhZGEgZGUgZGF0b3NcbiAgICAgICAgaWYgKGNvbHVtbi5oaWRlSWZBbGxWYWx1ZXNBcmVOdWxsID09PSB0cnVlICYmICFmb3JjZVNob3dJbkNyZWF0aW9uICYmIHRoaXMuYXJlQWxsQ29sdW1uVmFsdWVzRW1wdHkoY29sdW1uLCBkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9yIGRlZmVjdG86IG1vc3RyYXJcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5hIHNpIHVuYSBjb2x1bW5hIGRlYmUgc2VyIHZpc2libGUgZW4gbG9zIGhlYWRlcnNcbiAgICAgKiBAcGFyYW0gY29sdW1uIC0gTGEgZGVmaW5pY2nDs24gZGUgbGEgY29sdW1uYVxuICAgICAqIEBwYXJhbSBkYXRhIC0gRGF0b3MgYWN0dWFsZXMgZGUgbGEgdGFibGFcbiAgICAgKiBAcGFyYW0gY3JlYXRpbmcgLSBTaSBlc3TDoSBlbiBtb2RvIGNyZWFjacOzblxuICAgICAqIEBwYXJhbSBlZGl0aW5nIC0gSUQgZGUgZmlsYSBlbiBlZGljacOzbiAobnVsbCBzaSBubyBoYXkgZWRpY2nDs24pXG4gICAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCBoZWFkZXIgZGViZSBzZXIgdmlzaWJsZVxuICAgICAqL1xuICAgIGlzQ29sdW1uVmlzaWJsZUluSGVhZGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICAgIGNvbHVtbjogQzgwVGFibGVDb2xEZWYsXG4gICAgICAgIGRhdGE6IFRbXSxcbiAgICAgICAgY3JlYXRpbmc6IGJvb2xlYW4sXG4gICAgICAgIGVkaXRpbmc6IElEIHwgbnVsbFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBQUklPUklEQUQgMTogU2kgdmlzaWJsZSBlc3TDoSBleHBsw61jaXRhbWVudGUgZXN0YWJsZWNpZG8gZW4gZmFsc2UsIFNJRU1QUkUgb2N1bHRhclxuICAgICAgICBpZiAoY29sdW1uLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaSBlc3RhbW9zIGVuIG1vZG8gY3JlYWNpw7NuLCBtb3N0cmFyIGNvbHVtbmFzIGNvbiBoaWRlSWZBbGxWYWx1ZXNBcmVOdWxsXG4gICAgICAgIGlmIChjcmVhdGluZyAmJiBjb2x1bW4uaGlkZUlmQWxsVmFsdWVzQXJlTnVsbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaSBoYXkgdW5hIGZpbGEgZW4gbW9kbyBlZGljacOzbiB5IGxhIGNvbHVtbmEgdGllbmUgaGlkZUlmQWxsVmFsdWVzQXJlTnVsbFxuICAgICAgICBpZiAoZWRpdGluZyAhPT0gbnVsbCAmJiBjb2x1bW4uaGlkZUlmQWxsVmFsdWVzQXJlTnVsbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gQnVzY2FyIGxhIGZpbGEgcXVlIHNlIGVzdMOhIGVkaXRhbmRvXG4gICAgICAgICAgICBjb25zdCBlZGl0aW5nUm93ID0gZGF0YS5maW5kKHJvdyA9PiByb3dbJ2lkJ10gPT09IGVkaXRpbmcpO1xuXG4gICAgICAgICAgICBpZiAoZWRpdGluZ1Jvdykge1xuICAgICAgICAgICAgICAgIC8vIFNvbG8gbW9zdHJhciBlbCBoZWFkZXIgc2kgbGEgZmlsYSBlbiBlZGljacOzbiB0aWVuZSB2YWxvciBlbiBlc3RhIGNvbHVtbmFcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSB0aGlzLmdldENlbGxWYWx1ZShlZGl0aW5nUm93LCBjb2x1bW4uYWNjZXNzb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5kYXRhQ29udmVydGVyLmlzVmFsdWVFbXB0eShjZWxsVmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTaSBubyBzZSBlbmN1ZW50cmEgbGEgZmlsYSwgbm8gbW9zdHJhciBlbCBoZWFkZXJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpIGhpZGVJZkFsbFZhbHVlc0FyZU51bGwgZXMgdHJ1ZSB5IHRvZG9zIGxvcyB2YWxvcmVzIGVzdMOhbiB2YWPDrW9zLCBvY3VsdGFyXG4gICAgICAgIGlmIChjb2x1bW4uaGlkZUlmQWxsVmFsdWVzQXJlTnVsbCA9PT0gdHJ1ZSAmJiB0aGlzLmFyZUFsbENvbHVtblZhbHVlc0VtcHR5KGNvbHVtbiwgZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvciBkZWZlY3RvOiBtb3N0cmFyXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluYSBzaSB1bmEgY29sdW1uYSBkZWJlIHNlciB2aXNpYmxlIGVuIHVuYSBmaWxhIGVzcGVjw61maWNhIGNvbnNpZGVyYW5kbyBlbCBtb2RvIGVkaWNpw7NuXG4gICAgICogQHBhcmFtIGNvbHVtbiAtIExhIGRlZmluaWNpw7NuIGRlIGxhIGNvbHVtbmFcbiAgICAgKiBAcGFyYW0gcm93IC0gTGEgZmlsYSBhY3R1YWxcbiAgICAgKiBAcGFyYW0gZGF0YSAtIERhdG9zIGFjdHVhbGVzIGRlIGxhIHRhYmxhXG4gICAgICogQHBhcmFtIGVkaXRpbmcgLSBJRCBkZSBmaWxhIGVuIGVkaWNpw7NuIChudWxsIHNpIG5vIGhheSBlZGljacOzbilcbiAgICAgKiBAcmV0dXJucyB0cnVlIHNpIGxhIGNvbHVtbmEgZGViZSBzZXIgdmlzaWJsZSBwYXJhIGVzdGEgZmlsYVxuICAgICAqL1xuICAgIGlzQ29sdW1uVmlzaWJsZUZvclJvdzxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjb2x1bW46IEM4MFRhYmxlQ29sRGVmLFxuICAgICAgICByb3c6IFQsXG4gICAgICAgIGRhdGE6IFRbXSxcbiAgICAgICAgZWRpdGluZzogSUQgfCBudWxsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFBSSU9SSURBRCAxOiBTaSB2aXNpYmxlIGVzdMOhIGV4cGzDrWNpdGFtZW50ZSBlc3RhYmxlY2lkbyBlbiBmYWxzZSwgU0lFTVBSRSBvY3VsdGFyXG4gICAgICAgIGlmIChjb2x1bW4udmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBSSU9SSURBRCAyOiBTaSBlc3RhIGZpbGEgZXNwZWPDrWZpY2EgZXN0w6EgZW4gbW9kbyBlZGljacOzbiB5IGxhIGNvbHVtbmEgdGllbmUgaGlkZUlmQWxsVmFsdWVzQXJlTnVsbFxuICAgICAgICBjb25zdCBpc0VkaXRpbmdUaGlzUm93ID0gZWRpdGluZyA9PT0gcm93WydpZCddO1xuICAgICAgICBpZiAoaXNFZGl0aW5nVGhpc1JvdyAmJiBjb2x1bW4uaGlkZUlmQWxsVmFsdWVzQXJlTnVsbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gRW4gZWRpY2nDs24sIHNvbG8gbW9zdHJhciBzaSBlc3RhIGZpbGEgZXNwZWPDrWZpY2EgdGllbmUgdmFsb3IgZW4gZXN0YSBjb2x1bW5hXG4gICAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSB0aGlzLmdldENlbGxWYWx1ZShyb3csIGNvbHVtbi5hY2Nlc3Nvcik7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuZGF0YUNvbnZlcnRlci5pc1ZhbHVlRW1wdHkoY2VsbFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBSSU9SSURBRCAzOiBTaSBoaWRlSWZBbGxWYWx1ZXNBcmVOdWxsIGVzIHRydWUgeSB0b2RvcyBsb3MgdmFsb3JlcyBlc3TDoW4gdmFjw61vcywgb2N1bHRhclxuICAgICAgICBpZiAoY29sdW1uLmhpZGVJZkFsbFZhbHVlc0FyZU51bGwgPT09IHRydWUgJiYgdGhpcy5hcmVBbGxDb2x1bW5WYWx1ZXNFbXB0eShjb2x1bW4sIGRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb3IgZGVmZWN0bzogbW9zdHJhclxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmljYSBzaSB0b2RvcyBsb3MgdmFsb3JlcyBkZSB1bmEgY29sdW1uYSBlc3TDoW4gdmFjw61vcy9udWxvc1xuICAgICAqIEBwYXJhbSBjb2x1bW4gLSBMYSBkZWZpbmljacOzbiBkZSBsYSBjb2x1bW5hXG4gICAgICogQHBhcmFtIGRhdGEgLSBEYXRvcyBhY3R1YWxlcyBkZSBsYSB0YWJsYVxuICAgICAqIEByZXR1cm5zIHRydWUgc2kgdG9kb3MgbG9zIHZhbG9yZXMgZXN0w6FuIHZhY8Otb3NcbiAgICAgKi9cbiAgICBhcmVBbGxDb2x1bW5WYWx1ZXNFbXB0eTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjb2x1bW46IEM4MFRhYmxlQ29sRGVmLFxuICAgICAgICBkYXRhOiBUW11cbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gU2kgbm8gaGF5IGRhdG9zLCBjb25zaWRlcmFtb3MgbGEgY29sdW1uYSBjb21vIHZhY8OtYVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEuZXZlcnkocm93ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDZWxsVmFsdWUocm93LCBjb2x1bW4uYWNjZXNzb3IpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUNvbnZlcnRlci5pc1ZhbHVlRW1wdHkodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnRpZW5lIGVsIHZhbG9yIGRlIHVuYSBjZWxkYSB1c2FuZG8gZWwgYWNjZXNzb3IsIHNvcG9ydGFuZG8gbm90YWNpw7NuIGRlIHB1bnRvIHBhcmEgcHJvcGllZGFkZXMgYW5pZGFkYXNcbiAgICAgKiBAcGFyYW0gcm93IC0gTGEgZmlsYSBkZSBkYXRvc1xuICAgICAqIEBwYXJhbSBhY2Nlc3NvciAtIEVsIGFjY2Vzc29yIGRlIGxhIGNvbHVtbmFcbiAgICAgKiBAcmV0dXJucyBFbCB2YWxvciBkZSBsYSBjZWxkYVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q2VsbFZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ocm93OiBULCBhY2Nlc3Nvcjogc3RyaW5nKTogdW5rbm93biB7XG4gICAgICAgIGlmIChhY2Nlc3Nvci5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXN0ZWRWYWx1ZShyb3csIGFjY2Vzc29yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYWNjZXNzb3JdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9idGllbmUgZWwgdmFsb3IgZGUgdW4gb2JqZXRvIHVzYW5kbyBub3RhY2nDs24gZGUgcHVudG8gKGVqOiAndGFzay5uYW1lJylcbiAgICAgKiBAcGFyYW0gb2JqIC0gT2JqZXRvIGRlbCBjdWFsIG9idGVuZXIgZWwgdmFsb3JcbiAgICAgKiBAcGFyYW0gYWNjZXNzb3IgLSBSdXRhIGRlIGFjY2VzbyB1c2FuZG8gbm90YWNpw7NuIGRlIHB1bnRvXG4gICAgICogQHJldHVybnMgRWwgdmFsb3IgYW5pZGFkbyBvIHVuZGVmaW5lZFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TmVzdGVkVmFsdWUob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgYWNjZXNzb3I6IHN0cmluZyk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gYWNjZXNzb3Iuc3BsaXQoJy4nKS5yZWR1Y2UoKGN1cnJlbnQsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnID8gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH0sIG9iaiBhcyB1bmtub3duKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { Injectable, signal, inject } from '@angular/core';
|
|
2
|
-
import { TableColumnVisibilityService } from './table-column-visibility.service';
|
|
3
|
-
import { TableDataConverterService } from './table-data-converter.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 antes de emisión de eventos
|
|
13
|
-
*/
|
|
14
|
-
export class TableCrudStateService {
|
|
15
|
-
visibilityService = inject(TableColumnVisibilityService);
|
|
16
|
-
dataConverter = inject(TableDataConverterService);
|
|
17
|
-
/**
|
|
18
|
-
* Filtra columnas visibles y editables
|
|
19
|
-
*/
|
|
20
|
-
getEditableColumns(columns, data, includeHiddenIfNull) {
|
|
21
|
-
return columns.filter(col => this.visibilityService.isColumnVisible(col, data, includeHiddenIfNull) && !col.readOnly);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Convierte valores de row según definición de columnas
|
|
25
|
-
*/
|
|
26
|
-
convertRowValues(row, columns, data) {
|
|
27
|
-
return columns.reduce((acc, col) => {
|
|
28
|
-
const sampleValue = data.length > 0
|
|
29
|
-
? this.visibilityService['getCellValue'](data[0], col.accessor)
|
|
30
|
-
: undefined;
|
|
31
|
-
acc[col.accessor] = this.dataConverter.convertCellValue(row[col.accessor], col, sampleValue);
|
|
32
|
-
return acc;
|
|
33
|
-
}, {});
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Inicializa row para creación con valores por defecto
|
|
37
|
-
*/
|
|
38
|
-
initializeNewRow(columns, data) {
|
|
39
|
-
const row = {};
|
|
40
|
-
for (const col of this.getEditableColumns(columns, data, true)) {
|
|
41
|
-
const defaultValue = col.default === undefined ? '' : col.default;
|
|
42
|
-
row[col.accessor] = defaultValue;
|
|
43
|
-
}
|
|
44
|
-
return row;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Inicializa row para edición con valores actuales
|
|
48
|
-
*/
|
|
49
|
-
initializeEditRow(row, columns, data) {
|
|
50
|
-
const edit = {};
|
|
51
|
-
for (const col of this.getEditableColumns(columns, data, true)) {
|
|
52
|
-
const value = this.visibilityService['getCellValue'](row, col.accessor);
|
|
53
|
-
edit[col.accessor] = value;
|
|
54
|
-
}
|
|
55
|
-
return edit;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Inicializa el estado CRUD para una nueva tabla
|
|
59
|
-
* @returns Objeto con signals y métodos para gestión CRUD
|
|
60
|
-
*/
|
|
61
|
-
createCrudState() {
|
|
62
|
-
const creating = signal(false);
|
|
63
|
-
const newRow = signal(null);
|
|
64
|
-
const editing = signal(null);
|
|
65
|
-
const editRow = signal(null);
|
|
66
|
-
return {
|
|
67
|
-
creating: creating.asReadonly(),
|
|
68
|
-
newRow: newRow.asReadonly(),
|
|
69
|
-
editing: editing.asReadonly(),
|
|
70
|
-
editRow: editRow.asReadonly(),
|
|
71
|
-
startCreate: this.createStartCreateFn(creating, newRow),
|
|
72
|
-
cancelCreate: this.createCancelCreateFn(creating, newRow),
|
|
73
|
-
updateNewRow: this.createUpdateNewRowFn(newRow),
|
|
74
|
-
saveCreate: this.createSaveCreateFn(newRow, creating),
|
|
75
|
-
startEdit: this.createStartEditFn(editing, editRow),
|
|
76
|
-
cancelEdit: this.createCancelEditFn(editing, editRow),
|
|
77
|
-
updateEditRow: this.createUpdateEditRowFn(editRow),
|
|
78
|
-
saveEdit: this.createSaveEditFn(editRow, editing),
|
|
79
|
-
applyInputValues: this.createApplyInputValuesFn(creating, newRow, editing, editRow),
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
createStartCreateFn(creating, newRow) {
|
|
83
|
-
return (columns, data) => {
|
|
84
|
-
creating.set(true);
|
|
85
|
-
newRow.set(this.initializeNewRow(columns, data));
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
createCancelCreateFn(creating, newRow) {
|
|
89
|
-
return () => {
|
|
90
|
-
creating.set(false);
|
|
91
|
-
newRow.set(null);
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
createUpdateNewRowFn(newRow) {
|
|
95
|
-
return (key, value) => {
|
|
96
|
-
const current = newRow();
|
|
97
|
-
if (!current)
|
|
98
|
-
return;
|
|
99
|
-
newRow.set({ ...current, [key]: value });
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
createSaveCreateFn(newRow, creating) {
|
|
103
|
-
return (columns, data, createEmitter) => {
|
|
104
|
-
const row = newRow();
|
|
105
|
-
if (!row)
|
|
106
|
-
return;
|
|
107
|
-
const visibleColumns = this.getEditableColumns(columns, data, true);
|
|
108
|
-
const converted = this.convertRowValues(row, visibleColumns, data);
|
|
109
|
-
createEmitter.emit({
|
|
110
|
-
row: converted,
|
|
111
|
-
done: (success) => {
|
|
112
|
-
if (success) {
|
|
113
|
-
creating.set(false);
|
|
114
|
-
newRow.set(null);
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
createStartEditFn(editing, editRow) {
|
|
121
|
-
return (row, columns, data) => {
|
|
122
|
-
editing.set(row['id']);
|
|
123
|
-
editRow.set(this.initializeEditRow(row, columns, data));
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
createCancelEditFn(editing, editRow) {
|
|
127
|
-
return () => {
|
|
128
|
-
editing.set(null);
|
|
129
|
-
editRow.set(null);
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
createUpdateEditRowFn(editRow) {
|
|
133
|
-
return (key, value) => {
|
|
134
|
-
const current = editRow();
|
|
135
|
-
if (!current)
|
|
136
|
-
return;
|
|
137
|
-
editRow.set({ ...current, [key]: value });
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
createSaveEditFn(editRow, editing) {
|
|
141
|
-
return (rowId, columns, data, updateEmitter) => {
|
|
142
|
-
const currentEditRow = editRow();
|
|
143
|
-
if (!currentEditRow)
|
|
144
|
-
return;
|
|
145
|
-
const visibleColumns = this.getEditableColumns(columns, data, true);
|
|
146
|
-
const converted = this.convertRowValues(currentEditRow, visibleColumns, data);
|
|
147
|
-
updateEmitter.emit({
|
|
148
|
-
id: rowId,
|
|
149
|
-
changes: converted,
|
|
150
|
-
done: (success) => {
|
|
151
|
-
if (success) {
|
|
152
|
-
editing.set(null);
|
|
153
|
-
editRow.set(null);
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
});
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
createApplyInputValuesFn(creating, newRow, editing, editRow) {
|
|
160
|
-
return (partialValues) => {
|
|
161
|
-
if (!creating() && editing() === null)
|
|
162
|
-
return;
|
|
163
|
-
if (creating()) {
|
|
164
|
-
const currentRow = newRow();
|
|
165
|
-
if (currentRow) {
|
|
166
|
-
newRow.set({ ...currentRow, ...partialValues });
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
const currentEditRow = editRow();
|
|
171
|
-
if (currentEditRow) {
|
|
172
|
-
editRow.set({ ...currentEditRow, ...partialValues });
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableCrudStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
178
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableCrudStateService, providedIn: 'root' });
|
|
179
|
-
}
|
|
180
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableCrudStateService, decorators: [{
|
|
181
|
-
type: Injectable,
|
|
182
|
-
args: [{
|
|
183
|
-
providedIn: 'root'
|
|
184
|
-
}]
|
|
185
|
-
}] });
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY3J1ZC1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLWNydWQtc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUUzRTs7Ozs7Ozs7R0FRRztBQUlILE1BQU0sT0FBTyxxQkFBcUI7SUFFYixpQkFBaUIsR0FBRyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUN6RCxhQUFhLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFFbkU7O09BRUc7SUFDSyxrQkFBa0IsQ0FDdEIsT0FBeUIsRUFDekIsSUFBUyxFQUNULG1CQUE0QjtRQUU1QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQ2pCLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUNqRyxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQ3BCLEdBQWUsRUFDZixPQUF5QixFQUN6QixJQUFTO1FBRVQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxD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QUFPO1lBRTlDLElBQUksUUFBUSxFQUFFLEVBQUUsQ0FBQztnQkFDYixNQUFNLFVBQVUsR0FBRyxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDYixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sY0FBYyxHQUFHLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxjQUFjLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQztJQUNOLENBQUM7d0dBdE9RLHFCQUFxQjs0R0FBckIscUJBQXFCLGNBRmxCLE1BQU07OzRGQUVULHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIEV2ZW50RW1pdHRlciwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDODBUYWJsZUNvbERlZiwgSUQgfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uVmlzaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuL3RhYmxlLWNvbHVtbi12aXNpYmlsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVEYXRhQ29udmVydGVyU2VydmljZSB9IGZyb20gJy4vdGFibGUtZGF0YS1jb252ZXJ0ZXIuc2VydmljZSc7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBnZXN0aW9uYXIgZWwgZXN0YWRvIENSVUQgKENyZWFyLCBMZWVyLCBBY3R1YWxpemFyLCBFbGltaW5hcikgZW4gdGFibGFzIEM4MFxuICpcbiAqIE1hbmVqYTpcbiAqIC0gRXN0YWRvIGRlIGNyZWFjacOzbiB5IGVkaWNpw7NuXG4gKiAtIEdlc3Rpw7NuIGRlIGRhdG9zIHRlbXBvcmFsZXMgKG5ld1JvdywgZWRpdFJvdylcbiAqIC0gQXBsaWNhY2nDs24gZGUgdmFsb3JlcyBkaW7DoW1pY29zXG4gKiAtIFZhbGlkYWNpw7NuIHkgY29udmVyc2nDs24gZGUgZGF0b3MgYW50ZXMgZGUgZW1pc2nDs24gZGUgZXZlbnRvc1xuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ3J1ZFN0YXRlU2VydmljZSB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpc2liaWxpdHlTZXJ2aWNlID0gaW5qZWN0KFRhYmxlQ29sdW1uVmlzaWJpbGl0eVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YUNvbnZlcnRlciA9IGluamVjdChUYWJsZURhdGFDb252ZXJ0ZXJTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRyYSBjb2x1bW5hcyB2aXNpYmxlcyB5IGVkaXRhYmxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RWRpdGFibGVDb2x1bW5zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICAgIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10sXG4gICAgICAgIGRhdGE6IFRbXSxcbiAgICAgICAgaW5jbHVkZUhpZGRlbklmTnVsbDogYm9vbGVhblxuICAgICk6IEM4MFRhYmxlQ29sRGVmW10ge1xuICAgICAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoXG4gICAgICAgICAgICBjb2wgPT4gdGhpcy52aXNpYmlsaXR5U2VydmljZS5pc0NvbHVtblZpc2libGUoY29sLCBkYXRhLCBpbmNsdWRlSGlkZGVuSWZOdWxsKSAmJiAhY29sLnJlYWRPbmx5XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmllcnRlIHZhbG9yZXMgZGUgcm93IHNlZ8O6biBkZWZpbmljacOzbiBkZSBjb2x1bW5hc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29udmVydFJvd1ZhbHVlczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICByb3c6IFBhcnRpYWw8VD4sXG4gICAgICAgIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10sXG4gICAgICAgIGRhdGE6IFRbXVxuICAgICk6IFBhcnRpYWw8VD4ge1xuICAgICAgICByZXR1cm4gY29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzYW1wbGVWYWx1ZSA9IGRhdGEubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gdGhpcy52aXNpYmlsaXR5U2VydmljZVsnZ2V0Q2VsbFZhbHVlJ10oZGF0YVswXSwgY29sLmFjY2Vzc29yKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgYWNjW2NvbC5hY2Nlc3Nvcl0gPSB0aGlzLmRhdGFDb252ZXJ0ZXIuY29udmVydENlbGxWYWx1ZShyb3dbY29sLmFjY2Vzc29yXSwgY29sLCBzYW1wbGVWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgYXMgUGFydGlhbDxUPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmljaWFsaXphIHJvdyBwYXJhIGNyZWFjacOzbiBjb24gdmFsb3JlcyBwb3IgZGVmZWN0b1xuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdGlhbGl6ZU5ld1JvdzxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLFxuICAgICAgICBkYXRhOiBUW11cbiAgICApOiBQYXJ0aWFsPFQ+IHtcbiAgICAgICAgY29uc3Qgcm93OiBQYXJ0aWFsPFQ+ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuZ2V0RWRpdGFibGVDb2x1bW5zKGNvbHVtbnMsIGRhdGEsIHRydWUpKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBjb2wuZGVmYXVsdCA9PT0gdW5kZWZpbmVkID8gJycgOiBjb2wuZGVmYXVsdDtcbiAgICAgICAgICAgIChyb3cgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmljaWFsaXphIHJvdyBwYXJhIGVkaWNpw7NuIGNvbiB2YWxvcmVzIGFjdHVhbGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRWRpdFJvdzxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICByb3c6IFQsXG4gICAgICAgIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10sXG4gICAgICAgIGRhdGE6IFRbXVxuICAgICk6IFBhcnRpYWw8VD4ge1xuICAgICAgICBjb25zdCBlZGl0OiBQYXJ0aWFsPFQ+ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuZ2V0RWRpdGFibGVDb2x1bW5zKGNvbHVtbnMsIGRhdGEsIHRydWUpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmlzaWJpbGl0eVNlcnZpY2VbJ2dldENlbGxWYWx1ZSddKHJvdywgY29sLmFjY2Vzc29yKTtcbiAgICAgICAgICAgIChlZGl0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtjb2wuYWNjZXNzb3JdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVkaXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pY2lhbGl6YSBlbCBlc3RhZG8gQ1JVRCBwYXJhIHVuYSBudWV2YSB0YWJsYVxuICAgICAqIEByZXR1cm5zIE9iamV0byBjb24gc2lnbmFscyB5IG3DqXRvZG9zIHBhcmEgZ2VzdGnDs24gQ1JVRFxuICAgICAqL1xuICAgIGNyZWF0ZUNydWRTdGF0ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCkge1xuICAgICAgICBjb25zdCBjcmVhdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gICAgICAgIGNvbnN0IG5ld1JvdyA9IHNpZ25hbDxQYXJ0aWFsPFQ+IHwgbnVsbD4obnVsbCk7XG4gICAgICAgIGNvbnN0IGVkaXRpbmcgPSBzaWduYWw8SUQgfCBudWxsPihudWxsKTtcbiAgICAgICAgY29uc3QgZWRpdFJvdyA9IHNpZ25hbDxQYXJ0aWFsPFQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0aW5nOiBjcmVhdGluZy5hc1JlYWRvbmx5KCksXG4gICAgICAgICAgICBuZXdSb3c6IG5ld1Jvdy5hc1JlYWRvbmx5KCksXG4gICAgICAgICAgICBlZGl0aW5nOiBlZGl0aW5nLmFzUmVhZG9ubHkoKSxcbiAgICAgICAgICAgIGVkaXRSb3c6IGVkaXRSb3cuYXNSZWFkb25seSgpLFxuICAgICAgICAgICAgc3RhcnRDcmVhdGU6IHRoaXMuY3JlYXRlU3RhcnRDcmVhdGVGbihjcmVhdGluZywgbmV3Um93KSxcbiAgICAgICAgICAgIGNhbmNlbENyZWF0ZTogdGhpcy5jcmVhdGVDYW5jZWxDcmVhdGVGbihjcmVhdGluZywgbmV3Um93KSxcbiAgICAgICAgICAgIHVwZGF0ZU5ld1JvdzogdGhpcy5jcmVhdGVVcGRhdGVOZXdSb3dGbihuZXdSb3cpLFxuICAgICAgICAgICAgc2F2ZUNyZWF0ZTogdGhpcy5jcmVhdGVTYXZlQ3JlYXRlRm4obmV3Um93LCBjcmVhdGluZyksXG4gICAgICAgICAgICBzdGFydEVkaXQ6IHRoaXMuY3JlYXRlU3RhcnRFZGl0Rm4oZWRpdGluZywgZWRpdFJvdyksXG4gICAgICAgICAgICBjYW5jZWxFZGl0OiB0aGlzLmNyZWF0ZUNhbmNlbEVkaXRGbihlZGl0aW5nLCBlZGl0Um93KSxcbiAgICAgICAgICAgIHVwZGF0ZUVkaXRSb3c6IHRoaXMuY3JlYXRlVXBkYXRlRWRpdFJvd0ZuKGVkaXRSb3cpLFxuICAgICAgICAgICAgc2F2ZUVkaXQ6IHRoaXMuY3JlYXRlU2F2ZUVkaXRGbihlZGl0Um93LCBlZGl0aW5nKSxcbiAgICAgICAgICAgIGFwcGx5SW5wdXRWYWx1ZXM6IHRoaXMuY3JlYXRlQXBwbHlJbnB1dFZhbHVlc0ZuKGNyZWF0aW5nLCBuZXdSb3csIGVkaXRpbmcsIGVkaXRSb3cpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU3RhcnRDcmVhdGVGbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjcmVhdGluZzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPGJvb2xlYW4+PixcbiAgICAgICAgbmV3Um93OiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+PlxuICAgICkge1xuICAgICAgICByZXR1cm4gKGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10sIGRhdGE6IFRbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgY3JlYXRpbmcuc2V0KHRydWUpO1xuICAgICAgICAgICAgbmV3Um93LnNldCh0aGlzLmluaXRpYWxpemVOZXdSb3coY29sdW1ucywgZGF0YSkpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQ2FuY2VsQ3JlYXRlRm48VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgICAgY3JlYXRpbmc6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxib29sZWFuPj4sXG4gICAgICAgIG5ld1JvdzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj5cbiAgICApIHtcbiAgICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNyZWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICBuZXdSb3cuc2V0KG51bGwpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlVXBkYXRlTmV3Um93Rm48VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgICAgbmV3Um93OiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+PlxuICAgICkge1xuICAgICAgICByZXR1cm4gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IG5ld1JvdygpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG4gICAgICAgICAgICBuZXdSb3cuc2V0KHsgLi4uY3VycmVudCwgW2tleV06IHZhbHVlIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU2F2ZUNyZWF0ZUZuPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICAgIG5ld1JvdzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj4sXG4gICAgICAgIGNyZWF0aW5nOiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8Ym9vbGVhbj4+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLFxuICAgICAgICAgICAgZGF0YTogVFtdLFxuICAgICAgICAgICAgY3JlYXRlRW1pdHRlcjogRXZlbnRFbWl0dGVyPHsgcm93OiBQYXJ0aWFsPFQ+OyBkb25lOiAocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkOyB9PlxuICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IG5ld1JvdygpO1xuICAgICAgICAgICAgaWYgKCFyb3cpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdldEVkaXRhYmxlQ29sdW1ucyhjb2x1bW5zLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IHRoaXMuY29udmVydFJvd1ZhbHVlcyhyb3csIHZpc2libGVDb2x1bW5zLCBkYXRhKTtcblxuICAgICAgICAgICAgY3JlYXRlRW1pdHRlci5lbWl0KHtcbiAgICAgICAgICAgICAgICByb3c6IGNvbnZlcnRlZCxcbiAgICAgICAgICAgICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jvdy5zZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGFydEVkaXRGbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBlZGl0aW5nOiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8SUQgfCBudWxsPj4sXG4gICAgICAgIGVkaXRSb3c6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxQYXJ0aWFsPFQ+IHwgbnVsbD4+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiAocm93OiBULCBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLCBkYXRhOiBUW10pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGVkaXRpbmcuc2V0KHJvd1snaWQnXSBhcyBJRCk7XG4gICAgICAgICAgICBlZGl0Um93LnNldCh0aGlzLmluaXRpYWxpemVFZGl0Um93KHJvdywgY29sdW1ucywgZGF0YSkpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQ2FuY2VsRWRpdEZuPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICAgIGVkaXRpbmc6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxJRCB8IG51bGw+PixcbiAgICAgICAgZWRpdFJvdzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj5cbiAgICApIHtcbiAgICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGVkaXRpbmcuc2V0KG51bGwpO1xuICAgICAgICAgICAgZWRpdFJvdy5zZXQobnVsbCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVFZGl0Um93Rm48VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgICAgZWRpdFJvdzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPj5cbiAgICApIHtcbiAgICAgICAgcmV0dXJuIChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBlZGl0Um93KCk7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgICAgIGVkaXRSb3cuc2V0KHsgLi4uY3VycmVudCwgW2tleV06IHZhbHVlIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU2F2ZUVkaXRGbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBlZGl0Um93OiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+PixcbiAgICAgICAgZWRpdGluZzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPElEIHwgbnVsbD4+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICByb3dJZDogSUQsXG4gICAgICAgICAgICBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdLFxuICAgICAgICAgICAgZGF0YTogVFtdLFxuICAgICAgICAgICAgdXBkYXRlRW1pdHRlcjogRXZlbnRFbWl0dGVyPHsgaWQ6IElEOyBjaGFuZ2VzOiBQYXJ0aWFsPFQ+OyBkb25lOiAocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkOyB9PlxuICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFZGl0Um93ID0gZWRpdFJvdygpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50RWRpdFJvdykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ2V0RWRpdGFibGVDb2x1bW5zKGNvbHVtbnMsIGRhdGEsIHRydWUpO1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gdGhpcy5jb252ZXJ0Um93VmFsdWVzKGN1cnJlbnRFZGl0Um93LCB2aXNpYmxlQ29sdW1ucywgZGF0YSk7XG5cbiAgICAgICAgICAgIHVwZGF0ZUVtaXR0ZXIuZW1pdCh7XG4gICAgICAgICAgICAgICAgaWQ6IHJvd0lkLFxuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGNvbnZlcnRlZCxcbiAgICAgICAgICAgICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGluZy5zZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0Um93LnNldChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUFwcGx5SW5wdXRWYWx1ZXNGbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjcmVhdGluZzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPGJvb2xlYW4+PixcbiAgICAgICAgbmV3Um93OiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+PixcbiAgICAgICAgZWRpdGluZzogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPElEIHwgbnVsbD4+LFxuICAgICAgICBlZGl0Um93OiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+PlxuICAgICkge1xuICAgICAgICByZXR1cm4gKHBhcnRpYWxWYWx1ZXM6IFBhcnRpYWw8VD4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmICghY3JlYXRpbmcoKSAmJiBlZGl0aW5nKCkgPT09IG51bGwpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGNyZWF0aW5nKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Um93ID0gbmV3Um93KCk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Um93LnNldCh7IC4uLmN1cnJlbnRSb3csIC4uLnBhcnRpYWxWYWx1ZXMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RWRpdFJvdyA9IGVkaXRSb3coKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVkaXRSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50RWRpdFJvdywgLi4ucGFydGlhbFZhbHVlcyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
|
|
@@ -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=
|