@c80/ui 1.0.44 → 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.
Files changed (78) hide show
  1. package/c80-ui.d.ts +5 -0
  2. package/esm2022/c80-ui.js +5 -0
  3. package/esm2022/c80-ui.js.map +1 -0
  4. package/esm2022/index.js +6 -0
  5. package/esm2022/index.js.map +1 -0
  6. package/esm2022/lib/card-level/card-level.component.js +56 -0
  7. package/esm2022/lib/card-level/card-level.component.js.map +1 -0
  8. package/esm2022/lib/card-level/card-level.interface.js +2 -0
  9. package/esm2022/lib/card-level/card-level.interface.js.map +1 -0
  10. package/esm2022/lib/card-level/index.js +3 -0
  11. package/esm2022/lib/card-level/index.js.map +1 -0
  12. package/esm2022/lib/icon/icon.component.js +48 -0
  13. package/esm2022/lib/icon/icon.component.js.map +1 -0
  14. package/esm2022/lib/icon/icon.constants.js +237 -0
  15. package/esm2022/lib/icon/icon.constants.js.map +1 -0
  16. package/esm2022/lib/icon/icon.types.js +2 -0
  17. package/esm2022/lib/icon/icon.types.js.map +1 -0
  18. package/esm2022/lib/icon/icon.utils.js +4 -0
  19. package/esm2022/lib/icon/icon.utils.js.map +1 -0
  20. package/esm2022/lib/icon/index.js +4 -0
  21. package/esm2022/lib/icon/index.js.map +1 -0
  22. package/esm2022/lib/modal/index.js +3 -0
  23. package/esm2022/lib/modal/index.js.map +1 -0
  24. package/esm2022/lib/modal/modal.component.js +86 -0
  25. package/esm2022/lib/modal/modal.component.js.map +1 -0
  26. package/esm2022/lib/modal/modal.service.js +83 -0
  27. package/esm2022/lib/modal/modal.service.js.map +1 -0
  28. package/esm2022/lib/stat-card/index.js +2 -0
  29. package/esm2022/lib/stat-card/index.js.map +1 -0
  30. package/esm2022/lib/stat-card/stat-card.component.js +13 -0
  31. package/esm2022/lib/stat-card/stat-card.component.js.map +1 -0
  32. package/esm2022/lib/table/index.js +9 -0
  33. package/esm2022/lib/table/index.js.map +1 -0
  34. package/esm2022/lib/table/table-column-visibility.service.js +105 -0
  35. package/esm2022/lib/table/table-column-visibility.service.js.map +1 -0
  36. package/esm2022/lib/table/table-crud-state.service.js +115 -0
  37. package/esm2022/lib/table/table-crud-state.service.js.map +1 -0
  38. package/esm2022/lib/table/table-data-converter.service.js +145 -0
  39. package/esm2022/lib/table/table-data-converter.service.js.map +1 -0
  40. package/esm2022/lib/table/table-data-utils.service.js +193 -0
  41. package/esm2022/lib/table/table-data-utils.service.js.map +1 -0
  42. package/esm2022/lib/table/table-selection.service.js +121 -0
  43. package/esm2022/lib/table/table-selection.service.js.map +1 -0
  44. package/esm2022/lib/table/table.component.js +413 -0
  45. package/esm2022/lib/table/table.component.js.map +1 -0
  46. package/esm2022/lib/table/table.types.js +5 -0
  47. package/esm2022/lib/table/table.types.js.map +1 -0
  48. package/esm2022/lib/table/table.utils.js +107 -0
  49. package/esm2022/lib/table/table.utils.js.map +1 -0
  50. package/lib/icon/icon.component.d.ts +2 -2
  51. package/lib/modal/index.d.ts +2 -3
  52. package/lib/stat-card/stat-card.component.d.ts +2 -2
  53. package/lib/table/table.component.d.ts +10 -13
  54. package/package.json +7 -9
  55. package/esm2022/c80-ui.mjs +0 -5
  56. package/esm2022/index.mjs +0 -6
  57. package/esm2022/lib/card-level/card-level.component.mjs +0 -57
  58. package/esm2022/lib/card-level/card-level.interface.mjs +0 -2
  59. package/esm2022/lib/card-level/index.mjs +0 -3
  60. package/esm2022/lib/icon/icon.component.mjs +0 -49
  61. package/esm2022/lib/icon/icon.constants.mjs +0 -237
  62. package/esm2022/lib/icon/icon.types.mjs +0 -2
  63. package/esm2022/lib/icon/icon.utils.mjs +0 -4
  64. package/esm2022/lib/icon/index.mjs +0 -4
  65. package/esm2022/lib/modal/index.mjs +0 -3
  66. package/esm2022/lib/modal/modal.component.mjs +0 -86
  67. package/esm2022/lib/modal/modal.service.mjs +0 -83
  68. package/esm2022/lib/stat-card/index.mjs +0 -2
  69. package/esm2022/lib/stat-card/stat-card.component.mjs +0 -16
  70. package/esm2022/lib/table/index.mjs +0 -9
  71. package/esm2022/lib/table/table-column-visibility.service.mjs +0 -105
  72. package/esm2022/lib/table/table-crud-state.service.mjs +0 -115
  73. package/esm2022/lib/table/table-data-converter.service.mjs +0 -145
  74. package/esm2022/lib/table/table-data-utils.service.mjs +0 -193
  75. package/esm2022/lib/table/table-selection.service.mjs +0 -121
  76. package/esm2022/lib/table/table.component.mjs +0 -432
  77. package/esm2022/lib/table/table.types.mjs +0 -5
  78. 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=